From 355410c03c3cdfa13fc8164841c188522a83a22f Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Thu, 12 Nov 2020 19:13:24 +0700 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=B3=D0=B0=20-=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D1=8F=D0=BB=D0=B8?= =?UTF-8?q?=D1=81=D1=8C=20=D1=85=D0=BE=D1=82=D0=BA=D0=B5=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/share/utils.js | 63 ++++++++++++++++++++++++---------- client/store/modules/reader.js | 7 ++-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/client/share/utils.js b/client/share/utils.js index 0dd69976..add984a8 100644 --- a/client/share/utils.js +++ b/client/share/utils.js @@ -103,30 +103,57 @@ export function fromBase64(data) { )); } -export function getObjDiff(oldObj, newObj) { - const result = {__isDiff: true, change: {}, add: {}, del: []}; +export function getObjDiff(oldObj, newObj, opts = {}) { + const { + exclude = [], + excludeAdd = [], + excludeDel = [], + } = opts; - for (const key of Object.keys(oldObj)) { - if (newObj.hasOwnProperty(key)) { - if (!_.isEqual(oldObj[key], newObj[key])) { - if (_.isObject(oldObj[key]) && _.isObject(newObj[key])) { - result.change[key] = getObjDiff(oldObj[key], newObj[key]); - } else { - result.change[key] = _.cloneDeep(newObj[key]); + const ex = new Set(exclude); + const exAdd = new Set(excludeAdd); + const exDel = new Set(excludeDel); + + const makeObjDiff = (oldObj, newObj, keyPath) => { + const result = {__isDiff: true, change: {}, add: {}, del: []}; + + keyPath = `${keyPath}${keyPath ? '/' : ''}`; + + for (const key of Object.keys(oldObj)) { + const kp = `${keyPath}${key}`; + + if (newObj.hasOwnProperty(key)) { + if (ex.has(kp)) + continue; + + if (!_.isEqual(oldObj[key], newObj[key])) { + if (_.isObject(oldObj[key]) && _.isObject(newObj[key])) { + result.change[key] = makeObjDiff(oldObj[key], newObj[key], kp); + } else { + result.change[key] = _.cloneDeep(newObj[key]); + } } + } else { + if (exDel.has(kp)) + continue; + result.del.push(key); } - } else { - result.del.push(key); } + + for (const key of Object.keys(newObj)) { + const kp = `${keyPath}${key}`; + if (exAdd.has(kp)) + continue; + + if (!oldObj.hasOwnProperty(key)) { + result.add[key] = _.cloneDeep(newObj[key]); + } + } + + return result; } - for (const key of Object.keys(newObj)) { - if (!oldObj.hasOwnProperty(key)) { - result.add[key] = _.cloneDeep(newObj[key]); - } - } - - return result; + return makeObjDiff(oldObj, newObj, ''); } export function isObjDiff(diff) { diff --git a/client/store/modules/reader.js b/client/store/modules/reader.js index 12ec4d67..cf7cd0c4 100644 --- a/client/store/modules/reader.js +++ b/client/store/modules/reader.js @@ -268,9 +268,12 @@ for (const button of toolButtons) for (const hotKey of hotKeys) settingDefaults.userHotKeys[hotKey.name] = hotKey.codes; +const excludeDiffHotKeys = []; +for (const hotKey of hotKeys) + excludeDiffHotKeys.push(`userHotKeys/${hotKey.name}`); + function addDefaultsToSettings(settings) { - const diff = utils.getObjDiff(settings, settingDefaults); - + const diff = utils.getObjDiff(settings, settingDefaults, {exclude: excludeDiffHotKeys}); if (!utils.isEmptyObjDiffDeep(diff, {isApplyChange: false})) { return utils.applyObjDiff(settings, diff, {isApplyChange: false}); }