1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-21 09:38:01 +02:00

All: Fixes #10189: After deleting the last note from the conflicts folder, the application state is invalid

This commit is contained in:
Laurent Cozic 2024-04-27 09:54:47 +01:00
parent 10978781cd
commit a5f118bc26
5 changed files with 23 additions and 10 deletions

View File

@ -452,7 +452,7 @@ class Application extends BaseApplication {
Setting.dispatchUpdateAll();
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
await refreshFolders((action: any) => this.store().dispatch(action));
await refreshFolders((action: any) => this.store().dispatch(action), '');
const tags = await Tag.allWithNotes();

View File

@ -467,7 +467,7 @@ class Application extends BaseApplication {
Setting.dispatchUpdateAll();
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
await refreshFolders((action: any) => this.dispatch(action));
await refreshFolders((action: any) => this.dispatch(action), '');
const tags = await Tag.allWithNotes();

View File

@ -233,7 +233,7 @@ const generalMiddleware = (store: any) => (next: any) => async (action: any) =>
if (doRefreshFolders) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
await scheduleRefreshFolders((action: any) => storeDispatch(action));
await scheduleRefreshFolders((action: any) => storeDispatch(action), newState.selectedFolderId);
}
return result;
@ -670,7 +670,7 @@ async function initialize(dispatch: Function) {
reg.logger().info('Loading folders...');
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
await refreshFolders((action: any) => dispatch(action));
await refreshFolders((action: any) => dispatch(action), '');
const tags = await Tag.allWithNotes();
@ -1053,7 +1053,7 @@ class AppComponent extends React.Component {
public UNSAFE_componentWillReceiveProps(newProps: any) {
if (newProps.syncStarted !== this.lastSyncStarted_) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
if (!newProps.syncStarted) void refreshFolders((action: any) => this.props.dispatch(action));
if (!newProps.syncStarted) void refreshFolders((action: any) => this.props.dispatch(action), this.props.selectedFolderId);
this.lastSyncStarted_ = newProps.syncStarted;
}
}

View File

@ -575,10 +575,10 @@ export default class BaseApplication {
if (doRefreshFolders) {
if (doRefreshFolders === 'now') {
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
await refreshFolders((action: any) => this.dispatch(action));
await refreshFolders((action: any) => this.dispatch(action), newState.selectedFolderId);
} else {
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
await scheduleRefreshFolders((action: any) => this.dispatch(action));
await scheduleRefreshFolders((action: any) => this.dispatch(action), newState.selectedFolderId);
}
}
return result;

View File

@ -36,7 +36,9 @@ export const allForDisplay = async (options: FolderLoadOptions = {}) => {
return folders;
};
export const refreshFolders = async (dispatch: Dispatch) => {
// `selectedFolderId` should be the currently selected folder. Set it to an empty string if that
// information is not available in the current context.
export const refreshFolders = async (dispatch: Dispatch, selectedFolderId: string) => {
refreshCalls_.push(true);
try {
const folders = await allForDisplay({
@ -48,16 +50,27 @@ export const refreshFolders = async (dispatch: Dispatch) => {
type: 'FOLDER_UPDATE_ALL',
items: folders,
});
// If the currently selected folder no longer exist, select a default folder
if (selectedFolderId && !folders.find(f => f.id === selectedFolderId)) {
const defaultFolder = await Folder.defaultFolder();
if (defaultFolder) {
dispatch({
type: 'FOLDER_SELECT',
id: defaultFolder.id,
});
}
}
} finally {
refreshCalls_.pop();
}
};
export const scheduleRefreshFolders = async (dispatch: Dispatch) => {
export const scheduleRefreshFolders = async (dispatch: Dispatch, selectedFolderId: string) => {
if (scheduleRefreshFoldersIID_) shim.clearTimeout(scheduleRefreshFoldersIID_);
scheduleRefreshFoldersIID_ = shim.setTimeout(() => {
scheduleRefreshFoldersIID_ = null;
void refreshFolders(dispatch);
void refreshFolders(dispatch, selectedFolderId);
}, 1000);
};