2017-11-03 02:09:34 +02:00
|
|
|
const { Note } = require('lib/models/note.js');
|
2017-10-07 18:30:27 +02:00
|
|
|
|
|
|
|
const defaultState = {
|
|
|
|
notes: [],
|
|
|
|
notesSource: '',
|
|
|
|
notesParentType: null,
|
|
|
|
folders: [],
|
|
|
|
tags: [],
|
2017-10-23 22:34:04 +02:00
|
|
|
searches: [],
|
2017-10-07 18:30:27 +02:00
|
|
|
selectedNoteId: null,
|
|
|
|
selectedFolderId: null,
|
|
|
|
selectedTagId: null,
|
2017-10-23 22:34:04 +02:00
|
|
|
selectedSearchId: null,
|
2017-10-07 18:30:27 +02:00
|
|
|
selectedItemType: 'note',
|
|
|
|
showSideMenu: false,
|
|
|
|
screens: {},
|
|
|
|
historyCanGoBack: false,
|
|
|
|
notesOrder: [
|
|
|
|
{ by: 'user_updated_time', dir: 'DESC' },
|
|
|
|
],
|
|
|
|
syncStarted: false,
|
|
|
|
syncReport: {},
|
|
|
|
searchQuery: '',
|
|
|
|
settings: {},
|
|
|
|
appState: 'starting',
|
2017-11-04 21:46:37 +02:00
|
|
|
windowContentSize: { width: 0, height: 0 },
|
2017-10-07 18:30:27 +02:00
|
|
|
};
|
|
|
|
|
2017-10-29 18:22:53 +02:00
|
|
|
function folderOrNoteDelete(state, action) {
|
|
|
|
let newState = Object.assign({}, state);
|
|
|
|
|
|
|
|
const idKey = action.type === 'FOLDER_DELETE' ? 'folderId' : 'noteId';
|
|
|
|
const listKey = action.type === 'FOLDER_DELETE' ? 'folders' : 'notes';
|
|
|
|
const selectedItemKey = action.type === 'FOLDER_DELETE' ? 'selectedFolderId' : 'selectedNoteId';
|
|
|
|
|
|
|
|
let previousIndex = 0;
|
|
|
|
let newItems = [];
|
|
|
|
const items = state[listKey];
|
|
|
|
for (let i = 0; i < items.length; i++) {
|
|
|
|
let f = items[i];
|
|
|
|
if (f.id == action[idKey]) {
|
|
|
|
previousIndex = i;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
newItems.push(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState[listKey] = newItems;
|
|
|
|
|
|
|
|
if (previousIndex >= newItems.length) {
|
|
|
|
previousIndex = newItems.length - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
const newIndex = previousIndex >= 0 ? newItems[previousIndex].id : null;
|
|
|
|
newState[selectedItemKey] = newIndex;
|
|
|
|
|
|
|
|
return newState;
|
|
|
|
}
|
|
|
|
|
2017-10-22 19:12:16 +02:00
|
|
|
function updateOneTagOrFolder(state, action) {
|
|
|
|
let newItems = action.type === 'TAGS_UPDATE_ONE' ? state.tags.splice(0) : state.folders.splice(0);
|
|
|
|
let item = action.type === 'TAGS_UPDATE_ONE' ? action.tag : action.folder;
|
|
|
|
|
|
|
|
var found = false;
|
|
|
|
for (let i = 0; i < newItems.length; i++) {
|
|
|
|
let n = newItems[i];
|
|
|
|
if (n.id == item.id) {
|
|
|
|
newItems[i] = Object.assign(newItems[i], item);
|
|
|
|
found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!found) newItems.push(item);
|
|
|
|
|
|
|
|
let newState = Object.assign({}, state);
|
|
|
|
|
|
|
|
if (action.type === 'TAGS_UPDATE_ONE') {
|
|
|
|
newState.tags = newItems;
|
|
|
|
} else {
|
|
|
|
newState.folders = newItems;
|
|
|
|
}
|
|
|
|
|
|
|
|
return newState;
|
|
|
|
}
|
|
|
|
|
2017-10-23 23:48:29 +02:00
|
|
|
function defaultNotesParentType(state, exclusion) {
|
|
|
|
let newNotesParentType = null;
|
|
|
|
|
|
|
|
if (exclusion !== 'Folder' && state.selectedFolderId) {
|
|
|
|
newNotesParentType = 'Folder';
|
|
|
|
} else if (exclusion !== 'Tag' && state.selectedTagId) {
|
|
|
|
newNotesParentType = 'Tag';
|
|
|
|
} else if (exclusion !== 'Search' && state.selectedSearchId) {
|
|
|
|
newNotesParentType = 'Search';
|
|
|
|
}
|
|
|
|
|
|
|
|
return newNotesParentType;
|
|
|
|
}
|
|
|
|
|
2017-10-07 18:30:27 +02:00
|
|
|
const reducer = (state = defaultState, action) => {
|
|
|
|
let newState = state;
|
|
|
|
|
|
|
|
try {
|
|
|
|
switch (action.type) {
|
|
|
|
|
2017-10-07 23:01:03 +02:00
|
|
|
case 'NOTES_SELECT':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.selectedNoteId = action.noteId;
|
|
|
|
break;
|
|
|
|
|
2017-10-08 00:17:10 +02:00
|
|
|
case 'FOLDERS_SELECT':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
2017-10-23 23:48:29 +02:00
|
|
|
newState.selectedFolderId = action.id;
|
|
|
|
if (!action.id) {
|
|
|
|
newState.notesParentType = defaultNotesParentType(state, 'Folder');
|
|
|
|
} else {
|
|
|
|
newState.notesParentType = 'Folder';
|
|
|
|
}
|
2017-10-08 00:17:10 +02:00
|
|
|
break;
|
|
|
|
|
2017-10-07 18:30:27 +02:00
|
|
|
case 'SETTINGS_UPDATE_ALL':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.settings = action.settings;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'SETTINGS_UPDATE_ONE':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
let newSettings = Object.assign({}, state.settings);
|
|
|
|
newSettings[action.key] = action.value;
|
|
|
|
newState.settings = newSettings;
|
|
|
|
break;
|
|
|
|
|
|
|
|
// Replace all the notes with the provided array
|
|
|
|
case 'NOTES_UPDATE_ALL':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.notes = action.notes;
|
|
|
|
newState.notesSource = action.notesSource;
|
|
|
|
break;
|
|
|
|
|
|
|
|
// Insert the note into the note list if it's new, or
|
|
|
|
// update it within the note array if it already exists.
|
|
|
|
case 'NOTES_UPDATE_ONE':
|
|
|
|
|
|
|
|
const modNote = action.note;
|
|
|
|
|
2017-10-15 13:38:22 +02:00
|
|
|
let noteFolderHasChanged = false;
|
2017-10-07 18:30:27 +02:00
|
|
|
let newNotes = state.notes.slice();
|
|
|
|
var found = false;
|
|
|
|
for (let i = 0; i < newNotes.length; i++) {
|
|
|
|
let n = newNotes[i];
|
|
|
|
if (n.id == modNote.id) {
|
|
|
|
|
2017-10-15 13:38:22 +02:00
|
|
|
// Note is still in the same folder
|
2017-10-07 18:30:27 +02:00
|
|
|
if (!('parent_id' in modNote) || modNote.parent_id == n.parent_id) {
|
|
|
|
// Merge the properties that have changed (in modNote) into
|
|
|
|
// the object we already have.
|
|
|
|
newNotes[i] = Object.assign({}, newNotes[i]);
|
|
|
|
|
|
|
|
for (let n in modNote) {
|
|
|
|
if (!modNote.hasOwnProperty(n)) continue;
|
|
|
|
newNotes[i][n] = modNote[n];
|
|
|
|
}
|
|
|
|
|
2017-10-15 13:38:22 +02:00
|
|
|
} else { // Note has moved to a different folder
|
2017-10-07 18:30:27 +02:00
|
|
|
newNotes.splice(i, 1);
|
2017-10-15 13:38:22 +02:00
|
|
|
noteFolderHasChanged = true;
|
2017-10-07 18:30:27 +02:00
|
|
|
}
|
|
|
|
found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!found && ('parent_id' in modNote) && modNote.parent_id == state.selectedFolderId) newNotes.push(modNote);
|
|
|
|
|
|
|
|
newNotes = Note.sortNotes(newNotes, state.notesOrder, newState.settings.uncompletedTodosOnTop);
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.notes = newNotes;
|
2017-10-15 13:38:22 +02:00
|
|
|
|
|
|
|
if (noteFolderHasChanged) {
|
|
|
|
newState.selectedNoteId = newNotes.length ? newNotes[0].id : null;
|
|
|
|
}
|
2017-10-07 18:30:27 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'NOTES_DELETE':
|
|
|
|
|
2017-10-29 18:22:53 +02:00
|
|
|
newState = folderOrNoteDelete(state, action);
|
2017-10-07 18:30:27 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'FOLDERS_UPDATE_ALL':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.folders = action.folders;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'TAGS_UPDATE_ALL':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.tags = action.tags;
|
|
|
|
break;
|
|
|
|
|
2017-10-22 19:12:16 +02:00
|
|
|
case 'TAGS_SELECT':
|
2017-10-07 18:30:27 +02:00
|
|
|
|
2017-10-22 19:12:16 +02:00
|
|
|
newState = Object.assign({}, state);
|
2017-10-23 23:48:29 +02:00
|
|
|
newState.selectedTagId = action.id;
|
|
|
|
if (!action.id) {
|
|
|
|
newState.notesParentType = defaultNotesParentType(state, 'Tag');
|
|
|
|
} else {
|
|
|
|
newState.notesParentType = 'Tag';
|
|
|
|
}
|
2017-10-22 19:12:16 +02:00
|
|
|
break;
|
2017-10-07 18:30:27 +02:00
|
|
|
|
2017-10-22 19:12:16 +02:00
|
|
|
case 'TAGS_UPDATE_ONE':
|
2017-10-07 18:30:27 +02:00
|
|
|
|
2017-10-22 19:12:16 +02:00
|
|
|
newState = updateOneTagOrFolder(state, action);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'FOLDERS_UPDATE_ONE':
|
|
|
|
|
|
|
|
newState = updateOneTagOrFolder(state, action);
|
2017-10-07 18:30:27 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'FOLDER_DELETE':
|
|
|
|
|
2017-10-29 18:22:53 +02:00
|
|
|
newState = folderOrNoteDelete(state, action);
|
2017-10-07 18:30:27 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'SYNC_STARTED':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.syncStarted = true;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'SYNC_COMPLETED':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.syncStarted = false;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'SYNC_REPORT_UPDATE':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.syncReport = action.report;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'SEARCH_QUERY':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.searchQuery = action.query.trim();
|
|
|
|
break;
|
|
|
|
|
2017-10-23 22:34:04 +02:00
|
|
|
case 'SEARCH_ADD':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
let searches = newState.searches.slice();
|
|
|
|
searches.push(action.search);
|
|
|
|
newState.searches = searches;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'SEARCH_REMOVE':
|
|
|
|
|
|
|
|
let foundIndex = -1;
|
|
|
|
for (let i = 0; i < state.searches.length; i++) {
|
2017-10-23 23:48:29 +02:00
|
|
|
if (state.searches[i].id === action.id) {
|
2017-10-23 22:34:04 +02:00
|
|
|
foundIndex = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (foundIndex >= 0) {
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
let newSearches = newState.searches.slice();
|
|
|
|
newSearches.splice(foundIndex, 1);
|
|
|
|
newState.searches = newSearches;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'SEARCH_SELECT':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
2017-10-23 23:48:29 +02:00
|
|
|
newState.selectedSearchId = action.id;
|
|
|
|
if (!action.id) {
|
|
|
|
newState.notesParentType = defaultNotesParentType(state, 'Search');
|
|
|
|
} else {
|
|
|
|
newState.notesParentType = 'Search';
|
|
|
|
}
|
2017-10-23 22:34:04 +02:00
|
|
|
break;
|
|
|
|
|
2017-10-07 18:30:27 +02:00
|
|
|
case 'SET_APP_STATE':
|
|
|
|
|
|
|
|
newState = Object.assign({}, state);
|
|
|
|
newState.appState = action.state;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
error.message = 'In reducer: ' + error.message + ' Action: ' + JSON.stringify(action);
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
|
|
|
|
return newState;
|
|
|
|
}
|
|
|
|
|
2017-11-03 02:13:17 +02:00
|
|
|
module.exports = { reducer, defaultState };
|