From 27ab355f9c73415dc39f4d3f512b02308f847801 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Mon, 15 Sep 2025 04:34:37 -0700 Subject: [PATCH] [refactor] Improve updates/notifications domain organization (#5590) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [refactor] Move update-related functionality to platform/updates domain Reorganizes release management, version compatibility, and notification functionality following Domain-Driven Design principles, mirroring VSCode's architecture pattern. - Move releaseService.ts to platform/updates/common/ - Move releaseStore.ts to platform/updates/common/ - Move versionCompatibilityStore.ts to platform/updates/common/ - Move useFrontendVersionMismatchWarning.ts to platform/updates/common/ - Move toastStore.ts to platform/updates/common/ - Move ReleaseNotificationToast.vue to platform/updates/components/ - Move WhatsNewPopup.vue to platform/updates/components/ - Update 25+ import paths across codebase and tests This creates a cohesive "updates" domain containing all functionality related to software updates, version checking, release notifications, and user communication about application state changes. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude * fix imports --------- Co-authored-by: Claude --- src/components/common/BackgroundImageUpload.vue | 2 +- src/components/dialog/content/LoadWorkflowWarning.vue | 2 +- src/components/graph/GraphCanvas.vue | 6 ++++-- src/components/helpcenter/HelpCenterMenuContent.vue | 4 ++-- src/components/load3d/Load3D.vue | 2 +- src/components/sidebar/SidebarHelpCenterIcon.vue | 6 +++--- src/components/toast/GlobalToast.vue | 2 +- src/composables/auth/useFirebaseAuthActions.ts | 2 +- src/composables/graph/useSelectionOperations.ts | 2 +- src/composables/node/useNodeImageUpload.ts | 2 +- src/composables/useCoreCommands.ts | 2 +- src/composables/useErrorHandling.ts | 2 +- src/composables/useLoad3dViewer.ts | 2 +- src/composables/useManagerState.ts | 2 +- src/extensions/core/electronAdapter.ts | 2 +- src/extensions/core/groupNode.ts | 2 +- src/extensions/core/groupNodeManage.ts | 2 +- src/extensions/core/load3d.ts | 2 +- src/extensions/core/load3d/Load3dUtils.ts | 2 +- src/extensions/core/load3d/LoaderManager.ts | 2 +- src/extensions/core/load3d/ModelExporter.ts | 2 +- src/extensions/core/nodeTemplates.ts | 2 +- src/extensions/core/uploadAudio.ts | 2 +- src/extensions/core/webcamCapture.ts | 2 +- .../updates/common}/releaseService.ts | 0 src/{stores => platform/updates/common}/releaseStore.ts | 3 ++- src/{stores => platform/updates/common}/toastStore.ts | 0 .../updates/common}/useFrontendVersionMismatchWarning.ts | 4 ++-- .../updates/common}/versionCompatibilityStore.ts | 0 .../updates/components}/ReleaseNotificationToast.vue | 5 +++-- .../updates/components}/WhatsNewPopup.vue | 5 +++-- src/platform/workflow/core/services/workflowService.ts | 2 +- .../validation/composables/useWorkflowValidation.ts | 2 +- src/scripts/api.ts | 2 +- src/scripts/app.ts | 2 +- src/scripts/ui/settings.ts | 2 +- src/services/audioService.ts | 2 +- src/services/litegraphService.ts | 2 +- src/stores/apiKeyAuthStore.ts | 2 +- src/stores/subgraphStore.ts | 2 +- src/stores/workspaceStore.ts | 2 +- src/views/GraphView.vue | 4 ++-- tests-ui/tests/audioService.test.ts | 2 +- .../tests/components/helpcenter/WhatsNewPopup.test.ts | 8 +++++--- .../composables/useFrontendVersionMismatchWarning.test.ts | 6 +++--- tests-ui/tests/composables/useLoad3dViewer.test.ts | 4 ++-- tests-ui/tests/services/releaseService.test.ts | 2 +- tests-ui/tests/store/releaseStore.test.ts | 8 +++++--- tests-ui/tests/store/versionCompatibilityStore.test.ts | 2 +- 49 files changed, 70 insertions(+), 61 deletions(-) rename src/{services => platform/updates/common}/releaseService.ts (100%) rename src/{stores => platform/updates/common}/releaseStore.ts (98%) rename src/{stores => platform/updates/common}/toastStore.ts (100%) rename src/{composables => platform/updates/common}/useFrontendVersionMismatchWarning.ts (95%) rename src/{stores => platform/updates/common}/versionCompatibilityStore.ts (100%) rename src/{components/helpcenter => platform/updates/components}/ReleaseNotificationToast.vue (98%) rename src/{components/helpcenter => platform/updates/components}/WhatsNewPopup.vue (98%) diff --git a/src/components/common/BackgroundImageUpload.vue b/src/components/common/BackgroundImageUpload.vue index 7c20cbab1..46105e537 100644 --- a/src/components/common/BackgroundImageUpload.vue +++ b/src/components/common/BackgroundImageUpload.vue @@ -36,8 +36,8 @@ import Button from 'primevue/button' import InputText from 'primevue/inputtext' import { ref } from 'vue' +import { useToastStore } from '@/platform/updates/common/toastStore' import { api } from '@/scripts/api' -import { useToastStore } from '@/stores/toastStore' const modelValue = defineModel() diff --git a/src/components/dialog/content/LoadWorkflowWarning.vue b/src/components/dialog/content/LoadWorkflowWarning.vue index cc159292a..2698f17e6 100644 --- a/src/components/dialog/content/LoadWorkflowWarning.vue +++ b/src/components/dialog/content/LoadWorkflowWarning.vue @@ -60,9 +60,9 @@ import NoResultsPlaceholder from '@/components/common/NoResultsPlaceholder.vue' import MissingCoreNodesMessage from '@/components/dialog/content/MissingCoreNodesMessage.vue' import { useMissingNodes } from '@/composables/nodePack/useMissingNodes' import { useManagerState } from '@/composables/useManagerState' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useComfyManagerStore } from '@/stores/comfyManagerStore' import { useDialogStore } from '@/stores/dialogStore' -import { useToastStore } from '@/stores/toastStore' import type { MissingNodeType } from '@/types/comfy' import { ManagerTab } from '@/types/comfyManagerTypes' diff --git a/src/components/graph/GraphCanvas.vue b/src/components/graph/GraphCanvas.vue index f8eafe599..49f325c0c 100644 --- a/src/components/graph/GraphCanvas.vue +++ b/src/components/graph/GraphCanvas.vue @@ -111,6 +111,7 @@ import type { LGraphNode } from '@/lib/litegraph/src/litegraph' import { useLitegraphSettings } from '@/platform/settings/composables/useLitegraphSettings' import { CORE_SETTINGS } from '@/platform/settings/constants/coreSettings' import { useSettingStore } from '@/platform/settings/settingStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { useWorkflowAutoSave } from '@/platform/workflow/persistence/composables/useWorkflowAutoSave' @@ -131,7 +132,6 @@ import { newUserService } from '@/services/newUserService' import { useCommandStore } from '@/stores/commandStore' import { useExecutionStore } from '@/stores/executionStore' import { useNodeDefStore } from '@/stores/nodeDefStore' -import { useToastStore } from '@/stores/toastStore' import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore' import { useSearchBoxStore } from '@/stores/workspace/searchBoxStore' import { useWorkspaceStore } from '@/stores/workspaceStore' @@ -431,7 +431,9 @@ onMounted(async () => { workflowPersistence.restoreWorkflowTabsState() // Initialize release store to fetch releases from comfy-api (fire-and-forget) - const { useReleaseStore } = await import('@/stores/releaseStore') + const { useReleaseStore } = await import( + '@/platform/updates/common/releaseStore' + ) const releaseStore = useReleaseStore() void releaseStore.initialize() diff --git a/src/components/helpcenter/HelpCenterMenuContent.vue b/src/components/helpcenter/HelpCenterMenuContent.vue index 8264dd1ab..f90922e39 100644 --- a/src/components/helpcenter/HelpCenterMenuContent.vue +++ b/src/components/helpcenter/HelpCenterMenuContent.vue @@ -144,9 +144,9 @@ import PuzzleIcon from '@/components/icons/PuzzleIcon.vue' import { useConflictAcknowledgment } from '@/composables/useConflictAcknowledgment' import { useManagerState } from '@/composables/useManagerState' import { useSettingStore } from '@/platform/settings/settingStore' -import { type ReleaseNote } from '@/services/releaseService' +import { type ReleaseNote } from '@/platform/updates/common/releaseService' +import { useReleaseStore } from '@/platform/updates/common/releaseStore' import { useCommandStore } from '@/stores/commandStore' -import { useReleaseStore } from '@/stores/releaseStore' import { ManagerTab } from '@/types/comfyManagerTypes' import { electronAPI, isElectron } from '@/utils/envUtil' import { formatVersionAnchor } from '@/utils/formatUtil' diff --git a/src/components/load3d/Load3D.vue b/src/components/load3d/Load3D.vue index ae5b5ada5..92e23c1ea 100644 --- a/src/components/load3d/Load3D.vue +++ b/src/components/load3d/Load3D.vue @@ -102,9 +102,9 @@ import { UpDirection } from '@/extensions/core/load3d/interfaces' import { useSettingStore } from '@/platform/settings/settingStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import type { CustomInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { ComponentWidget } from '@/scripts/domWidget' -import { useToastStore } from '@/stores/toastStore' const { t } = useI18n() const { widget } = defineProps<{ diff --git a/src/components/sidebar/SidebarHelpCenterIcon.vue b/src/components/sidebar/SidebarHelpCenterIcon.vue index 4527f14bc..04589a551 100644 --- a/src/components/sidebar/SidebarHelpCenterIcon.vue +++ b/src/components/sidebar/SidebarHelpCenterIcon.vue @@ -62,14 +62,14 @@ import { storeToRefs } from 'pinia' import { computed, onMounted } from 'vue' import HelpCenterMenuContent from '@/components/helpcenter/HelpCenterMenuContent.vue' -import ReleaseNotificationToast from '@/components/helpcenter/ReleaseNotificationToast.vue' -import WhatsNewPopup from '@/components/helpcenter/WhatsNewPopup.vue' import { useConflictAcknowledgment } from '@/composables/useConflictAcknowledgment' import { useConflictDetection } from '@/composables/useConflictDetection' import { useSettingStore } from '@/platform/settings/settingStore' +import { useReleaseStore } from '@/platform/updates/common/releaseStore' +import ReleaseNotificationToast from '@/platform/updates/components/ReleaseNotificationToast.vue' +import WhatsNewPopup from '@/platform/updates/components/WhatsNewPopup.vue' import { useDialogService } from '@/services/dialogService' import { useHelpCenterStore } from '@/stores/helpCenterStore' -import { useReleaseStore } from '@/stores/releaseStore' import SidebarIcon from './SidebarIcon.vue' diff --git a/src/components/toast/GlobalToast.vue b/src/components/toast/GlobalToast.vue index 0e6b9f39e..c60524a48 100644 --- a/src/components/toast/GlobalToast.vue +++ b/src/components/toast/GlobalToast.vue @@ -8,7 +8,7 @@ import { useToast } from 'primevue/usetoast' import { nextTick, watch } from 'vue' import { useSettingStore } from '@/platform/settings/settingStore' -import { useToastStore } from '@/stores/toastStore' +import { useToastStore } from '@/platform/updates/common/toastStore' const toast = useToast() const toastStore = useToastStore() diff --git a/src/composables/auth/useFirebaseAuthActions.ts b/src/composables/auth/useFirebaseAuthActions.ts index ac0afecc2..52ac27e1c 100644 --- a/src/composables/auth/useFirebaseAuthActions.ts +++ b/src/composables/auth/useFirebaseAuthActions.ts @@ -3,8 +3,8 @@ import { ref } from 'vue' import { useErrorHandling } from '@/composables/useErrorHandling' import { t } from '@/i18n' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore' -import { useToastStore } from '@/stores/toastStore' import { usdToMicros } from '@/utils/formatUtil' /** diff --git a/src/composables/graph/useSelectionOperations.ts b/src/composables/graph/useSelectionOperations.ts index 7f8a73336..857e8871d 100644 --- a/src/composables/graph/useSelectionOperations.ts +++ b/src/composables/graph/useSelectionOperations.ts @@ -1,6 +1,7 @@ // import { useSelectedLiteGraphItems } from '@/composables/canvas/useSelectedLiteGraphItems' // Unused for now import { t } from '@/i18n' import { LGraphNode } from '@/lib/litegraph/src/litegraph' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { useCanvasStore, @@ -8,7 +9,6 @@ import { } from '@/renderer/core/canvas/canvasStore' import { app } from '@/scripts/app' import { useDialogService } from '@/services/dialogService' -import { useToastStore } from '@/stores/toastStore' /** * Composable for handling basic selection operations like copy, paste, duplicate, delete, rename diff --git a/src/composables/node/useNodeImageUpload.ts b/src/composables/node/useNodeImageUpload.ts index e586a9c0b..21a4d7f72 100644 --- a/src/composables/node/useNodeImageUpload.ts +++ b/src/composables/node/useNodeImageUpload.ts @@ -2,9 +2,9 @@ import { useNodeDragAndDrop } from '@/composables/node/useNodeDragAndDrop' import { useNodeFileInput } from '@/composables/node/useNodeFileInput' import { useNodePaste } from '@/composables/node/useNodePaste' import type { LGraphNode } from '@/lib/litegraph/src/litegraph' +import { useToastStore } from '@/platform/updates/common/toastStore' import type { ResultItemType } from '@/schemas/apiSchema' import { api } from '@/scripts/api' -import { useToastStore } from '@/stores/toastStore' const PASTED_IMAGE_EXPIRY_MS = 2000 diff --git a/src/composables/useCoreCommands.ts b/src/composables/useCoreCommands.ts index fa4e0baff..cd368221b 100644 --- a/src/composables/useCoreCommands.ts +++ b/src/composables/useCoreCommands.ts @@ -16,6 +16,7 @@ import { } from '@/lib/litegraph/src/litegraph' import { Point } from '@/lib/litegraph/src/litegraph' import { useSettingStore } from '@/platform/settings/settingStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import { type ComfyWorkflow, @@ -36,7 +37,6 @@ import { useNodeOutputStore } from '@/stores/imagePreviewStore' import { useQueueSettingsStore, useQueueStore } from '@/stores/queueStore' import { useSubgraphNavigationStore } from '@/stores/subgraphNavigationStore' import { useSubgraphStore } from '@/stores/subgraphStore' -import { useToastStore } from '@/stores/toastStore' import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore' import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore' import { useSearchBoxStore } from '@/stores/workspace/searchBoxStore' diff --git a/src/composables/useErrorHandling.ts b/src/composables/useErrorHandling.ts index 607997ac8..91cf0df32 100644 --- a/src/composables/useErrorHandling.ts +++ b/src/composables/useErrorHandling.ts @@ -1,5 +1,5 @@ import { t } from '@/i18n' -import { useToastStore } from '@/stores/toastStore' +import { useToastStore } from '@/platform/updates/common/toastStore' export function useErrorHandling() { const toast = useToastStore() diff --git a/src/composables/useLoad3dViewer.ts b/src/composables/useLoad3dViewer.ts index 4066787fc..9477f8dd3 100644 --- a/src/composables/useLoad3dViewer.ts +++ b/src/composables/useLoad3dViewer.ts @@ -9,8 +9,8 @@ import { } from '@/extensions/core/load3d/interfaces' import { t } from '@/i18n' import { LGraphNode } from '@/lib/litegraph/src/LGraphNode' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useLoad3dService } from '@/services/load3dService' -import { useToastStore } from '@/stores/toastStore' interface Load3dViewerState { backgroundColor: string diff --git a/src/composables/useManagerState.ts b/src/composables/useManagerState.ts index ae9eb1cde..10a7f4819 100644 --- a/src/composables/useManagerState.ts +++ b/src/composables/useManagerState.ts @@ -2,11 +2,11 @@ import { storeToRefs } from 'pinia' import { computed, readonly } from 'vue' import { t } from '@/i18n' +import { useToastStore } from '@/platform/updates/common/toastStore' import { api } from '@/scripts/api' import { useDialogService } from '@/services/dialogService' import { useCommandStore } from '@/stores/commandStore' import { useSystemStatsStore } from '@/stores/systemStatsStore' -import { useToastStore } from '@/stores/toastStore' import { ManagerTab } from '@/types/comfyManagerTypes' export enum ManagerUIState { diff --git a/src/extensions/core/electronAdapter.ts b/src/extensions/core/electronAdapter.ts index a25d1852e..a1ade628a 100644 --- a/src/extensions/core/electronAdapter.ts +++ b/src/extensions/core/electronAdapter.ts @@ -2,10 +2,10 @@ import log from 'loglevel' import { PYTHON_MIRROR } from '@/constants/uvMirrors' import { t } from '@/i18n' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { app } from '@/scripts/app' import { useDialogService } from '@/services/dialogService' -import { useToastStore } from '@/stores/toastStore' import { electronAPI as getElectronAPI, isElectron } from '@/utils/envUtil' import { checkMirrorReachable } from '@/utils/networkUtil' diff --git a/src/extensions/core/groupNode.ts b/src/extensions/core/groupNode.ts index 9751439d7..eab82634a 100644 --- a/src/extensions/core/groupNode.ts +++ b/src/extensions/core/groupNode.ts @@ -9,6 +9,7 @@ import { LiteGraph, SubgraphNode } from '@/lib/litegraph/src/litegraph' +import { useToastStore } from '@/platform/updates/common/toastStore' import { ComfyLink, ComfyNode, @@ -18,7 +19,6 @@ import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import { useDialogService } from '@/services/dialogService' import { useExecutionStore } from '@/stores/executionStore' import { useNodeDefStore } from '@/stores/nodeDefStore' -import { useToastStore } from '@/stores/toastStore' import { useWidgetStore } from '@/stores/widgetStore' import { ComfyExtension } from '@/types/comfy' import { ExecutableGroupNodeChildDTO } from '@/utils/executableGroupNodeChildDTO' diff --git a/src/extensions/core/groupNodeManage.ts b/src/extensions/core/groupNodeManage.ts index 7cc7fb220..355af0ccd 100644 --- a/src/extensions/core/groupNodeManage.ts +++ b/src/extensions/core/groupNodeManage.ts @@ -4,7 +4,7 @@ import { type LGraphNodeConstructor, LiteGraph } from '@/lib/litegraph/src/litegraph' -import { useToastStore } from '@/stores/toastStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { type ComfyApp, app } from '../../scripts/app' import { $el } from '../../scripts/ui' diff --git a/src/extensions/core/load3d.ts b/src/extensions/core/load3d.ts index e70f96820..698be00dd 100644 --- a/src/extensions/core/load3d.ts +++ b/src/extensions/core/load3d.ts @@ -8,6 +8,7 @@ import Load3dAnimation from '@/extensions/core/load3d/Load3dAnimation' import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' import { t } from '@/i18n' import type { IStringWidget } from '@/lib/litegraph/src/types/widgets' +import { useToastStore } from '@/platform/updates/common/toastStore' import { CustomInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' import { api } from '@/scripts/api' import { ComfyApp, app } from '@/scripts/app' @@ -15,7 +16,6 @@ import { ComponentWidgetImpl, addWidget } from '@/scripts/domWidget' import { useExtensionService } from '@/services/extensionService' import { useLoad3dService } from '@/services/load3dService' import { useDialogStore } from '@/stores/dialogStore' -import { useToastStore } from '@/stores/toastStore' import { isLoad3dNode } from '@/utils/litegraphUtil' async function handleModelUpload(files: FileList, node: any) { diff --git a/src/extensions/core/load3d/Load3dUtils.ts b/src/extensions/core/load3d/Load3dUtils.ts index 213019293..4a63e6b5a 100644 --- a/src/extensions/core/load3d/Load3dUtils.ts +++ b/src/extensions/core/load3d/Load3dUtils.ts @@ -1,7 +1,7 @@ import { t } from '@/i18n' +import { useToastStore } from '@/platform/updates/common/toastStore' import { api } from '@/scripts/api' import { app } from '@/scripts/app' -import { useToastStore } from '@/stores/toastStore' class Load3dUtils { static async uploadTempImage( diff --git a/src/extensions/core/load3d/LoaderManager.ts b/src/extensions/core/load3d/LoaderManager.ts index d9bc66c36..ccf06787b 100644 --- a/src/extensions/core/load3d/LoaderManager.ts +++ b/src/extensions/core/load3d/LoaderManager.ts @@ -6,7 +6,7 @@ import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader' import { STLLoader } from 'three/examples/jsm/loaders/STLLoader' import { t } from '@/i18n' -import { useToastStore } from '@/stores/toastStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { EventManagerInterface, diff --git a/src/extensions/core/load3d/ModelExporter.ts b/src/extensions/core/load3d/ModelExporter.ts index 3181cbd36..bf677ba44 100644 --- a/src/extensions/core/load3d/ModelExporter.ts +++ b/src/extensions/core/load3d/ModelExporter.ts @@ -4,7 +4,7 @@ import { OBJExporter } from 'three/examples/jsm/exporters/OBJExporter' import { STLExporter } from 'three/examples/jsm/exporters/STLExporter' import { t } from '@/i18n' -import { useToastStore } from '@/stores/toastStore' +import { useToastStore } from '@/platform/updates/common/toastStore' export class ModelExporter { static detectFormatFromURL(url: string): string | null { diff --git a/src/extensions/core/nodeTemplates.ts b/src/extensions/core/nodeTemplates.ts index 5ca26a934..5737ba54d 100644 --- a/src/extensions/core/nodeTemplates.ts +++ b/src/extensions/core/nodeTemplates.ts @@ -1,7 +1,7 @@ import { t } from '@/i18n' import { LGraphCanvas } from '@/lib/litegraph/src/litegraph' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useDialogService } from '@/services/dialogService' -import { useToastStore } from '@/stores/toastStore' import { deserialiseAndCreate } from '@/utils/vintageClipboard' import { api } from '../../scripts/api' diff --git a/src/extensions/core/uploadAudio.ts b/src/extensions/core/uploadAudio.ts index dd6351244..1b858b240 100644 --- a/src/extensions/core/uploadAudio.ts +++ b/src/extensions/core/uploadAudio.ts @@ -10,11 +10,11 @@ import type { IBaseWidget, IStringWidget } from '@/lib/litegraph/src/types/widgets' +import { useToastStore } from '@/platform/updates/common/toastStore' import type { ResultItemType } from '@/schemas/apiSchema' import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import type { DOMWidget } from '@/scripts/domWidget' import { useAudioService } from '@/services/audioService' -import { useToastStore } from '@/stores/toastStore' import { NodeLocatorId } from '@/types' import { getNodeByLocatorId } from '@/utils/graphTraversalUtil' diff --git a/src/extensions/core/webcamCapture.ts b/src/extensions/core/webcamCapture.ts index 0836a0767..7e3a79e58 100644 --- a/src/extensions/core/webcamCapture.ts +++ b/src/extensions/core/webcamCapture.ts @@ -1,5 +1,5 @@ import { t } from '@/i18n' -import { useToastStore } from '@/stores/toastStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { api } from '../../scripts/api' import { app } from '../../scripts/app' diff --git a/src/services/releaseService.ts b/src/platform/updates/common/releaseService.ts similarity index 100% rename from src/services/releaseService.ts rename to src/platform/updates/common/releaseService.ts diff --git a/src/stores/releaseStore.ts b/src/platform/updates/common/releaseStore.ts similarity index 98% rename from src/stores/releaseStore.ts rename to src/platform/updates/common/releaseStore.ts index 05c81515c..f34e525f5 100644 --- a/src/stores/releaseStore.ts +++ b/src/platform/updates/common/releaseStore.ts @@ -3,11 +3,12 @@ import { defineStore } from 'pinia' import { computed, ref } from 'vue' import { useSettingStore } from '@/platform/settings/settingStore' -import { type ReleaseNote, useReleaseService } from '@/services/releaseService' import { useSystemStatsStore } from '@/stores/systemStatsStore' import { isElectron } from '@/utils/envUtil' import { compareVersions, stringToLocale } from '@/utils/formatUtil' +import { type ReleaseNote, useReleaseService } from './releaseService' + // Store for managing release notes export const useReleaseStore = defineStore('release', () => { // State diff --git a/src/stores/toastStore.ts b/src/platform/updates/common/toastStore.ts similarity index 100% rename from src/stores/toastStore.ts rename to src/platform/updates/common/toastStore.ts diff --git a/src/composables/useFrontendVersionMismatchWarning.ts b/src/platform/updates/common/useFrontendVersionMismatchWarning.ts similarity index 95% rename from src/composables/useFrontendVersionMismatchWarning.ts rename to src/platform/updates/common/useFrontendVersionMismatchWarning.ts index e74f2ee5c..adb1bd702 100644 --- a/src/composables/useFrontendVersionMismatchWarning.ts +++ b/src/platform/updates/common/useFrontendVersionMismatchWarning.ts @@ -2,8 +2,8 @@ import { whenever } from '@vueuse/core' import { computed, onMounted } from 'vue' import { useI18n } from 'vue-i18n' -import { useToastStore } from '@/stores/toastStore' -import { useVersionCompatibilityStore } from '@/stores/versionCompatibilityStore' +import { useToastStore } from './toastStore' +import { useVersionCompatibilityStore } from './versionCompatibilityStore' interface UseFrontendVersionMismatchWarningOptions { immediate?: boolean diff --git a/src/stores/versionCompatibilityStore.ts b/src/platform/updates/common/versionCompatibilityStore.ts similarity index 100% rename from src/stores/versionCompatibilityStore.ts rename to src/platform/updates/common/versionCompatibilityStore.ts diff --git a/src/components/helpcenter/ReleaseNotificationToast.vue b/src/platform/updates/components/ReleaseNotificationToast.vue similarity index 98% rename from src/components/helpcenter/ReleaseNotificationToast.vue rename to src/platform/updates/components/ReleaseNotificationToast.vue index 4984b84d8..1abcf472e 100644 --- a/src/components/helpcenter/ReleaseNotificationToast.vue +++ b/src/platform/updates/components/ReleaseNotificationToast.vue @@ -48,10 +48,11 @@ import { computed, onMounted, ref, watch } from 'vue' import { useI18n } from 'vue-i18n' -import type { ReleaseNote } from '@/services/releaseService' -import { useReleaseStore } from '@/stores/releaseStore' import { formatVersionAnchor } from '@/utils/formatUtil' +import type { ReleaseNote } from '../common/releaseService' +import { useReleaseStore } from '../common/releaseStore' + const { locale } = useI18n() const releaseStore = useReleaseStore() diff --git a/src/components/helpcenter/WhatsNewPopup.vue b/src/platform/updates/components/WhatsNewPopup.vue similarity index 98% rename from src/components/helpcenter/WhatsNewPopup.vue rename to src/platform/updates/components/WhatsNewPopup.vue index 794c61e9b..d0049d873 100644 --- a/src/components/helpcenter/WhatsNewPopup.vue +++ b/src/platform/updates/components/WhatsNewPopup.vue @@ -68,10 +68,11 @@ import { marked } from 'marked' import { computed, onMounted, ref } from 'vue' import { useI18n } from 'vue-i18n' -import type { ReleaseNote } from '@/services/releaseService' -import { useReleaseStore } from '@/stores/releaseStore' import { formatVersionAnchor } from '@/utils/formatUtil' +import type { ReleaseNote } from '../common/releaseService' +import { useReleaseStore } from '../common/releaseStore' + const { locale, t } = useI18n() const releaseStore = useReleaseStore() diff --git a/src/platform/workflow/core/services/workflowService.ts b/src/platform/workflow/core/services/workflowService.ts index e50f37e1b..943177986 100644 --- a/src/platform/workflow/core/services/workflowService.ts +++ b/src/platform/workflow/core/services/workflowService.ts @@ -4,6 +4,7 @@ import { t } from '@/i18n' import { LGraph, LGraphCanvas } from '@/lib/litegraph/src/litegraph' import type { SerialisableGraph, Vector2 } from '@/lib/litegraph/src/litegraph' import { useSettingStore } from '@/platform/settings/settingStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { ComfyWorkflow, useWorkflowStore @@ -15,7 +16,6 @@ import { blankGraph, defaultGraph } from '@/scripts/defaultGraph' import { downloadBlob } from '@/scripts/utils' import { useDialogService } from '@/services/dialogService' import { useDomWidgetStore } from '@/stores/domWidgetStore' -import { useToastStore } from '@/stores/toastStore' import { useWorkspaceStore } from '@/stores/workspaceStore' import { appendJsonExt, generateUUID } from '@/utils/formatUtil' diff --git a/src/platform/workflow/validation/composables/useWorkflowValidation.ts b/src/platform/workflow/validation/composables/useWorkflowValidation.ts index b28226606..c6d7c70ca 100644 --- a/src/platform/workflow/validation/composables/useWorkflowValidation.ts +++ b/src/platform/workflow/validation/composables/useWorkflowValidation.ts @@ -1,7 +1,7 @@ import type { ISerialisedGraph } from '@/lib/litegraph/src/types/serialisation' +import { useToastStore } from '@/platform/updates/common/toastStore' import type { ComfyWorkflowJSON } from '@/platform/workflow/validation/schemas/workflowSchema' import { validateComfyWorkflow } from '@/platform/workflow/validation/schemas/workflowSchema' -import { useToastStore } from '@/stores/toastStore' import { fixBadLinks } from '@/utils/linkFixer' interface ValidationResult { diff --git a/src/scripts/api.ts b/src/scripts/api.ts index 8cc250e62..77fc17286 100644 --- a/src/scripts/api.ts +++ b/src/scripts/api.ts @@ -2,6 +2,7 @@ import axios from 'axios' import { get } from 'es-toolkit/compat' import defaultClientFeatureFlags from '@/config/clientFeatureFlags.json' with { type: 'json' } +import { useToastStore } from '@/platform/updates/common/toastStore' import { WorkflowTemplates } from '@/platform/workflow/templates/types/template' import type { ComfyApiWorkflow, @@ -38,7 +39,6 @@ import type { } from '@/schemas/apiSchema' import type { ModelFile, ModelFolderInfo } from '@/schemas/assetSchema' import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' -import { useToastStore } from '@/stores/toastStore' import type { NodeExecutionId } from '@/types/nodeIdentification' interface QueuePromptRequestBody { diff --git a/src/scripts/app.ts b/src/scripts/app.ts index 6751f632f..57ddfbb2c 100644 --- a/src/scripts/app.ts +++ b/src/scripts/app.ts @@ -14,6 +14,7 @@ import { import type { Vector2 } from '@/lib/litegraph/src/litegraph' import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets' import { useSettingStore } from '@/platform/settings/settingStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import { ComfyWorkflow } from '@/platform/workflow/management/stores/workflowStore' import { useWorkflowValidation } from '@/platform/workflow/validation/composables/useWorkflowValidation' @@ -55,7 +56,6 @@ import { KeyComboImpl, useKeybindingStore } from '@/stores/keybindingStore' import { useModelStore } from '@/stores/modelStore' import { SYSTEM_NODE_DEFS, useNodeDefStore } from '@/stores/nodeDefStore' import { useSubgraphStore } from '@/stores/subgraphStore' -import { useToastStore } from '@/stores/toastStore' import { useWidgetStore } from '@/stores/widgetStore' import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore' import { useWorkspaceStore } from '@/stores/workspaceStore' diff --git a/src/scripts/ui/settings.ts b/src/scripts/ui/settings.ts index fb2da6d81..8f1bfca16 100644 --- a/src/scripts/ui/settings.ts +++ b/src/scripts/ui/settings.ts @@ -1,9 +1,9 @@ import { t } from '@/i18n' import { useSettingStore } from '@/platform/settings/settingStore' import type { SettingParams } from '@/platform/settings/types' +import { useToastStore } from '@/platform/updates/common/toastStore' import type { Settings } from '@/schemas/apiSchema' import type { ComfyApp } from '@/scripts/app' -import { useToastStore } from '@/stores/toastStore' import { ComfyDialog } from './dialog' diff --git a/src/services/audioService.ts b/src/services/audioService.ts index 7621e3037..f2b03cd67 100644 --- a/src/services/audioService.ts +++ b/src/services/audioService.ts @@ -1,8 +1,8 @@ import { register } from 'extendable-media-recorder' import { connect } from 'extendable-media-recorder-wav-encoder' +import { useToastStore } from '@/platform/updates/common/toastStore' import { api } from '@/scripts/api' -import { useToastStore } from '@/stores/toastStore' export interface AudioRecordingError { type: 'permission' | 'not_supported' | 'encoder' | 'recording' | 'unknown' diff --git a/src/services/litegraphService.ts b/src/services/litegraphService.ts index 276b2e623..0579429da 100644 --- a/src/services/litegraphService.ts +++ b/src/services/litegraphService.ts @@ -25,6 +25,7 @@ import type { ISerialisedNode } from '@/lib/litegraph/src/types/serialisation' import { useSettingStore } from '@/platform/settings/settingStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import type { NodeId } from '@/platform/workflow/validation/schemas/workflowSchema' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' @@ -43,7 +44,6 @@ import { useExecutionStore } from '@/stores/executionStore' import { useNodeOutputStore } from '@/stores/imagePreviewStore' import { ComfyNodeDefImpl } from '@/stores/nodeDefStore' import { useSubgraphStore } from '@/stores/subgraphStore' -import { useToastStore } from '@/stores/toastStore' import { useWidgetStore } from '@/stores/widgetStore' import { normalizeI18nKey } from '@/utils/formatUtil' import { diff --git a/src/stores/apiKeyAuthStore.ts b/src/stores/apiKeyAuthStore.ts index 493884dd0..a167e758d 100644 --- a/src/stores/apiKeyAuthStore.ts +++ b/src/stores/apiKeyAuthStore.ts @@ -4,8 +4,8 @@ import { computed, ref, watch } from 'vue' import { useErrorHandling } from '@/composables/useErrorHandling' import { t } from '@/i18n' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore' -import { useToastStore } from '@/stores/toastStore' import { ApiKeyAuthHeader } from '@/types/authTypes' import { operations } from '@/types/comfyRegistryTypes' diff --git a/src/stores/subgraphStore.ts b/src/stores/subgraphStore.ts index bc65567d8..9706ffc4f 100644 --- a/src/stores/subgraphStore.ts +++ b/src/stores/subgraphStore.ts @@ -4,6 +4,7 @@ import { computed, ref } from 'vue' import { t } from '@/i18n' import { SubgraphNode } from '@/lib/litegraph/src/litegraph' import { useSettingStore } from '@/platform/settings/settingStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useWorkflowService } from '@/platform/workflow/core/services/workflowService' import { ComfyWorkflow, @@ -25,7 +26,6 @@ import { api } from '@/scripts/api' import { useDialogService } from '@/services/dialogService' import { useExecutionStore } from '@/stores/executionStore' import { ComfyNodeDefImpl } from '@/stores/nodeDefStore' -import { useToastStore } from '@/stores/toastStore' import { UserFile } from '@/stores/userFileStore' async function confirmOverwrite(name: string): Promise { diff --git a/src/stores/workspaceStore.ts b/src/stores/workspaceStore.ts index 3074351cc..4b5b03df6 100644 --- a/src/stores/workspaceStore.ts +++ b/src/stores/workspaceStore.ts @@ -2,6 +2,7 @@ import { defineStore } from 'pinia' import { computed, ref } from 'vue' import { useSettingStore } from '@/platform/settings/settingStore' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import type { Settings } from '@/schemas/apiSchema' import { useColorPaletteService } from '@/services/colorPaletteService' @@ -12,7 +13,6 @@ import { useApiKeyAuthStore } from './apiKeyAuthStore' import { useCommandStore } from './commandStore' import { useFirebaseAuthStore } from './firebaseAuthStore' import { useQueueSettingsStore } from './queueStore' -import { useToastStore } from './toastStore' import { useBottomPanelStore } from './workspace/bottomPanelStore' import { useSidebarTabStore } from './workspace/sidebarTabStore' diff --git a/src/views/GraphView.vue b/src/views/GraphView.vue index 8ecc9a35a..92a46b5b7 100644 --- a/src/views/GraphView.vue +++ b/src/views/GraphView.vue @@ -42,11 +42,12 @@ import TopMenubar from '@/components/topbar/TopMenubar.vue' import { useBrowserTabTitle } from '@/composables/useBrowserTabTitle' import { useCoreCommands } from '@/composables/useCoreCommands' import { useErrorHandling } from '@/composables/useErrorHandling' -import { useFrontendVersionMismatchWarning } from '@/composables/useFrontendVersionMismatchWarning' import { useProgressFavicon } from '@/composables/useProgressFavicon' import { SERVER_CONFIG_ITEMS } from '@/constants/serverConfig' import { i18n } from '@/i18n' import { useSettingStore } from '@/platform/settings/settingStore' +import { useFrontendVersionMismatchWarning } from '@/platform/updates/common/useFrontendVersionMismatchWarning' +import { useVersionCompatibilityStore } from '@/platform/updates/common/versionCompatibilityStore' import { StatusWsMessageStatus } from '@/schemas/apiSchema' import { api } from '@/scripts/api' import { app } from '@/scripts/app' @@ -62,7 +63,6 @@ import { useQueueStore } from '@/stores/queueStore' import { useServerConfigStore } from '@/stores/serverConfigStore' -import { useVersionCompatibilityStore } from '@/stores/versionCompatibilityStore' import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore' import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore' import { useSidebarTabStore } from '@/stores/workspace/sidebarTabStore' diff --git a/tests-ui/tests/audioService.test.ts b/tests-ui/tests/audioService.test.ts index 68f37680b..81fc46d9b 100644 --- a/tests-ui/tests/audioService.test.ts +++ b/tests-ui/tests/audioService.test.ts @@ -28,7 +28,7 @@ vi.mock('@/scripts/api', () => ({ api: mockApi })) -vi.mock('@/stores/toastStore', () => ({ +vi.mock('@/platform/updates/common/toastStore', () => ({ useToastStore: vi.fn(() => mockToastStore) })) diff --git a/tests-ui/tests/components/helpcenter/WhatsNewPopup.test.ts b/tests-ui/tests/components/helpcenter/WhatsNewPopup.test.ts index 1026228d2..c39a07e70 100644 --- a/tests-ui/tests/components/helpcenter/WhatsNewPopup.test.ts +++ b/tests-ui/tests/components/helpcenter/WhatsNewPopup.test.ts @@ -2,7 +2,7 @@ import { mount } from '@vue/test-utils' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { nextTick } from 'vue' -import WhatsNewPopup from '@/components/helpcenter/WhatsNewPopup.vue' +import WhatsNewPopup from '@/platform/updates/components/WhatsNewPopup.vue' import type { components } from '@/types/comfyRegistryTypes' type ReleaseNote = components['schemas']['ReleaseNote'] @@ -19,7 +19,7 @@ vi.mock('marked', () => ({ marked: vi.fn((content) => `

${content}

`) })) -vi.mock('@/stores/releaseStore', () => ({ +vi.mock('@/platform/updates/common/releaseStore', () => ({ useReleaseStore: vi.fn() })) @@ -58,7 +58,9 @@ describe('WhatsNewPopup', () => { mockReleaseStore.releases = [] // Mock release store - const { useReleaseStore } = await import('@/stores/releaseStore') + const { useReleaseStore } = await import( + '@/platform/updates/common/releaseStore' + ) vi.mocked(useReleaseStore).mockReturnValue(mockReleaseStore as any) }) diff --git a/tests-ui/tests/composables/useFrontendVersionMismatchWarning.test.ts b/tests-ui/tests/composables/useFrontendVersionMismatchWarning.test.ts index b8b4fceac..8c175ab05 100644 --- a/tests-ui/tests/composables/useFrontendVersionMismatchWarning.test.ts +++ b/tests-ui/tests/composables/useFrontendVersionMismatchWarning.test.ts @@ -3,9 +3,9 @@ import { vi } from 'vitest' import { afterEach, beforeEach, describe, expect, it } from 'vitest' import { nextTick } from 'vue' -import { useFrontendVersionMismatchWarning } from '@/composables/useFrontendVersionMismatchWarning' -import { useToastStore } from '@/stores/toastStore' -import { useVersionCompatibilityStore } from '@/stores/versionCompatibilityStore' +import { useToastStore } from '@/platform/updates/common/toastStore' +import { useFrontendVersionMismatchWarning } from '@/platform/updates/common/useFrontendVersionMismatchWarning' +import { useVersionCompatibilityStore } from '@/platform/updates/common/versionCompatibilityStore' // Mock globals //@ts-expect-error Define global for the test diff --git a/tests-ui/tests/composables/useLoad3dViewer.test.ts b/tests-ui/tests/composables/useLoad3dViewer.test.ts index baf64055b..a607186e5 100644 --- a/tests-ui/tests/composables/useLoad3dViewer.test.ts +++ b/tests-ui/tests/composables/useLoad3dViewer.test.ts @@ -4,14 +4,14 @@ import { nextTick } from 'vue' import { useLoad3dViewer } from '@/composables/useLoad3dViewer' import Load3d from '@/extensions/core/load3d/Load3d' import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' +import { useToastStore } from '@/platform/updates/common/toastStore' import { useLoad3dService } from '@/services/load3dService' -import { useToastStore } from '@/stores/toastStore' vi.mock('@/services/load3dService', () => ({ useLoad3dService: vi.fn() })) -vi.mock('@/stores/toastStore', () => ({ +vi.mock('@/platform/updates/common/toastStore', () => ({ useToastStore: vi.fn() })) diff --git a/tests-ui/tests/services/releaseService.test.ts b/tests-ui/tests/services/releaseService.test.ts index 57913a5d5..8dd2d7a94 100644 --- a/tests-ui/tests/services/releaseService.test.ts +++ b/tests-ui/tests/services/releaseService.test.ts @@ -1,7 +1,7 @@ import axios from 'axios' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { useReleaseService } from '@/services/releaseService' +import { useReleaseService } from '@/platform/updates/common/releaseService' // Hoist the mock to avoid hoisting issues const mockAxiosInstance = vi.hoisted(() => ({ diff --git a/tests-ui/tests/store/releaseStore.test.ts b/tests-ui/tests/store/releaseStore.test.ts index e759c8fc7..5cfc8a8fe 100644 --- a/tests-ui/tests/store/releaseStore.test.ts +++ b/tests-ui/tests/store/releaseStore.test.ts @@ -1,12 +1,12 @@ import { createPinia, setActivePinia } from 'pinia' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { useReleaseStore } from '@/stores/releaseStore' +import { useReleaseStore } from '@/platform/updates/common/releaseStore' // Mock the dependencies vi.mock('@/utils/formatUtil') vi.mock('@/utils/envUtil') -vi.mock('@/services/releaseService') +vi.mock('@/platform/updates/common/releaseService') vi.mock('@/platform/settings/settingStore') vi.mock('@/stores/systemStatsStore') vi.mock('@vueuse/core', () => ({ @@ -59,7 +59,9 @@ describe('useReleaseStore', () => { } // Setup mock implementations - const { useReleaseService } = await import('@/services/releaseService') + const { useReleaseService } = await import( + '@/platform/updates/common/releaseService' + ) const { useSettingStore } = await import('@/platform/settings/settingStore') const { useSystemStatsStore } = await import('@/stores/systemStatsStore') const { isElectron } = await import('@/utils/envUtil') diff --git a/tests-ui/tests/store/versionCompatibilityStore.test.ts b/tests-ui/tests/store/versionCompatibilityStore.test.ts index b5ff99ab4..f77baf328 100644 --- a/tests-ui/tests/store/versionCompatibilityStore.test.ts +++ b/tests-ui/tests/store/versionCompatibilityStore.test.ts @@ -2,8 +2,8 @@ import { createPinia, setActivePinia } from 'pinia' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { ref } from 'vue' +import { useVersionCompatibilityStore } from '@/platform/updates/common/versionCompatibilityStore' import { useSystemStatsStore } from '@/stores/systemStatsStore' -import { useVersionCompatibilityStore } from '@/stores/versionCompatibilityStore' vi.mock('@/config', () => ({ default: {