From f1c16327b696666f291d5fb2afdf4033cf9ef76d Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Fri, 7 Sep 2018 18:17:17 +0300 Subject: [PATCH] Initial version --- src/components/settings/settings.js | 4 +++ src/components/settings/settings.vue | 14 ++++++++- src/lib/persisted_state.js | 43 +++++++++++++++++++++------- src/modules/config.js | 21 +++++++++++++- 4 files changed, 69 insertions(+), 13 deletions(-) diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js index 8ef84b2a7..5e28c1af7 100644 --- a/src/components/settings/settings.js +++ b/src/components/settings/settings.js @@ -42,6 +42,10 @@ const settings = { computed: { user () { return this.$store.state.users.currentUser + }, + currentSaveStateNotice () { + console.log(this.$store.state.config._internal.currentSaveStateNotice && this.$store.state.config._internal.currentSaveStateNotice.error) + return this.$store.state.config._internal.currentSaveStateNotice } }, watch: { diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue index c106b79cf..be7c64a75 100644 --- a/src/components/settings/settings.vue +++ b/src/components/settings/settings.vue @@ -1,7 +1,19 @@ <template> <div class="settings panel panel-default"> <div class="panel-heading"> - {{$t('settings.settings')}} + <div class="title"> + {{$t('settings.settings')}} + </div> + + <template v-if="currentSaveStateNotice"> + <div @click.prevent class="alert error" v-if="currentSaveStateNotice.error"> + Errr + </div> + + <div @click.prevent class="alert success" v-if="!currentSaveStateNotice.error"> + Succ + </div> + </template> </div> <div class="panel-body"> <tab-switcher> diff --git a/src/lib/persisted_state.js b/src/lib/persisted_state.js index 60811e65e..007515cdc 100644 --- a/src/lib/persisted_state.js +++ b/src/lib/persisted_state.js @@ -1,7 +1,7 @@ import merge from 'lodash.merge' import objectPath from 'object-path' import localforage from 'localforage' -import { throttle, each } from 'lodash' +import { each } from 'lodash' let loaded = false @@ -12,18 +12,17 @@ const defaultReducer = (state, paths) => ( }, {}) ) +const saveImmedeatelyActions = [ + 'markNotificationsAsSeen', + 'clearCurrentUser', + 'setCurrentUser', + 'setOption' +] + const defaultStorage = (() => { return localforage })() -const defaultSetState = (key, state, storage) => { - if (!loaded) { - console.log('waiting for old state to be loaded...') - } else { - return storage.setItem(key, state) - } -} - export default function createPersistedState ({ key = 'vuex-lz', paths = [], @@ -31,7 +30,14 @@ export default function createPersistedState ({ let value = storage.getItem(key) return value }, - setState = throttle(defaultSetState, 60000), + setState = (key, state, storage) => { + if (!loaded) { + console.log('waiting for old state to be loaded...') + return Promise.resolve() + } else { + return storage.setItem(key, state) + } + }, reducer = defaultReducer, storage = defaultStorage, subscriber = store => handler => store.subscribe(handler) @@ -72,7 +78,22 @@ export default function createPersistedState ({ subscriber(store)((mutation, state) => { try { - setState(key, reducer(state, paths), storage) + if (saveImmedeatelyActions.includes(mutation.type)) { + setState(key, reducer(state, paths), storage) + .then(success => { + if (typeof success !== 'undefined') { + if (mutation.type === 'setOption') { + store.dispatch('settingsSaved', { success }) + } + } + }, error => { + if (mutation.type === 'setOption') { + store.dispatch('settingsSaved', { error }) + } + }) + } else { + console.warn(`Not saving to localStorage for: ${mutation.type}`) + } } catch (e) { console.log("Couldn't persist state:") console.log(e) diff --git a/src/modules/config.js b/src/modules/config.js index 60a34bc15..cb59acaa9 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -26,7 +26,11 @@ const defaultState = { }, muteWords: [], highlight: {}, - interfaceLanguage: browserLocale + interfaceLanguage: browserLocale, + _internal: { + currentSaveStateNotice: {}, + noticeClearTimeout: null + } } const config = { @@ -42,6 +46,18 @@ const config = { } else { del(state.highlight, user) } + }, + settingsSaved (state, { success, error }) { + if (success) { + if (state.noticeClearTimeout) { + clearTimeout(state.noticeClearTimeout) + } + set(state._internal, 'currentSaveStateNotice', { error: false, data: success }) + set(state._internal, 'noticeClearTimeout', + setTimeout(() => del(state._internal, 'currentSaveStateNotice'), 2000)) + } else { + set(state._internal, 'currentSaveStateNotice', { error: true, errorData: error }) + } } }, actions: { @@ -51,6 +67,9 @@ const config = { setHighlight ({ commit, dispatch }, { user, color, type }) { commit('setHighlight', {user, color, type}) }, + settingsSaved ({ commit, dispatch }, { success, error }) { + commit('settingsSaved', { success, error }) + }, setOption ({ commit, dispatch }, { name, value }) { commit('setOption', {name, value}) switch (name) { -- GitLab