1+ import { type TFunction } from "i18next" ;
2+ import { useState } from "react" ;
3+ import type { Dispatch , SetStateAction } from "react" ;
4+
15import { useLocale } from "@calcom/lib/hooks/useLocale" ;
26import { userMetadata } from "@calcom/prisma/zod-utils" ;
37import { 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