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:
Jason
2025-10-17 20:53:50 +08:00
parent e02175e68d
commit bcaebc1bcb

View File

@@ -85,6 +85,7 @@ export function SettingsDialog({
}, [requiresRestart]);
const closeDialog = useCallback(() => {
// 取消/直接关闭:恢复到初始设置(包括语言回滚)
resetSettings();
acknowledgeRestart();
clearSelection();
@@ -98,6 +99,14 @@ export function SettingsDialog({
resetStatus,
]);
const closeAfterSave = useCallback(() => {
// 保存成功后关闭:不再重置语言,避免需要“保存两次”才生效
acknowledgeRestart();
clearSelection();
resetStatus();
onOpenChange(false);
}, [acknowledgeRestart, clearSelection, onOpenChange, resetStatus]);
const handleDialogChange = useCallback(
(nextOpen: boolean) => {
if (!nextOpen) {
@@ -121,7 +130,7 @@ export function SettingsDialog({
setShowRestartPrompt(true);
return;
}
closeDialog();
closeAfterSave();
} catch (error) {
console.error("[SettingsDialog] Failed to save settings", error);
}
@@ -129,8 +138,8 @@ export function SettingsDialog({
const handleRestartLater = useCallback(() => {
setShowRestartPrompt(false);
closeDialog();
}, [closeDialog]);
closeAfterSave();
}, [closeAfterSave]);
const handleRestartNow = useCallback(async () => {
setShowRestartPrompt(false);
@@ -140,7 +149,7 @@ export function SettingsDialog({
defaultValue: "开发模式下不支持自动重启,请手动重新启动应用。",
}),
);
closeDialog();
closeAfterSave();
return;
}
@@ -154,9 +163,9 @@ export function SettingsDialog({
}),
);
} finally {
closeDialog();
closeAfterSave();
}
}, [closeDialog, t]);
}, [closeAfterSave, t]);
const isBusy = useMemo(() => isLoading && !settings, [isLoading, settings]);