import { useEffect } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import type * as DialogPrimitive from '@radix-ui/react-dialog'; import { FolderIcon, HomeIcon } from 'lucide-react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { trpc } from '@documenso/trpc/react'; import type { TFolderWithSubfolders } from '@documenso/trpc/server/folder-router/schema'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@documenso/ui/primitives/dialog'; import { Form, FormControl, FormField, FormItem, FormMessage, } from '@documenso/ui/primitives/form/form'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type TemplateFolderMoveDialogProps = { foldersData: TFolderWithSubfolders[] | undefined; folder: TFolderWithSubfolders | null; isOpen: boolean; onOpenChange: (open: boolean) => void; } & Omit; const ZMoveFolderFormSchema = z.object({ targetFolderId: z.string().optional(), }); type TMoveFolderFormSchema = z.infer; export const TemplateFolderMoveDialog = ({ foldersData, folder, isOpen, onOpenChange, }: TemplateFolderMoveDialogProps) => { const { _ } = useLingui(); const { toast } = useToast(); const { mutateAsync: moveFolder } = trpc.folder.moveFolder.useMutation(); const form = useForm({ resolver: zodResolver(ZMoveFolderFormSchema), defaultValues: { targetFolderId: folder?.parentId ?? '', }, }); const onFormSubmit = async ({ targetFolderId }: TMoveFolderFormSchema) => { if (!folder) return; try { await moveFolder({ id: folder.id, parentId: targetFolderId ?? '', }); onOpenChange(false); toast({ title: 'Folder moved successfully', }); } catch (err) { const error = AppError.parseError(err); if (error.code === AppErrorCode.NOT_FOUND) { toast({ title: 'Folder not found', description: _(msg`The folder you are trying to move does not exist.`), variant: 'destructive', }); return; } toast({ title: 'Failed to move folder', description: _(msg`An unknown error occurred while moving the folder.`), variant: 'destructive', }); } }; useEffect(() => { if (!isOpen) { form.reset(); } }, [isOpen, form]); // Filter out the current folder and only show folders of the same type const filteredFolders = foldersData?.filter( (f) => f.id !== folder?.id && f.type === folder?.type, ); return ( Move Folder Select a destination for this folder.
(
{filteredFolders && filteredFolders.map((f) => ( ))}
)} />
); };