Browse Source

Refactor LocalStorage

pull/4223/head
Artur Arseniev 4 years ago
parent
commit
f447ccef51
  1. 12
      src/editor/model/Editor.js
  2. 5
      src/storage_manager/config/config.js
  3. 53
      src/storage_manager/index.js
  4. 47
      src/storage_manager/model/LocalStorage.js

12
src/editor/model/Editor.js

@ -616,14 +616,14 @@ export default class EditorModel extends Model {
if (!sm) return; if (!sm) return;
const isCallback = isFunction(opts); const isCallback = isFunction(opts);
const store = this.storeData(); const toStore = this.storeData();
sm.store(store, res => { sm.store(toStore, res => {
clb && clb(res, store); isCallback && opts(res, toStore);
this.set('changesCount', 0); this.set('changesCount', 0);
this.trigger('storage:store', store); this.trigger('storage:store', toStore);
}); });
return store; return toStore;
} }
storeData() { storeData() {
@ -683,7 +683,7 @@ export default class EditorModel extends Model {
keys.forEach(k => load.push(k)); keys.forEach(k => load.push(k));
}); });
sm.load(load, res => { sm.load(res => {
this.cacheLoad = res; this.cacheLoad = res;
clb && clb(res); clb && clb(res);
setTimeout(() => this.trigger('storage:load', res)); setTimeout(() => this.trigger('storage:load', res));

5
src/storage_manager/config/config.js

@ -34,7 +34,10 @@ export default {
// Default storage options // Default storage options
options: { options: {
local: { local: {
key: 'gjs-project', key: 'gjsProject',
// If enabled, checks if browser supports LocalStorage
checkLocal: true,
}, },
remote: { remote: {
// Custom parameters to pass with the remote request, eg. csrf token // Custom parameters to pass with the remote request, eg. csrf token

53
src/storage_manager/index.js

@ -221,24 +221,24 @@ export default () => {
* @example * @example
* storageManager.store({item1: value1, item2: value2}); * storageManager.store({item1: value1, item2: value2});
* */ * */
store(data, resolve, reject, options = {}) { async store(data, resolve, reject, options = {}) {
const ev = 'store';
const st = this.getCurrentStorage(); const st = this.getCurrentStorage();
const toStore = {};
const opts = { ...this.getCurrentOptons(), ...options }; const opts = { ...this.getCurrentOptons(), ...options };
this.onStart('store', data); this.onStart(ev, data);
const onResult = res => { const onResult = res => {
this.onAfter('store', res); this.onAfter(ev, res);
resolve?.(res); resolve?.(res);
this.onEnd('store', res); this.onEnd(ev, res);
}; };
const onError = err => { const onError = err => {
reject?.(err); reject?.(err);
this.onError('store', err); this.onError(ev, err);
}; };
return st ? st.store(toStore, onResult, onError, opts) : null; return st ? st.store(data, onResult, onError, opts) : null;
}, },
/** /**
@ -253,35 +253,26 @@ export default () => {
* // res -> {item1: value1} * // res -> {item1: value1}
* }); * });
* */ * */
load(keys, clb) { async load(resolve, reject, options = {}) {
const ev = 'load';
const st = this.getCurrentStorage(); const st = this.getCurrentStorage();
const keysF = []; const opts = { ...this.getCurrentOptons(), ...options };
let result = {}; let result = {};
this.onStart(ev);
if (typeof keys === 'string') keys = [keys]; const onResult = res => {
this.onStart('load', keys); result = this.__clearKeys(res);
this.onAfter(ev, result);
resolve?.(result);
this.onEnd(ev, result);
};
for (var i = 0, len = keys.length; i < len; i++) { const onError = err => {
keysF.push(c.id + keys[i]); reject?.(err);
} this.onError(ev, err);
};
if (st) { return st ? st.load(onResult, onError, opts) : resolve(result);
st.load(
keysF,
res => {
result = this.__clearKeys(res);
this.onAfter('load', result);
clb && clb(result);
this.onEnd('load', result);
},
err => {
clb && clb(result);
this.onError('load', err);
}
);
} else {
clb && clb(result);
}
}, },
/** /**

47
src/storage_manager/model/LocalStorage.js

@ -1,37 +1,46 @@
import { Model } from 'backbone'; import { Model } from 'backbone';
import { hasWin } from 'utils/mixins'; import { hasWin } from 'utils/mixins';
const noLocalStorage = 'localStorage not available';
export default Model.extend({ export default Model.extend({
defaults: { defaults: {
checkLocal: true checkLocal: true,
}, },
/** /**
* @private * @private
*/ */
store(data, clb = () => {}) { async store(data, resolve, reject, opts) {
if (this.hasLocal()) { try {
for (let key in data) localStorage.setItem(key, data[key]); if (this.hasLocal()) {
localStorage.setItem(opts.key, JSON.stringify(data));
return resolve();
} else {
reject(noLocalStorage);
}
} catch (error) {
reject(error);
} }
clb && clb();
}, },
/** /**
* @private * @private
*/ */
load(keys, clb = () => {}) { async load(resolve, reject, opts) {
const result = {}; let result = {};
if (this.hasLocal()) { try {
for (let i = 0, len = keys.length; i < len; i++) { if (this.hasLocal()) {
const value = localStorage.getItem(keys[i]); result = JSON.parse(localStorage.getItem(opts.key) || '{}');
if (value) result[keys[i]] = value; resolve(result);
} else {
reject(noLocalStorage);
} }
} catch (error) {
reject(error);
} }
clb && clb(result);
return result; return result;
}, },
@ -41,8 +50,7 @@ export default Model.extend({
remove(keys) { remove(keys) {
if (!this.hasLocal()) return; if (!this.hasLocal()) return;
for (let i = 0, len = keys.length; i < len; i++) for (let i = 0, len = keys.length; i < len; i++) localStorage.removeItem(keys[i]);
localStorage.removeItem(keys[i]);
}, },
/** /**
@ -50,13 +58,10 @@ export default Model.extend({
* @private * @private
* */ * */
hasLocal() { hasLocal() {
const win = hasWin(); if (this.get('checkLocal') && (!hasWin() || !localStorage)) {
if (this.get('checkLocal') && (!win || !localStorage)) {
win && console.warn("Your browser doesn't support localStorage");
return false; return false;
} }
return true; return true;
} },
}); });

Loading…
Cancel
Save