diff --git a/browser/main/store.js b/browser/main/store.js index 27796d30..7ea6decb 100644 --- a/browser/main/store.js +++ b/browser/main/store.js @@ -38,29 +38,13 @@ function data (state = defaultDataMap(), action) { if (note.isTrashed) { state.trashedSet.add(uniqueKey) } - - let storageNoteList = state.storageNoteMap.get(note.storage) - if (storageNoteList == null) { - storageNoteList = new Set(storageNoteList) - state.storageNoteMap.set(note.storage, storageNoteList) - } + const storageNoteList = getOrInitItem(state.storageNoteMap, note.storage) storageNoteList.add(uniqueKey) - let folderNoteSet = state.folderNoteMap.get(folderKey) - if (folderNoteSet == null) { - folderNoteSet = new Set(folderNoteSet) - state.folderNoteMap.set(folderKey, folderNoteSet) - } + const folderNoteSet = getOrInitItem(state.folderNoteMap, folderKey) folderNoteSet.add(uniqueKey) - note.tags.forEach((tag) => { - let tagNoteList = state.tagNoteMap.get(tag) - if (tagNoteList == null) { - tagNoteList = new Set(tagNoteList) - state.tagNoteMap.set(tag, tagNoteList) - } - tagNoteList.add(uniqueKey) - }) + assignToTags(note.tags, state, uniqueKey) }) return state case 'UPDATE_NOTE': @@ -74,40 +58,18 @@ function data (state = defaultDataMap(), action) { state.noteMap = new Map(state.noteMap) state.noteMap.set(uniqueKey, note) - if (oldNote == null || oldNote.isStarred !== note.isStarred) { - state.starredSet = new Set(state.starredSet) - if (note.isStarred) { - state.starredSet.add(uniqueKey) - } else { - state.starredSet.delete(uniqueKey) - } - } + updateStarredChange(oldNote, note, state, uniqueKey) if (oldNote == null || oldNote.isTrashed !== note.isTrashed) { state.trashedSet = new Set(state.trashedSet) if (note.isTrashed) { state.trashedSet.add(uniqueKey) state.starredSet.delete(uniqueKey) - - note.tags.forEach(tag => { - let tagNoteList = state.tagNoteMap.get(tag) - if (tagNoteList != null) { - tagNoteList = new Set(tagNoteList) - tagNoteList.delete(uniqueKey) - state.tagNoteMap.set(tag, tagNoteList) - } - }) + removeFromTags(note.tags, state, uniqueKey) } else { state.trashedSet.delete(uniqueKey) - note.tags.forEach(tag => { - let tagNoteList = state.tagNoteMap.get(tag) - if (tagNoteList != null) { - tagNoteList = new Set(tagNoteList) - tagNoteList.add(uniqueKey) - state.tagNoteMap.set(tag, tagNoteList) - } - }) + assignToTags(note.tags, state, uniqueKey) if (note.isStarred) { state.starredSet.add(uniqueKey) @@ -125,54 +87,12 @@ function data (state = defaultDataMap(), action) { } // Update foldermap if folder changed or post created - if (oldNote == null || oldNote.folder !== note.folder) { - state.folderNoteMap = new Map(state.folderNoteMap) - let folderNoteSet = state.folderNoteMap.get(folderKey) - folderNoteSet = new Set(folderNoteSet) - folderNoteSet.add(uniqueKey) - state.folderNoteMap.set(folderKey, folderNoteSet) - - if (oldNote != null) { - const oldFolderKey = oldNote.storage + '-' + oldNote.folder - let oldFolderNoteList = state.folderNoteMap.get(oldFolderKey) - oldFolderNoteList = new Set(oldFolderNoteList) - oldFolderNoteList.delete(uniqueKey) - state.folderNoteMap.set(oldFolderKey, oldFolderNoteList) - } - } + updateFolderChange(oldNote, note, state, folderKey, uniqueKey) if (oldNote != null) { - const discardedTags = _.difference(oldNote.tags, note.tags) - const addedTags = _.difference(note.tags, oldNote.tags) - if (discardedTags.length + addedTags.length > 0) { - state.tagNoteMap = new Map(state.tagNoteMap) - - discardedTags.forEach((tag) => { - let tagNoteList = state.tagNoteMap.get(tag) - if (tagNoteList != null) { - tagNoteList = new Set(tagNoteList) - tagNoteList.delete(uniqueKey) - state.tagNoteMap.set(tag, tagNoteList) - } - }) - addedTags.forEach((tag) => { - let tagNoteList = state.tagNoteMap.get(tag) - tagNoteList = new Set(tagNoteList) - tagNoteList.add(uniqueKey) - - state.tagNoteMap.set(tag, tagNoteList) - }) - } + updateTagChanges(oldNote, note, state, uniqueKey) } else { - state.tagNoteMap = new Map(state.tagNoteMap) - note.tags.forEach((tag) => { - let tagNoteList = state.tagNoteMap.get(tag) - if (tagNoteList == null) { - tagNoteList = new Set(tagNoteList) - state.tagNoteMap.set(tag, tagNoteList) - } - tagNoteList.add(uniqueKey) - }) + assignToTags(note.tags, state, uniqueKey) } return state @@ -220,26 +140,10 @@ function data (state = defaultDataMap(), action) { originFolderList.delete(originKey) state.folderNoteMap.set(originFolderKey, originFolderList) - // From tagMap - if (originNote.tags.length > 0) { - state.tagNoteMap = new Map(state.tagNoteMap) - originNote.tags.forEach((tag) => { - let noteSet = state.tagNoteMap.get(tag) - noteSet = new Set(noteSet) - noteSet.delete(originKey) - state.tagNoteMap.set(tag, noteSet) - }) - } + removeFromTags(originNote.tags, state, originKey) } - if (oldNote == null || oldNote.isStarred !== note.isStarred) { - state.starredSet = new Set(state.starredSet) - if (note.isStarred) { - state.starredSet.add(uniqueKey) - } else { - state.starredSet.delete(uniqueKey) - } - } + updateStarredChange(oldNote, note, state, uniqueKey) if (oldNote == null || oldNote.isTrashed !== note.isTrashed) { state.trashedSet = new Set(state.trashedSet) @@ -260,55 +164,13 @@ function data (state = defaultDataMap(), action) { } // Update foldermap if folder changed or post created - if (oldNote == null || oldNote.folder !== note.folder) { - state.folderNoteMap = new Map(state.folderNoteMap) - let folderNoteList = state.folderNoteMap.get(folderKey) - folderNoteList = new Set(folderNoteList) - folderNoteList.add(uniqueKey) - state.folderNoteMap.set(folderKey, folderNoteList) - - if (oldNote != null) { - const oldFolderKey = oldNote.storage + '-' + oldNote.folder - let oldFolderNoteList = state.folderNoteMap.get(oldFolderKey) - oldFolderNoteList = new Set(oldFolderNoteList) - oldFolderNoteList.delete(uniqueKey) - state.folderNoteMap.set(oldFolderKey, oldFolderNoteList) - } - } + updateFolderChange(oldNote, note, state, folderKey, uniqueKey) // Remove from old folder map if (oldNote != null) { - const discardedTags = _.difference(oldNote.tags, note.tags) - const addedTags = _.difference(note.tags, oldNote.tags) - if (discardedTags.length + addedTags.length > 0) { - state.tagNoteMap = new Map(state.tagNoteMap) - - discardedTags.forEach((tag) => { - let tagNoteList = state.tagNoteMap.get(tag) - if (tagNoteList != null) { - tagNoteList = new Set(tagNoteList) - tagNoteList.delete(uniqueKey) - state.tagNoteMap.set(tag, tagNoteList) - } - }) - addedTags.forEach((tag) => { - let tagNoteList = state.tagNoteMap.get(tag) - tagNoteList = new Set(tagNoteList) - tagNoteList.add(uniqueKey) - - state.tagNoteMap.set(tag, tagNoteList) - }) - } + updateTagChanges(oldNote, note, state, uniqueKey) } else { - state.tagNoteMap = new Map(state.tagNoteMap) - note.tags.forEach((tag) => { - let tagNoteList = state.tagNoteMap.get(tag) - if (tagNoteList == null) { - tagNoteList = new Set(tagNoteList) - state.tagNoteMap.set(tag, tagNoteList) - } - tagNoteList.add(uniqueKey) - }) + assignToTags(note.tags, state, uniqueKey) } return state @@ -347,16 +209,7 @@ function data (state = defaultDataMap(), action) { folderSet.delete(uniqueKey) state.folderNoteMap.set(folderKey, folderSet) - // From tagMap - if (targetNote.tags.length > 0) { - state.tagNoteMap = new Map(state.tagNoteMap) - targetNote.tags.forEach((tag) => { - let noteSet = state.tagNoteMap.get(tag) - noteSet = new Set(noteSet) - noteSet.delete(uniqueKey) - state.tagNoteMap.set(tag, noteSet) - }) - } + removeFromTags(targetNote.tags, state, uniqueKey) } state.noteMap = new Map(state.noteMap) state.noteMap.delete(uniqueKey) @@ -420,9 +273,7 @@ function data (state = defaultDataMap(), action) { // Delete key from tag map state.tagNoteMap = new Map(state.tagNoteMap) note.tags.forEach((tag) => { - let tagNoteSet = state.tagNoteMap.get(tag) - tagNoteSet = new Set(tagNoteSet) - state.tagNoteMap.set(tag, tagNoteSet) + const tagNoteSet = getOrInitItem(state.tagNoteMap, tag) tagNoteSet.delete(noteKey) }) } @@ -449,11 +300,7 @@ function data (state = defaultDataMap(), action) { state.starredSet.add(uniqueKey) } - let storageNoteList = state.storageNoteMap.get(note.storage) - if (storageNoteList == null) { - storageNoteList = new Set(storageNoteList) - state.storageNoteMap.set(note.storage, storageNoteList) - } + const storageNoteList = getOrInitItem(state.tagNoteMap, note.storage) storageNoteList.add(uniqueKey) let folderNoteSet = state.folderNoteMap.get(folderKey) @@ -464,11 +311,7 @@ function data (state = defaultDataMap(), action) { folderNoteSet.add(uniqueKey) note.tags.forEach((tag) => { - let tagNoteSet = state.tagNoteMap.get(tag) - if (tagNoteSet == null) { - tagNoteSet = new Set(tagNoteSet) - state.tagNoteMap.set(tag, tagNoteSet) - } + const tagNoteSet = getOrInitItem(state.tagNoteMap, tag) tagNoteSet.add(uniqueKey) }) }) @@ -559,6 +402,73 @@ function status (state = defaultStatus, action) { return state } +function updateStarredChange (oldNote, note, state, uniqueKey) { + if (oldNote == null || oldNote.isStarred !== note.isStarred) { + state.starredSet = new Set(state.starredSet) + if (note.isStarred) { + state.starredSet.add(uniqueKey) + } else { + state.starredSet.delete(uniqueKey) + } + } +} + +function updateFolderChange (oldNote, note, state, folderKey, uniqueKey) { + if (oldNote == null || oldNote.folder !== note.folder) { + state.folderNoteMap = new Map(state.folderNoteMap) + let folderNoteList = state.folderNoteMap.get(folderKey) + folderNoteList = new Set(folderNoteList) + folderNoteList.add(uniqueKey) + state.folderNoteMap.set(folderKey, folderNoteList) + + if (oldNote != null) { + const oldFolderKey = oldNote.storage + '-' + oldNote.folder + let oldFolderNoteList = state.folderNoteMap.get(oldFolderKey) + oldFolderNoteList = new Set(oldFolderNoteList) + oldFolderNoteList.delete(uniqueKey) + state.folderNoteMap.set(oldFolderKey, oldFolderNoteList) + } + } +} + +function updateTagChanges (oldNote, note, state, uniqueKey) { + const discardedTags = _.difference(oldNote.tags, note.tags) + const addedTags = _.difference(note.tags, oldNote.tags) + if (discardedTags.length + addedTags.length > 0) { + removeFromTags(discardedTags, state, uniqueKey) + assignToTags(addedTags, state, uniqueKey) + } +} + +function assignToTags (tags, state, uniqueKey) { + state.tagNoteMap = new Map(state.tagNoteMap) + tags.forEach((tag) => { + const tagNoteList = getOrInitItem(state.tagNoteMap, tag) + tagNoteList.add(uniqueKey) + }) +} + +function removeFromTags (tags, state, uniqueKey) { + state.tagNoteMap = new Map(state.tagNoteMap) + tags.forEach(tag => { + let tagNoteList = state.tagNoteMap.get(tag) + if (tagNoteList != null) { + tagNoteList = new Set(tagNoteList) + tagNoteList.delete(uniqueKey) + state.tagNoteMap.set(tag, tagNoteList) + } + }) +} + +function getOrInitItem (target, key) { + let results = target.get(key) + if (results == null) { + results = new Set() + target.set(key, results) + } + return results +} + const reducer = combineReducers({ data, config,