import { useEffect, useState } from 'react'; import { Trans } from '@lingui/react/macro'; import { Bird, FolderIcon, HomeIcon, Loader2 } from 'lucide-react'; import { useNavigate, useSearchParams } from 'react-router'; import { FolderType } from '@documenso/lib/types/folder-type'; import { formatAvatarUrl } from '@documenso/lib/utils/avatars'; 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 { Avatar, AvatarFallback, AvatarImage } from '@documenso/ui/primitives/avatar'; import { Button } from '@documenso/ui/primitives/button'; import { TemplateCreateDialog } from '~/components/dialogs/template-create-dialog'; import { TemplateFolderCreateDialog } from '~/components/dialogs/template-folder-create-dialog'; import { TemplateFolderDeleteDialog } from '~/components/dialogs/template-folder-delete-dialog'; import { TemplateFolderMoveDialog } from '~/components/dialogs/template-folder-move-dialog'; import { TemplateFolderSettingsDialog } from '~/components/dialogs/template-folder-settings-dialog'; import { FolderCard } from '~/components/general/folder/folder-card'; import { TemplatesTable } from '~/components/tables/templates-table'; import { useOptionalCurrentTeam } from '~/providers/team'; import { appMetaTags } from '~/utils/meta'; export function meta() { return appMetaTags('Templates'); } export default function TemplatesPage() { const navigate = useNavigate(); const [searchParams] = useSearchParams(); 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 team = useOptionalCurrentTeam(); const { mutateAsync: pinFolder } = trpc.folder.pinFolder.useMutation(); const { mutateAsync: unpinFolder } = trpc.folder.unpinFolder.useMutation(); const page = Number(searchParams.get('page')) || 1; const perPage = Number(searchParams.get('perPage')) || 10; const documentRootPath = formatDocumentsPath(team?.url); const templateRootPath = formatTemplatesPath(team?.url); const { data, isLoading, isLoadingError, refetch } = trpc.template.findTemplates.useQuery({ page: page, perPage: perPage, }); const { data: foldersData, isLoading: isFoldersLoading, refetch: refetchFolders, } = trpc.folder.getFolders.useQuery({ type: FolderType.TEMPLATE, parentId: null, }); useEffect(() => { void refetch(); void refetchFolders(); }, [team?.url]); const navigateToFolder = (folderId?: string | null) => { const templatesPath = formatTemplatesPath(team?.url); if (folderId) { void navigate(`${templatesPath}/f/${folderId}`); } else { void navigate(templatesPath); } }; const handleNavigate = (folderId: string) => { navigateToFolder(folderId); }; const handleMove = (folder: TFolderWithSubfolders) => { setFolderToMove(folder); setIsMovingFolder(true); }; const handlePin = (folderId: string) => { void pinFolder({ folderId }); }; const handleUnpin = (folderId: string) => { void unpinFolder({ folderId }); }; const handleSettings = (folder: TFolderWithSubfolders) => { setFolderToSettings(folder); setIsSettingsFolderOpen(true); }; const handleDelete = (folder: TFolderWithSubfolders) => { setFolderToDelete(folder); setIsDeletingFolder(true); }; const handleViewAllFolders = () => { void navigate(`${formatTemplatesPath(team?.url)}/folders`); }; return (
{foldersData?.breadcrumbs.map((folder) => (
/
))}
{isFoldersLoading ? (
) : ( <> {foldersData?.folders && foldersData.folders.some((folder) => folder.pinned) && (
{foldersData.folders .filter((folder) => folder.pinned) .map((folder) => ( ))}
)}
{foldersData?.folders ?.filter((folder) => !folder.pinned) .slice(0, 12) .map((folder) => ( ))}
{foldersData && foldersData.folders?.length > 12 && ( )}
)}
{team && ( {team.avatarImageId && } {team.name.slice(0, 1)} )}

Templates

{data && data.count === 0 ? (

We're all empty

You have not yet created any templates. To create a template please upload one.

) : ( )}
{ setIsMovingFolder(open); if (!open) { setFolderToMove(null); } }} /> { setIsSettingsFolderOpen(open); if (!open) { setFolderToSettings(null); } }} /> { setIsDeletingFolder(open); if (!open) { setFolderToDelete(null); } }} />
); }