diff options
| author | blackhao <13851610112@163.com> | 2025-12-14 01:53:35 -0600 |
|---|---|---|
| committer | blackhao <13851610112@163.com> | 2025-12-14 01:53:35 -0600 |
| commit | 41a08c6f1818d991108725bf671b8934e5cc13bf (patch) | |
| tree | 386367a826ec98a5d8256b24bbdb48370f21be7e /frontend/src/store | |
| parent | 2956d4b67ca24991e0962f2be7f849ec5b682be6 (diff) | |
auto save
Diffstat (limited to 'frontend/src/store')
| -rw-r--r-- | frontend/src/store/flowStore.ts | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/frontend/src/store/flowStore.ts b/frontend/src/store/flowStore.ts index a919498..e2cd5d1 100644 --- a/frontend/src/store/flowStore.ts +++ b/frontend/src/store/flowStore.ts @@ -151,6 +151,7 @@ interface FlowState { currentBlueprintPath?: string; lastViewport?: ViewportState; saveStatus: SaveStatus; + autoSave: boolean; onNodesChange: OnNodesChange; onEdgesChange: OnEdgesChange; @@ -205,6 +206,8 @@ interface FlowState { setCurrentBlueprintPath: (path?: string) => void; setLastViewport: (viewport: ViewportState) => void; saveCurrentBlueprint: (path?: string, viewport?: ViewportState) => Promise<void>; + setAutoSave: (enabled: boolean) => void; + triggerAutoSave: () => void; clearBlueprint: () => void; loadArchivedNodes: () => Promise<void>; saveArchivedNodes: () => Promise<void>; @@ -305,6 +308,7 @@ const useFlowStore = create<FlowState>((set, get) => { currentBlueprintPath: undefined, lastViewport: undefined, saveStatus: 'idle', + autoSave: false, toggleTheme: () => { const newTheme = get().theme === 'light' ? 'dark' : 'light'; @@ -430,8 +434,9 @@ const useFlowStore = create<FlowState>((set, get) => { }, onNodesChange: (changes: NodeChange[]) => { - // Check if any nodes are being removed + // Check if any nodes are being removed or positions are changing const hasRemovals = changes.some(c => c.type === 'remove'); + const hasPositionChanges = changes.some(c => c.type === 'position' && c.dragging === false); set({ nodes: applyNodeChanges(changes, get().nodes) as LLMNode[], @@ -445,12 +450,24 @@ const useFlowStore = create<FlowState>((set, get) => { }); get().propagateTraces(); } + + // Trigger auto-save for removals or position changes (after drag ends) + if (hasRemovals || hasPositionChanges) { + get().triggerAutoSave(); + } }, onEdgesChange: (changes: EdgeChange[]) => { + const hasRemovals = changes.some(c => c.type === 'remove'); + set({ edges: applyEdgeChanges(changes, get().edges), }); get().propagateTraces(); + + // Trigger auto-save for edge changes + if (hasRemovals) { + get().triggerAutoSave(); + } }, onConnect: (connection: Connection) => { const { nodes, edges } = get(); @@ -901,11 +918,13 @@ const useFlowStore = create<FlowState>((set, get) => { }, get().edges), }); setTimeout(() => get().propagateTraces(), 0); + get().triggerAutoSave(); }, addNode: (node: LLMNode) => { set((state) => ({ nodes: [...state.nodes, node] })); setTimeout(() => get().propagateTraces(), 0); + get().triggerAutoSave(); }, updateNodeData: (nodeId: string, data: Partial<NodeData>) => { @@ -923,6 +942,11 @@ const useFlowStore = create<FlowState>((set, get) => { if (data.response !== undefined) { get().propagateTraces(); } + + // Trigger auto-save for important changes (not just userPrompt typing) + if (data.response !== undefined || data.status !== undefined || data.attachedFileIds !== undefined) { + get().triggerAutoSave(); + } }, setSelectedNode: (nodeId: string | null) => { @@ -1565,6 +1589,31 @@ const useFlowStore = create<FlowState>((set, get) => { } }, + setAutoSave: (enabled: boolean) => { + set({ autoSave: enabled }); + // Save preference to localStorage + localStorage.setItem('contextflow-autosave', enabled ? 'true' : 'false'); + }, + + triggerAutoSave: (() => { + let timeoutId: ReturnType<typeof setTimeout> | null = null; + return () => { + const state = useFlowStore.getState(); + if (!state.autoSave || !state.currentBlueprintPath) return; + + // Debounce: wait 2 seconds after last change before saving + if (timeoutId) clearTimeout(timeoutId); + timeoutId = setTimeout(async () => { + try { + await state.saveCurrentBlueprint(); + console.log('[AutoSave] Blueprint saved'); + } catch (e) { + console.error('[AutoSave] Failed to save:', e); + } + }, 2000); + }; + })(), + clearBlueprint: () => { set({ nodes: [], |
