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