import { BadgeX, Ban, ShieldPlus, VenetianMask } from 'lucide-react'; import { Tables } from '@kit/supabase/database'; import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs'; import { Badge } from '@kit/ui/badge'; import { Button } from '@kit/ui/button'; import { Heading } from '@kit/ui/heading'; import { If } from '@kit/ui/if'; import { PageBody, PageHeader } from '@kit/ui/page'; import { ProfileAvatar } from '@kit/ui/profile-avatar'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@kit/ui/table'; import { AdminBanUserDialog } from './admin-ban-user-dialog'; import { AdminDeleteAccountDialog } from './admin-delete-account-dialog'; import { AdminDeleteUserDialog } from './admin-delete-user-dialog'; import { AdminImpersonateUserDialog } from './admin-impersonate-user-dialog'; import { AdminMembersTable } from './admin-members-table'; import { AdminMembershipsTable } from './admin-memberships-table'; import { AdminReactivateUserDialog } from './admin-reactivate-user-dialog'; type Account = Tables<'accounts'>; type Membership = Tables<'accounts_memberships'>; export function AdminAccountPage(props: { account: Account & { memberships: Membership[] }; }) { const isPersonalAccount = props.account.is_personal_account; if (isPersonalAccount) { return ; } return ; } async function PersonalAccountPage(props: { account: Account }) { const adminClient = getSupabaseServerAdminClient(); const { data, error } = await adminClient.auth.admin.getUserById( props.account.id, ); if (!data || error) { throw new Error(`User not found`); } const memberships = await getMemberships(props.account.id); const isBanned = 'banned_until' in data.user && data.user.banned_until !== 'none'; return ( <> } >
{props.account.name}
Personal Account Banned
Companies
); } async function TeamAccountPage(props: { account: Account & { memberships: Membership[] }; }) { const members = await getMembers(props.account.slug ?? ''); return ( <> } >
{props.account.name}
Company Account
Company Employees
); } async function SubscriptionsTable(props: { accountId: string }) { const client = getSupabaseServerClient(); const { data: subscription, error } = await client .from('subscriptions') .select('*, subscription_items !inner (*)') .eq('account_id', props.accountId) .maybeSingle(); if (error) { return ( There was an error loading subscription. Please check the logs for more information or try again later. ); } return (
Subscription This account does not currently have a subscription. } > {(subscription) => { return (
Subscription ID Provider Customer ID Status Created At Period Starts At Ends At {subscription.id} {subscription.billing_provider} {subscription.billing_customer_id} {subscription.status} {subscription.created_at} {subscription.period_starts_at} {subscription.period_ends_at}
Product ID Variant ID Quantity Price Interval Type {subscription.subscription_items.map((item) => { return ( {item.product_id} {item.variant_id} {item.quantity} {item.price_amount} {item.interval} {item.type} ); })}
); }}
); } async function getMemberships(userId: string) { const client = getSupabaseServerClient(); const memberships = await client .from('accounts_memberships') .select< string, Membership & { account: { id: string; name: string; }; } >('*, account: account_id !inner (id, name)') .eq('user_id', userId); if (memberships.error) { throw memberships.error; } return memberships.data; } async function getMembers(accountSlug: string) { const client = getSupabaseServerClient(); const members = await client.rpc('get_account_members', { account_slug: accountSlug, }); if (members.error) { throw members.error; } return members.data; }