From ad028947e0ec14bce745f08a2394e1a9e60b3c35 Mon Sep 17 00:00:00 2001 From: Piyush Gupta <56182734+gupta-piyush19@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:01:39 +0530 Subject: [PATCH] fix: new survey button visible to viewers (#3065) --- .../surveys/templates/page.tsx | 12 +++++++++ .../components/EnvironmentLayout.tsx | 1 + .../components/TopControlBar.tsx | 10 +++++++- .../components/TopControlButtons.tsx | 25 +++++++++++-------- .../[environmentId]/surveys/page.tsx | 9 +++++++ 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/templates/page.tsx b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/templates/page.tsx index 1de26ec9ec..9349a84cbe 100644 --- a/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/templates/page.tsx +++ b/apps/web/app/(app)/(survey-editor)/environments/[environmentId]/surveys/templates/page.tsx @@ -1,6 +1,9 @@ import { getServerSession } from "next-auth"; +import { redirect } from "next/navigation"; import { authOptions } from "@formbricks/lib/authOptions"; import { getEnvironment } from "@formbricks/lib/environment/service"; +import { getMembershipByUserIdOrganizationId } from "@formbricks/lib/membership/service"; +import { getAccessFlags } from "@formbricks/lib/membership/utils"; import { getProductByEnvironmentId } from "@formbricks/lib/product/service"; import { getUser } from "@formbricks/lib/user/service"; import { TProductConfigChannel, TProductConfigIndustry } from "@formbricks/types/product"; @@ -43,6 +46,15 @@ const Page = async ({ params, searchParams }: SurveyTemplateProps) => { if (!environment) { throw new Error("Environment not found"); } + const currentUserMembership = await getMembershipByUserIdOrganizationId( + session?.user.id, + product.organizationId + ); + const { isViewer } = getAccessFlags(currentUserMembership?.role); + + if (isViewer) { + return redirect(`/environments/${environment.id}/surveys`); + } const prefilledFilters = [product.config.channel, product.config.industry, searchParams.role ?? null]; diff --git a/apps/web/app/(app)/environments/[environmentId]/components/EnvironmentLayout.tsx b/apps/web/app/(app)/environments/[environmentId]/components/EnvironmentLayout.tsx index ec311d0236..d3238597cf 100644 --- a/apps/web/app/(app)/environments/[environmentId]/components/EnvironmentLayout.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/components/EnvironmentLayout.tsx @@ -102,6 +102,7 @@ export const EnvironmentLayout = async ({ environmentId, session, children }: En environment={environment} environments={environments} currentProductChannel={currentProductChannel} + membershipRole={currentUserMembership?.role} />
{children}
diff --git a/apps/web/app/(app)/environments/[environmentId]/components/TopControlBar.tsx b/apps/web/app/(app)/environments/[environmentId]/components/TopControlBar.tsx index 02055cb50a..bcd7c99fd2 100644 --- a/apps/web/app/(app)/environments/[environmentId]/components/TopControlBar.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/components/TopControlBar.tsx @@ -2,15 +2,22 @@ import { TopControlButtons } from "@/app/(app)/environments/[environmentId]/comp import { WidgetStatusIndicator } from "@/app/(app)/environments/[environmentId]/components/WidgetStatusIndicator"; import { IS_FORMBRICKS_CLOUD } from "@formbricks/lib/constants"; import { TEnvironment } from "@formbricks/types/environment"; +import { TMembershipRole } from "@formbricks/types/memberships"; import { TProductConfigChannel } from "@formbricks/types/product"; interface SideBarProps { environment: TEnvironment; environments: TEnvironment[]; currentProductChannel: TProductConfigChannel; + membershipRole?: TMembershipRole; } -export const TopControlBar = ({ environment, environments, currentProductChannel }: SideBarProps) => { +export const TopControlBar = ({ + environment, + environments, + currentProductChannel, + membershipRole, +}: SideBarProps) => { return (
@@ -28,6 +35,7 @@ export const TopControlBar = ({ environment, environments, currentProductChannel environment={environment} environments={environments} isFormbricksCloud={IS_FORMBRICKS_CLOUD} + membershipRole={membershipRole} />
diff --git a/apps/web/app/(app)/environments/[environmentId]/components/TopControlButtons.tsx b/apps/web/app/(app)/environments/[environmentId]/components/TopControlButtons.tsx index b52e7d722f..c8d10049a4 100644 --- a/apps/web/app/(app)/environments/[environmentId]/components/TopControlButtons.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/components/TopControlButtons.tsx @@ -5,18 +5,21 @@ import { CircleUserIcon, MessageCircleQuestionIcon, PlusIcon } from "lucide-reac import { useRouter } from "next/navigation"; import formbricks from "@formbricks/js/app"; import { TEnvironment } from "@formbricks/types/environment"; +import { TMembershipRole } from "@formbricks/types/memberships"; import { Button } from "@formbricks/ui/Button"; interface TopControlButtonsProps { environment: TEnvironment; environments: TEnvironment[]; isFormbricksCloud: boolean; + membershipRole?: TMembershipRole; } export const TopControlButtons = ({ environment, environments, isFormbricksCloud, + membershipRole, }: TopControlButtonsProps) => { const router = useRouter(); return ( @@ -44,16 +47,18 @@ export const TopControlButtons = ({ }}> - + {membershipRole && membershipRole !== "viewer" ? ( + + ) : null} ); }; diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/page.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/page.tsx index d49d2778cc..3e7ca70495 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/page.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/page.tsx @@ -90,6 +90,15 @@ const Page = async ({ params, searchParams }: SurveyTemplateProps) => { currentProductChannel={currentProductChannel} /> + ) : isViewer ? ( + <> +

No surveys created yet.

+ +

+ As a Viewer you are not allowed to create surveys. Please ask an Editor to create a survey or an + Admin to upgrade your role. +

+ ) : ( <>