From 5972a6f77f3dc60a6433575b18adeecab19485b0 Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Wed, 16 Apr 2025 09:59:18 -0400 Subject: [PATCH] perf: Fetch data server-side for Webhook Create page (#20675) * perf: fetch data server-side for create webhooks page * refactor * refactor * refactor * improve skeleton styling * fix styling --- .../webhooks/(with-loader)/loading.tsx | 13 +---- .../developer/webhooks/(with-loader)/page.tsx | 15 +----- .../developer/webhooks/new/loading.tsx | 5 ++ .../developer/webhooks/new/page.tsx | 31 ++++++------ .../webhooks/pages/webhook-new-skeleton.tsx | 24 ++++++++++ .../webhooks/pages/webhook-new-view.tsx | 48 +++++++------------ .../webhooks/pages/webhooks-skeleton.tsx | 24 ++++++++++ .../features/webhooks/pages/webhooks-view.tsx | 31 ++++-------- 8 files changed, 100 insertions(+), 91 deletions(-) create mode 100644 apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/loading.tsx create mode 100644 packages/features/webhooks/pages/webhook-new-skeleton.tsx create mode 100644 packages/features/webhooks/pages/webhooks-skeleton.tsx diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/loading.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/loading.tsx index ebd2717b55..14f36df7dd 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/loading.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/loading.tsx @@ -1,14 +1,5 @@ -import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; -import { SkeletonLoader } from "@calcom/features/webhooks/pages/webhooks-view"; +import { SkeletonLoader } from "@calcom/features/webhooks/pages/webhooks-skeleton"; export default function Loading() { - return ( - - - - ); + return ; } diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/page.tsx index 12ccfde849..f22437b86a 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/page.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/page.tsx @@ -1,11 +1,9 @@ import { createRouterCaller } from "app/_trpc/context"; -import { _generateMetadata, getTranslate } from "app/_utils"; +import { _generateMetadata } from "app/_utils"; import { cookies, headers } from "next/headers"; import { redirect } from "next/navigation"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; -import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; -import { CreateNewWebhookButton } from "@calcom/features/webhooks/components"; import WebhooksView from "@calcom/features/webhooks/pages/webhooks-view"; import { APP_NAME } from "@calcom/lib/constants"; import { UserPermissionRole } from "@calcom/prisma/enums"; @@ -25,20 +23,11 @@ const WebhooksViewServerWrapper = async () => { redirect("/auth/login"); } - const t = await getTranslate(); const isAdmin = session.user.role === UserPermissionRole.ADMIN; const caller = await createRouterCaller(webhookRouter); const data = await caller.getByViewer(); - return ( - 0 ? : null} - borderInShellHeader={(data && data.profiles.length === 1) || !data?.webhookGroups?.length}> - - - ); + return ; }; export default WebhooksViewServerWrapper; diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/loading.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/loading.tsx new file mode 100644 index 0000000000..8d9abaffc5 --- /dev/null +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/loading.tsx @@ -0,0 +1,5 @@ +import { SkeletonLoader } from "@calcom/features/webhooks/pages/webhook-new-skeleton"; + +export default function Loading() { + return ; +} diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/page.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/page.tsx index 12ca114d3e..3688adefc5 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/page.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/new/page.tsx @@ -1,9 +1,10 @@ -import { getTranslate, _generateMetadata } from "app/_utils"; -import { Suspense } from "react"; +import { createRouterCaller } from "app/_trpc/context"; +import { _generateMetadata } from "app/_utils"; -import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; -import { NewWebhookView, SkeletonLoader } from "@calcom/features/webhooks/pages/webhook-new-view"; +import { NewWebhookView } from "@calcom/features/webhooks/pages/webhook-new-view"; import { APP_NAME } from "@calcom/lib/constants"; +import { appsRouter } from "@calcom/trpc/server/routers/viewer/apps/_router"; +import { webhookRouter } from "@calcom/trpc/server/routers/viewer/webhook/_router"; export const generateMetadata = async () => await _generateMetadata( @@ -12,19 +13,17 @@ export const generateMetadata = async () => ); const Page = async () => { - const t = await getTranslate(); + const [appsCaller, webhookCaller] = await Promise.all([ + createRouterCaller(appsRouter), + createRouterCaller(webhookRouter), + ]); - return ( - - }> - - - - ); + const [installedApps, webhooks] = await Promise.all([ + appsCaller.integrations({ variant: "other", onlyInstalled: true }), + webhookCaller.list(), + ]); + + return ; }; export default Page; diff --git a/packages/features/webhooks/pages/webhook-new-skeleton.tsx b/packages/features/webhooks/pages/webhook-new-skeleton.tsx new file mode 100644 index 0000000000..314466c8a8 --- /dev/null +++ b/packages/features/webhooks/pages/webhook-new-skeleton.tsx @@ -0,0 +1,24 @@ +"use client"; + +import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; +import { APP_NAME } from "@calcom/lib/constants"; +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { SkeletonText, SkeletonContainer } from "@calcom/ui/components/skeleton"; + +export const SkeletonLoader = () => { + const { t } = useLocale(); + return ( + + +
+ + +
+
+
+ ); +}; diff --git a/packages/features/webhooks/pages/webhook-new-view.tsx b/packages/features/webhooks/pages/webhook-new-view.tsx index 2a5df6ed46..c2f5551197 100644 --- a/packages/features/webhooks/pages/webhook-new-view.tsx +++ b/packages/features/webhooks/pages/webhook-new-view.tsx @@ -3,10 +3,12 @@ import { useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; +import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; +import { APP_NAME } from "@calcom/lib/constants"; import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; -import { SkeletonText, SkeletonContainer } from "@calcom/ui/components/skeleton"; +import type { RouterOutputs } from "@calcom/trpc/react"; import { showToast } from "@calcom/ui/components/toast"; import { revalidateWebhooksList } from "@calcom/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/(with-loader)/actions"; @@ -14,18 +16,12 @@ import type { WebhookFormSubmitData } from "../components/WebhookForm"; import WebhookForm from "../components/WebhookForm"; import { subscriberUrlReserved } from "../lib/subscriberUrlReserved"; -export const SkeletonLoader = () => { - return ( - -
- - -
-
- ); +type Props = { + webhooks: RouterOutputs["viewer"]["webhook"]["list"]; + installedApps: RouterOutputs["viewer"]["apps"]["integrations"]; }; -export const NewWebhookView = () => { +export const NewWebhookView = ({ webhooks, installedApps }: Props) => { const searchParams = useCompatSearchParams(); const { t } = useLocale(); const utils = trpc.useUtils(); @@ -35,18 +31,6 @@ export const NewWebhookView = () => { const teamId = searchParams?.get("teamId") ? Number(searchParams.get("teamId")) : undefined; const platform = searchParams?.get("platform") ? Boolean(searchParams.get("platform")) : false; - const { data: installedApps, isPending } = trpc.viewer.apps.integrations.useQuery( - { variant: "other", onlyInstalled: true }, - { - suspense: true, - enabled: session.status === "authenticated", - } - ); - const { data: webhooks } = trpc.viewer.webhook.list.useQuery(undefined, { - suspense: true, - enabled: session.status === "authenticated", - }); - const createWebhookMutation = trpc.viewer.webhook.create.useMutation({ async onSuccess() { showToast(t("webhook_created_successfully"), "success"); @@ -91,14 +75,18 @@ export const NewWebhookView = () => { }); }; - if (isPending) return null; - return ( - app.slug)} - /> + + app.slug)} + /> + ); }; diff --git a/packages/features/webhooks/pages/webhooks-skeleton.tsx b/packages/features/webhooks/pages/webhooks-skeleton.tsx new file mode 100644 index 0000000000..961e731d61 --- /dev/null +++ b/packages/features/webhooks/pages/webhooks-skeleton.tsx @@ -0,0 +1,24 @@ +"use client"; + +import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; +import { APP_NAME } from "@calcom/lib/constants"; +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { SkeletonText, SkeletonContainer } from "@calcom/ui/components/skeleton"; + +export const SkeletonLoader = () => { + const { t } = useLocale(); + return ( + + +
+ + +
+
+
+ ); +}; diff --git a/packages/features/webhooks/pages/webhooks-view.tsx b/packages/features/webhooks/pages/webhooks-view.tsx index c76d5a366e..981470085c 100644 --- a/packages/features/webhooks/pages/webhooks-view.tsx +++ b/packages/features/webhooks/pages/webhooks-view.tsx @@ -2,6 +2,7 @@ import { useRouter } from "next/navigation"; +import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; import { APP_NAME, WEBAPP_URL } from "@calcom/lib/constants"; import { useBookerUrl } from "@calcom/lib/hooks/useBookerUrl"; import { useLocale } from "@calcom/lib/hooks/useLocale"; @@ -10,21 +11,9 @@ import type { WebhooksByViewer } from "@calcom/trpc/server/routers/viewer/webhoo import classNames from "@calcom/ui/classNames"; import { Avatar } from "@calcom/ui/components/avatar"; import { EmptyScreen } from "@calcom/ui/components/empty-screen"; -import { SkeletonText, SkeletonContainer } from "@calcom/ui/components/skeleton"; import { WebhookListItem, CreateNewWebhookButton } from "../components"; -export const SkeletonLoader = () => { - return ( - -
- - -
-
- ); -}; - type Props = { data: RouterOutputs["viewer"]["webhook"]["getByViewer"]; isAdmin: boolean; @@ -53,9 +42,13 @@ const WebhooksList = ({ const hasTeams = profiles && profiles.length > 1; return ( - <> + 0 ? : null} + borderInShellHeader={false}> {!!webhookGroups.length ? ( -
+
{webhookGroups.map((group) => (
{hasTeams && ( @@ -72,11 +65,7 @@ const WebhooksList = ({
)}
-
+
{group.webhooks.map((webhook, index) => ( } border={true} /> )} - + ); };