import { createSignal, Show } from "solid-js"; import { Title } from "@solidjs/meta"; import { A } from "@solidjs/router"; import { Sidebar, TopBar } from "~/components/dashboard"; import { Button, Card, Input, Badge } from "~/components/ui"; import { useAuth, useSubscription } from "~/hooks"; import { api } from "~/lib/api"; export default function SettingsPage() { const [sidebarOpen, setSidebarOpen] = createSignal(false); const auth = useAuth(); const subscription = useSubscription(); const [name, setName] = createSignal(auth.user()?.name ?? ""); const [saving, setSaving] = createSignal(false); const [portalLoading, setPortalLoading] = createSignal(false); const [cancelLoading, setCancelLoading] = createSignal(false); async function saveProfile() { setSaving(true); try { await api.user.update.mutate({ name: name() }); } finally { setSaving(false); } } async function openBillingPortal() { setPortalLoading(true); try { const result = await api.billing.createPortalSession.mutate({ returnUrl: `${window.location.origin}/settings`, }); window.location.href = result.url; } catch { setPortalLoading(false); } } async function handleCancelSubscription() { const sub = subscription.subscription(); if (!sub || !sub.stripeId) return; setCancelLoading(true); try { await api.billing.cancelSubscription.mutate({ subscriptionId: sub.stripeId, }); } catch { // Error handled by trpc } finally { setCancelLoading(false); } } function getStatusBadgeClass(status: string): string { switch (status) { case "active": return "bg-green-100 text-green-800"; case "trialing": return "bg-blue-100 text-blue-800"; case "past_due": return "bg-yellow-100 text-yellow-800"; case "canceled": return "bg-red-100 text-red-800"; case "unpaid": return "bg-red-100 text-red-800"; default: return "bg-gray-100 text-gray-800"; } } return (
Settings — Kordant setSidebarOpen(false)} />
setSidebarOpen(v => !v)} />

Settings

Profile

setName(e.currentTarget.value)} />

Subscription

You're on the free plan. Upgrade to unlock all features.

} > {(sub) => (

{sub().tier?.charAt(0).toUpperCase() + sub().tier?.slice(1) || "Free"} {sub().isTrialing ? " (Trial)" : ""}

{sub().status}

Cancels at period end
{(end) => (

{sub().isTrialing && sub().trialEnd ? `Trial ends ${new Date(sub().trialEnd as any).toLocaleDateString()}` : `Next billing date: ${new Date(end() as any).toLocaleDateString()}`}

)}
{(last4) => (

Payment method: •••• {last4()}

)}

Your subscription will remain active until the end of your billing period.

)}
); }