This is an automated email from the git hooks/post-receive script. New commit to branch bow-v2-go in repository bow. See https://gitlab.nuiton.org/chorem/bow.git commit 609b45cde821db107231c5eb3f6f9926a6315584 Author: Benjamin <poussin@codelutin.com> Date: Fri Apr 24 11:06:28 2020 +0200 meilleur support du login/logout ajout de la notion de listener sur le change dans le store --- web/src/App.vue | 8 +++++++- web/src/components/layout/Header.vue | 16 ++++++++++++---- web/src/router/index.js | 25 ++++++++++++++++++++++++- web/src/utils/Store.js | 21 +++++++++++++++++++++ web/src/views/Login.vue | 10 +++++++--- 5 files changed, 71 insertions(+), 9 deletions(-) diff --git a/web/src/App.vue b/web/src/App.vue index 5d209a4..c31b580 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -23,11 +23,16 @@ import Sidebar from './components/layout/Sidebar.vue' }) class App extends Vue { insertOpenSearch() { + let linkId = 'opensearch' + // on retire l'ancien quoi qu'il arrive + let old = document.getElementById(linkId) + old && old.remove() + let token = this.$store.getCookie('bow-token') if (token) { // <link title="bow" type="application/opensearchdescription+xml" rel="search" href="<%= VUE_APP_BOW_PUBLIC_API_URL %>/api/v1/opensearch"> let link = document.createElement('link') - link.id = 'opensearch' + link.id = linkId link.title = 'bow' link.type = 'application/opensearchdescription+xml' link.rel = 'search' @@ -39,6 +44,7 @@ class App extends Vue { beforeMount() { console.log('beforeMounted App') this.insertOpenSearch() + this.$store.addListener('bow-user', this.insertOpenSearch, this) } } export default App diff --git a/web/src/components/layout/Header.vue b/web/src/components/layout/Header.vue index 1f1fb89..5598a51 100644 --- a/web/src/components/layout/Header.vue +++ b/web/src/components/layout/Header.vue @@ -7,7 +7,7 @@ <SearchInput></SearchInput> <div id="header-user-infos"> - <span v-if="token"> + <span v-if="authenticated" v-on:authenticated="loadData()"> <router-link to="/preferences"> {{ this.user.login }} (bow user since {{ new Date(this.user.creationdate).getFullYear() }}) </router-link> @@ -35,18 +35,26 @@ import SearchInput from '@/components/SearchInput' }) class Header extends Vue { user = {} - token = '' + authenticated = false logout() { this.$fetch .delete(`/users/${this.user.id}/auth`) + .then(() => this.loadData()) + .then(() => this.$store.delete('bow-user')) .then(() => this.$router.push({ name: 'Login' })) } + loadData() { + console.log('loadData Header') + this.user = this.$store.get('bow-user') + this.authenticated = !!this.$store.getCookie('bow-token') + } + beforeMount() { console.log('beforeMounted Header') - this.user = this.$store.get('bow-user') - this.token = this.$store.getCookie('bow-token') + this.loadData() + this.$store.addListener('bow-user', this.loadData, this) } // beforeUpdate() { diff --git a/web/src/router/index.js b/web/src/router/index.js index 90152d6..437a8e0 100644 --- a/web/src/router/index.js +++ b/web/src/router/index.js @@ -16,12 +16,18 @@ const routes = [ { path: '/preferences', name: 'Preferences', - component: Preferences + component: Preferences, + meta: { + requiresAuth: true + } }, { path: '/', name: 'Home', component: Home, + meta: { + requiresAuth: true + }, props: route => ({ id: route.query.id, tags: route.query.tags, @@ -36,6 +42,9 @@ const routes = [ path: '/edit/:id', name: 'Edit', component: BookmarkEdit, + meta: { + requiresAuth: true + }, props: route => ({ id: route.params.id, uri: route.query.uri, @@ -63,4 +72,18 @@ const router = new VueRouter({ routes }) +router.beforeEach((to, from, next) => { + if ( + to.matched.some(record => record.meta.requiresAuth) && + !window.$store.getCookie('bow-token') + ) { + next({ + path: '/login', + params: { nextUrl: to.fullPath } + }) + } else { + next() + } +}) + export default router diff --git a/web/src/utils/Store.js b/web/src/utils/Store.js index ee3ea5d..88e2286 100644 --- a/web/src/utils/Store.js +++ b/web/src/utils/Store.js @@ -1,8 +1,19 @@ +// contient des pairs {key, callback} +let listeners = [] + +function fireEvent(key, value) { + console.log('-------------> storage change', key, value) + listeners.filter(l => l.key === key).forEach(l => { + l.callback.call(l.me, value, key) + }) +} + /* Default store/read to/from localStorage If data not found on localStorage, looking for value in cookie */ let StoreHelper = { + get(key) { let value = localStorage.getItem(key) || this.getCookie(key) return value === undefined ? undefined : JSON.parse(value) @@ -11,10 +22,12 @@ let StoreHelper = { set(key, value) { // value must not be undefined (error when JSON.parse during get) localStorage.setItem(key, JSON.stringify(value || null)) + fireEvent(key, value) }, delete(key) { localStorage.removeItem(key) + fireEvent(key, undefined) }, has(key) { @@ -38,6 +51,14 @@ let StoreHelper = { .map(s => decodeURIComponent(s.replace(/[^=]+=(.*)/, '$1')))[0] return value + }, + + addListener(key, callback, me) { + listeners.push({key, callback, me}) + }, + + removeEventListener(key, callback) { + listeners = listeners.filter(e => e.key !== key && e.callback !== callback) } } diff --git a/web/src/views/Login.vue b/web/src/views/Login.vue index df2e7ff..acac899 100644 --- a/web/src/views/Login.vue +++ b/web/src/views/Login.vue @@ -49,9 +49,13 @@ class Login extends Vue { this.$fetch.post('/users/auth', this.data).then( user => { console.log('ok', user) - this.$store.set('user', user) - this.$emit('authenticated', user) - this.$router.push({ name: 'Home'}) + this.$store.set('bow-user', user) + + if(this.$route.params.nextUrl != null){ + this.$router.push(this.$route.params.nextUrl) + } else { + this.$router.push({ name: 'Home'}) + } }, err => { console.log('ko', err) -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.