You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-07-13 00:10:37 +02:00
Mobile: Plugin settings screen: Fix plugin states not set correctly when installing multiple plugins at once (#10580)
Co-authored-by: Laurent Cozic <laurent22@users.noreply.github.com>
This commit is contained in:
@ -1,11 +1,12 @@
|
||||
import { _ } from '../../../../locale';
|
||||
import PluginService, { PluginSettings, defaultPluginSetting } from '../../../../services/plugins/PluginService';
|
||||
import type * as React from 'react';
|
||||
import shim from '../../../../shim';
|
||||
import produce from 'immer';
|
||||
import { ItemEvent, OnPluginSettingChangeHandler } from './types';
|
||||
|
||||
const useOnDeleteHandler = (
|
||||
pluginSettings: PluginSettings,
|
||||
pluginSettingsRef: React.RefObject<PluginSettings>,
|
||||
onSettingsChange: OnPluginSettingChangeHandler,
|
||||
deleteNow: boolean,
|
||||
) => {
|
||||
@ -15,11 +16,6 @@ const useOnDeleteHandler = (
|
||||
const confirmed = await shim.showConfirmationDialog(_('Delete plugin "%s"?', item.manifest.name));
|
||||
if (!confirmed) return;
|
||||
|
||||
let newSettings = produce(pluginSettings, (draft: PluginSettings) => {
|
||||
if (!draft[item.manifest.id]) draft[item.manifest.id] = defaultPluginSetting();
|
||||
draft[item.manifest.id].deleted = true;
|
||||
});
|
||||
|
||||
if (deleteNow) {
|
||||
const pluginService = PluginService.instance();
|
||||
|
||||
@ -29,12 +25,28 @@ const useOnDeleteHandler = (
|
||||
if (plugin) {
|
||||
await pluginService.unloadPlugin(item.manifest.id);
|
||||
}
|
||||
|
||||
newSettings = await pluginService.uninstallPlugins(newSettings);
|
||||
}
|
||||
|
||||
onSettingsChange({ value: newSettings });
|
||||
}, [pluginSettings, onSettingsChange, deleteNow]);
|
||||
// Important: To avoid race conditions, don't run any async code between fetching plugin
|
||||
// settings from the ref and calling onSettingsChange.
|
||||
let newSettings = pluginSettingsRef.current;
|
||||
if (deleteNow) {
|
||||
newSettings = produce(newSettings, (draft: PluginSettings) => {
|
||||
delete draft[item.manifest.id];
|
||||
});
|
||||
onSettingsChange({ value: newSettings });
|
||||
|
||||
await PluginService.instance().uninstallPlugin(item.manifest.id);
|
||||
} else {
|
||||
// Setting .deleted causes the app to delete this plugin on startup.
|
||||
newSettings = produce(newSettings, (draft: PluginSettings) => {
|
||||
if (!draft[item.manifest.id]) draft[item.manifest.id] = defaultPluginSetting();
|
||||
draft[item.manifest.id].deleted = true;
|
||||
});
|
||||
onSettingsChange({ value: newSettings });
|
||||
}
|
||||
|
||||
}, [pluginSettingsRef, onSettingsChange, deleteNow]);
|
||||
};
|
||||
|
||||
export default useOnDeleteHandler;
|
||||
|
Reference in New Issue
Block a user