@@ -17,14 +17,16 @@ import {
17
17
ToastBody ,
18
18
ToastBody3 as UpdateToast ,
19
19
ErrorBoundary ,
20
+ importComponentFromFELibrary ,
20
21
} from './components/common'
21
- import { showError , BreadcrumbStore , Reload , DevtronProgressing } from '@devtron-labs/devtron-fe-common-lib'
22
+ import { showError , BreadcrumbStore , Reload , DevtronProgressing , APPROVAL_MODAL_TYPE } from '@devtron-labs/devtron-fe-common-lib'
22
23
import * as serviceWorker from './serviceWorker'
23
24
import Hotjar from './components/Hotjar/Hotjar'
24
25
import { validateToken } from './services/service'
25
26
26
27
const NavigationRoutes = lazy ( ( ) => import ( './components/common/navigation/NavigationRoutes' ) )
27
28
const Login = lazy ( ( ) => import ( './components/login/Login' ) )
29
+ const GenericDirectApprovalModal = importComponentFromFELibrary ( 'GenericDirectApprovalModal' )
28
30
29
31
toast . configure ( {
30
32
autoClose : 3000 ,
@@ -46,9 +48,12 @@ export default function App() {
46
48
const [ bgUpdated , setBGUpdated ] = useState ( false )
47
49
const [ validating , setValidating ] = useState ( true )
48
50
const [ forceUpdateOnLocationChange , setForceUpdateOnLocationChange ] = useState ( false )
51
+ const [ approvalToken , setApprovalToken ] = useState < string > ( '' )
52
+ const [ approvalType , setApprovalType ] = useState < APPROVAL_MODAL_TYPE > ( APPROVAL_MODAL_TYPE . CONFIG )
49
53
const location = useLocation ( )
50
54
const { push } = useHistory ( )
51
55
const didMountRef = useRef ( false )
56
+ const isDirectApprovalNotification = location . pathname && location . pathname . includes ( 'approve' ) && location . search && location . search . includes ( `?token=${ approvalToken } ` )
52
57
53
58
function onlineToast ( toastBody : JSX . Element , options ) {
54
59
if ( onlineToastRef . current && toast . isActive ( onlineToastRef . current ) ) {
@@ -84,30 +89,52 @@ export default function App() {
84
89
}
85
90
}
86
91
87
- useEffect ( ( ) => {
88
- async function validation ( ) {
89
- try {
90
- await validateToken ( )
91
- defaultRedirection ( )
92
- } catch ( err : any ) {
93
- // push to login without breaking search
94
- if ( err ?. code === 401 ) {
95
- const loginPath = URLS . LOGIN_SSO
96
- const newSearch = location . pathname . includes ( URLS . LOGIN_SSO )
97
- ? location . search
98
- : `?continue=${ location . pathname } `
99
- push ( `${ loginPath } ${ newSearch } ` )
100
- } else {
101
- setErrorPage ( true )
102
- showError ( err )
103
- }
104
- } finally {
105
- setValidating ( false )
92
+ const redirectToDirectApprovalNotification = ( ) : void => {
93
+ setValidating ( false )
94
+ if ( location . pathname && location . pathname . includes ( 'deployment' ) ) {
95
+ setApprovalType ( APPROVAL_MODAL_TYPE . DEPLOYMENT )
96
+ } else {
97
+ setApprovalType ( APPROVAL_MODAL_TYPE . CONFIG )
98
+ }
99
+
100
+ let queryString = new URLSearchParams ( location . search )
101
+ let token = queryString . get ( 'token' )
102
+ if ( token ) {
103
+ setApprovalToken ( token )
104
+ }
105
+ }
106
+
107
+ async function validation ( ) {
108
+ try {
109
+ await validateToken ( )
110
+ defaultRedirection ( )
111
+ } catch ( err : any ) {
112
+ // push to login without breaking search
113
+ if ( err ?. code === 401 ) {
114
+ const loginPath = URLS . LOGIN_SSO
115
+ const newSearch = location . pathname . includes ( URLS . LOGIN_SSO )
116
+ ? location . search
117
+ : `?continue=${ location . pathname } `
118
+ push ( `${ loginPath } ${ newSearch } ` )
119
+ } else {
120
+ setErrorPage ( true )
121
+ showError ( err )
106
122
}
123
+ } finally {
124
+ setValidating ( false )
107
125
}
126
+ }
127
+
128
+
129
+ useEffect ( ( ) => {
108
130
// If not K8S_CLIENT then validateToken otherwise directly redirect
109
131
if ( ! window . _env_ . K8S_CLIENT ) {
132
+ // By Passing validations for direct email approval notifications
133
+ if ( isDirectApprovalNotification ) {
134
+ redirectToDirectApprovalNotification ( )
135
+ } else {
110
136
validation ( )
137
+ }
111
138
} else {
112
139
setValidating ( false )
113
140
defaultRedirection ( )
@@ -207,7 +234,7 @@ export default function App() {
207
234
< Suspense fallback = { null } >
208
235
{ validating ? (
209
236
< div className = "full-height-width" >
210
- < DevtronProgressing parentClasses = "h-100 flex bcn-0" classes = "icon-dim-80" />
237
+ < DevtronProgressing parentClasses = "h-100 flex bcn-0" classes = "icon-dim-80" />
211
238
</ div >
212
239
) : (
213
240
< >
@@ -218,13 +245,21 @@ export default function App() {
218
245
) : (
219
246
< ErrorBoundary >
220
247
< BreadcrumbStore >
221
- < Switch >
222
- { ! window . _env_ . K8S_CLIENT && < Route path = { `/login` } component = { Login } /> }
223
- < Route path = "/" render = { ( ) => < NavigationRoutes /> } />
224
- < Redirect
225
- to = { window . _env_ . K8S_CLIENT ? '/' : `${ URLS . LOGIN_SSO } ${ location . search } ` }
226
- />
227
- </ Switch >
248
+ < Switch >
249
+ { isDirectApprovalNotification && GenericDirectApprovalModal && (
250
+ < Route exact path = { `/${ approvalType ?. toLocaleLowerCase ( ) } /approve` } >
251
+ < GenericDirectApprovalModal
252
+ approvalType = { approvalType }
253
+ approvalToken = { approvalToken }
254
+ />
255
+ </ Route >
256
+ ) }
257
+ { ! window . _env_ . K8S_CLIENT && < Route path = { `/login` } component = { Login } /> }
258
+ < Route path = "/" render = { ( ) => < NavigationRoutes /> } />
259
+ < Redirect
260
+ to = { window . _env_ . K8S_CLIENT ? '/' : `${ URLS . LOGIN_SSO } ${ location . search } ` }
261
+ />
262
+ </ Switch >
228
263
< div id = "full-screen-modal" > </ div >
229
264
< div id = "visible-modal" > </ div >
230
265
< div id = "visible-modal-2" > </ div >
0 commit comments