From bb98143e2e5333b562631096e222bad7eb6bff6e Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Tue, 20 May 2025 16:36:34 -0400 Subject: [PATCH] perf: Server Fetching for platform members and org members pages (#21342) * remove members page * refactor to server fetch * same for /members * use server fetches for all queires * fix * add skeletons * refactor * fix loading page * fix * fix type checks * fix details * refactor platform members page --- .../organizations/[id]/members/layout.tsx | 19 +++++++ .../organizations/[id]/members/loading.tsx | 5 ++ .../organizations/[id]/members/page.tsx | 22 ++++++-- .../settings/organizations/members/layout.tsx | 20 ++++++++ .../organizations/members/loading.tsx | 5 ++ .../settings/organizations/members/page.tsx | 32 ++++++------ .../settings/platform/members/layout.tsx | 33 ++++++++++++ .../settings/platform/members/loading.tsx | 5 ++ .../settings/platform/members/page.tsx | 25 +++++++++- apps/web/modules/members/members-view.tsx | 33 ++++++------ .../ee/organizations/pages/members.tsx | 30 ----------- .../ee/platform/pages/settings/members.tsx | 50 ++++--------------- .../components/UserTable/UserListTable.tsx | 35 ++++--------- .../UserTable/UserListTableSkeleton.tsx | 47 +++++++++++++++++ 14 files changed, 231 insertions(+), 130 deletions(-) create mode 100644 apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/layout.tsx create mode 100644 apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/loading.tsx create mode 100644 apps/web/app/(use-page-wrapper)/settings/organizations/members/layout.tsx create mode 100644 apps/web/app/(use-page-wrapper)/settings/organizations/members/loading.tsx create mode 100644 apps/web/app/(use-page-wrapper)/settings/platform/members/layout.tsx create mode 100644 apps/web/app/(use-page-wrapper)/settings/platform/members/loading.tsx delete mode 100644 packages/features/ee/organizations/pages/members.tsx create mode 100644 packages/features/users/components/UserTable/UserListTableSkeleton.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/layout.tsx new file mode 100644 index 0000000000..7403ef82cd --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/layout.tsx @@ -0,0 +1,19 @@ +import { getTranslate } from "app/_utils"; + +import { CTA_CONTAINER_CLASS_NAME } from "@calcom/features/data-table/lib/utils"; +import Shell from "@calcom/features/shell/Shell"; + +export default async function Layout({ children }: { children: React.ReactNode }) { + const t = await getTranslate(); + + return ( + }> + {children} + + ); +} diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/loading.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/loading.tsx new file mode 100644 index 0000000000..489822d2d6 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/loading.tsx @@ -0,0 +1,5 @@ +import { UserListTableSkeleton } from "@calcom/features/users/components/UserTable/UserListTableSkeleton"; + +export default function Loading() { + return ; +} diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/page.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/page.tsx index e22b5193d5..5e15a03a6a 100644 --- a/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/page.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/organizations/[id]/members/page.tsx @@ -1,6 +1,10 @@ +import { createRouterCaller } from "app/_trpc/context"; import { _generateMetadata } from "app/_utils"; -import MembersPage from "~/members/members-view"; +import { attributesRouter } from "@calcom/trpc/server/routers/viewer/attributes/_router"; +import { viewerOrganizationsRouter } from "@calcom/trpc/server/routers/viewer/organizations/_router"; + +import { MembersView } from "~/members/members-view"; export const generateMetadata = async ({ params }: { params: Promise<{ id: string }> }) => await _generateMetadata( @@ -11,8 +15,20 @@ export const generateMetadata = async ({ params }: { params: Promise<{ id: strin `/settings/organizations/${(await params).id}/members` ); -const ServerPageWrapper = () => { - return ; +const ServerPageWrapper = async () => { + const [orgCaller, attributesCaller] = await Promise.all([ + createRouterCaller(viewerOrganizationsRouter), + createRouterCaller(attributesRouter), + ]); + const [org, teams, facetedTeamValues, attributes] = await Promise.all([ + orgCaller.listCurrent(), + orgCaller.getTeams(), + orgCaller.getFacetedValues(), + attributesCaller.list(), + ]); + return ( + + ); }; export default ServerPageWrapper; diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/members/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/members/layout.tsx new file mode 100644 index 0000000000..deb88ac86d --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/organizations/members/layout.tsx @@ -0,0 +1,20 @@ +import SettingsLayoutAppDirClient from "app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient"; +import { getTranslate } from "app/_utils"; + +import { CTA_CONTAINER_CLASS_NAME } from "@calcom/features/data-table/lib/utils"; +import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; + +export default async function Layout({ children }: { children: React.ReactNode }) { + const t = await getTranslate(); + + return ( + + + {children} + + + ); +} diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/members/loading.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/members/loading.tsx new file mode 100644 index 0000000000..489822d2d6 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/organizations/members/loading.tsx @@ -0,0 +1,5 @@ +import { UserListTableSkeleton } from "@calcom/features/users/components/UserTable/UserListTableSkeleton"; + +export default function Loading() { + return ; +} diff --git a/apps/web/app/(use-page-wrapper)/settings/organizations/members/page.tsx b/apps/web/app/(use-page-wrapper)/settings/organizations/members/page.tsx index e097bc493a..6a499d66af 100644 --- a/apps/web/app/(use-page-wrapper)/settings/organizations/members/page.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/organizations/members/page.tsx @@ -1,9 +1,10 @@ -import SettingsLayoutAppDir from "app/(use-page-wrapper)/settings/(settings-layout)/layout"; -import { _generateMetadata, getTranslate } from "app/_utils"; +import { createRouterCaller } from "app/_trpc/context"; +import { _generateMetadata } from "app/_utils"; -import { CTA_CONTAINER_CLASS_NAME } from "@calcom/features/data-table/lib/utils"; -import LegacyPage from "@calcom/features/ee/organizations/pages/members"; -import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; +import { attributesRouter } from "@calcom/trpc/server/routers/viewer/attributes/_router"; +import { viewerOrganizationsRouter } from "@calcom/trpc/server/routers/viewer/organizations/_router"; + +import { MembersView } from "~/members/members-view"; export const generateMetadata = async () => await _generateMetadata( @@ -15,17 +16,20 @@ export const generateMetadata = async () => ); const Page = async () => { - const t = await getTranslate(); + const [orgCaller, attributesCaller] = await Promise.all([ + createRouterCaller(viewerOrganizationsRouter), + createRouterCaller(attributesRouter), + ]); + const [org, teams, facetedTeamValues, attributes] = await Promise.all([ + orgCaller.listCurrent(), + orgCaller.getTeams(), + orgCaller.getFacetedValues(), + attributesCaller.list(), + ]); - const children = ( - - - + return ( + ); - return await SettingsLayoutAppDir({ children, containerClassName: "lg:max-w-screen-2xl" }); }; export default Page; diff --git a/apps/web/app/(use-page-wrapper)/settings/platform/members/layout.tsx b/apps/web/app/(use-page-wrapper)/settings/platform/members/layout.tsx new file mode 100644 index 0000000000..76a42b69f9 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/platform/members/layout.tsx @@ -0,0 +1,33 @@ +import { getTranslate } from "app/_utils"; + +import { CTA_CONTAINER_CLASS_NAME } from "@calcom/features/data-table/lib/utils"; +import Shell from "@calcom/features/shell/Shell"; +import { Button } from "@calcom/ui/components/button"; + +export default async function Layout({ children }: { children: React.ReactNode }) { + const t = await getTranslate(); + + return ( + +

Member management

+