Skip to content

Commit

Permalink
Guard from invalid value on local storage
Browse files Browse the repository at this point in the history
  • Loading branch information
int128 committed Jun 27, 2017
1 parent 6e9d8ff commit 1f0d2e4
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 65 deletions.
34 changes: 34 additions & 0 deletions src/infrastructure/PreferenceStorage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
export default class PreferenceStorage {
constructor(key) {
this.key = key;
}

get() {
try {
return JSON.parse(localStorage.getItem(this.key));
} catch (e) {
console.warn(e);
return null;
}
}

save(json) {
localStorage.setItem(this.key, JSON.stringify(json));
}

remove() {
localStorage.removeItem(this.key);
}

poll() {
return new Promise(resolve => {
const callback = e => {
if (e.storageArea === localStorage && e.key === this.key && e.newValue !== null) {
window.removeEventListener('storage', callback);
resolve();
}
}
window.addEventListener('storage', callback);
});
}
}
50 changes: 21 additions & 29 deletions src/repositories/AppPreferenceRepository.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import PreferenceStorage from '../infrastructure/PreferenceStorage';

import AppPreference from '../models/AppPreference';
import { THEMES } from '../models/Themes';

const APP_PREFERENCE = 'APP_PREFERENCE';
const SELECTED_THEME_ID = 'SELECTED_THEME_ID';
const HIDDEN_COMPONENTS = 'HIDDEN_COMPONENTS';

export default class AppPreferenceRepository {
get() {
const oldSelectedThemeId = JSON.parse(localStorage.getItem(SELECTED_THEME_ID));
const json = JSON.parse(localStorage.getItem(APP_PREFERENCE));
preferenceStorage = new PreferenceStorage('APP_PREFERENCE')
oldHiddenComponentsStorage = new PreferenceStorage('HIDDEN_COMPONENTS')
oldSelectedThemeIdStorage = new PreferenceStorage('SELECTED_THEME_ID')

const theme = THEMES.getById(this.extractThemeIdFrom(json, oldSelectedThemeId));
return new AppPreference({...json, theme});
get() {
const json = this.preferenceStorage.get();
return this.migrateOldKey(new AppPreference({
...json,
theme: THEMES.getById(json ? json.theme : null)
}));
}

extractThemeIdFrom(json, oldSelectedThemeId) {
if (oldSelectedThemeId) {
// migrate old key
return oldSelectedThemeId;
} else if (json) {
return json.theme;
migrateOldKey(appPreference) {
const selectedThemeId = this.oldSelectedThemeIdStorage.get();
if (selectedThemeId !== null) {
return appPreference.set('theme', THEMES.getById(selectedThemeId));
} else {
return null;
return appPreference;
}
}

Expand All @@ -39,22 +39,14 @@ export default class AppPreferenceRepository {
return value;
}
});
localStorage.setItem(APP_PREFERENCE, JSON.stringify(json));
this.preferenceStorage.save(json);

// clean up old key
localStorage.removeItem(HIDDEN_COMPONENTS);
localStorage.removeItem(SELECTED_THEME_ID);
// remove old data
this.oldHiddenComponentsStorage.remove();
this.oldSelectedThemeIdStorage.remove();
}

poll() {
return new Promise(resolve => {
const callback = e => {
if (e.storageArea === localStorage && e.key === APP_PREFERENCE && e.newValue !== null) {
window.removeEventListener('storage', callback);
resolve();
}
}
window.addEventListener('storage', callback);
});
return this.preferenceStorage.poll();
}
}
25 changes: 10 additions & 15 deletions src/repositories/FolderItemPreferenceRepository.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
import { Seq } from 'immutable';
import PreferenceStorage from '../infrastructure/PreferenceStorage';

import FolderItemPreference from '../models/FolderItemPreference';
import FolderItemPreferences from '../models/FolderItemPreferences';

const FOLDER_ITEM_PREFERENCES = 'FOLDER_ITEM_PREFERENCES';

export default class FolderItemPreferenceRepository {
preferenceStorage = new PreferenceStorage('FOLDER_ITEM_PREFERENCES');

get() {
const json = JSON.parse(localStorage.getItem(FOLDER_ITEM_PREFERENCES));
const array = Seq(json).map(object => new FolderItemPreference(object)).toArray();
return new FolderItemPreferences(array);
const json = this.preferenceStorage.get();
const arrayOfFolderItemPreference = Seq(json)
.map(object => new FolderItemPreference(object))
.toArray();
return new FolderItemPreferences(arrayOfFolderItemPreference);
}

save(folderItemPreferences) {
localStorage.setItem(FOLDER_ITEM_PREFERENCES, JSON.stringify(folderItemPreferences.toArray()));
this.preferenceStorage.save(folderItemPreferences.toArray());
}

poll() {
return new Promise(resolve => {
const callback = e => {
if (e.storageArea === localStorage && e.key === FOLDER_ITEM_PREFERENCES && e.newValue !== null) {
window.removeEventListener('storage', callback);
resolve();
}
}
window.addEventListener('storage', callback);
});
return this.preferenceStorage.poll();
}
}
41 changes: 20 additions & 21 deletions src/repositories/FolderPreferenceRepository.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,38 @@
import { Seq } from 'immutable';
import PreferenceStorage from '../infrastructure/PreferenceStorage';

import FolderPreference from '../models/FolderPreference';
import FolderPreferences from '../models/FolderPreferences';

const FOLDER_PREFERENCES = 'FOLDER_PREFERENCES';
const COLLAPSED_FOLDERS = 'COLLAPSED_FOLDERS';

export default class FolderPreferenceRepository {
preferenceStorage = new PreferenceStorage('FOLDER_PREFERENCES')
oldCollapsedFoldersStorage = new PreferenceStorage('COLLAPSED_FOLDERS')

get() {
// migrate old data
if (localStorage.getItem(COLLAPSED_FOLDERS)) {
const json = JSON.parse(localStorage.getItem(COLLAPSED_FOLDERS));
const array = Seq(json).map(id => new FolderPreference({id, collapsed: true})).toArray();
return new FolderPreferences(array);
const collapsedFolders = this.oldCollapsedFoldersStorage.get();
if (collapsedFolders !== null) {
const arrayOfFolderPreferences = Seq(collapsedFolders)
.map(id => new FolderPreference({id, collapsed: true}))
.toArray();
return new FolderPreferences(arrayOfFolderPreferences);
}

const json = JSON.parse(localStorage.getItem(FOLDER_PREFERENCES));
const array = Seq(json).map(object => new FolderPreference(object)).toArray();
return new FolderPreferences(array);
const json = this.preferenceStorage.get();
const arrayOfFolderPreferences = Seq(json)
.map(object => new FolderPreference(object))
.toArray();
return new FolderPreferences(arrayOfFolderPreferences);
}

save(folderPreferences) {
localStorage.setItem(FOLDER_PREFERENCES, JSON.stringify(folderPreferences.toArray()));
localStorage.removeItem(COLLAPSED_FOLDERS);
this.preferenceStorage.save(folderPreferences.toArray());

// remove old data
this.oldCollapsedFoldersStorage.remove();
}

poll() {
return new Promise(resolve => {
const callback = e => {
if (e.storageArea === localStorage && e.key === FOLDER_PREFERENCES && e.newValue !== null) {
window.removeEventListener('storage', callback);
resolve();
}
}
window.addEventListener('storage', callback);
});
return this.preferenceStorage.poll();
}
}

0 comments on commit 1f0d2e4

Please sign in to comment.