1
+ import { type TFunction } from "i18next" ;
2
+ import { useState } from "react" ;
3
+ import type { Dispatch , SetStateAction } from "react" ;
4
+
1
5
import { useLocale } from "@calcom/lib/hooks/useLocale" ;
2
6
import { userMetadata } from "@calcom/prisma/zod-utils" ;
3
7
import { trpc } from "@calcom/trpc/react" ;
@@ -14,8 +18,13 @@ interface ConnectedAppStepProps {
14
18
isPageLoading : boolean ;
15
19
}
16
20
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
+ } ) => {
19
28
const { data : queryConnectedVideoApps , isPending } = trpc . viewer . apps . integrations . useQuery ( {
20
29
variant : "conferencing" ,
21
30
onlyInstalled : false ,
@@ -30,47 +39,64 @@ const ConnectedVideoStep = (props: ConnectedAppStepProps) => {
30
39
sortByMostPopular : true ,
31
40
sortByInstalledFirst : true ,
32
41
} ) ;
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 ( ) ;
35
44
36
- const metadata = userMetadata . parse ( data ?. metadata ) ;
45
+ if ( isPending ) {
46
+ return < StepConnectionLoader /> ;
47
+ }
37
48
38
49
const hasAnyInstalledVideoApps = queryConnectedVideoApps ?. items . some (
39
50
( item ) => item . userCredentialIds . length > 0
40
51
) ;
52
+ if ( hasAnyInstalledVideoApps ) {
53
+ setAnyInstalledVideoApps ( true ) ;
54
+ }
41
55
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 ;
42
65
const defaultConferencingApp = metadata ?. defaultConferencingApp ?. appSlug ;
43
66
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
+ } ;
72
92
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 } />
74
100
< Button
75
101
EndIcon = "arrow-right"
76
102
data-testid = "save-video-button"
0 commit comments