mirror of https://github.com/TZGyn/shortener
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
6.0 KiB
Svelte
195 lines
6.0 KiB
Svelte
<script lang="ts">
|
|
import * as Tooltip from '$lib/components/ui/tooltip/index.js'
|
|
import * as Form from '$lib/components/ui/form'
|
|
import { Button, buttonVariants } from '$lib/components/ui/button'
|
|
import { Separator } from '$lib/components/ui/separator'
|
|
import * as Dialog from '$lib/components/ui/dialog'
|
|
import { Check, LoaderCircleIcon } from 'lucide-svelte'
|
|
import { zodClient } from 'sveltekit-superforms/adapters'
|
|
import { cancelSubscriptionSchema } from './schema'
|
|
import { superForm } from 'sveltekit-superforms'
|
|
import { toast } from 'svelte-sonner'
|
|
import { ScrollArea } from '$lib/components/ui/scroll-area'
|
|
|
|
let { data } = $props()
|
|
|
|
let cancelPlanDialogOpen = $state(false)
|
|
|
|
const cancelSubscriptionForm = superForm(
|
|
data.cancel_subscription_form,
|
|
{
|
|
validators: zodClient(cancelSubscriptionSchema),
|
|
onUpdate: ({ form }) => {
|
|
if (!form.valid) {
|
|
toast.error(form.message)
|
|
}
|
|
},
|
|
onUpdated: ({ form }) => {
|
|
if (form.valid) {
|
|
toast.success(form.message)
|
|
cancelPlanDialogOpen = false
|
|
}
|
|
},
|
|
},
|
|
)
|
|
|
|
const {
|
|
enhance: enhanceCancelSubscription,
|
|
submitting: submittingCancelSubscription,
|
|
} = cancelSubscriptionForm
|
|
</script>
|
|
|
|
<div class="flex h-auto flex-col overflow-hidden p-10">
|
|
<div class="space-y-0.5">
|
|
<h2 class="text-2xl font-bold tracking-tight">Pricing</h2>
|
|
<p class="text-muted-foreground">Checkout our pricings here.</p>
|
|
</div>
|
|
<Separator class="mt-4 lg:mt-6" />
|
|
|
|
<ScrollArea>
|
|
<div
|
|
class="flex w-full flex-wrap-reverse justify-center gap-8 pt-6">
|
|
<div class="flex w-[400px] gap-8 rounded-lg border p-8">
|
|
<div class="flex w-full flex-col gap-3 text-start">
|
|
<h2 class="text-2xl font-bold">Free</h2>
|
|
<p class="text-muted-foreground">
|
|
No credit card required.
|
|
</p>
|
|
<Separator />
|
|
<div class="flex flex-col gap-2">
|
|
<div class="flex items-end gap-2">
|
|
<h1 class="text-5xl font-bold">$0</h1>
|
|
<span>/month</span>
|
|
</div>
|
|
<span class="text-muted-foreground">Free Forever</span>
|
|
</div>
|
|
<Separator />
|
|
<div class="flex h-full flex-col justify-between gap-12">
|
|
<div class="flex flex-col gap-4">
|
|
<div class="flex items-center gap-2">
|
|
<Check class="text-brand" />
|
|
<p>Unlimited Links</p>
|
|
</div>
|
|
<div class="flex items-center gap-2">
|
|
<Check class="text-brand" />
|
|
<p>Unlimited Projects</p>
|
|
</div>
|
|
<div class="flex items-center gap-2">
|
|
<Check class="text-brand" />
|
|
<p>Click history up to 1 month</p>
|
|
</div>
|
|
</div>
|
|
{#if data.user.plan === 'owner'}
|
|
<Button variant={'brand'} disabled>Owner</Button>
|
|
{:else if data.user.plan === 'free'}
|
|
<Button variant={'default'} disabled>
|
|
Current Plan
|
|
</Button>
|
|
{:else}
|
|
<Button variant={'brand'} disabled>Select Plan</Button>
|
|
{/if}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div
|
|
class="border-brand relative flex w-[400px] gap-8 rounded-lg border p-8">
|
|
<div
|
|
class="bg-brand text-brand-foreground absolute -top-3 left-1/2 -translate-x-1/2 rounded-full px-3">
|
|
Recommended
|
|
</div>
|
|
<div class="flex w-full flex-col gap-3 text-start">
|
|
<h2 class="text-2xl font-bold">Pro</h2>
|
|
<p class="text-muted-foreground">
|
|
More customizations, more data.
|
|
</p>
|
|
<Separator />
|
|
<div class="flex flex-col gap-2">
|
|
<div class="flex items-end gap-2">
|
|
<h1 class="text-5xl font-bold">$9</h1>
|
|
<span>/month</span>
|
|
</div>
|
|
<span class="text-muted-foreground">Billed Monthly</span>
|
|
</div>
|
|
<Separator />
|
|
<div class="flex h-full flex-col justify-between gap-12">
|
|
<div class="flex flex-col gap-4">
|
|
<div class="flex items-center gap-2">
|
|
<Check class="text-brand" />
|
|
<p>Everything in free</p>
|
|
</div>
|
|
<div class="flex items-center gap-2">
|
|
<Check class="text-brand" />
|
|
<p>5 custom domains</p>
|
|
<!-- <Tooltip.Root>
|
|
<Tooltip.Trigger class="flex items-center gap-1">
|
|
<InfoIcon class="h-4 w-4" />
|
|
</Tooltip.Trigger>
|
|
<Tooltip.Content>
|
|
Additional domains are $3 per domain
|
|
</Tooltip.Content>
|
|
</Tooltip.Root> -->
|
|
</div>
|
|
<div class="flex items-center gap-2">
|
|
<Check class="text-brand" />
|
|
<p>2 years of tracked clicks and history</p>
|
|
</div>
|
|
<div class="flex items-center gap-2">
|
|
<Check class="text-brand" />
|
|
<p>Custom QR Code</p>
|
|
</div>
|
|
</div>
|
|
{#if data.user.plan === 'owner'}
|
|
<Button variant={'brand'} disabled>Owner</Button>
|
|
{:else if data.user.plan === 'pro'}
|
|
<Dialog.Root bind:open={cancelPlanDialogOpen}>
|
|
<Dialog.Trigger
|
|
class={buttonVariants({ variant: 'destructive' })}>
|
|
Cancel Plan
|
|
</Dialog.Trigger>
|
|
<Dialog.Content class="sm:max-w-[425px]">
|
|
<Dialog.Header>
|
|
<Dialog.Title>Cancel plan?</Dialog.Title>
|
|
<Dialog.Description>
|
|
Your subscription will still be valid until the
|
|
next billing
|
|
</Dialog.Description>
|
|
</Dialog.Header>
|
|
<Dialog.Footer>
|
|
<Button
|
|
variant={'outline'}
|
|
onclick={() => (cancelPlanDialogOpen = false)}>
|
|
Cancel
|
|
</Button>
|
|
<form
|
|
method="POST"
|
|
use:enhanceCancelSubscription
|
|
class="flex flex-col gap-6"
|
|
action="?/cancel_subscription">
|
|
<Form.Button
|
|
class="w-fit"
|
|
variant="destructive"
|
|
disabled={$submittingCancelSubscription ||
|
|
!data.user.plan}>
|
|
{#if $submittingCancelSubscription}
|
|
<LoaderCircleIcon class="animate-spin" />
|
|
{/if}
|
|
Proceed
|
|
</Form.Button>
|
|
</form>
|
|
</Dialog.Footer>
|
|
</Dialog.Content>
|
|
</Dialog.Root>
|
|
{:else}
|
|
<Button
|
|
href={'/dashboard/billing/plan/pro'}
|
|
variant={'brand'}>
|
|
Select Plan
|
|
</Button>
|
|
{/if}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</ScrollArea>
|
|
</div>
|