Skip to content

Commit 750db38

Browse files
authored
fix: Crash of onboarding connected-video page (#23047)
1 parent 8829e1c commit 750db38

File tree

1 file changed

+60
-34
lines changed

1 file changed

+60
-34
lines changed

apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx

Lines changed: 60 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import { type TFunction } from "i18next";
2+
import { useState } from "react";
3+
import type { Dispatch, SetStateAction } from "react";
4+
15
import { useLocale } from "@calcom/lib/hooks/useLocale";
26
import { userMetadata } from "@calcom/prisma/zod-utils";
37
import { trpc } from "@calcom/trpc/react";
@@ -14,8 +18,13 @@ interface ConnectedAppStepProps {
1418
isPageLoading: boolean;
1519
}
1620

17-
const ConnectedVideoStep = (props: ConnectedAppStepProps) => {
18-
const { nextStep, isPageLoading } = props;
21+
const ConnectedVideoStepInner = ({
22+
t,
23+
setAnyInstalledVideoApps,
24+
}: {
25+
t: TFunction;
26+
setAnyInstalledVideoApps: Dispatch<SetStateAction<boolean>>;
27+
}) => {
1928
const { data: queryConnectedVideoApps, isPending } = trpc.viewer.apps.integrations.useQuery({
2029
variant: "conferencing",
2130
onlyInstalled: false,
@@ -30,47 +39,64 @@ const ConnectedVideoStep = (props: ConnectedAppStepProps) => {
3039
sortByMostPopular: true,
3140
sortByInstalledFirst: true,
3241
});
33-
const { data } = useMeQuery();
34-
const { t } = useLocale();
42+
// we want to start loading immediately, after all this is a hook.
43+
const { data, status } = useMeQuery();
3544

36-
const metadata = userMetadata.parse(data?.metadata);
45+
if (isPending) {
46+
return <StepConnectionLoader />;
47+
}
3748

3849
const hasAnyInstalledVideoApps = queryConnectedVideoApps?.items.some(
3950
(item) => item.userCredentialIds.length > 0
4051
);
52+
if (hasAnyInstalledVideoApps) {
53+
setAnyInstalledVideoApps(true);
54+
}
4155

56+
if (status !== "success") {
57+
return <StepConnectionLoader />;
58+
}
59+
60+
const result = userMetadata.safeParse(data?.metadata);
61+
if (!result.success) {
62+
return <StepConnectionLoader />;
63+
}
64+
const { data: metadata } = result;
4265
const defaultConferencingApp = metadata?.defaultConferencingApp?.appSlug;
4366
return (
44-
<>
45-
{!isPending && (
46-
<List className="bg-default border-subtle divide-subtle scroll-bar mx-1 max-h-[45vh] divide-y !overflow-y-scroll rounded-md border p-0 sm:mx-0">
47-
{queryConnectedVideoApps?.items &&
48-
queryConnectedVideoApps?.items.map((item) => {
49-
if (item.slug === "daily-video") return null; // we dont want to show daily here as it is installed by default
50-
return (
51-
<li key={item.name}>
52-
{item.name && item.logo && (
53-
<AppConnectionItem
54-
type={item.type}
55-
title={item.name}
56-
isDefault={item.slug === defaultConferencingApp}
57-
description={item.description}
58-
dependencyData={item.dependencyData}
59-
logo={item.logo}
60-
slug={item.slug}
61-
installed={item.userCredentialIds.length > 0}
62-
defaultInstall={
63-
!defaultConferencingApp && item.appData?.location?.linkType === "dynamic"
64-
}
65-
/>
66-
)}
67-
</li>
68-
);
69-
})}
70-
</List>
71-
)}
67+
<List className="bg-default border-subtle divide-subtle scroll-bar mx-1 max-h-[45vh] divide-y !overflow-y-scroll rounded-md border p-0 sm:mx-0">
68+
{queryConnectedVideoApps?.items &&
69+
queryConnectedVideoApps?.items.map((item) => {
70+
if (item.slug === "daily-video") return null; // we dont want to show daily here as it is installed by default
71+
return (
72+
<li key={item.name}>
73+
{item.name && item.logo && (
74+
<AppConnectionItem
75+
type={item.type}
76+
title={item.name}
77+
isDefault={item.slug === defaultConferencingApp}
78+
description={item.description}
79+
dependencyData={item.dependencyData}
80+
logo={item.logo}
81+
slug={item.slug}
82+
installed={item.userCredentialIds.length > 0}
83+
defaultInstall={!defaultConferencingApp && item.appData?.location?.linkType === "dynamic"}
84+
/>
85+
)}
86+
</li>
87+
);
88+
})}
89+
</List>
90+
);
91+
};
7292

73-
{isPending && <StepConnectionLoader />}
93+
const ConnectedVideoStep = (props: ConnectedAppStepProps) => {
94+
const { nextStep, isPageLoading } = props;
95+
const { t } = useLocale();
96+
const [hasAnyInstalledVideoApps, setAnyInstalledVideoApps] = useState(false);
97+
return (
98+
<>
99+
<ConnectedVideoStepInner setAnyInstalledVideoApps={setAnyInstalledVideoApps} t={t} />
74100
<Button
75101
EndIcon="arrow-right"
76102
data-testid="save-video-button"

0 commit comments

Comments
 (0)