55 lines
1.9 KiB
TypeScript
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
|
|
}
|