import { useState, useMemo } from 'react'; import { Box, Text, useInput } from 'ink'; import type { CountryDTO } from '@effigenix/api-client'; interface CountryPickerProps { countries: CountryDTO[]; query: string; onQueryChange: (q: string) => void; onSelect: (country: CountryDTO) => void; focus: boolean; selectedName?: string; maxVisible?: number; } const DACH_CODES = ['DE', 'AT', 'CH']; export function CountryPicker({ countries, query, onQueryChange, onSelect, focus, selectedName, maxVisible = 5, }: CountryPickerProps) { const [cursor, setCursor] = useState(0); const filtered = useMemo(() => { if (!query) { // Show DACH favorites when no query return countries.filter((c) => DACH_CODES.includes(c.code)).slice(0, maxVisible); } const q = query.toLowerCase(); return countries.filter( (c) => c.name.toLowerCase().includes(q) || c.code.toLowerCase().includes(q), ).slice(0, maxVisible); }, [countries, query, maxVisible]); useInput((input, key) => { if (!focus) return; if (key.upArrow) { setCursor((c) => Math.max(0, c - 1)); return; } if (key.downArrow) { setCursor((c) => Math.min(filtered.length - 1, c + 1)); return; } if (key.return && filtered.length > 0) { const selected = filtered[cursor]; if (selected) onSelect(selected); return; } if (key.backspace || key.delete) { onQueryChange(query.slice(0, -1)); setCursor(0); return; } if (key.tab || key.escape || key.ctrl || key.meta) return; if (input && !key.upArrow && !key.downArrow) { onQueryChange(query + input); setCursor(0); } }, { isActive: focus }); if (!focus && selectedName) { return ( Land * ✓ {selectedName} ); } if (focus && selectedName && !query) { return ( Land * (tippen zum Ändern) ✓ {selectedName} {filtered.length > 0 && ( {filtered.map((c, i) => ( {i === cursor ? '▶ ' : ' '}{c.code} – {c.name} ))} )} ); } return ( Land * (Suche) {query || (focus ? '▌' : '')} {focus && filtered.length > 0 && ( {filtered.map((c, i) => ( {i === cursor ? '▶ ' : ' '}{c.code} – {c.name} ))} )} {focus && query && filtered.length === 0 && ( Kein Land gefunden. )} ); }