Files
FlightsAPI/resources/js/Composables/useAircraftFamilies.ts
T
2026-05-16 23:48:18 +10:00

52 lines
1.9 KiB
TypeScript

import { computed, ComputedRef } from 'vue'
import { Flight } from '@/Types/types'
// ── Types ──────────────────────────────────────────────────────────────────
export interface AircraftFamilyEntry {
family: string
designators: string[]
flights: Flight[]
}
// ── Composable ─────────────────────────────────────────────────────────────
export function useAircraftFamilies(
flights: ComputedRef<Flight[]>,
families: Record<string, string[]>,
) {
// Build a lookup from designator → family name for O(1) matching
const designatorToFamily = Object.entries(families).reduce<Record<string, string>>(
(acc, [family, designators]) => {
for (const d of designators) acc[d] = family
return acc
},
{}
)
const entries = computed<AircraftFamilyEntry[]>(() => {
// Pre-populate all families with empty flight lists
const map = new Map<string, AircraftFamilyEntry>(
Object.entries(families).map(([family, designators]) => [
family,
{ family, designators, flights: [] },
])
)
for (const flight of flights.value) {
const designator = flight.aircraft?.designator
if (!designator) continue
const family = designatorToFamily[designator]
if (!family) continue
map.get(family)!.flights.push(flight)
}
return [...map.values()]
})
const completedCount = computed(() => entries.value.filter(e => e.flights.length > 0).length)
const totalCount = computed(() => entries.value.length)
return { entries, completedCount, totalCount }
}