From cd667810d3eddd2d2c405d3cbc849aeae3c7c534 Mon Sep 17 00:00:00 2001 From: "M. Palanikannan" <73993394+Palanikannan1437@users.noreply.github.com> Date: Thu, 26 Jun 2025 13:16:10 +0530 Subject: [PATCH] [WIKI-494] Fix: feature flag for shared pages in sidebar (#3509) * fix: shared pages feature flag * fix: empty state --- .../(pageType)/shared/empty-shared-pages.tsx | 68 +++++++++++++++++++ .../(pages)/pages/(pageType)/shared/page.tsx | 16 ++++- .../pages/sidebar/section/section-root.tsx | 9 +++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 web/app/(all)/[workspaceSlug]/(pages)/pages/(pageType)/shared/empty-shared-pages.tsx diff --git a/web/app/(all)/[workspaceSlug]/(pages)/pages/(pageType)/shared/empty-shared-pages.tsx b/web/app/(all)/[workspaceSlug]/(pages)/pages/(pageType)/shared/empty-shared-pages.tsx new file mode 100644 index 0000000000..b0b7c7d598 --- /dev/null +++ b/web/app/(all)/[workspaceSlug]/(pages)/pages/(pageType)/shared/empty-shared-pages.tsx @@ -0,0 +1,68 @@ +"use client"; + +import { observer } from "mobx-react"; +import { Users, Crown } from "lucide-react"; +// plane imports +import { EUserWorkspaceRoles, EUserPermissionsLevel } from "@plane/constants"; +import { Button, getButtonStyling } from "@plane/ui"; +import { cn } from "@plane/utils"; +// hooks +import { useUserPermissions } from "@/hooks/store"; +// assets +import { useWorkspaceSubscription } from "@/plane-web/hooks/store"; + +export const SharedPagesFallback = observer(() => { + // store hooks + const { allowPermissions } = useUserPermissions(); + const { togglePaidPlanModal } = useWorkspaceSubscription(); + + // derived values + const canUpgrade = allowPermissions([EUserWorkspaceRoles.ADMIN], EUserPermissionsLevel.WORKSPACE); + + return ( +
+
+
+
+ +
+ +

Upgrade for Page Sharing

+

+ Collaborate seamlessly by sharing pages with your team members. Grant different access levels and work + together on your documentation and knowledge base. +

+ +
+
+ Share pages with your team +
+
+ Control access levels (view, edit) +
+
+ + {canUpgrade && ( +
+ + + Talk custom pricing + +
+ )} +
+
+
+ ); +}); diff --git a/web/app/(all)/[workspaceSlug]/(pages)/pages/(pageType)/shared/page.tsx b/web/app/(all)/[workspaceSlug]/(pages)/pages/(pageType)/shared/page.tsx index 8e368fbcd0..e947807ec2 100644 --- a/web/app/(all)/[workspaceSlug]/(pages)/pages/(pageType)/shared/page.tsx +++ b/web/app/(all)/[workspaceSlug]/(pages)/pages/(pageType)/shared/page.tsx @@ -1,8 +1,22 @@ "use client"; +import { useParams } from "next/navigation"; // plane web components +import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { WikiPagesListLayoutRoot } from "@/plane-web/components/pages"; +// local components +import { SharedPagesFallback } from "./empty-shared-pages"; export default function SharedPagesList() { - return ; + const { workspaceSlug } = useParams(); + + return ( + } + > + + + ); } diff --git a/web/ee/components/pages/sidebar/section/section-root.tsx b/web/ee/components/pages/sidebar/section/section-root.tsx index fb7238677d..38bebd4fec 100644 --- a/web/ee/components/pages/sidebar/section/section-root.tsx +++ b/web/ee/components/pages/sidebar/section/section-root.tsx @@ -15,6 +15,7 @@ import { useAppTheme } from "@/hooks/store"; import { useAppRouter } from "@/hooks/use-app-router"; // plane web hooks import { EPageStoreType, usePageStore } from "@/plane-web/hooks/store"; +import { useFlag } from "@/plane-web/hooks/store/use-flag"; // local imports import { SectionHeader, SectionContent } from "./components"; import { SECTION_DETAILS } from "./constants"; @@ -44,6 +45,14 @@ const WikiSidebarListSectionRootContent: React.FC = observer(( EPageStoreType.WORKSPACE ); + // feature flag check for shared pages + const isSharedPagesEnabled = useFlag(workspaceSlug?.toString(), "SHARED_PAGES", false); + + // Don't render shared section if feature flag is disabled + if (sectionType === "shared" && !isSharedPagesEnabled) { + return null; + } + // Custom hooks const { isDropping } = useSectionDragAndDrop(listSectionRef, getPageById, sectionType); const { isLoading } = useSectionPages(sectionType);