From 82deab41f4c25def5ae532569525bd96563371f6 Mon Sep 17 00:00:00 2001 From: Catalin Pit Date: Tue, 17 Dec 2024 08:03:08 +0200 Subject: [PATCH] fix: move permission check outside the document visibility component (#1543) PR created because of this comment https://github.com/documenso/documenso/pull/1521#discussion_r1881895305. --- .../document/document-visibility-select.tsx | 26 +++++++------------ .../primitives/document-flow/add-settings.tsx | 17 +++++++++--- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/packages/ui/components/document/document-visibility-select.tsx b/packages/ui/components/document/document-visibility-select.tsx index 854a03c2b..16871e57e 100644 --- a/packages/ui/components/document/document-visibility-select.tsx +++ b/packages/ui/components/document/document-visibility-select.tsx @@ -3,7 +3,6 @@ import React, { forwardRef } from 'react'; import { TeamMemberRole } from '@prisma/client'; import type { SelectProps } from '@radix-ui/react-select'; import { InfoIcon } from 'lucide-react'; -import { match } from 'ts-pattern'; import { DOCUMENT_VISIBILITY } from '@documenso/lib/constants/document-visibility'; import { DocumentVisibility } from '@documenso/lib/types/document-visibility'; @@ -17,26 +16,19 @@ import { import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitives/tooltip'; export type DocumentVisibilitySelectType = SelectProps & { - currentMemberRole?: string; + currentTeamMemberRole?: string; isTeamSettings?: boolean; disabled?: boolean; - visibility?: string; + canUpdateVisibility?: boolean; }; export const DocumentVisibilitySelect = forwardRef( - ({ currentMemberRole, isTeamSettings = false, disabled, visibility, ...props }, ref) => { - const canUpdateVisibility = match(currentMemberRole) - .with(TeamMemberRole.ADMIN, () => true) - .with( - TeamMemberRole.MANAGER, - () => - visibility === DocumentVisibility.EVERYONE || - visibility === DocumentVisibility.MANAGER_AND_ABOVE, - ) - .otherwise(() => false); - - const isAdmin = currentMemberRole === TeamMemberRole.ADMIN; - const isManager = currentMemberRole === TeamMemberRole.MANAGER; + ( + { currentTeamMemberRole, isTeamSettings = false, disabled, canUpdateVisibility, ...props }, + ref, + ) => { + const isAdmin = currentTeamMemberRole === TeamMemberRole.ADMIN; + const isManager = currentTeamMemberRole === TeamMemberRole.MANAGER; const canEdit = isTeamSettings || canUpdateVisibility; return ( @@ -51,7 +43,7 @@ export const DocumentVisibilitySelect = forwardRef {DOCUMENT_VISIBILITY.MANAGER_AND_ABOVE.value} diff --git a/packages/ui/primitives/document-flow/add-settings.tsx b/packages/ui/primitives/document-flow/add-settings.tsx index 2e8f908af..c5882482d 100644 --- a/packages/ui/primitives/document-flow/add-settings.tsx +++ b/packages/ui/primitives/document-flow/add-settings.tsx @@ -6,12 +6,13 @@ import { zodResolver } from '@hookform/resolvers/zod'; import { Trans } from '@lingui/macro'; import { InfoIcon } from 'lucide-react'; import { useForm } from 'react-hook-form'; +import { match } from 'ts-pattern'; import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; import { SUPPORTED_LANGUAGES } from '@documenso/lib/constants/i18n'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth'; -import type { TeamMemberRole } from '@documenso/prisma/client'; +import { DocumentVisibility, TeamMemberRole } from '@documenso/prisma/client'; import { DocumentStatus, type Field, type Recipient, SendStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { @@ -110,6 +111,16 @@ export const AddSettingsFormPartial = ({ (recipient) => recipient.sendStatus === SendStatus.SENT, ); + const canUpdateVisibility = match(currentTeamMemberRole) + .with(TeamMemberRole.ADMIN, () => true) + .with( + TeamMemberRole.MANAGER, + () => + document.visibility === DocumentVisibility.EVERYONE || + document.visibility === DocumentVisibility.MANAGER_AND_ABOVE, + ) + .otherwise(() => false); + // We almost always want to set the timezone to the user's local timezone to avoid confusion // when the document is signed. useEffect(() => { @@ -237,8 +248,8 @@ export const AddSettingsFormPartial = ({