From 237b36e2e209df99963f3cabd59d37db9115d8a2 Mon Sep 17 00:00:00 2001 From: axolotle Date: Fri, 9 Feb 2024 04:08:35 +0100 Subject: [PATCH] centralize a bit moar app init stuff (installed/connected) --- app/src/App.vue | 8 +---- app/src/router/index.js | 4 +++ app/src/store/info.js | 32 +++++++++++++++---- app/src/views/Login.vue | 20 ++++-------- app/src/views/PostInstall.vue | 10 +----- .../views/_partials/ReconnectingDisplay.vue | 2 +- 6 files changed, 39 insertions(+), 37 deletions(-) diff --git a/app/src/App.vue b/app/src/App.vue index b3809363..007ed45e 100644 --- a/app/src/App.vue +++ b/app/src/App.vue @@ -112,13 +112,7 @@ export default { // This hook is only triggered at page first load created () { - // From this hook the value of `connected` always come from the localStorage. - // This state may be `true` but session may have expired, by querying - // yunohost infos, api may respond with `Unauthorized` in which case the `connected` - // state will be automaticly reseted and user will be prompt with the login view. - if (this.connected) { - this.$store.dispatch('GET_YUNOHOST_INFOS') - } + this.$store.dispatch('ON_APP_CREATED') }, mounted () { diff --git a/app/src/router/index.js b/app/src/router/index.js index 163ffd96..21deb68f 100644 --- a/app/src/router/index.js +++ b/app/src/router/index.js @@ -35,6 +35,10 @@ router.beforeEach((to, from, next) => { if (store.getters.error) { store.dispatch('DISMISS_ERROR', true) } + + if (to.name === 'post-install' && store.getters.installed) { + return next('/') + } // Allow if connected or route is not protected if (store.getters.connected || to.meta.noAuth) { next() diff --git a/app/src/store/info.js b/app/src/store/info.js index a34db1a2..dfcd3d20 100644 --- a/app/src/store/info.js +++ b/app/src/store/info.js @@ -7,6 +7,7 @@ import { timeout, isEmptyValue, isObjectLiteral } from '@/helpers/commons' export default { state: { host: window.location.host, // String + installed: null, connected: localStorage.getItem('connected') === 'true', // Boolean yunohost: null, // Object { version, repo } waiting: false, // Boolean @@ -22,6 +23,10 @@ export default { }, mutations: { + 'SET_INSTALLED' (state, boolean) { + state.installed = boolean + }, + 'SET_CONNECTED' (state, boolean) { localStorage.setItem('connected', boolean) state.connected = boolean @@ -106,23 +111,37 @@ export default { }, actions: { - 'CHECK_INSTALL' ({ dispatch }, retry = 2) { + async 'ON_APP_CREATED' ({ dispatch, state }) { + await dispatch('CHECK_INSTALL') + + if (!state.installed) { + router.push({ name: 'post-install' }) + } else { + dispatch('CONNECT') + } + }, + + async 'CHECK_INSTALL' ({ dispatch, commit }, retry = 2) { // this action will try to query the `/installed` route 3 times every 5 s with // a timeout of the same delay. // FIXME need testing with api not responding - return timeout(api.get('installed'), 5000).then(({ installed }) => { + try { + const { installed } = await timeout(api.get('installed'), 5000) + commit('SET_INSTALLED', installed) return installed - }).catch(err => { + } catch (err) { if (retry > 0) { return dispatch('CHECK_INSTALL', --retry) } throw err - }) + } }, - 'CONNECT' ({ commit, dispatch }) { + async 'CONNECT' ({ commit, dispatch }) { + // If the user is not connected, the first action will throw + // and login prompt will be shown automaticly + await dispatch('GET_YUNOHOST_INFOS') commit('SET_CONNECTED', true) - dispatch('GET_YUNOHOST_INFOS') }, 'RESET_CONNECTED' ({ commit }) { @@ -350,6 +369,7 @@ export default { getters: { host: state => state.host, + installed: state => state.installed, connected: state => state.connected, yunohost: state => state.yunohost, error: state => state.error, diff --git a/app/src/views/Login.vue b/app/src/views/Login.vue index f7fdf8db..b5d31f14 100644 --- a/app/src/views/Login.vue +++ b/app/src/views/Login.vue @@ -13,7 +13,7 @@ diff --git a/app/src/views/PostInstall.vue b/app/src/views/PostInstall.vue index 6b1b17af..be54f869 100644 --- a/app/src/views/PostInstall.vue +++ b/app/src/views/PostInstall.vue @@ -75,7 +75,7 @@

{{ $t('installation_complete') }}

- + @@ -201,14 +201,6 @@ export default { confirmation: { required, passwordMatch: sameAs('password') } } } - }, - - created () { - this.$store.dispatch('CHECK_INSTALL').then(installed => { - if (installed) { - this.$router.push({ name: 'home' }) - } - }) } } diff --git a/app/src/views/_partials/ReconnectingDisplay.vue b/app/src/views/_partials/ReconnectingDisplay.vue index 008980fa..45404d63 100644 --- a/app/src/views/_partials/ReconnectingDisplay.vue +++ b/app/src/views/_partials/ReconnectingDisplay.vue @@ -29,7 +29,7 @@