mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-30 03:01:54 +00:00
fix: optimizing
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { tryOnScopeDispose } from '@vueuse/core'
|
import { tryOnScopeDispose, useDebounceFn } from '@vueuse/core'
|
||||||
import { computed, watch } from 'vue'
|
import { computed, ref, watch } from 'vue'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -47,12 +47,31 @@ export function useWorkflowPersistence() {
|
|||||||
settingStore.get('Comfy.Workflow.Persist')
|
settingStore.get('Comfy.Workflow.Persist')
|
||||||
)
|
)
|
||||||
|
|
||||||
const persistCurrentWorkflow = () => {
|
const lastSavedJsonByPath = ref<Record<string, string>>({})
|
||||||
|
|
||||||
|
const persistCurrentWorkflow = useDebounceFn(() => {
|
||||||
if (!workflowPersistenceEnabled.value) return
|
if (!workflowPersistenceEnabled.value) return
|
||||||
const activeWorkflow = workflowStore.activeWorkflow
|
const activeWorkflow = workflowStore.activeWorkflow
|
||||||
if (!activeWorkflow) return
|
if (!activeWorkflow) return
|
||||||
const graphData = comfyApp.rootGraph.serialize()
|
const graphData = comfyApp.rootGraph.serialize()
|
||||||
const workflowJson = JSON.stringify(graphData)
|
const workflowJson = JSON.stringify(graphData)
|
||||||
|
const workflowPath = activeWorkflow.path
|
||||||
|
|
||||||
|
if (workflowJson === lastSavedJsonByPath.value[workflowPath]) return
|
||||||
|
lastSavedJsonByPath.value[workflowPath] = workflowJson
|
||||||
|
|
||||||
|
try {
|
||||||
|
workflowDraftStore.saveDraft(activeWorkflow.path, {
|
||||||
|
data: workflowJson,
|
||||||
|
updatedAt: Date.now(),
|
||||||
|
name: activeWorkflow.key,
|
||||||
|
isTemporary: activeWorkflow.isTemporary
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to save draft', error)
|
||||||
|
// If draft store fails, don't continue saving to storage
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
localStorage.setItem('workflow', workflowJson)
|
localStorage.setItem('workflow', workflowJson)
|
||||||
@@ -81,14 +100,7 @@ export function useWorkflowPersistence() {
|
|||||||
workflowDraftStore.removeDraft(activeWorkflow.path)
|
workflowDraftStore.removeDraft(activeWorkflow.path)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}, 1_000)
|
||||||
workflowDraftStore.saveDraft(activeWorkflow.path, {
|
|
||||||
data: workflowJson,
|
|
||||||
updatedAt: Date.now(),
|
|
||||||
name: activeWorkflow.key,
|
|
||||||
isTemporary: activeWorkflow.isTemporary
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadPreviousWorkflowFromStorage = async () => {
|
const loadPreviousWorkflowFromStorage = async () => {
|
||||||
const workflowName = getStorageValue('Comfy.PreviousWorkflow')
|
const workflowName = getStorageValue('Comfy.PreviousWorkflow')
|
||||||
@@ -144,9 +156,11 @@ export function useWorkflowPersistence() {
|
|||||||
setStorageValue('Comfy.PreviousWorkflow', activeWorkflowKey)
|
setStorageValue('Comfy.PreviousWorkflow', activeWorkflowKey)
|
||||||
// When the activeWorkflow changes, the graph has already been loaded.
|
// When the activeWorkflow changes, the graph has already been loaded.
|
||||||
// Saving the current state of the graph to the localStorage.
|
// Saving the current state of the graph to the localStorage.
|
||||||
|
// Use debounced version to avoid immediate save on tab switch
|
||||||
persistCurrentWorkflow()
|
persistCurrentWorkflow()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
api.addEventListener('graphChanged', persistCurrentWorkflow)
|
api.addEventListener('graphChanged', persistCurrentWorkflow)
|
||||||
|
|
||||||
// Clean up event listener when component unmounts
|
// Clean up event listener when component unmounts
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ import { useStorage } from '@vueuse/core'
|
|||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
|
|
||||||
|
import type {
|
||||||
|
DraftCacheState,
|
||||||
|
WorkflowDraftSnapshot
|
||||||
|
} from '@/platform/workflow/persistence/base/draftCache'
|
||||||
import {
|
import {
|
||||||
type DraftCacheState,
|
|
||||||
MAX_DRAFTS,
|
MAX_DRAFTS,
|
||||||
type WorkflowDraftSnapshot,
|
|
||||||
createDraftCacheState,
|
createDraftCacheState,
|
||||||
mostRecentDraftPath,
|
mostRecentDraftPath,
|
||||||
moveDraft as moveDraftEntry,
|
moveDraft as moveDraftEntry,
|
||||||
@@ -43,7 +45,23 @@ export const useWorkflowDraftStore = defineStore('workflowDraft', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const saveDraft = (path: string, snapshot: WorkflowDraftSnapshot) => {
|
const saveDraft = (path: string, snapshot: WorkflowDraftSnapshot) => {
|
||||||
updateState(upsertDraft(currentState(), path, snapshot, MAX_DRAFTS))
|
try {
|
||||||
|
updateState(upsertDraft(currentState(), path, snapshot, MAX_DRAFTS))
|
||||||
|
} catch (error) {
|
||||||
|
if (
|
||||||
|
error instanceof DOMException &&
|
||||||
|
error.name === 'QuotaExceededError'
|
||||||
|
) {
|
||||||
|
const state = currentState()
|
||||||
|
if (state.order.length > 0) {
|
||||||
|
const oldestPath = state.order[0]
|
||||||
|
updateState(removeDraftEntry(state, oldestPath))
|
||||||
|
updateState(upsertDraft(currentState(), path, snapshot, MAX_DRAFTS))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const removeDraft = (path: string) => {
|
const removeDraft = (path: string) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user