Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
3e3448e
[restore] conflict notification commits restore
viva-jinyi Aug 2, 2025
a1ea18c
[fix] Restore conflict notification work and fix tests
viva-jinyi Aug 2, 2025
aefa3a9
[fix] Use Vue 3.5 destructuring syntax for props with defaults
viva-jinyi Aug 2, 2025
7389790
[feature] dual modal supported
viva-jinyi Aug 2, 2025
134341d
[fix] Fix date format in PackCard test for locale consistency
viva-jinyi Aug 2, 2025
ff31e2d
[fix] title text modified
viva-jinyi Aug 5, 2025
42ad8eb
[fix] Fix conflict red dot not syncing
viva-jinyi Aug 5, 2025
63b6af5
[fix] Add conflict detection when installed packages list updates
viva-jinyi Aug 6, 2025
73f2489
fix: use selected target_branch for PR base in update-manager-types w…
viva-jinyi Aug 6, 2025
87db9cc
[fix] test code timeout error fixed
viva-jinyi Aug 6, 2025
7d0e971
[chore] Update ComfyUI-Manager API types from ComfyUI-Manager@4e6f970…
comfy-pr-bot Aug 6, 2025
4c99172
[types] Add proper types for ImportFailInfo API endpoints (#4783)
viva-jinyi Aug 6, 2025
33bf377
[fix] ci error fixed & button max-width modified
viva-jinyi Aug 7, 2025
59e1945
fix: node pack card width adapted
viva-jinyi Aug 12, 2025
35873fa
fix: prevent duplicate api calls & installedPacksWithVersions instead…
viva-jinyi Aug 12, 2025
a5153cd
feat: run conflict detection after Apply Changes
viva-jinyi Aug 17, 2025
267e07e
refactor: simplify PackInstallButton isInstalling state management
viva-jinyi Aug 27, 2025
91e462d
feat: improve multi-package selection handling (#5116)
viva-jinyi Aug 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: prevent duplicate api calls & installedPacksWithVersions instead…
… of installpackids
  • Loading branch information
viva-jinyi committed Aug 27, 2025
commit 35873fae66e4bd805de207bd5e337e77c435b868
31 changes: 25 additions & 6 deletions src/composables/nodePack/useInstalledPacks.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { whenever } from '@vueuse/core'
import { computed, onUnmounted } from 'vue'
import { computed, onUnmounted, ref } from 'vue'

import { useNodePacks } from '@/composables/nodePack/useNodePacks'
import { useComfyManagerStore } from '@/stores/comfyManagerStore'
Expand All @@ -9,6 +9,10 @@ import type { components } from '@/types/comfyRegistryTypes'
export const useInstalledPacks = (options: UseNodePacksOptions = {}) => {
const comfyManagerStore = useComfyManagerStore()

// Flag to prevent duplicate fetches during initialization
const isInitializing = ref(false)
const lastFetchedIds = ref<string>('')

const installedPackIds = computed(() =>
Array.from(comfyManagerStore.installedPacksIds)
)
Expand All @@ -20,15 +24,30 @@ export const useInstalledPacks = (options: UseNodePacksOptions = {}) => {
packs.filter((pack) => comfyManagerStore.isPackInstalled(pack.id))

const startFetchInstalled = async () => {
if (comfyManagerStore.installedPacksIds.size === 0) {
await comfyManagerStore.refreshInstalledList()
// Prevent duplicate calls during initialization
if (isInitializing.value) {
return
}

isInitializing.value = true
try {
if (comfyManagerStore.installedPacksIds.size === 0) {
await comfyManagerStore.refreshInstalledList()
}
await startFetch()
} finally {
isInitializing.value = false
}
await startFetch()
}

// When installedPackIds changes, we need to update the nodePacks
whenever(installedPackIds, async () => {
await startFetch()
// But only if the IDs actually changed (not just array reference)
whenever(installedPackIds, async (newIds) => {
const newIdsStr = newIds.sort().join(',')
if (newIdsStr !== lastFetchedIds.value && !isInitializing.value) {
lastFetchedIds.value = newIdsStr
await startFetch()
}
})

onUnmounted(() => {
Expand Down
43 changes: 21 additions & 22 deletions src/composables/useConflictDetection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,25 +246,25 @@ export function useConflictDetection() {
// Step 5: Combine local installation data with Registry version data
const requirements: NodePackRequirements[] = []

// Create a map for quick access to version info
const versionInfoMap = new Map(
installedPacksWithVersions.value.map((pack) => [pack.id, pack.version])
)

for (const pack of installedPacks.value) {
const packageId = pack.id || ''
// IMPORTANT: Use installedPacksWithVersions to check ALL installed packages
// not just the ones that exist in Registry (installedPacks)
for (const installedPack of installedPacksWithVersions.value) {
const packageId = installedPack.id
const versionData = versionDataMap.get(packageId)
const installedVersion = versionInfoMap.get(packageId) || 'unknown'
const installedVersion = installedPack.version || 'unknown'

// Check if package is enabled using store method
const isEnabled = managerStore.isPackEnabled(packageId)

// Find the pack info from Registry if available
const packInfo = installedPacks.value.find((p) => p.id === packageId)

if (versionData) {
// Combine local installation data with version-specific Registry data
const requirement: NodePackRequirements = {
// Basic package info
id: pack.id,
name: pack.name,
id: packageId,
name: packInfo?.name || packageId,
installed_version: installedVersion,
is_enabled: isEnabled,

Expand All @@ -289,8 +289,8 @@ export function useConflictDetection() {

// Create fallback requirement without Registry data
const fallbackRequirement: NodePackRequirements = {
id: pack.id,
name: pack.name,
id: packageId,
name: packInfo?.name || packageId,
installed_version: installedVersion,
is_enabled: isEnabled,
is_banned: false,
Expand Down Expand Up @@ -400,19 +400,19 @@ export function useConflictDetection() {
try {
const comfyManagerService = useComfyManagerService()

// Use installed packs from useInstalledPacks composable
// Use installedPacksWithVersions to match what versions bulk API uses
// This ensures both APIs check the same set of packages
if (
!installedPacksReady.value ||
!installedPacks.value ||
installedPacks.value.length === 0
!installedPacksWithVersions.value ||
installedPacksWithVersions.value.length === 0
) {
console.warn(
'[ConflictDetection] No installed packages available from useInstalledPacks'
'[ConflictDetection] No installed packages available for import failure check'
)
return {}
}

const packageIds = installedPacks.value.map((pack) => pack.id || '')
const packageIds = installedPacksWithVersions.value.map((pack) => pack.id)

// Use bulk API to get import failure info for all packages at once
const bulkResult = await comfyManagerService.getImportFailInfoBulk(
Expand Down Expand Up @@ -544,10 +544,6 @@ export function useConflictDetection() {
// 4. Detect Python import failures
const importFailInfo = await fetchImportFailInfo()
const importFailResults = detectImportFailConflicts(importFailInfo)
console.log(
'[ConflictDetection] Python import failures detected:',
importFailResults
)

// 5. Combine all results
const allResults = [...packageResults, ...importFailResults]
Expand Down Expand Up @@ -636,9 +632,12 @@ export function useConflictDetection() {
/**
* Error-resilient initialization (called on app mount).
* Async function that doesn't block UI setup.
* Ensures proper order: installed -> system_stats -> versions bulk -> import_fail_info_bulk
*/
async function initializeConflictDetection(): Promise<void> {
try {
// Simply perform conflict detection
// The useInstalledPacks will handle fetching installed list if needed
await performConflictDetection()
} catch (error) {
console.warn(
Expand Down
5 changes: 0 additions & 5 deletions src/stores/comfyManagerStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'

import { useCachedRequest } from '@/composables/useCachedRequest'
import { useConflictDetection } from '@/composables/useConflictDetection'
import { useManagerQueue } from '@/composables/useManagerQueue'
import { useServerLogs } from '@/composables/useServerLogs'
import { useComfyManagerService } from '@/services/comfyManagerService'
Expand Down Expand Up @@ -123,10 +122,6 @@ export const useComfyManagerStore = defineStore('comfyManager', () => {
return key.split('@')[0]
})
installedPacks.value = packsWithCleanedKeys
// Run conflict detection for all installed packages
// This ensures conflict status is always up-to-date when installed list changes
const { performConflictDetection } = useConflictDetection()
await performConflictDetection()
}
isStale.value = false
}
Expand Down