From 04a91dc71abce0df1c7116cd94447dc248e31b5a Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Tue, 2 Sep 2025 12:46:05 -0400 Subject: [PATCH] perf: server side fetching for /settings/my-account/conferencing (#23358) * wip * fix * refactor --- .../my-account/conferencing/loading.tsx | 5 ++ .../my-account/conferencing/page.tsx | 22 +++++- .../ConferencingAppsViewWebWrapper.tsx | 73 ++++++++++++------- 3 files changed, 72 insertions(+), 28 deletions(-) create mode 100644 apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/conferencing/loading.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/conferencing/loading.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/conferencing/loading.tsx new file mode 100644 index 0000000000..40bb0e3205 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/conferencing/loading.tsx @@ -0,0 +1,5 @@ +import { SkeletonLoader } from "@calcom/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper"; + +export default function Loading() { + return ; +} diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/conferencing/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/conferencing/page.tsx index 300fa17c15..ebb7bd810f 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/conferencing/page.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/conferencing/page.tsx @@ -1,6 +1,9 @@ +import { createRouterCaller } from "app/_trpc/context"; import { _generateMetadata } from "app/_utils"; import { ConferencingAppsViewWebWrapper } from "@calcom/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper"; +import { appsRouter } from "@calcom/trpc/server/routers/viewer/apps/_router"; +import { eventTypesRouter } from "@calcom/trpc/server/routers/viewer/eventTypes/_router"; export const generateMetadata = async () => await _generateMetadata( @@ -12,7 +15,24 @@ export const generateMetadata = async () => ); const Page = async () => { - return ; + const [appsCaller, eventTypesCaller] = await Promise.all([ + createRouterCaller(appsRouter), + createRouterCaller(eventTypesRouter), + ]); + + const [integrations, defaultConferencingApp, eventTypesQueryData] = await Promise.all([ + appsCaller.integrations({ variant: "conferencing", onlyInstalled: true }), + appsCaller.getUsersDefaultConferencingApp(), + eventTypesCaller.bulkEventFetch(), + ]); + + return ( + + ); }; export default Page; diff --git a/packages/platform/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper.tsx b/packages/platform/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper.tsx index 6da033c0eb..6f78be2c89 100644 --- a/packages/platform/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper.tsx +++ b/packages/platform/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper.tsx @@ -1,12 +1,13 @@ "use client"; -import { useReducer, Suspense } from "react"; +import { useReducer } from "react"; import { AppList } from "@calcom/features/apps/components/AppList"; import DisconnectIntegrationModal from "@calcom/features/apps/components/DisconnectIntegrationModal"; import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; +import type { RouterOutputs } from "@calcom/trpc/react"; import { Button } from "@calcom/ui/components/button"; import { EmptyScreen } from "@calcom/ui/components/empty-screen"; import { SkeletonText, SkeletonContainer } from "@calcom/ui/components/skeleton"; @@ -22,39 +23,46 @@ export type UpdateUsersDefaultConferencingAppParams = { export type BulkUpdatParams = { eventTypeIds: number[]; callback: () => void }; type RemoveAppParams = { credentialId: number; teamId?: number; callback: () => void }; -const SkeletonLoader = () => { +export const SkeletonLoader = () => { + const { t } = useLocale(); return ( - -
- - -
-
+ } + borderInShellHeader={true}> + +
+ + +
+
+
); }; -const InstalledConferencingApps = ({ +type IntegrationsOutput = RouterOutputs["viewer"]["apps"]["integrations"]; +type DefaultConferencingApp = RouterOutputs["viewer"]["apps"]["getUsersDefaultConferencingApp"] | undefined; +type EventTypesList = RouterOutputs["viewer"]["eventTypes"]["bulkEventFetch"]["eventTypes"]; + +export const InstalledConferencingApps = ({ disconnectIntegrationModalCtrl, + integrations, + defaultConferencingApp, + eventTypes, }: { disconnectIntegrationModalCtrl: ReturnType; + integrations: IntegrationsOutput; + defaultConferencingApp: DefaultConferencingApp; + eventTypes: EventTypesList; }) => { const { t } = useLocale(); const utils = trpc.useUtils(); - const { data: defaultConferencingApp } = trpc.viewer.apps.getUsersDefaultConferencingApp.useQuery(); - const updateDefaultAppMutation = trpc.viewer.apps.updateUserDefaultConferencingApp.useMutation(); const updateLocationsMutation = trpc.viewer.eventTypes.bulkUpdateToDefaultLocation.useMutation(); - const { data: eventTypesQueryData, isFetching: isEventTypesFetching } = - trpc.viewer.eventTypes.bulkEventFetch.useQuery(); - - const [result] = trpc.viewer.apps.integrations.useSuspenseQuery({ - variant: "conferencing", - onlyInstalled: true, - }); - const handleConnectDisconnectIntegrationMenuToggle = () => { utils.viewer.apps.integrations.invalidate(); }; @@ -99,7 +107,7 @@ const InstalledConferencingApps = ({ ); }; - if (result.items.length === 0) { + if (integrations.items.length === 0) { return ( @@ -179,7 +187,15 @@ const AddConferencingButton = () => { ); }; -export const ConferencingAppsViewWebWrapper = () => { +export const ConferencingAppsViewWebWrapper = ({ + integrations, + defaultConferencingApp, + eventTypes, +}: { + integrations: IntegrationsOutput; + defaultConferencingApp: DefaultConferencingApp; + eventTypes: EventTypesList; +}) => { const { t } = useLocale(); const utils = trpc.useUtils(); @@ -213,9 +229,12 @@ export const ConferencingAppsViewWebWrapper = () => { borderInShellHeader={true}> <>
- }> - - +