import { useEffect, useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { useLingui } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro'; import type * as DialogPrimitive from '@radix-ui/react-dialog'; import { FolderIcon, HomeIcon, Search } 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 { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type FolderMoveDialogProps = { foldersData: TFolderWithSubfolders[] | undefined; folder: TFolderWithSubfolders | null; isOpen: boolean; onOpenChange: (open: boolean) => void; } & Omit; const ZMoveFolderFormSchema = z.object({ targetFolderId: z.string().nullable(), }); type TMoveFolderFormSchema = z.infer; export const FolderMoveDialog = ({ foldersData, folder, isOpen, onOpenChange, }: FolderMoveDialogProps) => { const { t } = useLingui(); const { toast } = useToast(); const [searchTerm, setSearchTerm] = useState(''); const { mutateAsync: moveFolder } = trpc.folder.moveFolder.useMutation(); const form = useForm({ resolver: zodResolver(ZMoveFolderFormSchema), defaultValues: { targetFolderId: folder?.parentId ?? null, }, }); const onFormSubmit = async ({ targetFolderId }: TMoveFolderFormSchema) => { if (!folder) return; try { await moveFolder({ id: folder.id, parentId: targetFolderId || null, }); onOpenChange(false); toast({ title: t`Folder moved successfully`, }); } catch (err) { const error = AppError.parseError(err); if (error.code === AppErrorCode.NOT_FOUND) { toast({ title: t`Folder not found`, description: t`The folder you are trying to move does not exist.`, variant: 'destructive', }); return; } toast({ title: t`Failed to move folder`, description: t`An unknown error occurred while moving the folder.`, variant: 'destructive', }); } }; useEffect(() => { if (!isOpen) { form.reset(); setSearchTerm(''); } }, [isOpen, form]); // Filter out the current folder, only show folders of the same type, and filter by search term const filteredFolders = foldersData?.filter( (f) => f.id !== folder?.id && f.type === folder?.type && (searchTerm === '' || f.name.toLowerCase().includes(searchTerm.toLowerCase())), ); return ( Move Folder Select a destination for this folder.
setSearchTerm(e.target.value)} className="pl-8" />
(
{filteredFolders && filteredFolders.map((f) => ( ))}
)} />
); };