diff --git a/ReactNativeClient/lib/components/action-button.js b/ReactNativeClient/lib/components/action-button.js index f7ca6ae38..354b633e2 100644 --- a/ReactNativeClient/lib/components/action-button.js +++ b/ReactNativeClient/lib/components/action-button.js @@ -31,7 +31,7 @@ class ActionButtonComponent extends React.Component { newTodo_press() { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Note', noteId: null, folderId: this.props.parentFolderId, @@ -41,7 +41,7 @@ class ActionButtonComponent extends React.Component { newNote_press() { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Note', noteId: null, folderId: this.props.parentFolderId, @@ -51,7 +51,7 @@ class ActionButtonComponent extends React.Component { newFolder_press() { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Folder', folderId: null, }); diff --git a/ReactNativeClient/lib/components/note-item.js b/ReactNativeClient/lib/components/note-item.js index dabae2987..5c3eb0669 100644 --- a/ReactNativeClient/lib/components/note-item.js +++ b/ReactNativeClient/lib/components/note-item.js @@ -33,7 +33,7 @@ class NoteItemComponent extends Component { noteItem_press(noteId) { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Note', noteId: noteId, }); diff --git a/ReactNativeClient/lib/components/note-list.js b/ReactNativeClient/lib/components/note-list.js index 3da7c66b9..78919b156 100644 --- a/ReactNativeClient/lib/components/note-list.js +++ b/ReactNativeClient/lib/components/note-list.js @@ -69,12 +69,11 @@ class NoteListComponent extends Component { async todoCheckbox_change(itemId, checked) { let note = await Note.load(itemId); await Note.save({ id: note.id, todo_completed: checked ? time.unixMs() : 0 }); - reg.scheduleSync(); } listView_itemPress(noteId) { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Note', noteId: noteId, }); diff --git a/ReactNativeClient/lib/components/screen-header.js b/ReactNativeClient/lib/components/screen-header.js index 34f4bb6ae..93b59394e 100644 --- a/ReactNativeClient/lib/components/screen-header.js +++ b/ReactNativeClient/lib/components/screen-header.js @@ -114,12 +114,12 @@ class ScreenHeaderComponent extends Component { } backButton_press() { - this.props.dispatch({ type: 'Navigation/BACK' }); + this.props.dispatch({ type: 'NAV_BACK' }); } searchButton_press() { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Search', }); } @@ -132,21 +132,21 @@ class ScreenHeaderComponent extends Component { log_press() { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Log', }); } status_press() { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Status', }); } config_press() { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Config', }); } diff --git a/ReactNativeClient/lib/components/screens/folder.js b/ReactNativeClient/lib/components/screens/folder.js index b96d7e32b..e3c4f95de 100644 --- a/ReactNativeClient/lib/components/screens/folder.js +++ b/ReactNativeClient/lib/components/screens/folder.js @@ -66,8 +66,6 @@ class FolderScreenComponent extends BaseScreenComponent { try { folder = await Folder.save(folder, { userSideValidation: true }); - - reg.scheduleSync(); } catch (error) { dialogs.error(this, _('The notebook could not be saved: %s', error.message)); return; @@ -79,7 +77,7 @@ class FolderScreenComponent extends BaseScreenComponent { }); this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Notes', folderId: folder.id, }); diff --git a/ReactNativeClient/lib/components/screens/note.js b/ReactNativeClient/lib/components/screens/note.js index 4dbbdb1da..327d736aa 100644 --- a/ReactNativeClient/lib/components/screens/note.js +++ b/ReactNativeClient/lib/components/screens/note.js @@ -181,8 +181,6 @@ class NoteScreenComponent extends BaseScreenComponent { }); if (isNew) Note.updateGeolocation(note.id); this.refreshNoteMetadata(); - - reg.scheduleSync(); } async saveOneProperty(name, value) { @@ -204,8 +202,6 @@ class NoteScreenComponent extends BaseScreenComponent { lastSavedNote: Object.assign({}, note), note: note, }); - - reg.scheduleSync(); } else { note[name] = value; this.setState({ note: note }); @@ -224,12 +220,10 @@ class NoteScreenComponent extends BaseScreenComponent { await Note.delete(note.id); this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Notes', folderId: folderId, }); - - reg.scheduleSync(); } attachFile_onPress() { @@ -274,7 +268,6 @@ class NoteScreenComponent extends BaseScreenComponent { async todoCheckbox_change(checked) { await this.saveOneProperty('todo_completed', checked ? time.unixMs() : 0); - reg.scheduleSync(); } render() { @@ -485,8 +478,6 @@ class NoteScreenComponent extends BaseScreenComponent { note: note, folder: folder, }); - - reg.scheduleSync(); } }} menuOptions={this.menuOptions()} diff --git a/ReactNativeClient/lib/components/screens/notes.js b/ReactNativeClient/lib/components/screens/notes.js index 5e36d7d83..310e62b79 100644 --- a/ReactNativeClient/lib/components/screens/notes.js +++ b/ReactNativeClient/lib/components/screens/notes.js @@ -64,11 +64,9 @@ class NotesScreenComponent extends BaseScreenComponent { Folder.delete(folderId).then(() => { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Welcome', }); - - reg.scheduleSync(); }).catch((error) => { alert(error.message); }); @@ -77,7 +75,7 @@ class NotesScreenComponent extends BaseScreenComponent { editFolder_onPress(folderId) { this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Folder', folderId: folderId, }); diff --git a/ReactNativeClient/lib/components/screens/onedrive-login.js b/ReactNativeClient/lib/components/screens/onedrive-login.js index 52d2d8cd4..8903bd7c8 100644 --- a/ReactNativeClient/lib/components/screens/onedrive-login.js +++ b/ReactNativeClient/lib/components/screens/onedrive-login.js @@ -49,7 +49,7 @@ class OneDriveLoginScreenComponent extends BaseScreenComponent { try { await reg.oneDriveApi().execTokenRequest(this.authCode_, this.redirectUrl(), true); - this.props.dispatch({ type: 'Navigation/BACK' }); + this.props.dispatch({ type: 'NAV_BACK' }); reg.scheduleSync(0); } catch (error) { alert(error.message); diff --git a/ReactNativeClient/lib/components/side-menu-content.js b/ReactNativeClient/lib/components/side-menu-content.js index 5f2df799a..043514936 100644 --- a/ReactNativeClient/lib/components/side-menu-content.js +++ b/ReactNativeClient/lib/components/side-menu-content.js @@ -67,7 +67,7 @@ class SideMenuContentComponent extends Component { this.props.dispatch({ type: 'SIDE_MENU_CLOSE' }); this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Notes', folderId: folder.id, }); @@ -78,7 +78,7 @@ class SideMenuContentComponent extends Component { this.props.dispatch({ type: 'SIDE_MENU_CLOSE' }); this.props.dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'OneDriveLogin', }); return; diff --git a/ReactNativeClient/lib/poor-man-intervals.js b/ReactNativeClient/lib/poor-man-intervals.js index 2c60eaac8..bf313681a 100644 --- a/ReactNativeClient/lib/poor-man-intervals.js +++ b/ReactNativeClient/lib/poor-man-intervals.js @@ -32,6 +32,9 @@ class PoorManIntervals { } static update() { + // Don't update more than once a second + if (PoorManIntervals.lastUpdateTime_ + 1000 > time.unixMs()) return; + for (let i = 0; i < PoorManIntervals.intervals_.length; i++) { let interval = PoorManIntervals.intervals_[i]; const now = time.unixMs(); @@ -40,10 +43,13 @@ class PoorManIntervals { interval.callback(); } } + + PoorManIntervals.lastUpdateTime_ = time.unixMs(); } } +PoorManIntervals.lastUpdateTime_ = 0; PoorManIntervals.intervalId_ = 0; PoorManIntervals.intervals_ = []; diff --git a/ReactNativeClient/root.js b/ReactNativeClient/root.js index 4f9bc190d..00a39708c 100644 --- a/ReactNativeClient/root.js +++ b/ReactNativeClient/root.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import { BackHandler, Keyboard } from 'react-native'; import { connect, Provider } from 'react-redux' -import { createStore } from 'redux'; +import { createStore, applyMiddleware } from 'redux'; import { shimInit } from 'lib/shim-init-react.js'; import { Log } from 'lib/log.js' import { AppNav } from 'lib/components/app-nav.js' @@ -56,7 +56,7 @@ let defaultState = { }; const initialRoute = { - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Welcome', params: {} }; @@ -84,8 +84,6 @@ function reducerActionsAreSame(a1, a2) { } const reducer = (state = defaultState, action) => { - reg.logger().info('Reducer action', action.type); - let newState = state; let historyGoingBack = false; @@ -93,7 +91,7 @@ const reducer = (state = defaultState, action) => { switch (action.type) { - case 'Navigation/BACK': + case 'NAV_BACK': if (!navHistory.length) break; @@ -109,7 +107,7 @@ const reducer = (state = defaultState, action) => { // Fall throught - case 'Navigation/NAVIGATE': + case 'NAV_GO': const currentRoute = state.route; const currentRouteName = currentRoute ? currentRoute.routeName : ''; @@ -164,7 +162,6 @@ const reducer = (state = defaultState, action) => { Setting.setValue('activeFolderId', newState.selectedFolderId); } - Keyboard.dismiss(); // TODO: should probably be in some middleware break; // Replace all the notes with the provided array @@ -311,14 +308,25 @@ const reducer = (state = defaultState, action) => { throw error; } - // Check the registered intervals here since we know this function - // will be called regularly. - PoorManIntervals.update(); - return newState; } -let store = createStore(reducer); +const generalMiddleware = store => next => action => { + reg.logger().info('Reducer action', action.type); + PoorManIntervals.update(); // This function needs to be called regularly so put it here + + const result = next(action); + + if (action.type == 'NAV_GO') Keyboard.dismiss(); + + if (['NOTES_UPDATE_ONE', 'NOTES_DELETE', 'FOLDERS_UPDATE_ONE', 'FOLDER_DELETE'].indexOf(action.type) >= 0) { + reg.scheduleSync(); + } + + return result; +} + +let store = createStore(reducer, applyMiddleware(generalMiddleware)); let initializationState_ = 'waiting'; @@ -410,12 +418,12 @@ async function initialize(dispatch, backButtonHandler) { if (!folder) { dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Welcome', }); } else { dispatch({ - type: 'Navigation/NAVIGATE', + type: 'NAV_GO', routeName: 'Notes', folderId: folder.id, }); @@ -462,7 +470,7 @@ class AppComponent extends React.Component { } if (this.props.historyCanGoBack) { - this.props.dispatch({ type: 'Navigation/BACK' }); + this.props.dispatch({ type: 'NAV_BACK' }); return true; }