From cf1c33891fae1f177509086b59d4979b8622c274 Mon Sep 17 00:00:00 2001 From: codetypes Date: Thu, 21 Nov 2024 09:38:31 +0800 Subject: [PATCH] detect file changes --- src/components/editor.tsx | 19 +++++++++++++------ src/components/explorer.tsx | 2 +- src/components/menu.tsx | 1 - src/contexts/workspace-context.ts | 23 +++++++++++++++++++---- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/components/editor.tsx b/src/components/editor.tsx index e4d065d..77b2853 100644 --- a/src/components/editor.tsx +++ b/src/components/editor.tsx @@ -152,7 +152,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . filterFocus: true, filterType: "content", placeholder: "", - isFocused: false + isFocused: false, }); const onSearchChange = (option: FilterOption) => { @@ -327,7 +327,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . } }; - const reload = () => { + const refresh = () => { const rootData = findDataById("1"); const rootNode = b3util.createNode(rootData); editor.data = b3util.createTreeData(rootNode); @@ -337,11 +337,13 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . restoreViewport(); }; + const reload = () => {}; + const checkSubtree = () => { if (editor.graph) { const data = findDataById("1"); if (b3util.isSubtreeUpdated(data)) { - reload(); + refresh(); pushHistory(); onChange(); } @@ -383,7 +385,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . b3util.copyFromNode(data, newNode); data.size = b3util.calcTreeDataSize(data); if (oldNode.path !== newNode.path) { - reload(); + refresh(); selectNode(null); selectNode(data.id); } else { @@ -623,6 +625,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . export: editor.export, desc: editor.desc, } as TreeModel; + editor.modifiedTime = Date.now(); fs.writeFileSync(path, JSON.stringify(treeModel, null, 2)); workspace.updateFileMeta(editor); editor.unsave = false; @@ -684,7 +687,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . } as TreeModel; fs.writeFileSync(subpath, JSON.stringify(subtreeModel, null, 2)); data.path = workspace.relative(subpath); - reload(); + refresh(); pushHistory(); onChange(); }, 200); @@ -1006,6 +1009,10 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . redo(); break; } + case "refresh": { + refresh(); + break; + } case "reload": { reload(); break; @@ -1274,7 +1281,7 @@ export const Editor: FC = ({ onUpdate: updateState, data: editor, . filterStr: "", filterType: "content", placeholder: "", - isFocused: false + isFocused: false, }); keysRef.current?.focus(); }} diff --git a/src/components/explorer.tsx b/src/components/explorer.tsx index b93c7e1..901a015 100644 --- a/src/components/explorer.tsx +++ b/src/components/explorer.tsx @@ -694,7 +694,7 @@ export const Explorer: FC = () => { console.log("editor move", editor.path === newPath, editor.path, newPath); if (editor.path.startsWith(newPath)) { console.log("editor reload", editor.path === newPath, editor.path, newPath); - editor.dispatch("reload"); + editor.dispatch("refresh"); } } }; diff --git a/src/components/menu.tsx b/src/components/menu.tsx index 21d355d..b8b487d 100644 --- a/src/components/menu.tsx +++ b/src/components/menu.tsx @@ -133,7 +133,6 @@ export const Menu: FC = () => { accelerator: "CmdOrCtrl+S", enabled: enabled, click: () => { - console.log("save1"); workspace.save(); }, }, diff --git a/src/contexts/workspace-context.ts b/src/contexts/workspace-context.ts index c92a0d8..4e4b0ce 100644 --- a/src/contexts/workspace-context.ts +++ b/src/contexts/workspace-context.ts @@ -30,8 +30,9 @@ export type EditEvent = | "jumpNode" | "undo" | "redo" - | "reload" + | "refresh" | "rename" + | "reload" | "updateTree" | "updateNode" | "searchNode" @@ -49,6 +50,7 @@ export class EditorStore { dragSrcId?: string; dragDstId?: string; unsave: boolean = false; + modifiedTime: number = Date.now(); historyStack: NodeModel[] = []; historyIndex: number = 0; selectedId?: string | null; @@ -66,6 +68,7 @@ export class EditorStore { const file = readJson(path) as TreeModel; this.data = b3util.createTreeData(file.root); + this.modifiedTime = fs.statSync(path).mtimeMs; this.desc = file.desc ?? ""; this.export = file.export !== false; this.name = file.name || path.slice(0, -5); @@ -393,6 +396,7 @@ export const useWorkspace = create((set, get) => ({ }, open: (path) => { + path = fs.realpathSync(path); const workspace = get(); let editor = workspace.editors.find((v) => v.path === path); if (!editor) { @@ -488,8 +492,19 @@ export const useWorkspace = create((set, get) => ({ hasEvent = true; } } - if (event === "change" && filename === "node-config.b3-setting") { - workspace.loadNodeDefs(); + if (event === "change" && filename) { + if (filename === "node-config.b3-setting") { + workspace.loadNodeDefs(); + } else { + const fullpath = fs.realpathSync(`${workspace.workdir}/${filename}`); + const editor = workspace.find(fullpath); + if (editor) { + console.log(filename, editor, editor.modifiedTime, fs.statSync(fullpath).mtimeMs); + if (editor.modifiedTime + 500 < fs.statSync(fullpath).mtimeMs) { + console.log("reload", filename); + } + } + } } }); } catch (e) { @@ -550,7 +565,7 @@ export const useWorkspace = create((set, get) => ({ nodeDefs.set(v.name, v); } set({ nodeDefs }); - workspace.editing?.dispatch("reload"); + workspace.editing?.dispatch("refresh"); }, // node edit