"use client" import { zodResolver } from "@hookform/resolvers/zod" import type { Organization } from "better-auth/plugins/organization" import { Loader2 } from "lucide-react" import { type ComponentProps, useContext, useMemo } from "react" import { useForm } from "react-hook-form" import * as z from "zod" import { AuthUIContext } from "../../lib/auth-ui-provider" import { cn, getLocalizedError } from "../../lib/utils" import type { AuthLocalization } from "../../localization/auth-localization" import type { SettingsCardClassNames } from "../settings/shared/settings-card" import { Button } from "../ui/button" import { Card } from "../ui/card" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "../ui/dialog" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "../ui/form" import { Input } from "../ui/input" import { OrganizationCellView } from "./organization-cell-view" export interface DeleteOrganizationDialogProps extends ComponentProps { classNames?: SettingsCardClassNames localization?: AuthLocalization organization: Organization } export function DeleteOrganizationDialog({ classNames, localization: localizationProp, onOpenChange, organization, ...props }: DeleteOrganizationDialogProps) { const { authClient, account: accountOptions, hooks: { useListOrganizations }, localization: contextLocalization, navigate, toast, localizeErrors } = useContext(AuthUIContext) const localization = useMemo( () => ({ ...contextLocalization, ...localizationProp }), [contextLocalization, localizationProp] ) const { refetch: refetchOrganizations } = useListOrganizations() const formSchema = z.object({ slug: z .string() .min(1, { message: localization.SLUG_REQUIRED! }) .refine((val) => val === organization.slug, { message: localization.SLUG_DOES_NOT_MATCH! }) }) const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { slug: "" } }) const { isSubmitting } = form.formState const deleteOrganization = async () => { try { await authClient.organization.delete({ organizationId: organization.id, fetchOptions: { throw: true } }) await refetchOrganizations?.() toast({ variant: "success", message: localization.DELETE_ORGANIZATION_SUCCESS! }) navigate( `${accountOptions?.basePath}/${accountOptions?.viewPaths.ORGANIZATIONS}` ) onOpenChange?.(false) } catch (error) { toast({ variant: "error", message: getLocalizedError({ error, localization, localizeErrors }) }) } } return ( {localization?.DELETE_ORGANIZATION} {localization?.DELETE_ORGANIZATION_DESCRIPTION}
( { localization?.DELETE_ORGANIZATION_INSTRUCTIONS } {organization.slug} )} />
) }