From 78ee7bcc76b519df0d5c705ba4bbe7a8cfcd296c Mon Sep 17 00:00:00 2001 From: codetypes Date: Thu, 21 Nov 2024 10:35:03 +0800 Subject: [PATCH] show file changed dialog --- public/locales/en.json | 1 + public/locales/zh.json | 1 + src/behavior3 | 2 +- src/components/editor.tsx | 12 ++++- src/components/workspace.tsx | 82 ++++++++++++++++++++++++++----- src/contexts/workspace-context.ts | 19 +++++-- 6 files changed, 97 insertions(+), 20 deletions(-) diff --git a/public/locales/en.json b/public/locales/en.json index b6e62a8..fa4521e 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -64,6 +64,7 @@ "workspace.saveAllOnClose": "Do you want to save the changes to the following {{count}} files?", "workspace.saveOnClose": "Do you want to save the changes you made to '{{name}}'?", + "workspace.reloadFile": "'{{name}}' has changed, do you want to reload now?", "explorer.deleteFile": "Are you sure you want delete '{{name}}'?", "explorer.deleteFolder": "Are you sure you want delete '{{name}}' and its contents?", diff --git a/public/locales/zh.json b/public/locales/zh.json index 9952cce..b6c0753 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -64,6 +64,7 @@ "workspace.saveAllOnClose": "你需要保存对以下 {{count}} 个文件的修改吗?", "workspace.saveOnClose": "你需要保存对文件 {{name}} 的修改吗?", + "workspace.reloadFile": "文件 {{name}} 发生改变,你需要重新加载吗?", "explorer.deleteFile": "你确定要删除文件 '{{name}}'?", "explorer.deleteFolder": "你确定要删除目录 '{{name}}'?", diff --git a/src/behavior3 b/src/behavior3 index 043fd34..a7868c4 160000 --- a/src/behavior3 +++ b/src/behavior3 @@ -1 +1 @@ -Subproject commit 043fd3443f3766ab62f6b8ac61589f3f3df736e7 +Subproject commit a7868c472171c7aba4beef7096e84d87f1d2388d diff --git a/src/components/editor.tsx b/src/components/editor.tsx index 77b2853..5300553 100644 --- a/src/components/editor.tsx +++ b/src/components/editor.tsx @@ -11,7 +11,7 @@ import { message } from "@/misc/hooks"; import i18n from "@/misc/i18n"; import { Hotkey, isMacos, useKeyDown } from "@/misc/keys"; import Path from "@/misc/path"; -import { mergeClassNames } from "@/misc/util"; +import { mergeClassNames, readJson } from "@/misc/util"; import { ArrowDownOutlined, ArrowUpOutlined, CloseOutlined } from "@ant-design/icons"; import G6, { G6GraphEvent, Item, TreeGraph } from "@antv/g6"; import { dialog } from "@electron/remote"; @@ -330,6 +330,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . const refresh = () => { const rootData = findDataById("1"); const rootNode = b3util.createNode(rootData); + editor.modifiedTime = fs.statSync(editor.path).mtimeMs; editor.data = b3util.createTreeData(rootNode); editor.autoId = b3util.refreshTreeDataId(editor.data); editor.graph.changeData(editor.data); @@ -337,7 +338,14 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . restoreViewport(); }; - const reload = () => {}; + const reload = () => { + const file = readJson(editor.path) as TreeModel; + editor.data = b3util.createTreeData(file.root); + editor.autoId = b3util.refreshTreeDataId(editor.data); + editor.graph.changeData(editor.data); + editor.graph.layout(); + restoreViewport(); + }; const checkSubtree = () => { if (editor.graph) { diff --git a/src/components/workspace.tsx b/src/components/workspace.tsx index 60d9433..486b955 100644 --- a/src/components/workspace.tsx +++ b/src/components/workspace.tsx @@ -28,6 +28,7 @@ export const Workspace: FC = () => { edit: useWorkspace((state) => state.edit), editing: useWorkspace((state) => state.editing), editors: useWorkspace((state) => state.editors), + modifiedEditors: useWorkspace((state) => state.modifiedEditors), fileTree: useWorkspace((state) => state.fileTree), find: useWorkspace((state) => state.find), init: useWorkspace((state) => state.init), @@ -39,7 +40,7 @@ export const Workspace: FC = () => { const settings = { recent: useSetting((state) => state.recent), }; - const [isShowingSave, setShowingSave] = useState(false); + const [isShowingAlert, setShowingAlert] = useState(false); const { t } = useTranslation(); const forceUpdate = useForceUpdate(); const { width = 0, height = 0 } = useWindowSize(); @@ -88,16 +89,71 @@ export const Workspace: FC = () => { }); useEffect(() => { - if (!workspace.isShowingSearch && !isShowingSave) { + if (!workspace.isShowingSearch && !isShowingAlert) { keysRef.current?.focus(); } }, [workspace.isShowingSearch]); + useEffect(() => { + const editor = workspace.editing; + if (editor && workspace.modifiedEditors.includes(editor)) { + if (isShowingAlert) { + return; + } + setShowingAlert(true); + const modifiedEditors = workspace.modifiedEditors.filter((v) => v !== editor); + console.log( + "modified:", + editor.path, + modifiedEditors.map((v) => v.path) + ); + const alert = modal.confirm({ + centered: true, + content: ( + +
+ +
+
{t("workspace.reloadFile", { name: Path.basename(editor.path) })}
+
+ ), + footer: ( + + + + + + + ), + }); + } + }, [workspace.modifiedEditors, workspace.editing]); + const showSaveDialog = (editor: EditorStore) => { - if (isShowingSave) { + if (isShowingAlert) { return; } - setShowingSave(true); + setShowingAlert(true); const alert = modal.confirm({ centered: true, content: ( @@ -118,7 +174,7 @@ export const Workspace: FC = () => { workspace.close(editor.path); alert.destroy(); keysRef.current?.focus(); - setShowingSave(false); + setShowingAlert(false); }} > {t("save")} @@ -129,7 +185,7 @@ export const Workspace: FC = () => { workspace.close(editor.path); alert.destroy(); keysRef.current?.focus(); - setShowingSave(false); + setShowingAlert(false); }} > {t("donotSave")} @@ -139,7 +195,7 @@ export const Workspace: FC = () => { onClick={() => { alert.destroy(); keysRef.current?.focus(); - setShowingSave(false); + setShowingAlert(false); }} > {t("cancel")} @@ -150,10 +206,10 @@ export const Workspace: FC = () => { }; const showSaveAllDialog = (unsaves: EditorStore[]) => { - if (isShowingSave) { + if (isShowingAlert) { return; } - setShowingSave(true); + setShowingAlert(true); const alert = modal.confirm({ centered: true, content: ( @@ -169,7 +225,7 @@ export const Workspace: FC = () => {
{t("workspace.saveAllOnClose", { count: unsaves.length })}
{unsaves.map((editor) => ( -
{Path.basename(editor.path)}
+
{Path.basename(editor.path)}
))}
@@ -185,7 +241,7 @@ export const Workspace: FC = () => { unsaves.forEach((editor) => editor.dispatch("save")); alert.destroy(); window.close(); - setShowingSave(false); + setShowingAlert(false); }} > {unsaves.length > 1 ? t("saveAll") : t("save")} @@ -196,7 +252,7 @@ export const Workspace: FC = () => { workspace.editors.length = 0; alert.destroy(); window.close(); - setShowingSave(false); + setShowingAlert(false); }} > {t("donotSave")} @@ -205,7 +261,7 @@ export const Workspace: FC = () => {