From d30b0b28c9371e56ffe54b5a8b56087718221c1d Mon Sep 17 00:00:00 2001
From: Shpuld Shpuldson <shp@cock.li>
Date: Wed, 1 Jul 2020 19:15:28 +0300
Subject: [PATCH] catch localforage error and let the application work, add an
 alert for user to dismiss

---
 src/App.js               |  6 ++++++
 src/App.scss             |  9 +++++++++
 src/App.vue              | 10 ++++++++++
 src/i18n/en.json         |  3 +++
 src/main.js              | 13 +++++++++++--
 src/modules/instance.js  |  2 +-
 src/modules/interface.js |  7 +++++++
 7 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/src/App.js b/src/App.js
index 040138c97..da66fe214 100644
--- a/src/App.js
+++ b/src/App.js
@@ -107,6 +107,9 @@ export default {
       return {
         'order': this.$store.state.instance.sidebarRight ? 99 : 0
       }
+    },
+    showStorageError () {
+      return this.$store.state.interface.storageError === 'show'
     }
   },
   methods: {
@@ -129,6 +132,9 @@ export default {
       if (changed) {
         this.$store.dispatch('setMobileLayout', mobileLayout)
       }
+    },
+    hideStorageError () {
+      this.$store.dispatch('setStorageError', 'hide')
     }
   }
 }
diff --git a/src/App.scss b/src/App.scss
index f2972eda5..db447f1c3 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -806,6 +806,15 @@ nav {
   }
 }
 
+.storage-error-notice {
+  text-align: center;
+  i {
+    cursor: pointer;
+    color: $fallback--text;
+    color: var(--alertErrorText, $fallback--text);
+  }
+}
+
 .button-icon {
   font-size: 1.2em;
 }
diff --git a/src/App.vue b/src/App.vue
index 7b9ad3dc1..23991eacc 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -101,6 +101,16 @@
         </div>
       </div>
       <div class="main">
+        <div
+          v-if="showStorageError"
+          class="alert error storage-error-notice"
+        >
+          {{ $t("errors.storage_unavailable") }}
+          <i
+            class="icon-cancel"
+            @click="hideStorageError"
+          />
+        </div>
         <div
           v-if="!currentUser"
           class="login-hint panel panel-default"
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 59f69e576..4856008f4 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -163,6 +163,9 @@
     "load_all_hint": "Loaded first {saneAmount} emoji, loading all emoji may cause performance issues.",
     "load_all": "Loading all {emojiAmount} emoji"
   },
+  "errors": {
+    "storage_unavailable": "Pleroma could not access browser storage. You may encounter issues and your login or your local settings won't be saved. Try enabling cookies."
+  },
   "interactions": {
     "favs_repeats": "Repeats and Favorites",
     "follows": "New follows",
diff --git a/src/main.js b/src/main.js
index 9a201e4fa..bb2c8cd36 100644
--- a/src/main.js
+++ b/src/main.js
@@ -62,7 +62,16 @@ const persistedStateOptions = {
 };
 
 (async () => {
-  const persistedState = await createPersistedState(persistedStateOptions)
+  console.log('before perse state')
+  let persistedState
+  let storageError = 'none'
+  try {
+    persistedState = await createPersistedState(persistedStateOptions)
+  } catch (e) {
+    console.error(e)
+    storageError = 'show'
+    persistedState = _ => _
+  }
   const store = new Vuex.Store({
     modules: {
       i18n: {
@@ -89,7 +98,7 @@ const persistedStateOptions = {
     strict: false // Socket modifies itself, let's ignore this for now.
     // strict: process.env.NODE_ENV !== 'production'
   })
-
+  store.dispatch('setStorageError', storageError)
   afterStoreSetup({ store, i18n })
 })()
 
diff --git a/src/modules/instance.js b/src/modules/instance.js
index ec5f4e547..cc8843172 100644
--- a/src/modules/instance.js
+++ b/src/modules/instance.js
@@ -8,7 +8,7 @@ const defaultState = {
   // Stuff from apiConfig
   name: 'Pleroma FE',
   registrationOpen: true,
-  server: 'http://localhost:4040/',
+  server: 'http://lain.com:4040',
   textlimit: 5000,
   themeData: undefined,
   vapidPublicKey: undefined,
diff --git a/src/modules/interface.js b/src/modules/interface.js
index eeebd65eb..4b5b5b5d9 100644
--- a/src/modules/interface.js
+++ b/src/modules/interface.js
@@ -8,6 +8,7 @@ const defaultState = {
     noticeClearTimeout: null,
     notificationPermission: null
   },
+  storageError: 'none',
   browserSupport: {
     cssFilter: window.CSS && window.CSS.supports && (
       window.CSS.supports('filter', 'drop-shadow(0 0)') ||
@@ -58,6 +59,9 @@ const interfaceMod = {
       if (!state.settingsModalLoaded) {
         state.settingsModalLoaded = true
       }
+    },
+    setStorageError (state, value) {
+      state.storageError = value
     }
   },
   actions: {
@@ -81,6 +85,9 @@ const interfaceMod = {
     },
     togglePeekSettingsModal ({ commit }) {
       commit('togglePeekSettingsModal')
+    },
+    setStorageError ({ commit }, value) {
+      commit('setStorageError', value)
     }
   }
 }
-- 
GitLab