'use client' import { useState } from 'react' import Link from 'next/link' import { Button, toast, Spinner } from '@ciphera-net/ui' import { CreditCard, ArrowSquareOut } from '@phosphor-icons/react' import { useSubscription } from '@/lib/swr/dashboard' import { createPortalSession, cancelSubscription, resumeSubscription } from '@/lib/api/billing' import { formatDateLong } from '@/lib/utils/formatDate' import { getAuthErrorMessage } from '@ciphera-net/ui' export default function WorkspaceBillingTab() { const { data: subscription, isLoading, mutate } = useSubscription() const [cancelling, setCancelling] = useState(false) const handleManageBilling = async () => { try { const { url } = await createPortalSession() if (url) window.open(url, '_blank') } catch (err) { toast.error(getAuthErrorMessage(err as Error) || 'Failed to open billing portal') } } const handleCancel = async () => { if (!confirm('Are you sure you want to cancel your subscription?')) return setCancelling(true) try { await cancelSubscription() await mutate() toast.success('Subscription cancelled') } catch (err) { toast.error(getAuthErrorMessage(err as Error) || 'Failed to cancel subscription') } finally { setCancelling(false) } } const handleResume = async () => { try { await resumeSubscription() await mutate() toast.success('Subscription resumed') } catch (err) { toast.error(getAuthErrorMessage(err as Error) || 'Failed to resume subscription') } } if (isLoading) { return (
You're on the free plan.
Manage your plan, usage, and payment details.
Sites
{subscription.sites_count}
Pageviews
{subscription.pageview_usage.toLocaleString()} / {subscription.pageview_limit.toLocaleString()}
{subscription.cancel_at_period_end ? 'Ends' : 'Renews'}
{formatDateLong(new Date(subscription.current_period_end))}
Limit
{subscription.pageview_limit.toLocaleString()} / mo