Bläddra i källkod

Работа над ServerStorage

Book Pauk 6 år sedan
förälder
incheckning
2a4ff926ae

+ 6 - 3
client/components/Reader/ServerStorage/ServerStorage.vue

@@ -34,11 +34,14 @@ class ServerStorage extends Vue {
         }
         }
         this.hashedStorageKey = utils.toBase58(cryptoUtils.sha256(this.serverStorageKey));
         this.hashedStorageKey = utils.toBase58(cryptoUtils.sha256(this.serverStorageKey));
 
 
-        this.oldProfiles = this.profiles;
         await this.loadProfiles();
         await this.loadProfiles();
         this.checkCurrentProfile();
         this.checkCurrentProfile();
     }
     }
 
 
+    get serverSyncEnabled() {
+        return this.$store.state.reader.serverSyncEnabled;
+    }
+
     get settings() {
     get settings() {
         return this.$store.state.reader.settings;
         return this.$store.state.reader.settings;
     }
     }
@@ -79,7 +82,7 @@ class ServerStorage extends Vue {
     }
     }
 
 
     async loadProfiles() {
     async loadProfiles() {
-        if (!this.currentProfile)
+        if (!this.serverSyncEnabled)
             return;
             return;
 
 
         let prof = await this.storageGet({'profiles': {}});
         let prof = await this.storageGet({'profiles': {}});
@@ -103,7 +106,7 @@ class ServerStorage extends Vue {
     }
     }
 
 
     async saveProfiles() {
     async saveProfiles() {
-        if (!this.currentProfile || this.savingProfiles)
+        if (!this.serverSyncEnabled || this.savingProfiles)
             return;
             return;
 
 
         const diff = utils.getObjDiff(this.oldProfiles, this.profiles);
         const diff = utils.getObjDiff(this.oldProfiles, this.profiles);

+ 43 - 14
client/components/Reader/SettingsPage/SettingsPage.vue

@@ -9,13 +9,21 @@
                 <el-tabs type="border-card" tab-position="left" v-model="selectedTab">
                 <el-tabs type="border-card" tab-position="left" v-model="selectedTab">
                     <!-- Профили ------------------------------------------------------------------------->
                     <!-- Профили ------------------------------------------------------------------------->
                     <el-tab-pane label="Профили">
                     <el-tab-pane label="Профили">
-                        <el-form :model="form" size="small" label-width="100px" @submit.native.prevent>
+                        <el-form :model="form" size="small" label-width="80px" @submit.native.prevent>
+                            <div class="partHeader">Управление синхронизацией настроек</div>
+                            <el-form-item label="">
+                                <el-checkbox v-model="serverSyncEnabled">Включить синхронизацию с сервером</el-checkbox>
+                            </el-form-item>
+                        </el-form>
+
+                        <div v-show="serverSyncEnabled">
+                        <el-form :model="form" size="small" label-width="80px" @submit.native.prevent>
                             <div class="partHeader">Профили устройств</div>
                             <div class="partHeader">Профили устройств</div>
 
 
                             <el-form-item label="">
                             <el-form-item label="">
                                 <div class="text">
                                 <div class="text">
-                                    Выберите или добавьте профиль устройства, чтобы начать синхронизацию данных с сервером.
-                                    При выборе "Нет" синхронизация отключается.
+                                    Выберите или добавьте профиль устройства, чтобы начать синхронизацию настроек с сервером.
+                                    <br>При выборе "Нет" синхронизация настроек (но не книг) отключается.
                                 </div>
                                 </div>
                             </el-form-item>
                             </el-form-item>
 
 
@@ -37,13 +45,13 @@
                             </el-form-item>
                             </el-form-item>
                         </el-form>
                         </el-form>
 
 
-                        <el-form :model="form" size="small" label-width="100px" @submit.native.prevent>
+                        <el-form :model="form" size="small" label-width="80px" @submit.native.prevent>
                             <div class="partHeader">Ключ доступа</div>
                             <div class="partHeader">Ключ доступа</div>
 
 
                             <el-form-item label="">
                             <el-form-item label="">
                                 <div class="text">
                                 <div class="text">
-                                    Ключ доступа позволяет восстановить профили с настройками и список читаемых книг
-                                    на другом устройстве. Для этого необходимо передать его через почту, мессенджер или другим способом.
+                                    Ключ доступа позволяет восстановить профили с настройками и список читаемых книг.
+                                    Для этого необходимо передать ключ на устройство через почту, мессенджер или другим способом.
                                 </div>
                                 </div>
                             </el-form-item>
                             </el-form-item>
 
 
@@ -57,11 +65,13 @@
 
 
                             <el-form-item label="">
                             <el-form-item label="">
                                 <div v-if="!serverStorageKeyVisible">
                                 <div v-if="!serverStorageKeyVisible">
+                                    <hr/>
                                     <b>{{ partialStorageKey }}</b> (часть вашего ключа)
                                     <b>{{ partialStorageKey }}</b> (часть вашего ключа)
+                                    <hr/>
                                 </div>
                                 </div>
                                 <div v-else style="line-height: 100%">
                                 <div v-else style="line-height: 100%">
                                     <hr/>
                                     <hr/>
-                                    <div style="width: 300px; overflow-wrap: break-word;"><b>{{ serverStorageKey }}</b></div>
+                                    <div style="width: 300px; padding-top: 5px; overflow-wrap: break-word;"><b>{{ serverStorageKey }}</b></div>
                                     <br><div class="center">
                                     <br><div class="center">
                                         <el-button size="mini" class="copy-button" @click="copyToClip(serverStorageKey, 'Ключ')">Скопировать ключ</el-button>
                                         <el-button size="mini" class="copy-button" @click="copyToClip(serverStorageKey, 'Ключ')">Скопировать ключ</el-button>
                                     </div>
                                     </div>
@@ -94,6 +104,7 @@
                                 </div>
                                 </div>
                             </el-form-item>
                             </el-form-item>
                         </el-form>
                         </el-form>
+                        </div>
                     </el-tab-pane>
                     </el-tab-pane>
                     <!-- Вид ------------------------------------------------------------------------->                    
                     <!-- Вид ------------------------------------------------------------------------->                    
                     <el-tab-pane label="Вид">
                     <el-tab-pane label="Вид">
@@ -521,6 +532,14 @@ class SettingsPage extends Vue {
         return this.$store.state.reader.settings;
         return this.$store.state.reader.settings;
     }
     }
 
 
+    get serverSyncEnabled() {
+        return this.$store.state.reader.serverSyncEnabled;
+    }
+
+    set serverSyncEnabled(newValue) {
+        this.commit('reader/setServerSyncEnabled', newValue);
+    }
+
     get profiles() {
     get profiles() {
         return this.$store.state.reader.profiles;
         return this.$store.state.reader.profiles;
     }
     }
@@ -615,10 +634,9 @@ class SettingsPage extends Vue {
                 if (this.profiles[result.value]) {
                 if (this.profiles[result.value]) {
                     this.$alert('Такой профиль уже существует', 'Ошибка');
                     this.$alert('Такой профиль уже существует', 'Ошибка');
                 } else {
                 } else {
-                    this.currentProfile = result.value;
-                    await this.$nextTick();//даем возможность обновить currentProfile
                     const newProfiles = Object.assign({}, this.profiles, {[result.value]: 1});
                     const newProfiles = Object.assign({}, this.profiles, {[result.value]: 1});
                     this.commit('reader/setProfiles', newProfiles);
                     this.commit('reader/setProfiles', newProfiles);
+                    this.currentProfile = result.value;
                 }
                 }
             }
             }
         } catch (e) {
         } catch (e) {
@@ -646,7 +664,6 @@ class SettingsPage extends Vue {
                     const newProfiles = Object.assign({}, this.profiles);
                     const newProfiles = Object.assign({}, this.profiles);
                     delete newProfiles[this.currentProfile];
                     delete newProfiles[this.currentProfile];
                     this.commit('reader/setProfiles', newProfiles);
                     this.commit('reader/setProfiles', newProfiles);
-                    await this.$nextTick();//даем возможность сохранить profiles
                     this.currentProfile = '';
                     this.currentProfile = '';
                 }
                 }
             }
             }
@@ -670,11 +687,7 @@ class SettingsPage extends Vue {
             });
             });
 
 
             if (result.value && result.value.toLowerCase() == 'да') {
             if (result.value && result.value.toLowerCase() == 'да') {
-                if (!this.currentProfile)
-                    this.currentProfile = Object.keys(this.profiles)[0];
-                await this.$nextTick();//даем возможность обновить currentProfile
                 this.commit('reader/setProfiles', {});
                 this.commit('reader/setProfiles', {});
-                await this.$nextTick();//даем возможность сохранить profiles
                 this.currentProfile = '';
                 this.currentProfile = '';
             }
             }
         } catch (e) {
         } catch (e) {
@@ -697,6 +710,22 @@ class SettingsPage extends Vue {
     }
     }
 
 
     async enterServerStorageKey() {
     async enterServerStorageKey() {
+        try {
+            const result = await this.$prompt(`<b>Предупреждение!</b> Изменение ключа доступа приведет к потере всех профилей и читаемых книг, привязанных к предыдущему ключу.` +
+                    `<br><br>Введите новый ключ доступа:`, '', {
+                dangerouslyUseHTMLString: true,
+                confirmButtonText: 'OK',
+                cancelButtonText: 'Отмена',
+                inputValidator: (str) => { if (str && str.length == 44) return true; else return 'Неверный формат ключа'; },
+                type: 'warning'
+            });
+
+            if (result.value && result.value.length == 44) {
+                this.commit('reader/setServerStorageKey', result.value);
+            }
+        } catch (e) {
+            //
+        }
     }
     }
 
 
     async generateServerStorageKey() {
     async generateServerStorageKey() {

+ 4 - 0
client/store/modules/reader.js

@@ -177,6 +177,7 @@ for (const font of webFonts)
 // initial state
 // initial state
 const state = {
 const state = {
     toolBarActive: true,
     toolBarActive: true,
+    serverSyncEnabled: false,
     serverStorageKey: '',
     serverStorageKey: '',
     profiles: {},
     profiles: {},
     profilesRev: 0,
     profilesRev: 0,
@@ -195,6 +196,9 @@ const mutations = {
     setToolBarActive(state, value) {
     setToolBarActive(state, value) {
         state.toolBarActive = value;
         state.toolBarActive = value;
     },
     },
+    setServerSyncEnabled(state, value) {
+        state.serverSyncEnabled = value;
+    },
     setServerStorageKey(state, value) {
     setServerStorageKey(state, value) {
         state.serverStorageKey = value;
         state.serverStorageKey = value;
     },
     },