Files
tolaria/src/utils/vaultCollections.ts
2026-05-14 17:30:13 +02:00

55 lines
1.8 KiB
TypeScript

import type { VaultOption } from '../components/status-bar/types'
function buildPersistedVaultOrder({
extraVaults,
hiddenDefaults,
visibleDefaults,
}: {
extraVaults: VaultOption[]
hiddenDefaults: string[]
visibleDefaults: VaultOption[]
}): VaultOption[] {
const visibleDefaultsByPath = new Map(visibleDefaults.map((vault) => [vault.path, vault]))
const orderedVaults: VaultOption[] = []
const seenPaths = new Set<string>()
for (const vault of extraVaults) {
if (hiddenDefaults.includes(vault.path) || seenPaths.has(vault.path)) continue
const defaultVault = visibleDefaultsByPath.get(vault.path)
orderedVaults.push(defaultVault ? { ...defaultVault, ...vault, managedDefault: defaultVault.managedDefault } : vault)
seenPaths.add(vault.path)
}
for (const vault of visibleDefaults) {
if (!seenPaths.has(vault.path)) orderedVaults.push(vault)
}
return orderedVaults
}
export function buildAllVaults({
hiddenDefaults,
visibleDefaults,
extraVaults,
}: {
hiddenDefaults: string[]
visibleDefaults: VaultOption[]
extraVaults: VaultOption[]
}): VaultOption[] {
const visibleDefaultPaths = new Set(visibleDefaults.map((vault) => vault.path))
const hasPersistedDefaultOrder = extraVaults.some((vault) => visibleDefaultPaths.has(vault.path))
if (hasPersistedDefaultOrder) {
return buildPersistedVaultOrder({ extraVaults, hiddenDefaults, visibleDefaults })
}
const vaultsByPath = new Map<string, VaultOption>()
for (const vault of visibleDefaults) vaultsByPath.set(vault.path, vault)
for (const vault of extraVaults) {
if (hiddenDefaults.includes(vault.path)) continue
const existingVault = vaultsByPath.get(vault.path)
vaultsByPath.set(vault.path, existingVault ? { ...existingVault, ...vault, path: vault.path } : vault)
}
return [...vaultsByPath.values()]
}