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.
+
+ >
) : (
<>