@@ -4,55 +4,115 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/primitive
4
4
import { DashboardLayout } from '../components/dashboard-layout' ;
5
5
import { Navigate } from 'react-router-dom' ;
6
6
import { ROUTES } from '@/utils/routes' ;
7
+ import { useEffect , useState } from 'react' ;
8
+ import { useEnvironment } from '@/context/environment/hooks' ;
9
+ import { getWebhookPortalToken } from '@/api/webhooks' ;
10
+ import { AppPortal , SvixProvider } from 'svix-react' ;
7
11
8
12
export function WebhooksPage ( ) {
9
13
const isWebhooksManagementEnabled = useFeatureFlag ( FeatureFlagsKeysEnum . IS_WEBHOOKS_MANAGEMENT_ENABLED ) ;
14
+ const { currentEnvironment } = useEnvironment ( ) ;
15
+ const [ portalUrl , setPortalUrl ] = useState < string | null > ( null ) ;
16
+ const [ appId , setAppId ] = useState < string | null > ( null ) ;
17
+ const [ portalToken , setPortalToken ] = useState < string | null > ( null ) ;
18
+ const [ isLoading , setIsLoading ] = useState < boolean > ( true ) ;
19
+ const [ error , setError ] = useState < string | null > ( null ) ;
20
+
21
+ useEffect ( ( ) => {
22
+ if ( ! isWebhooksManagementEnabled || ! currentEnvironment ) {
23
+ setIsLoading ( false ) ;
24
+
25
+ return ;
26
+ }
27
+
28
+ const fetchToken = async ( ) => {
29
+ setIsLoading ( true ) ;
30
+ setError ( null ) ;
31
+
32
+ try {
33
+ const response = await getWebhookPortalToken ( currentEnvironment ) ;
34
+ setPortalUrl ( response . url ) ;
35
+ setPortalToken ( response . token ) ;
36
+ setAppId ( response . appId ) ;
37
+ console . log ( 'Webhook Portal URL:' , response . url ) ;
38
+ console . log ( 'Webhook Portal Token:' , response . token ) ;
39
+ } catch ( e : any ) {
40
+ console . error ( 'Failed to fetch webhook portal token:' , e ) ;
41
+ setError ( e . message || 'Failed to load portal token.' ) ;
42
+ } finally {
43
+ setIsLoading ( false ) ;
44
+ }
45
+ } ;
46
+
47
+ fetchToken ( ) ;
48
+ } , [ isWebhooksManagementEnabled , currentEnvironment ] ) ;
10
49
11
50
if ( ! isWebhooksManagementEnabled ) {
12
51
// Or redirect to a 'Not Found' page or a parent page
13
52
14
53
return < Navigate to = { ROUTES . WORKFLOWS } replace /> ;
15
54
}
16
55
56
+ // TODO: Add UI elements to display loading/error states and potentially the URL/token if needed
57
+
58
+ if ( ! portalToken || ! appId ) {
59
+ return < div > No portal token found</ div > ;
60
+ }
61
+
62
+ console . log ( { portalUrl } ) ;
63
+
64
+ // Function to safely construct the portal URL with the next parameter
65
+ const buildPortalUrl = ( baseUrl : string | null , nextPath : string ) : string => {
66
+ if ( ! baseUrl ) return '' ;
67
+ const urlParts = baseUrl . split ( '#' ) ;
68
+
69
+ if ( urlParts . length !== 2 ) {
70
+ console . error ( 'Unexpected Svix portal URL format:' , baseUrl ) ;
71
+ return baseUrl ;
72
+ }
73
+
74
+ const base = urlParts [ 0 ] ;
75
+ const keyFragment = urlParts [ 1 ] ;
76
+ // Add only the next parameter
77
+ const separator = base . includes ( '?' ) ? '&' : '?' ;
78
+ return `${ base } ${ separator } next=${ nextPath } #${ keyFragment } ` ;
79
+ } ;
80
+
17
81
return (
18
82
< DashboardLayout headerStartItems = { < h1 className = "text-foreground-950" > Webhooks</ h1 > } >
19
- < Tabs defaultValue = "endpoints" >
20
- < div className = "border-neutral-alpha-200 flex items-center justify-between border-b" >
21
- < TabsList variant = "regular" className = "border-b-0 border-t-2 border-transparent p-0 !px-2" >
22
- < TabsTrigger value = "endpoints" variant = "regular" >
23
- Endpoints
24
- </ TabsTrigger >
25
- < TabsTrigger value = "event-catalog" variant = "regular" >
26
- Event Catalog
27
- </ TabsTrigger >
28
- < TabsTrigger value = "logs" variant = "regular" >
29
- Logs
30
- </ TabsTrigger >
31
- < TabsTrigger value = "activity" variant = "regular" >
32
- Activity
33
- </ TabsTrigger >
34
- </ TabsList >
35
- { /* Add action buttons here if needed later */ }
36
- </ div >
37
- < TabsContent value = "endpoints" variant = "regular" className = "!mt-0 p-2.5" >
38
- < div className = "text-muted-foreground flex h-64 items-center justify-center" >
39
- Endpoints Content Placeholder
40
- </ div >
41
- </ TabsContent >
42
- < TabsContent value = "event-catalog" variant = "regular" className = "!mt-0 p-2.5" >
43
- < div className = "text-muted-foreground flex h-64 items-center justify-center" >
44
- Event Catalog Content Placeholder
45
- </ div >
46
- </ TabsContent >
47
- < TabsContent value = "logs" variant = "regular" className = "!mt-0 p-2.5" >
48
- < div className = "text-muted-foreground flex h-64 items-center justify-center" > Logs Content Placeholder</ div >
49
- </ TabsContent >
50
- < TabsContent value = "activity" variant = "regular" className = "!mt-0 p-2.5" >
51
- < div className = "text-muted-foreground flex h-64 items-center justify-center" >
52
- Activity Content Placeholder
83
+ < SvixProvider token = { portalToken } appId = { appId } >
84
+ < Tabs defaultValue = "endpoints" >
85
+ < div className = "border-neutral-alpha-200 flex items-center justify-between border-b" >
86
+ < TabsList variant = "regular" className = "border-b-0 border-t-2 border-transparent p-0 !px-2" >
87
+ < TabsTrigger value = "endpoints" variant = "regular" >
88
+ Endpoints
89
+ </ TabsTrigger >
90
+ < TabsTrigger value = "event-catalog" variant = "regular" >
91
+ Event Catalog
92
+ </ TabsTrigger >
93
+ < TabsTrigger value = "logs" variant = "regular" >
94
+ Logs
95
+ </ TabsTrigger >
96
+ < TabsTrigger value = "activity" variant = "regular" >
97
+ Activity
98
+ </ TabsTrigger >
99
+ </ TabsList >
100
+ { /* Add action buttons here if needed later */ }
53
101
</ div >
54
- </ TabsContent >
55
- </ Tabs >
102
+ < TabsContent value = "endpoints" variant = "regular" className = "!mt-0 p-2.5" >
103
+ < AppPortal url = { buildPortalUrl ( portalUrl , '/endpoints' ) } style = { { backgroundColor : 'red' } } fullSize />
104
+ </ TabsContent >
105
+ < TabsContent value = "event-catalog" variant = "regular" className = "!mt-0 p-2.5" >
106
+ < AppPortal url = { buildPortalUrl ( portalUrl , '/event-types' ) } fullSize />
107
+ </ TabsContent >
108
+ < TabsContent value = "logs" variant = "regular" className = "!mt-0 p-2.5" >
109
+ < AppPortal url = { buildPortalUrl ( portalUrl , '/messages' ) } fullSize />
110
+ </ TabsContent >
111
+ < TabsContent value = "activity" variant = "regular" className = "!mt-0 p-2.5" >
112
+ < AppPortal url = { buildPortalUrl ( portalUrl , '/activity' ) } fullSize />
113
+ </ TabsContent >
114
+ </ Tabs >
115
+ </ SvixProvider >
56
116
</ DashboardLayout >
57
117
) ;
58
118
}
0 commit comments