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 { createTeamAccountsApi } from '@kit/team-accounts/api'; 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<{ schema: 'medreport' }, 'accounts'>; type Membership = Tables<{ schema: 'medreport' }, '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 api = createTeamAccountsApi(getSupabaseServerClient()); const members = await api.getMembers(props.account.slug ?? ''); return ( <> } >
{props.account.name}
Company Account
Company Members
); } async function SubscriptionsTable(props: { accountId: string }) { const client = getSupabaseServerClient(); const { data: subscription, error } = await client .schema('medreport') .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 .schema('medreport') .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; }