1
1
import { makeStyles } from "@material-ui/core/styles"
2
- import { useMachine } from "@xstate/react"
3
2
import { useOrganizationId } from "hooks/useOrganizationId"
4
3
import { createContext , FC , Suspense , useContext } from "react"
5
4
import { NavLink , Outlet , useNavigate , useParams } from "react-router-dom"
6
5
import { combineClasses } from "util/combineClasses"
7
- import {
8
- TemplateContext ,
9
- templateMachine ,
10
- } from "xServices/template/templateXService"
11
6
import { Margins } from "components/Margins/Margins"
12
7
import { Stack } from "components/Stack/Stack"
13
- import { Permissions } from "xServices/auth/authXService"
14
8
import { Loader } from "components/Loader/Loader"
15
- import { usePermissions } from "hooks/usePermissions"
16
9
import { TemplatePageHeader } from "./TemplatePageHeader"
17
10
import { AlertBanner } from "components/AlertBanner/AlertBanner"
11
+ import {
12
+ checkAuthorization ,
13
+ getTemplateByName ,
14
+ getTemplateDAUs ,
15
+ getTemplateVersion ,
16
+ getTemplateVersionResources ,
17
+ getTemplateVersions ,
18
+ } from "api/api"
19
+ import { useQuery } from "@tanstack/react-query"
20
+
21
+ const templatePermissions = ( templateId : string ) => ( {
22
+ canUpdateTemplate : {
23
+ object : {
24
+ resource_type : "template" ,
25
+ resource_id : templateId ,
26
+ } ,
27
+ action : "update" ,
28
+ } ,
29
+ } )
18
30
19
- const useTemplateName = ( ) => {
20
- const { template } = useParams ( )
31
+ const fetchTemplate = async ( orgId : string , templateName : string ) => {
32
+ const template = await getTemplateByName ( orgId , templateName )
33
+ const [ activeVersion , resources , versions , daus , permissions ] =
34
+ await Promise . all ( [
35
+ getTemplateVersion ( template . active_version_id ) ,
36
+ getTemplateVersionResources ( template . active_version_id ) ,
37
+ getTemplateVersions ( template . id ) ,
38
+ getTemplateDAUs ( template . id ) ,
39
+ checkAuthorization ( {
40
+ checks : templatePermissions ( template . id ) ,
41
+ } ) ,
42
+ ] )
21
43
22
- if ( ! template ) {
23
- throw new Error ( "No template found in the URL" )
44
+ return {
45
+ template,
46
+ activeVersion,
47
+ resources,
48
+ versions,
49
+ daus,
50
+ permissions,
24
51
}
25
-
26
- return template
27
52
}
28
53
29
- type TemplateLayoutContextValue = {
30
- context : TemplateContext
31
- permissions ?: Permissions
54
+ const useTemplateData = ( orgId : string , templateName : string ) => {
55
+ return useQuery ( {
56
+ queryKey : [ "template" , templateName ] ,
57
+ queryFn : ( ) => fetchTemplate ( orgId , templateName ) ,
58
+ } )
32
59
}
33
60
61
+ type TemplateLayoutContextValue = Awaited < ReturnType < typeof fetchTemplate > >
62
+
34
63
const TemplateLayoutContext = createContext <
35
64
TemplateLayoutContextValue | undefined
36
65
> ( undefined )
@@ -50,38 +79,32 @@ export const TemplateLayout: FC<{ children?: JSX.Element }> = ({
50
79
} ) => {
51
80
const navigate = useNavigate ( )
52
81
const styles = useStyles ( )
53
- const organizationId = useOrganizationId ( )
54
- const templateName = useTemplateName ( )
55
- const [ templateState , _ ] = useMachine ( templateMachine , {
56
- context : {
57
- templateName,
58
- organizationId,
59
- } ,
60
- } )
61
- const {
62
- template,
63
- permissions : templatePermissions ,
64
- getTemplateError,
65
- } = templateState . context
66
- const permissions = usePermissions ( )
82
+ const orgId = useOrganizationId ( )
83
+ const { template } = useParams ( ) as { template : string }
84
+ const templateData = useTemplateData ( orgId , template )
67
85
68
- if ( getTemplateError ) {
86
+ if ( templateData . error ) {
69
87
return (
70
88
< div className = { styles . error } >
71
- < AlertBanner severity = "error" error = { getTemplateError } />
89
+ < AlertBanner severity = "error" error = { templateData . error } />
72
90
</ div >
73
91
)
74
92
}
75
93
76
- if ( ! template || ! templatePermissions ) {
94
+ if ( templateData . isLoading ) {
77
95
return < Loader />
78
96
}
79
97
98
+ // Make typescript happy
99
+ if ( ! templateData . data ) {
100
+ return < > </ >
101
+ }
102
+
80
103
return (
81
104
< >
82
105
< TemplatePageHeader
83
- template = { template }
84
- permissions = { templatePermissions }
106
+ template = { templateData . data . template }
107
+ permissions = { templateData . data . permissions }
85
108
onDeleteTemplate = { ( ) => {
86
109
navigate ( "/templates" )
87
110
} }
@@ -92,7 +115,7 @@ export const TemplateLayout: FC<{ children?: JSX.Element }> = ({
92
115
< Stack direction = "row" spacing = { 0.25 } >
93
116
< NavLink
94
117
end
95
- to = { `/templates/${ template . name } ` }
118
+ to = { `/templates/${ template } ` }
96
119
className = { ( { isActive } ) =>
97
120
combineClasses ( [
98
121
styles . tabItem ,
@@ -103,7 +126,7 @@ export const TemplateLayout: FC<{ children?: JSX.Element }> = ({
103
126
Summary
104
127
</ NavLink >
105
128
< NavLink
106
- to = { `/templates/${ template . name } /permissions` }
129
+ to = { `/templates/${ template } /permissions` }
107
130
className = { ( { isActive } ) =>
108
131
combineClasses ( [
109
132
styles . tabItem ,
@@ -118,9 +141,7 @@ export const TemplateLayout: FC<{ children?: JSX.Element }> = ({
118
141
</ div >
119
142
120
143
< Margins >
121
- < TemplateLayoutContext . Provider
122
- value = { { permissions, context : templateState . context } }
123
- >
144
+ < TemplateLayoutContext . Provider value = { templateData . data } >
124
145
< Suspense fallback = { < Loader /> } > { children } </ Suspense >
125
146
</ TemplateLayoutContext . Provider >
126
147
</ Margins >
0 commit comments