import { useState } from 'react'; import { Trans } from '@lingui/react/macro'; import { FolderType } from '@prisma/client'; import { FolderIcon, HomeIcon } from 'lucide-react'; import { Link } from 'react-router'; import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { IS_ENVELOPES_ENABLED } from '@documenso/lib/constants/app'; import { formatDocumentsPath, formatTemplatesPath } from '@documenso/lib/utils/teams'; import { trpc } from '@documenso/trpc/react'; import { type TFolderWithSubfolders } from '@documenso/trpc/server/folder-router/schema'; import { Skeleton } from '@documenso/ui/primitives/skeleton'; import { FolderCreateDialog } from '~/components/dialogs/folder-create-dialog'; import { FolderDeleteDialog } from '~/components/dialogs/folder-delete-dialog'; import { FolderMoveDialog } from '~/components/dialogs/folder-move-dialog'; import { FolderUpdateDialog } from '~/components/dialogs/folder-update-dialog'; import { TemplateCreateDialog } from '~/components/dialogs/template-create-dialog'; import { DocumentUploadButton } from '~/components/general/document/document-upload-button'; import { FolderCard, FolderCardEmpty } from '~/components/general/folder/folder-card'; import { useCurrentTeam } from '~/providers/team'; import { EnvelopeUploadButton } from '../document/envelope-upload-button'; export type FolderGridProps = { type: FolderType; parentId: string | null; }; export const FolderGrid = ({ type, parentId }: FolderGridProps) => { const team = useCurrentTeam(); const organisation = useCurrentOrganisation(); const [isMovingFolder, setIsMovingFolder] = useState(false); const [folderToMove, setFolderToMove] = useState(null); const [isDeletingFolder, setIsDeletingFolder] = useState(false); const [folderToDelete, setFolderToDelete] = useState(null); const [isSettingsFolderOpen, setIsSettingsFolderOpen] = useState(false); const [folderToSettings, setFolderToSettings] = useState(null); const { data: foldersData, isPending } = trpc.folder.getFolders.useQuery({ type, parentId, }); const formatBreadCrumbPath = (folderId: string) => { const rootPath = type === FolderType.DOCUMENT ? formatDocumentsPath(team.url) : formatTemplatesPath(team.url); return `${rootPath}/f/${folderId}`; }; const formatViewAllFoldersPath = () => { const rootPath = type === FolderType.DOCUMENT ? formatDocumentsPath(team.url) : formatTemplatesPath(team.url); return `${rootPath}/folders`; }; const formatRootPath = () => { return type === FolderType.DOCUMENT ? formatDocumentsPath(team.url) : formatTemplatesPath(team.url); }; const pinnedFolders = foldersData?.folders.filter((folder) => folder.pinned) || []; const unpinnedFolders = foldersData?.folders.filter((folder) => !folder.pinned) || []; return (
Home {isPending && parentId ? (
) : ( foldersData?.breadcrumbs.map((folder) => (
/ {folder.name}
)) )}
{(IS_ENVELOPES_ENABLED || organisation.organisationClaim.flags.allowEnvelopes) && ( )} {type === FolderType.DOCUMENT ? ( ) : ( )}
{isPending ? (
{Array.from({ length: 4 }).map((_, index) => (
))}
) : foldersData && foldersData.folders.length === 0 ? (
} />
) : ( foldersData && (
{pinnedFolders.length > 0 && (
{pinnedFolders.map((folder) => ( { setFolderToMove(folder); setIsMovingFolder(true); }} onSettings={(folder) => { setFolderToSettings(folder); setIsSettingsFolderOpen(true); }} onDelete={(folder) => { setFolderToDelete(folder); setIsDeletingFolder(true); }} /> ))}
)} {unpinnedFolders.length > 0 && (
{unpinnedFolders.slice(0, 12).map((folder) => ( { setFolderToMove(folder); setIsMovingFolder(true); }} onSettings={(folder) => { setFolderToSettings(folder); setIsSettingsFolderOpen(true); }} onDelete={(folder) => { setFolderToDelete(folder); setIsDeletingFolder(true); }} /> ))}
)} {foldersData.folders.length > 12 && (
View all folders
)}
) )} { setIsMovingFolder(open); if (!open) { setFolderToMove(null); } }} /> { setIsSettingsFolderOpen(open); if (!open) { setFolderToSettings(null); } }} /> {folderToDelete && ( { setIsDeletingFolder(open); if (!open) { setFolderToDelete(null); } }} /> )}
); };