@@ -14,6 +14,7 @@ import {
14
14
BaseLayout ,
15
15
Notifications ,
16
16
ChangelogButton ,
17
+ RedirectionGuard ,
17
18
PciGuidesHeader ,
18
19
Datagrid ,
19
20
useProjectUrl ,
@@ -65,7 +66,11 @@ export default function ContactsPage() {
65
66
const context = useContext ( ShellContext ) ;
66
67
const user = context . environment . getUser ( ) ;
67
68
const projectId = useParam ( 'projectId' ) ;
68
- const { data : project } = useProject ( ) ;
69
+ const {
70
+ data : project ,
71
+ isLoading : isProjectLoading ,
72
+ isError : isProjectError ,
73
+ } = useProject ( ) ;
69
74
const { data : serviceInfo } = useProjectService ( projectId ) ;
70
75
const { data : aclAccountIds } = useProjectAcl ( projectId ) ;
71
76
const userAcls = useProjectAclAccountsInfo ( projectId , aclAccountIds || [ ] ) ;
@@ -78,96 +83,111 @@ export default function ContactsPage() {
78
83
const openAddContactModal = ( ) => {
79
84
navigate ( `./${ urls . contactAndRightsAdd } ` ) ;
80
85
} ;
86
+ const isUsRegion = context . environment . getRegion ( ) === 'US' ;
81
87
const isEuRegion = context . environment . getRegion ( ) === 'EU' ;
82
88
const discoveryProject = isDiscoveryProject ( project ) ;
83
89
const canChangeContacts = isEuRegion && ! discoveryProject ;
84
90
const contactsPageHref = useGetContactsPageHref ( context , serviceInfo ) ;
91
+ const redirectToProjects = isProjectError || isUsRegion ;
85
92
86
93
if ( ! project || ! serviceInfo || ! userAcls ) {
87
- return < OdsSpinner size = "md" /> ;
94
+ return (
95
+ < RedirectionGuard
96
+ condition = { redirectToProjects }
97
+ isLoading = { isProjectLoading }
98
+ route = { urls . root }
99
+ >
100
+ < OdsSpinner size = "md" />
101
+ </ RedirectionGuard >
102
+ ) ;
88
103
}
89
104
90
105
return (
91
- < BaseLayout
92
- header = { {
93
- title : t ( 'pci_projects_project_contacts_title' ) ,
94
- changelogButton : < ChangelogButton links = { ROADMAP_CHANGELOG_LINKS } /> ,
95
- headerButton : < PciGuidesHeader category = "instances" /> ,
96
- } }
97
- breadcrumb = {
98
- < OdsBreadcrumb >
99
- < OdsBreadcrumbItem href = { hrefProject } label = { project . description } />
100
- < OdsBreadcrumbItem
101
- href = { '#' }
102
- label = { t ( 'pci_projects_project_contacts_title' ) }
103
- />
104
- </ OdsBreadcrumb >
105
- }
106
+ < RedirectionGuard
107
+ condition = { redirectToProjects }
108
+ isLoading = { isProjectLoading }
109
+ route = { urls . root }
106
110
>
107
- < div className = "flex flex-col gap-4 mb-8" >
108
- < PciDiscoveryBanner project = { project } />
109
- < Notifications />
110
- < div className = "contacts-card" >
111
- < div className = "row" >
112
- < OdsText className = "contacts-card-info text-right" >
113
- { t ( 'cpb_rights_owner' ) }
114
- </ OdsText >
115
- < OdsText className = "contacts-card-info text-left" >
116
- { serviceInfo . contactAdmin }
117
- </ OdsText >
118
- < div className = "contacts-card-info" >
119
- { canChangeContacts && (
120
- < OdsLink
121
- href = { contactsPageHref }
122
- label = { t ( 'cpb_rights_modify' ) }
123
- icon = { ODS_ICON_NAME . externalLink }
124
- target = "_blank"
125
- />
126
- ) }
111
+ < BaseLayout
112
+ header = { {
113
+ title : t ( 'pci_projects_project_contacts_title' ) ,
114
+ changelogButton : < ChangelogButton links = { ROADMAP_CHANGELOG_LINKS } /> ,
115
+ headerButton : < PciGuidesHeader category = "instances" /> ,
116
+ } }
117
+ breadcrumb = {
118
+ < OdsBreadcrumb >
119
+ < OdsBreadcrumbItem href = { hrefProject } label = { project . description } />
120
+ < OdsBreadcrumbItem
121
+ href = { '#' }
122
+ label = { t ( 'pci_projects_project_contacts_title' ) }
123
+ />
124
+ </ OdsBreadcrumb >
125
+ }
126
+ >
127
+ < div className = "flex flex-col gap-4 mb-8" >
128
+ < PciDiscoveryBanner project = { project } />
129
+ < Notifications />
130
+ < div className = "contacts-card" >
131
+ < div className = "row" >
132
+ < OdsText className = "contacts-card-info text-right" >
133
+ { t ( 'cpb_rights_owner' ) }
134
+ </ OdsText >
135
+ < OdsText className = "contacts-card-info text-left" >
136
+ { serviceInfo . contactAdmin }
137
+ </ OdsText >
138
+ < div className = "contacts-card-info" >
139
+ { canChangeContacts && (
140
+ < OdsLink
141
+ href = { contactsPageHref }
142
+ label = { t ( 'cpb_rights_modify' ) }
143
+ icon = { ODS_ICON_NAME . externalLink }
144
+ target = "_blank"
145
+ />
146
+ ) }
147
+ </ div >
127
148
</ div >
128
- </ div >
129
- < div className = "row mt-4 " >
130
- < OdsText className = "contacts-card-info text-right" >
131
- { t ( 'cpb_rights_billing_contact' ) }
132
- </ OdsText >
133
- < OdsText className = "contacts-card-info text-left" >
134
- { serviceInfo . contactBilling }
135
- </ OdsText >
136
- < div className = "contacts-card-info" >
137
- { canChangeContacts && (
138
- < OdsLink
139
- href = { contactsPageHref }
140
- label = { t ( 'cpb_rights_modify' ) }
141
- icon = { ODS_ICON_NAME . externalLink }
142
- target = "_blank"
143
- />
144
- ) }
149
+ < div className = "row mt-4" >
150
+ < OdsText className = "contacts-card-info text-right " >
151
+ { t ( 'cpb_rights_billing_contact' ) }
152
+ </ OdsText >
153
+ < OdsText className = "contacts-card-info text-left" >
154
+ { serviceInfo . contactBilling }
155
+ </ OdsText >
156
+ < div className = "contacts-card-info" >
157
+ { canChangeContacts && (
158
+ < OdsLink
159
+ href = { contactsPageHref }
160
+ label = { t ( 'cpb_rights_modify' ) }
161
+ icon = { ODS_ICON_NAME . externalLink }
162
+ target = "_blank"
163
+ />
164
+ ) }
165
+ </ div >
145
166
</ div >
146
167
</ div >
147
- </ div >
148
- < OdsText > { t ( 'cpb_rights_expl2' ) } </ OdsText >
149
- < OdsText > { t ( 'cpb_rights_note' ) } </ OdsText >
168
+ < OdsText > { t ( 'cpb_rights_expl2' ) } </ OdsText >
169
+ < OdsText > { t ( 'cpb_rights_note' ) } </ OdsText >
150
170
151
- { isAdmin && (
152
- < OdsButton
153
- className = "my-8 size-fit"
154
- label = { t ( 'common_add' ) }
155
- variant = { ODS_BUTTON_VARIANT . outline }
156
- onClick = { openAddContactModal }
157
- isDisabled = { discoveryProject }
158
- />
159
- ) }
171
+ { isAdmin && (
172
+ < OdsButton
173
+ className = "my-8 size-fit"
174
+ label = { t ( 'common_add' ) }
175
+ variant = { ODS_BUTTON_VARIANT . outline }
176
+ onClick = { openAddContactModal }
177
+ isDisabled = { discoveryProject }
178
+ />
179
+ ) }
160
180
161
- < Datagrid
162
- columns = { columns }
163
- items = { flattenData as AccountAcl [ ] }
164
- totalItems = { userAcls . length }
165
- hasNextPage = { hasNextPage }
166
- onFetchNextPage = { fetchNextPage }
167
- />
168
- </ div >
169
-
170
- < Outlet / >
171
- </ BaseLayout >
181
+ < Datagrid
182
+ columns = { columns }
183
+ items = { flattenData as AccountAcl [ ] }
184
+ totalItems = { userAcls . length }
185
+ hasNextPage = { hasNextPage }
186
+ onFetchNextPage = { fetchNextPage }
187
+ />
188
+ </ div >
189
+ < Outlet />
190
+ </ BaseLayout >
191
+ </ RedirectionGuard >
172
192
) ;
173
193
}
0 commit comments