From 37aabe7d1d2c19b2727d3b1c2f5902bb7bb50970 Mon Sep 17 00:00:00 2001 From: Akshita Goyal <36129505+gakshita@users.noreply.github.com> Date: Thu, 6 Nov 2025 18:50:45 +0530 Subject: [PATCH] [PAI-923] fix: implemented fetch key functions for auth layouts #8067 --- .../project-settings-member-defaults.tsx | 2 +- apps/web/core/constants/fetch-keys.ts | 54 ++++++++++++++++++- .../hooks/use-workspace-issue-properties.ts | 9 ++-- .../layouts/auth-layout/project-wrapper.tsx | 30 +++++++---- .../layouts/auth-layout/workspace-wrapper.tsx | 32 ++++++----- 5 files changed, 96 insertions(+), 31 deletions(-) diff --git a/apps/web/core/components/project/project-settings-member-defaults.tsx b/apps/web/core/components/project/project-settings-member-defaults.tsx index f20b1f16c..96f1c2656 100644 --- a/apps/web/core/components/project/project-settings-member-defaults.tsx +++ b/apps/web/core/components/project/project-settings-member-defaults.tsx @@ -64,7 +64,7 @@ export const ProjectSettingsMemberDefaults: React.FC({ defaultValues }); // fetching user members useSWR( - workspaceSlug && projectId ? PROJECT_MEMBERS(projectId) : null, + workspaceSlug && projectId ? PROJECT_MEMBERS(workspaceSlug, projectId) : null, workspaceSlug && projectId ? () => fetchProjectDetails(workspaceSlug, projectId) : null ); diff --git a/apps/web/core/constants/fetch-keys.ts b/apps/web/core/constants/fetch-keys.ts index a56ec52f3..f29b58a1d 100644 --- a/apps/web/core/constants/fetch-keys.ts +++ b/apps/web/core/constants/fetch-keys.ts @@ -49,13 +49,35 @@ const paramsToKey = (params: any) => { export const USER_WORKSPACES_LIST = "USER_WORKSPACES_LIST"; +export const WORKSPACE_PARTIAL_PROJECTS = (workspaceSlug: string) => + `WORKSPACE_PARTIAL_PROJECTS_${workspaceSlug.toUpperCase()}`; + export const WORKSPACE_MEMBERS = (workspaceSlug: string) => `WORKSPACE_MEMBERS_${workspaceSlug.toUpperCase()}`; +export const WORKSPACE_MODULES = (workspaceSlug: string) => `WORKSPACE_MODULES_${workspaceSlug.toUpperCase()}`; + +export const WORKSPACE_CYCLES = (workspaceSlug: string) => `WORKSPACE_CYCLES_${workspaceSlug.toUpperCase()}`; + +export const WORKSPACE_LABELS = (workspaceSlug: string) => `WORKSPACE_LABELS_${workspaceSlug.toUpperCase()}`; + +export const WORKSPACE_ESTIMATES = (workspaceSlug: string) => `WORKSPACE_ESTIMATES_${workspaceSlug.toUpperCase()}`; + export const WORKSPACE_INVITATION = (invitationId: string) => `WORKSPACE_INVITATION_${invitationId}`; -export const PROJECT_DETAILS = (projectId: string) => `PROJECT_DETAILS_${projectId.toUpperCase()}`; +export const WORKSPACE_MEMBER_ME_INFORMATION = (workspaceSlug: string) => + `WORKSPACE_MEMBER_ME_INFORMATION_${workspaceSlug.toUpperCase()}`; -export const PROJECT_MEMBERS = (projectId: string) => `PROJECT_MEMBERS_${projectId.toUpperCase()}`; +export const WORKSPACE_PROJECTS_ROLES_INFORMATION = (workspaceSlug: string) => + `WORKSPACE_PROJECTS_ROLES_INFORMATION_${workspaceSlug.toUpperCase()}`; + +export const WORKSPACE_FAVORITE = (workspaceSlug: string) => `WORKSPACE_FAVORITE_${workspaceSlug.toUpperCase()}`; + +export const WORKSPACE_STATES = (workspaceSlug: string) => `WORKSPACE_STATES_${workspaceSlug.toUpperCase()}`; + +export const WORKSPACE_SIDEBAR_PREFERENCES = (workspaceSlug: string) => + `WORKSPACE_SIDEBAR_PREFERENCES_${workspaceSlug.toUpperCase()}`; + +export const WORKSPACE_DB = (workspaceSlug: string) => `WORKSPACE_DB_${workspaceSlug.toUpperCase()}`; export const PROJECT_GITHUB_REPOSITORY = (projectId: string) => `PROJECT_GITHUB_REPOSITORY_${projectId.toUpperCase()}`; @@ -115,3 +137,31 @@ export const USER_PROFILE_PROJECT_SEGREGATION = (workspaceSlug: string, userId: // api-tokens export const API_TOKENS_LIST = `API_TOKENS_LIST`; + +// project level keys +export const PROJECT_DETAILS = (workspaceSlug: string, projectId: string) => + `PROJECT_DETAILS_${projectId.toString().toUpperCase()}`; + +export const PROJECT_ME_INFORMATION = (workspaceSlug: string, projectId: string) => + `PROJECT_ME_INFORMATION_${projectId.toString().toUpperCase()}`; + +export const PROJECT_LABELS = (workspaceSlug: string, projectId: string) => + `PROJECT_LABELS_${projectId.toString().toUpperCase()}`; + +export const PROJECT_MEMBERS = (workspaceSlug: string, projectId: string) => + `PROJECT_MEMBERS_${projectId.toString().toUpperCase()}`; + +export const PROJECT_STATES = (workspaceSlug: string, projectId: string) => + `PROJECT_STATES_${projectId.toString().toUpperCase()}`; + +export const PROJECT_ESTIMATES = (workspaceSlug: string, projectId: string) => + `PROJECT_ESTIMATES_${projectId.toString().toUpperCase()}`; + +export const PROJECT_ALL_CYCLES = (workspaceSlug: string, projectId: string) => + `PROJECT_ALL_CYCLES_${projectId.toString().toUpperCase()}`; + +export const PROJECT_MODULES = (workspaceSlug: string, projectId: string) => + `PROJECT_MODULES_${projectId.toString().toUpperCase()}`; + +export const PROJECT_VIEWS = (workspaceSlug: string, projectId: string) => + `PROJECT_VIEWS_${projectId.toString().toUpperCase()}`; diff --git a/apps/web/core/hooks/use-workspace-issue-properties.ts b/apps/web/core/hooks/use-workspace-issue-properties.ts index 01d8c9263..f1491f5a0 100644 --- a/apps/web/core/hooks/use-workspace-issue-properties.ts +++ b/apps/web/core/hooks/use-workspace-issue-properties.ts @@ -1,5 +1,6 @@ import useSWR from "swr"; // plane web imports +import { WORKSPACE_ESTIMATES, WORKSPACE_CYCLES, WORKSPACE_LABELS, WORKSPACE_MODULES } from "@/constants/fetch-keys"; import { useWorkspaceIssuePropertiesExtended } from "@/plane-web/hooks/use-workspace-issue-properties-extended"; // plane imports import { useProjectEstimates } from "./store/estimates"; @@ -18,28 +19,28 @@ export const useWorkspaceIssueProperties = (workspaceSlug: string | string[] | u // fetch workspace Modules useSWR( - workspaceSlug ? `WORKSPACE_MODULES_${workspaceSlug}` : null, + workspaceSlug ? WORKSPACE_MODULES(workspaceSlug.toString()) : null, workspaceSlug ? () => fetchWorkspaceModules(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetch workspace Cycles useSWR( - workspaceSlug ? `WORKSPACE_CYCLES_${workspaceSlug}` : null, + workspaceSlug ? WORKSPACE_CYCLES(workspaceSlug.toString()) : null, workspaceSlug ? () => fetchWorkspaceCycles(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetch workspace labels useSWR( - workspaceSlug ? `WORKSPACE_LABELS_${workspaceSlug}` : null, + workspaceSlug ? WORKSPACE_LABELS(workspaceSlug.toString()) : null, workspaceSlug ? () => fetchWorkspaceLabels(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetch workspace estimates useSWR( - workspaceSlug ? `WORKSPACE_ESTIMATES_${workspaceSlug}` : null, + workspaceSlug ? WORKSPACE_ESTIMATES(workspaceSlug.toString()) : null, workspaceSlug ? () => getWorkspaceEstimates(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); diff --git a/apps/web/core/layouts/auth-layout/project-wrapper.tsx b/apps/web/core/layouts/auth-layout/project-wrapper.tsx index cc4803946..f2371ffbd 100644 --- a/apps/web/core/layouts/auth-layout/project-wrapper.tsx +++ b/apps/web/core/layouts/auth-layout/project-wrapper.tsx @@ -13,6 +13,17 @@ import { EProjectNetwork } from "@plane/types"; import { JoinProject } from "@/components/auth-screens/project/join-project"; import { LogoSpinner } from "@/components/common/logo-spinner"; import { ETimeLineTypeType } from "@/components/gantt-chart/contexts"; +import { + PROJECT_DETAILS, + PROJECT_ME_INFORMATION, + PROJECT_LABELS, + PROJECT_MEMBERS, + PROJECT_STATES, + PROJECT_ESTIMATES, + PROJECT_ALL_CYCLES, + PROJECT_MODULES, + PROJECT_VIEWS, +} from "@/constants/fetch-keys"; import { captureClick } from "@/helpers/event-tracker.helper"; // hooks import { useProjectEstimates } from "@/hooks/store/estimates"; @@ -29,7 +40,6 @@ import { useTimeLineChart } from "@/hooks/use-timeline-chart"; // local import { persistence } from "@/local-db/storage.sqlite"; // plane web constants - interface IProjectAuthWrapper { workspaceSlug: string; projectId?: string; @@ -94,48 +104,48 @@ export const ProjectAuthWrapper: FC = observer((props) => { // fetching project details useSWR( - workspaceSlug && projectId ? `PROJECT_DETAILS_${workspaceSlug.toString()}_${projectId.toString()}` : null, + workspaceSlug && projectId ? PROJECT_DETAILS(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? () => fetchProjectDetails(workspaceSlug.toString(), projectId.toString()) : null ); // fetching user project member information useSWR( - workspaceSlug && projectId ? `PROJECT_ME_INFORMATION_${workspaceSlug}_${projectId}` : null, + workspaceSlug && projectId ? PROJECT_ME_INFORMATION(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? () => fetchUserProjectInfo(workspaceSlug.toString(), projectId.toString()) : null ); // fetching project labels useSWR( - workspaceSlug && projectId ? `PROJECT_LABELS_${workspaceSlug}_${projectId}` : null, + workspaceSlug && projectId ? PROJECT_LABELS(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? () => fetchProjectLabels(workspaceSlug.toString(), projectId.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetching project members useSWR( - workspaceSlug && projectId ? `PROJECT_MEMBERS_${workspaceSlug}_${projectId}` : null, + workspaceSlug && projectId ? PROJECT_MEMBERS(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? () => fetchProjectMembers(workspaceSlug.toString(), projectId.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetching project states useSWR( - workspaceSlug && projectId ? `PROJECT_STATES_${workspaceSlug}_${projectId}` : null, + workspaceSlug && projectId ? PROJECT_STATES(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? () => fetchProjectStates(workspaceSlug.toString(), projectId.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetching project estimates useSWR( - workspaceSlug && projectId ? `PROJECT_ESTIMATES_${workspaceSlug}_${projectId}` : null, + workspaceSlug && projectId ? PROJECT_ESTIMATES(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? () => getProjectEstimates(workspaceSlug.toString(), projectId.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetching project cycles useSWR( - workspaceSlug && projectId ? `PROJECT_ALL_CYCLES_${workspaceSlug}_${projectId}` : null, + workspaceSlug && projectId ? PROJECT_ALL_CYCLES(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? () => fetchAllCycles(workspaceSlug.toString(), projectId.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetching project modules useSWR( - workspaceSlug && projectId ? `PROJECT_MODULES_${workspaceSlug}_${projectId}` : null, + workspaceSlug && projectId ? PROJECT_MODULES(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? async () => { await fetchModulesSlim(workspaceSlug.toString(), projectId.toString()); @@ -146,7 +156,7 @@ export const ProjectAuthWrapper: FC = observer((props) => { ); // fetching project views useSWR( - workspaceSlug && projectId ? `PROJECT_VIEWS_${workspaceSlug}_${projectId}` : null, + workspaceSlug && projectId ? PROJECT_VIEWS(workspaceSlug.toString(), projectId.toString()) : null, workspaceSlug && projectId ? () => fetchViews(workspaceSlug.toString(), projectId.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); diff --git a/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx b/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx index 5b48a6992..050aefdd8 100644 --- a/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx +++ b/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx @@ -5,7 +5,6 @@ import { observer } from "mobx-react"; import Image from "next/image"; import Link from "next/link"; import { useParams } from "next/navigation"; -import { useTheme } from "next-themes"; import useSWR from "swr"; import useSWRImmutable from "swr/immutable"; // ui @@ -18,12 +17,20 @@ import { Tooltip } from "@plane/propel/tooltip"; // components import { cn } from "@plane/utils"; // assets -import PlaneBlackLogo from "@/app/assets/plane-logos/black-horizontal-with-blue-logo.png?url"; -import PlaneWhiteLogo from "@/app/assets/plane-logos/white-horizontal-with-blue-logo.png?url"; import WorkSpaceNotAvailable from "@/app/assets/workspace/workspace-not-available.png?url"; // components import { LogoSpinner } from "@/components/common/logo-spinner"; // hooks +import { + WORKSPACE_MEMBERS, + WORKSPACE_PARTIAL_PROJECTS, + WORKSPACE_MEMBER_ME_INFORMATION, + WORKSPACE_PROJECTS_ROLES_INFORMATION, + WORKSPACE_FAVORITE, + WORKSPACE_STATES, + WORKSPACE_SIDEBAR_PREFERENCES, + WORKSPACE_DB, +} from "@/constants/fetch-keys"; import { useFavorite } from "@/hooks/store/use-favorite"; import { useMember } from "@/hooks/store/use-member"; import { useProject } from "@/hooks/store/use-project"; @@ -43,8 +50,6 @@ export const WorkspaceAuthWrapper: FC = observer((props) const { children, isLoading: isParentLoading = false } = props; // router params const { workspaceSlug } = useParams(); - // next themes - const { resolvedTheme } = useTheme(); // store hooks const { signOut, data: currentUser } = useUser(); const { fetchPartialProjects } = useProject(); @@ -62,7 +67,6 @@ export const WorkspaceAuthWrapper: FC = observer((props) [EUserPermissions.ADMIN, EUserPermissions.MEMBER], EUserPermissionsLevel.WORKSPACE ); - const planeLogo = resolvedTheme === "dark" ? PlaneWhiteLogo : PlaneBlackLogo; const allWorkspaces = workspaces ? Object.values(workspaces) : undefined; const currentWorkspace = (allWorkspaces && allWorkspaces.find((workspace) => workspace?.slug === workspaceSlug)) || undefined; @@ -70,32 +74,32 @@ export const WorkspaceAuthWrapper: FC = observer((props) // fetching user workspace information useSWR( - workspaceSlug && currentWorkspace ? `WORKSPACE_MEMBER_ME_INFORMATION_${workspaceSlug}` : null, + workspaceSlug && currentWorkspace ? WORKSPACE_MEMBER_ME_INFORMATION(workspaceSlug.toString()) : null, workspaceSlug && currentWorkspace ? () => fetchUserWorkspaceInfo(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); useSWR( - workspaceSlug && currentWorkspace ? `WORKSPACE_PROJECTS_ROLES_INFORMATION_${workspaceSlug}` : null, + workspaceSlug && currentWorkspace ? WORKSPACE_PROJECTS_ROLES_INFORMATION(workspaceSlug.toString()) : null, workspaceSlug && currentWorkspace ? () => fetchUserProjectPermissions(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetching workspace projects useSWR( - workspaceSlug && currentWorkspace ? `WORKSPACE_PARTIAL_PROJECTS_${workspaceSlug}` : null, + workspaceSlug && currentWorkspace ? WORKSPACE_PARTIAL_PROJECTS(workspaceSlug.toString()) : null, workspaceSlug && currentWorkspace ? () => fetchPartialProjects(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetch workspace members useSWR( - workspaceSlug && currentWorkspace ? `WORKSPACE_MEMBERS_${workspaceSlug}` : null, + workspaceSlug && currentWorkspace ? WORKSPACE_MEMBERS(workspaceSlug.toString()) : null, workspaceSlug && currentWorkspace ? () => fetchWorkspaceMembers(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetch workspace favorite useSWR( workspaceSlug && currentWorkspace && canPerformWorkspaceMemberActions - ? `WORKSPACE_FAVORITE_${workspaceSlug}` + ? WORKSPACE_FAVORITE(workspaceSlug.toString()) : null, workspaceSlug && currentWorkspace && canPerformWorkspaceMemberActions ? () => fetchFavorite(workspaceSlug.toString()) @@ -104,21 +108,21 @@ export const WorkspaceAuthWrapper: FC = observer((props) ); // fetch workspace states useSWR( - workspaceSlug ? `WORKSPACE_STATES_${workspaceSlug}` : null, + workspaceSlug ? WORKSPACE_STATES(workspaceSlug.toString()) : null, workspaceSlug ? () => fetchWorkspaceStates(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetch workspace sidebar preferences useSWR( - workspaceSlug ? `WORKSPACE_SIDEBAR_PREFERENCES_${workspaceSlug}` : null, + workspaceSlug ? WORKSPACE_SIDEBAR_PREFERENCES(workspaceSlug.toString()) : null, workspaceSlug ? () => fetchSidebarNavigationPreferences(workspaceSlug.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // initialize the local database const { isLoading: isDBInitializing } = useSWRImmutable( - workspaceSlug ? `WORKSPACE_DB_${workspaceSlug}` : null, + workspaceSlug ? WORKSPACE_DB(workspaceSlug.toString()) : null, workspaceSlug ? async () => { // persistence.reset();