'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useAction } from 'next-safe-action/hooks'; import { useForm, useWatch } from 'react-hook-form'; import * as z from 'zod'; import { ErrorBoundary } from '@kit/monitoring/components'; import { VerifyOtpForm } from '@kit/otp/components'; import { useUser } from '@kit/supabase/hooks/use-user'; import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; import { AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@kit/ui/alert-dialog'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@kit/ui/card'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@kit/ui/form'; import { Input } from '@kit/ui/input'; import { LoadingOverlay } from '@kit/ui/loading-overlay'; import { Trans } from '@kit/ui/trans'; import { deleteTeamAccountAction } from '../../server/actions/delete-team-account-server-actions'; import { leaveTeamAccountAction } from '../../server/actions/leave-team-account-server-actions'; export function TeamAccountDangerZone({ account, primaryOwnerUserId, features, }: React.PropsWithChildren<{ account: { name: string; id: string; }; features: { enableTeamDeletion: boolean; }; primaryOwnerUserId: string; }>) { const { data: user } = useUser(); if (!user) { return ; } // Only the primary owner can delete the team account const userIsPrimaryOwner = user.id === primaryOwnerUserId; if (userIsPrimaryOwner) { if (features.enableTeamDeletion) { return ( ); } return; } // A primary owner can't leave the team account // but other members can return ( ); } function DeleteTeamContainer(props: { account: { name: string; id: string; }; }) { return (

} />
); } function DeleteTeamConfirmationForm({ name, id, }: { name: string; id: string; }) { const { data: user } = useUser(); const { execute, isPending } = useAction(deleteTeamAccountAction); const form = useForm({ mode: 'onChange', reValidateMode: 'onChange', resolver: zodResolver( z.object({ otp: z.string().min(6).max(6), }), ), defaultValues: { otp: '', }, }); const { otp } = useWatch({ control: form.control }); if (!user?.email) { return ; } if (!otp) { return ( form.setValue('otp', otp, { shouldValidate: true })} CancelButton={ } /> ); } return ( }>
{ e.preventDefault(); execute({ accountId: id, otp }); }} >
); } function LeaveTeamContainer(props: { account: { name: string; id: string; }; }) { const { execute, isPending } = useAction(leaveTeamAccountAction); const form = useForm({ resolver: zodResolver( z.object({ confirmation: z.string().refine((value) => value === 'LEAVE', { message: 'Confirmation required to leave team', path: ['confirmation'], }), }), ), defaultValues: { confirmation: '' as 'LEAVE', }, }); return (

} /> }>
{ execute({ accountId: props.account.id, confirmation: data.confirmation, }); })} > { return ( ); }} />
); } function LeaveTeamErrorAlert() { return (
); } function DeleteTeamErrorAlert() { return (
); } function DangerZoneCard({ children }: React.PropsWithChildren) { return ( {children} ); }