diff --git a/src/App.vue b/src/App.vue index 15ff14da..cc299a54 100644 --- a/src/App.vue +++ b/src/App.vue @@ -42,13 +42,16 @@ export default defineComponent({ }) }, methods: { - async presentLoader() { + async presentLoader(options = { message: '', backdropDismiss: true }) { + // When having a custom message remove already existing loader + if(options.message && this.loader) this.dismissLoader(); + if (!this.loader) { this.loader = await loadingController .create({ - message: this.$t("Click the backdrop to dismiss."), + message: options.message ? this.$t(options.message) : this.$t("Click the backdrop to dismiss."), translucent: true, - backdropDismiss: true + backdropDismiss: options.backdropDismiss }); } this.loader.present(); diff --git a/src/locales/en.json b/src/locales/en.json index 7ced93e4..600dfa77 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -42,6 +42,7 @@ "Loading": "Loading", "Login": "Login", "Logging in": "Logging in", + "Logging out": "Logging out", "Logout": "Logout", "Make sure you have entered all the inventory you received. You cannot edit this information after proceeding.": "Make sure you have entered all the inventory you received. { space } You cannot edit this information after proceeding.", "No more shipments found": "No more shipments found", diff --git a/src/store/modules/user/actions.ts b/src/store/modules/user/actions.ts index 7e25d60b..fe117723 100644 --- a/src/store/modules/user/actions.ts +++ b/src/store/modules/user/actions.ts @@ -14,6 +14,7 @@ import { setPermissions } from '@/authorization' import { useAuthStore } from '@hotwax/dxp-components' +import emitter from '@/event-bus' const actions: ActionTree = { @@ -104,10 +105,29 @@ const actions: ActionTree = { * Logout user */ async logout ({ commit }, payload) { + // store the url on which we need to redirect the user after logout api completes in case of SSO enabled + let redirectionUrl = '' + + emitter.emit('presentLoader', { message: 'Logging out', backdropDismiss: false }) + // Calling the logout api to flag the user as logged out, only when user is authorised // if the user is already unauthorised then not calling the logout api as it returns 401 again that results in a loop, thus there is no need to call logout api if the user is unauthorised if(!payload?.isUserUnauthorised) { - await logout(); + let resp; + + // wrapping the parsing logic in try catch as in some case the logout api makes redirection, and then we are unable to parse the resp and thus the logout process halts + try { + resp = await logout(); + + // Added logic to remove the `//` from the resp as in case of get request we are having the extra characters and in case of post we are having 403 + resp = JSON.parse(resp.startsWith('//') ? resp.replace('//', '') : resp) + } catch(err) { + console.error('Error parsing data', err) + } + + if(resp?.logoutAuthType == 'SAML2SSO') { + redirectionUrl = resp.logoutUrl + } } const authStore = useAuthStore() @@ -121,6 +141,14 @@ const actions: ActionTree = { // reset plugin state on logout authStore.$reset() + + // If we get any url in logout api resp then we will redirect the user to the url + if(redirectionUrl) { + window.location.href = redirectionUrl + } + + emitter.emit('dismissLoader') + return redirectionUrl; }, /** diff --git a/src/views/Settings.vue b/src/views/Settings.vue index 70e9b899..10402778 100644 --- a/src/views/Settings.vue +++ b/src/views/Settings.vue @@ -219,22 +219,31 @@ export default defineComponent({ { text: this.$t('Ok'), handler: () => { - this.store.dispatch('product/clearUploadProducts'); - this.store.dispatch('user/logout').then(() => { - this.router.push('/login'); + this.store.dispatch('user/logout', { isUserUnauthorised: false }).then((redirectionUrl) => { + this.store.dispatch('product/clearUploadProducts'); + + // if not having redirection url then redirect the user to launchpad + if (!redirectionUrl) { + const redirectUrl = window.location.origin + '/login' + window.location.href = `${process.env.VUE_APP_LOGIN_URL}?isLoggedOut=true&redirectUrl=${redirectUrl}` + } }) } }] }); await alert.present(); }, - logout () { - this.store.dispatch('user/logout').then(() => { + logout() { + this.store.dispatch('user/logout', { isUserUnauthorised: false }).then((redirectionUrl) => { this.store.dispatch('shipment/clearShipments'); this.store.dispatch('return/clearReturns'); this.store.dispatch("party/resetReceiversDetails"); - const redirectUrl = window.location.origin + '/login' - window.location.href = `${process.env.VUE_APP_LOGIN_URL}?isLoggedOut=true&redirectUrl=${redirectUrl}` + + // if not having redirection url then redirect the user to launchpad + if (!redirectionUrl) { + const redirectUrl = window.location.origin + '/login' + window.location.href = `${process.env.VUE_APP_LOGIN_URL}?isLoggedOut=true&redirectUrl=${redirectUrl}` + } }) }, goToLaunchpad() {