From f40c6da93b634a122adccc41c94b8889c4dfd5a4 Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Wed, 13 Aug 2025 23:35:30 +0900 Subject: [PATCH] fix: use server fetched user for all sub pages in /getting-started (#23064) * use server fetched user for all sub pages * Wrap setAnyInstalledVideoApps call in useEffect --------- Co-authored-by: Alex van Andel --- .../steps-views/ConnectedVideoStep.tsx | 34 +++++++++---------- .../steps-views/UserProfile.tsx | 8 +++-- .../steps-views/UserSettings.tsx | 5 +-- .../[[...step]]/onboarding-view.tsx | 6 ++-- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx b/apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx index ccf9cf91da..9aae75783c 100644 --- a/apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx +++ b/apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx @@ -1,11 +1,11 @@ import { type TFunction } from "i18next"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import type { Dispatch, SetStateAction } from "react"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { userMetadata } from "@calcom/prisma/zod-utils"; import { trpc } from "@calcom/trpc/react"; -import useMeQuery from "@calcom/trpc/react/hooks/useMeQuery"; +import type { RouterOutputs } from "@calcom/trpc/react"; import classNames from "@calcom/ui/classNames"; import { Button } from "@calcom/ui/components/button"; import { List } from "@calcom/ui/components/list"; @@ -16,14 +16,17 @@ import { StepConnectionLoader } from "../components/StepConnectionLoader"; interface ConnectedAppStepProps { nextStep: () => void; isPageLoading: boolean; + user: RouterOutputs["viewer"]["me"]["get"]; } const ConnectedVideoStepInner = ({ t, setAnyInstalledVideoApps, + user, }: { t: TFunction; setAnyInstalledVideoApps: Dispatch>; + user: RouterOutputs["viewer"]["me"]["get"]; }) => { const { data: queryConnectedVideoApps, isPending } = trpc.viewer.apps.integrations.useQuery({ variant: "conferencing", @@ -39,25 +42,20 @@ const ConnectedVideoStepInner = ({ sortByMostPopular: true, sortByInstalledFirst: true, }); - // we want to start loading immediately, after all this is a hook. - const { data, status } = useMeQuery(); + + const hasAnyInstalledVideoApps = queryConnectedVideoApps?.items.some( + (item) => item.userCredentialIds.length > 0 + ); + + useEffect(() => { + setAnyInstalledVideoApps(Boolean(hasAnyInstalledVideoApps)); + }, [hasAnyInstalledVideoApps, setAnyInstalledVideoApps]); if (isPending) { return ; } - const hasAnyInstalledVideoApps = queryConnectedVideoApps?.items.some( - (item) => item.userCredentialIds.length > 0 - ); - if (hasAnyInstalledVideoApps) { - setAnyInstalledVideoApps(true); - } - - if (status !== "success") { - return ; - } - - const result = userMetadata.safeParse(data?.metadata); + const result = userMetadata.safeParse(user.metadata); if (!result.success) { return ; } @@ -91,12 +89,12 @@ const ConnectedVideoStepInner = ({ }; const ConnectedVideoStep = (props: ConnectedAppStepProps) => { - const { nextStep, isPageLoading } = props; + const { nextStep, isPageLoading, user } = props; const { t } = useLocale(); const [hasAnyInstalledVideoApps, setAnyInstalledVideoApps] = useState(false); return ( <> - +