import { defineStore } from 'pinia' import { computed, ref, watch } from 'vue' import { ComfyWorkflow } from '@/scripts/workflows' import { buildTree } from '@/utils/treeUtil' import { api } from '@/scripts/api' export const useWorkflowStore = defineStore('workflow', () => { const activeWorkflow = ref(null) const workflowLookup = ref>({}) const workflows = computed(() => Object.values(workflowLookup.value)) const persistedWorkflows = computed(() => workflows.value.filter((workflow) => workflow.isPersisted) ) const openWorkflows = computed(() => workflows.value.filter((workflow) => workflow.isOpen) ) const bookmarkedWorkflows = computed(() => workflows.value.filter((workflow) => workflow.isBookmarked) ) const modifiedWorkflows = computed(() => workflows.value.filter((workflow) => workflow.unsaved) ) const buildWorkflowTree = (workflows: ComfyWorkflow[]) => { return buildTree(workflows, (workflow: ComfyWorkflow) => workflow.key.split('/') ) } const workflowsTree = computed(() => buildWorkflowTree(persistedWorkflows.value) ) // Bookmarked workflows tree is flat. const bookmarkedWorkflowsTree = computed(() => buildTree(bookmarkedWorkflows.value, (workflow: ComfyWorkflow) => [ workflow.path ]) ) // Open workflows tree is flat. const openWorkflowsTree = computed(() => buildTree(openWorkflows.value, (workflow: ComfyWorkflow) => [workflow.key]) ) return { activeWorkflow, workflows, openWorkflows, bookmarkedWorkflows, modifiedWorkflows, workflowLookup, workflowsTree, bookmarkedWorkflowsTree, openWorkflowsTree, buildWorkflowTree } }) export const useWorkflowBookmarkStore = defineStore('workflowBookmark', () => { const bookmarks = ref>(new Set()) const isBookmarked = (path: string) => bookmarks.value.has(path) const loadBookmarks = async () => { const resp = await api.getUserData('workflows/.index.json') if (resp.status === 200) { const info = await resp.json() bookmarks.value = new Set(info?.favorites ?? []) } } const saveBookmarks = async () => { await api.storeUserData('workflows/.index.json', { favorites: Array.from(bookmarks.value) }) } const setBookmarked = (path: string, value: boolean) => { if (value) { bookmarks.value.add(path) } else { bookmarks.value.delete(path) } saveBookmarks() } const toggleBookmarked = (path: string) => { setBookmarked(path, !bookmarks.value.has(path)) } return { isBookmarked, loadBookmarks, saveBookmarks, setBookmarked, toggleBookmarked } })