import { Plural, Trans } from '@lingui/react/macro'; import { TeamMemberRole } from '@prisma/client'; import { ChevronLeft, Users2 } from 'lucide-react'; import { Link, redirect } from 'react-router'; import { match } from 'ts-pattern'; import { getSession } from '@documenso/auth/server/lib/utils/get-session'; import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; import { getDocumentWithDetailsById } from '@documenso/lib/server-only/document/get-document-with-details-by-id'; import { type TGetTeamByUrlResponse, getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; import { DocumentVisibility } from '@documenso/lib/types/document-visibility'; import { isDocumentCompleted } from '@documenso/lib/utils/document'; import { formatDocumentsPath } from '@documenso/lib/utils/teams'; import { DocumentEditForm } from '~/components/general/document/document-edit-form'; import { DocumentStatus } from '~/components/general/document/document-status'; import { StackAvatarsWithTooltip } from '~/components/general/stack-avatars-with-tooltip'; import { superLoaderJson, useSuperLoaderData } from '~/utils/super-json-loader'; import type { Route } from './+types/documents.$id.edit'; export async function loader({ params, request }: Route.LoaderArgs) { const { user } = await getSession(request); let team: TGetTeamByUrlResponse | null = null; if (params.teamUrl) { team = await getTeamByUrl({ userId: user.id, teamUrl: params.teamUrl }); } const { id, folderId } = params; const documentId = Number(id); const documentRootPath = formatDocumentsPath(team?.url); if (!documentId || Number.isNaN(documentId)) { throw redirect(documentRootPath); } if (!folderId) { throw redirect(documentRootPath); } const document = await getDocumentWithDetailsById({ documentId, userId: user.id, teamId: team?.id, folderId, }).catch(() => null); if (document?.teamId && !team?.url) { throw redirect(documentRootPath); } const documentVisibility = document?.visibility; const currentTeamMemberRole = team?.currentTeamMember?.role; const isRecipient = document?.recipients.find((recipient) => recipient.email === user.email); let canAccessDocument = true; if (!isRecipient && document?.userId !== user.id) { canAccessDocument = match([documentVisibility, currentTeamMemberRole]) .with([DocumentVisibility.EVERYONE, TeamMemberRole.ADMIN], () => true) .with([DocumentVisibility.EVERYONE, TeamMemberRole.MANAGER], () => true) .with([DocumentVisibility.EVERYONE, TeamMemberRole.MEMBER], () => true) .with([DocumentVisibility.MANAGER_AND_ABOVE, TeamMemberRole.ADMIN], () => true) .with([DocumentVisibility.MANAGER_AND_ABOVE, TeamMemberRole.MANAGER], () => true) .with([DocumentVisibility.ADMIN, TeamMemberRole.ADMIN], () => true) .otherwise(() => false); } if (!document) { throw redirect(documentRootPath); } if (team && !canAccessDocument) { throw redirect(documentRootPath); } if (document.folderId !== folderId) { throw redirect(folderId ? `${documentRootPath}/f/${folderId}` : documentRootPath); } if (isDocumentCompleted(document.status)) { throw redirect(`${documentRootPath}/${documentId}`); } const isDocumentEnterprise = await isUserEnterprise({ userId: user.id, teamId: team?.id, }); return superLoaderJson({ document: { ...document, folder: null, }, documentRootPath, isDocumentEnterprise, folderId, }); } export default function DocumentEditPage() { const { document, documentRootPath, isDocumentEnterprise, folderId } = useSuperLoaderData(); const { recipients } = document; return (
Documents

{document.title}

{recipients.length > 0 && (
)}
); }