Files
tolaria/src/utils/vaultOrdering.ts
2026-05-15 02:29:39 +02:00

55 lines
1.9 KiB
TypeScript

import type { VaultOption } from '../components/status-bar/types'
export type VaultMoveDirection = 'up' | 'down'
export function vaultPathList(vaults: VaultOption[]): string[] {
return vaults.map((vault) => vault.path)
}
export function orderVaultsByPath(vaults: VaultOption[], orderedPaths: string[]): VaultOption[] | null {
if (vaults.length !== orderedPaths.length) return null
const vaultsByPath = new Map(vaults.map((vault) => [vault.path, vault]))
const orderedVaults: VaultOption[] = []
for (const path of orderedPaths) {
const vault = vaultsByPath.get(path)
if (!vault) return null
orderedVaults.push(vault)
}
return orderedVaults
}
export function moveVaultPath(vaults: VaultOption[], path: string, direction: VaultMoveDirection): string[] | null {
const orderedPaths = vaultPathList(vaults)
const currentIndex = orderedPaths.indexOf(path)
if (currentIndex === -1) return null
const nextIndex = direction === 'up' ? currentIndex - 1 : currentIndex + 1
if (nextIndex < 0 || nextIndex >= orderedPaths.length) return null
const nextPaths = [...orderedPaths]
const [movedPath] = nextPaths.splice(currentIndex, 1)
nextPaths.splice(nextIndex, 0, movedPath)
return nextPaths
}
export function reorderVaultPath(vaults: VaultOption[], activePath: string, overPath: string): string[] | null {
if (activePath === overPath) return null
const orderedPaths = vaultPathList(vaults)
const activeIndex = orderedPaths.indexOf(activePath)
const overIndex = orderedPaths.indexOf(overPath)
if (activeIndex === -1 || overIndex === -1) return null
const nextPaths = [...orderedPaths]
const [movedPath] = nextPaths.splice(activeIndex, 1)
nextPaths.splice(overIndex, 0, movedPath)
return nextPaths
}
export function canMoveVaultPath(vaults: VaultOption[], path: string, direction: VaultMoveDirection): boolean {
return moveVaultPath(vaults, path, direction) !== null
}