fix: prevent language setting rollback after successful save
Introduce `closeAfterSave` callback to distinguish between save-and-close and cancel-and-close scenarios. Previously, saving settings would trigger `resetSettings()`, causing language changes to revert and requiring users to save twice for the change to take effect. Changes: - Add `closeAfterSave()`: close dialog without resetting settings after successful save - Keep `closeDialog()`: reset settings when canceling or directly closing dialog - Update save flow to use `closeAfterSave()` in `handleSaveClick`, `handleRestartLater`, and `handleRestartNow`
This commit is contained in:
@@ -85,6 +85,7 @@ export function SettingsDialog({
|
|||||||
}, [requiresRestart]);
|
}, [requiresRestart]);
|
||||||
|
|
||||||
const closeDialog = useCallback(() => {
|
const closeDialog = useCallback(() => {
|
||||||
|
// 取消/直接关闭:恢复到初始设置(包括语言回滚)
|
||||||
resetSettings();
|
resetSettings();
|
||||||
acknowledgeRestart();
|
acknowledgeRestart();
|
||||||
clearSelection();
|
clearSelection();
|
||||||
@@ -98,6 +99,14 @@ export function SettingsDialog({
|
|||||||
resetStatus,
|
resetStatus,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const closeAfterSave = useCallback(() => {
|
||||||
|
// 保存成功后关闭:不再重置语言,避免需要“保存两次”才生效
|
||||||
|
acknowledgeRestart();
|
||||||
|
clearSelection();
|
||||||
|
resetStatus();
|
||||||
|
onOpenChange(false);
|
||||||
|
}, [acknowledgeRestart, clearSelection, onOpenChange, resetStatus]);
|
||||||
|
|
||||||
const handleDialogChange = useCallback(
|
const handleDialogChange = useCallback(
|
||||||
(nextOpen: boolean) => {
|
(nextOpen: boolean) => {
|
||||||
if (!nextOpen) {
|
if (!nextOpen) {
|
||||||
@@ -121,7 +130,7 @@ export function SettingsDialog({
|
|||||||
setShowRestartPrompt(true);
|
setShowRestartPrompt(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
closeDialog();
|
closeAfterSave();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("[SettingsDialog] Failed to save settings", error);
|
console.error("[SettingsDialog] Failed to save settings", error);
|
||||||
}
|
}
|
||||||
@@ -129,8 +138,8 @@ export function SettingsDialog({
|
|||||||
|
|
||||||
const handleRestartLater = useCallback(() => {
|
const handleRestartLater = useCallback(() => {
|
||||||
setShowRestartPrompt(false);
|
setShowRestartPrompt(false);
|
||||||
closeDialog();
|
closeAfterSave();
|
||||||
}, [closeDialog]);
|
}, [closeAfterSave]);
|
||||||
|
|
||||||
const handleRestartNow = useCallback(async () => {
|
const handleRestartNow = useCallback(async () => {
|
||||||
setShowRestartPrompt(false);
|
setShowRestartPrompt(false);
|
||||||
@@ -140,7 +149,7 @@ export function SettingsDialog({
|
|||||||
defaultValue: "开发模式下不支持自动重启,请手动重新启动应用。",
|
defaultValue: "开发模式下不支持自动重启,请手动重新启动应用。",
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
closeDialog();
|
closeAfterSave();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,9 +163,9 @@ export function SettingsDialog({
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
} finally {
|
} finally {
|
||||||
closeDialog();
|
closeAfterSave();
|
||||||
}
|
}
|
||||||
}, [closeDialog, t]);
|
}, [closeAfterSave, t]);
|
||||||
|
|
||||||
const isBusy = useMemo(() => isLoading && !settings, [isLoading, settings]);
|
const isBusy = useMemo(() => isLoading && !settings, [isLoading, settings]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user