Files
speckle-server/packages/frontend-2/components/pricingTable/PricingTable.vue
T
Kristaps Fabians Geikins 211922b6a6 chore: get rid of all old workspace plan code (#4624)
* first batch of changes

* tests fix

* FE fixed

* renaming constants

* test fixes

* moar test fixes

* another test fix

* reenable app rover check

---------

Co-authored-by: Gergő Jedlicska <gergo@jedlicska.com>
2025-04-30 19:18:32 +02:00

88 lines
2.3 KiB
Vue

<template>
<div class="flex flex-col lg:grid lg:grid-cols-3 gap-4 w-full">
<PricingTablePlan
v-for="plan in plans"
:key="plan"
v-model:is-yearly-interval-selected="isYearlyIntervalSelected"
:plan="plan"
:current-plan="currentPlan"
:active-billing-interval="billingInterval"
:can-upgrade="isAdmin"
:workspace-id="props.workspaceId"
:has-subscription="!!subscription"
:currency="props.currency"
@on-upgrade-click="toggleUpgradeDialog(plan as PaidWorkspacePlans)"
/>
<SettingsWorkspacesBillingUpgradeDialog
v-if="planToUpgrade"
v-model:open="isUpgradeDialogOpen"
:slug="props.slug"
:plan="planToUpgrade"
:billing-interval="
isYearlyIntervalSelected ? BillingInterval.Yearly : BillingInterval.Monthly
"
:workspace-id="workspaceId"
is-changing-plan
/>
</div>
</template>
<script setup lang="ts">
import { BillingInterval, type Currency } from '~/lib/common/generated/gql/graphql'
import {
WorkspacePlans,
type PaidWorkspacePlans,
type MaybeNullOrUndefined,
type WorkspaceRoles,
Roles
} from '@speckle/shared'
import { useWorkspacePlan } from '~~/lib/workspaces/composables/plan'
import { useMixpanel } from '~~/lib/core/composables/mp'
const props = defineProps<{
slug: string
role: MaybeNullOrUndefined<WorkspaceRoles>
workspaceId: MaybeNullOrUndefined<string>
currency?: Currency
}>()
const isYearlyIntervalSelected = defineModel<boolean>('isYearlyIntervalSelected', {
default: false
})
const {
billingInterval,
plan: currentPlan,
subscription,
intervalIsYearly
} = useWorkspacePlan(props.slug)
const mixpanel = useMixpanel()
const isUpgradeDialogOpen = ref(false)
const planToUpgrade = ref<PaidWorkspacePlans | null>(null)
const plans = computed(() => [
WorkspacePlans.Free,
WorkspacePlans.Team,
WorkspacePlans.Pro
])
const isAdmin = computed(() => props.role === Roles.Workspace.Admin)
const toggleUpgradeDialog = (plan: PaidWorkspacePlans) => {
planToUpgrade.value = plan
isUpgradeDialogOpen.value = !isUpgradeDialogOpen.value
mixpanel.track('Pricing Plan CTA Clicked', {
plan,
cycle: billingInterval.value,
// eslint-disable-next-line camelcase
workspace_id: props.workspaceId
})
}
onMounted(() => {
isYearlyIntervalSelected.value = intervalIsYearly.value
})
</script>