import { useEffect, useState } from 'react'; import { Trans } from '@lingui/react/macro'; import { Bird, FolderIcon, HomeIcon, Loader2, PinIcon } from 'lucide-react'; import { useNavigate, useParams, 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 { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@documenso/ui/primitives/dropdown-menu'; import { FolderDeleteDialog } from '~/components/dialogs/folder-delete-dialog'; import { FolderMoveDialog } from '~/components/dialogs/folder-move-dialog'; import { FolderSettingsDialog } from '~/components/dialogs/folder-settings-dialog'; import { TemplateCreateDialog } from '~/components/dialogs/template-create-dialog'; import { TemplateFolderCreateDialog } from '~/components/dialogs/template-folder-create-dialog'; 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 [searchParams] = useSearchParams(); const { folderId } = useParams(); const navigate = useNavigate(); const team = useOptionalCurrentTeam(); 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, folderId: folderId, }); const { data: foldersData, isLoading: isFoldersLoading, refetch: refetchFolders, } = trpc.folder.getFolders.useQuery({ parentId: folderId, type: FolderType.TEMPLATE, }); const { mutateAsync: pinFolder } = trpc.folder.pinFolder.useMutation(); const { mutateAsync: unpinFolder } = trpc.folder.unpinFolder.useMutation(); const [folderToMove, setFolderToMove] = useState(null); const [isMovingFolder, setIsMovingFolder] = useState(false); const [folderToSettings, setFolderToSettings] = useState(null); const [isSettingsFolderOpen, setIsSettingsFolderOpen] = useState(false); const [folderToDelete, setFolderToDelete] = useState(null); const [isDeletingFolder, setIsDeletingFolder] = useState(false); useEffect(() => { void refetch(); void refetchFolders(); }, [team?.url]); const navigateToFolder = (folderId?: string) => { const templatesPath = formatTemplatesPath(team?.url); if (folderId) { void navigate(`${templatesPath}/f/${folderId}`); } else { void navigate(templatesPath); } }; return (
{foldersData?.breadcrumbs.map((folder) => (
/
))}
{isFoldersLoading ? (
) : ( <> {foldersData?.folders.some((folder) => folder.pinned) && (
{foldersData?.folders .filter((folder) => folder.pinned) .map((folder) => (
{ setFolderToMove(folder); setIsMovingFolder(true); }} > Move { void unpinFolder({ folderId: folder.id }); }} > Unpin { setFolderToSettings(folder); setIsSettingsFolderOpen(true); }} > Settings { setFolderToDelete(folder); setIsDeletingFolder(true); }} > Delete
))}
)}
{foldersData?.folders .filter((folder) => !folder.pinned) .map((folder) => (
{ setFolderToMove(folder); setIsMovingFolder(true); }} > Move { void pinFolder({ folderId: folder.id }); }} > Pin { setFolderToSettings(folder); setIsSettingsFolderOpen(true); }} > Settings { setFolderToDelete(folder); setIsDeletingFolder(true); }} > Delete
))}
)}
{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); } }} />
); }