import { 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 { z } from 'zod'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogClose, 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 SettingsSecurityPasskeyTableActionsProps = { className?: string; passkeyId: string; passkeyName: string; }; const ZUpdatePasskeySchema = z.object({ name: z.string(), }); type TUpdatePasskeySchema = z.infer; export const SettingsSecurityPasskeyTableActions = ({ className, passkeyId, passkeyName, }: SettingsSecurityPasskeyTableActionsProps) => { const { _ } = useLingui(); const { toast } = useToast(); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [isUpdateDialogOpen, setIsUpdateDialogOpen] = useState(false); const form = useForm({ resolver: zodResolver(ZUpdatePasskeySchema), defaultValues: { name: passkeyName, }, }); const { mutateAsync: updatePasskey, isPending: isUpdatingPasskey } = trpc.auth.updatePasskey.useMutation({ onSuccess: () => { toast({ title: _(msg`Success`), description: _(msg`Passkey has been updated`), }); setIsUpdateDialogOpen(false); }, onError: () => { toast({ title: _(msg`Something went wrong`), description: _( msg`We are unable to update this passkey at the moment. Please try again later.`, ), duration: 10000, variant: 'destructive', }); }, }); const { mutateAsync: deletePasskey, isPending: isDeletingPasskey } = trpc.auth.deletePasskey.useMutation({ onSuccess: () => { toast({ title: _(msg`Success`), description: _(msg`Passkey has been removed`), }); setIsDeleteDialogOpen(false); }, onError: () => { toast({ title: _(msg`Something went wrong`), description: _( msg`We are unable to remove this passkey at the moment. Please try again later.`, ), duration: 10000, variant: 'destructive', }); }, }); return (
!isUpdatingPasskey && setIsUpdateDialogOpen(value)} > e.stopPropagation()} asChild> Update passkey You are currently updating the {passkeyName} passkey.
updatePasskey({ passkeyId, name, }), )} >
( Name )} />
!isDeletingPasskey && setIsDeleteDialogOpen(value)} > e.stopPropagation()} asChild={true}> Delete passkey Are you sure you want to remove the {passkeyName} passkey.
); };