import { useEffect, useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router'; import { z } from 'zod'; import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { useSession } from '@documenso/lib/client-only/providers/session'; import { AppError } from '@documenso/lib/errors/app-error'; import { trpc } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@documenso/ui/primitives/dialog'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type OrganisationDeleteDialogProps = { trigger?: React.ReactNode; }; export const OrganisationDeleteDialog = ({ trigger }: OrganisationDeleteDialogProps) => { const navigate = useNavigate(); const [open, setOpen] = useState(false); const { _ } = useLingui(); const { toast } = useToast(); const { refreshSession } = useSession(); const organisation = useCurrentOrganisation(); const deleteMessage = _(msg`delete ${organisation.name}`); const ZDeleteOrganisationFormSchema = z.object({ organisationName: z.literal(deleteMessage, { errorMap: () => ({ message: _(msg`You must enter '${deleteMessage}' to proceed`) }), }), }); const form = useForm({ resolver: zodResolver(ZDeleteOrganisationFormSchema), defaultValues: { organisationName: '', }, }); const { mutateAsync: deleteOrganisation } = trpc.organisation.delete.useMutation(); const onFormSubmit = async () => { try { await deleteOrganisation({ organisationId: organisation.id }); toast({ title: _(msg`Success`), description: _(msg`Your organisation has been successfully deleted.`), duration: 5000, }); await navigate('/settings/organisations'); await refreshSession(); setOpen(false); } catch (err) { const error = AppError.parseError(err); console.error(error); toast({ title: _(msg`An unknown error occurred`), description: _( msg`We encountered an unknown error while attempting to delete this organisation. Please try again later.`, ), variant: 'destructive', duration: 10000, }); } }; useEffect(() => { if (!open) { form.reset(); } }, [open, form]); return ( !form.formState.isSubmitting && setOpen(value)}> {trigger ?? ( )} Are you sure you wish to delete this organisation? You are about to delete {organisation.name}. All data related to this organisation such as teams, documents, and all other resources will be deleted. This action is irreversible.
( Confirm by typing {deleteMessage} )} />
); };