diff --git a/packages/app-mobile/components/screens/Notes.tsx b/packages/app-mobile/components/screens/Notes.tsx index ce440735cf9..4de1ab756aa 100644 --- a/packages/app-mobile/components/screens/Notes.tsx +++ b/packages/app-mobile/components/screens/Notes.tsx @@ -18,7 +18,6 @@ const { BackButtonService } = require('../../services/back-button.js'); import { AppState } from '../../utils/types'; import { NoteEntity } from '@joplin/lib/services/database/types'; import { itemIsInTrash } from '@joplin/lib/services/trash'; -const { ALL_NOTES_FILTER_ID } = require('@joplin/lib/reserved-ids.js'); // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied class NotesScreenComponent extends BaseScreenComponent { @@ -230,34 +229,19 @@ class NotesScreenComponent extends BaseScreenComponent { let buttonFolderId = this.props.selectedFolderId !== Folder.conflictFolderId() ? this.props.selectedFolderId : null; if (!buttonFolderId) buttonFolderId = this.props.activeFolderId; - const isAllNotes = - this.props.notesParentType === 'SmartFilter' - && this.props.selectedSmartFilterId === ALL_NOTES_FILTER_ID; - - // Usually, when showing all notes, activeFolderId/selectedFolderId is set to the last - // active folder. - // If the app starts showing all notes, activeFolderId/selectedFolderId are - // empty or null. As such, we need a special case to show the buttons: - const addFolderNoteButtons = !!buttonFolderId || isAllNotes; + const addFolderNoteButtons = !!buttonFolderId; const thisComp = this; const makeActionButtonComp = () => { if ((this.props.notesParentType === 'Folder' && itemIsInTrash(parent)) || !Folder.atLeastOneRealFolderExists(this.props.folders)) return null; - const getTargetFolderId = async () => { - if (!buttonFolderId && isAllNotes) { - return (await Folder.defaultFolder()).id; - } - return buttonFolderId; - }; if (addFolderNoteButtons && this.props.folders.length > 0) { const buttons = []; buttons.push({ label: _('New to-do'), onPress: async () => { - const folderId = await getTargetFolderId(); const isTodo = true; - void this.newNoteNavigate(folderId, isTodo); + void this.newNoteNavigate(buttonFolderId, isTodo); }, color: '#9b59b6', icon: 'checkbox-outline', @@ -266,9 +250,8 @@ class NotesScreenComponent extends BaseScreenComponent { buttons.push({ label: _('New note'), onPress: async () => { - const folderId = await getTargetFolderId(); const isTodo = false; - void this.newNoteNavigate(folderId, isTodo); + void this.newNoteNavigate(buttonFolderId, isTodo); }, color: '#9b59b6', icon: 'document', diff --git a/packages/app-mobile/root.tsx b/packages/app-mobile/root.tsx index 5b42946c35a..89152df1a81 100644 --- a/packages/app-mobile/root.tsx +++ b/packages/app-mobile/root.tsx @@ -215,7 +215,10 @@ const generalMiddleware = (store: any) => (next: any) => async (action: any) => } if (action.type === 'NAV_GO' && action.routeName === 'Notes') { - Setting.setValue('activeFolderId', newState.selectedFolderId); + if ('selectedFolderId' in newState) { + Setting.setValue('activeFolderId', newState.selectedFolderId); + } + const notesParent: NotesParent = { type: action.smartFilterId ? 'SmartFilter' : 'Folder', selectedItemId: action.smartFilterId ? action.smartFilterId : newState.selectedFolderId, @@ -469,6 +472,21 @@ const initializeTempDir = async () => { return tempDir; }; +const getInitialActiveFolder = async () => { + let folderId = Setting.value('activeFolderId'); + + // In some cases (e.g. new profile/install), activeFolderId hasn't been set yet. + // Because activeFolderId is used to determine the parent for new notes, initialize + // it here: + if (!folderId) { + folderId = (await Folder.defaultFolder())?.id; + if (folderId) { + Setting.setValue('activeFolderId', folderId); + } + } + return await Folder.load(folderId); +}; + // eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied async function initialize(dispatch: Function) { shimInit(); @@ -686,10 +704,7 @@ async function initialize(dispatch: Function) { // items: masterKeys, // }); - const folderId = Setting.value('activeFolderId'); - let folder = await Folder.load(folderId); - - if (!folder) folder = await Folder.defaultFolder(); + const folder = await getInitialActiveFolder(); dispatch({ type: 'FOLDER_SET_COLLAPSED_ALL', diff --git a/packages/lib/reducer.ts b/packages/lib/reducer.ts index cd7f632c0f6..0e9823b0915 100644 --- a/packages/lib/reducer.ts +++ b/packages/lib/reducer.ts @@ -1335,6 +1335,12 @@ const reducer = produce((draft: Draft = defaultState, action: any) => { handleHistory(draft, action); } + if (action.type === 'SETTING_UPDATE_ALL' || (action.type === 'SETTING_UPDATE_ONE' && action.key === 'activeFolderId')) { + // To allow creating notes when opening the app with all notes and/or tags, + // a "last selected folder ID" needs to be set. + draft.selectedFolderId ??= draft.settings.activeFolderId; + } + for (const additionalReducer of additionalReducers) { additionalReducer.reducer(draft, action); }