import React, { useEffect, useState } from 'react'; import { Box, Text, useInput } from 'ink'; import type { CountryDTO } from '@effigenix/api-client'; import { useNavigation } from '../../../state/navigation-context.js'; import { useCustomers } from '../../../hooks/useCustomers.js'; import { FormInput } from '../../shared/FormInput.js'; import { CountryPicker } from '../../shared/CountryPicker.js'; import { LoadingSpinner } from '../../shared/LoadingSpinner.js'; import { ErrorDisplay } from '../../shared/ErrorDisplay.js'; import { client } from '../../../utils/api-client.js'; type Field = 'label' | 'street' | 'houseNumber' | 'postalCode' | 'city' | 'countryPicker' | 'contactPerson' | 'deliveryNotes'; const FIELDS: Field[] = ['label', 'street', 'houseNumber', 'postalCode', 'city', 'countryPicker', 'contactPerson', 'deliveryNotes']; const FIELD_LABELS: Record = { label: 'Bezeichnung * (z.B. Hauptküche)', street: 'Straße *', houseNumber: 'Hausnummer *', postalCode: 'PLZ *', city: 'Stadt *', countryPicker: 'Land *', contactPerson: 'Ansprechpartner', deliveryNotes: 'Lieferhinweis', }; export function AddDeliveryAddressScreen() { const { params, replace, back } = useNavigation(); const customerId = params['customerId'] ?? ''; const { addDeliveryAddress, loading, error, clearError } = useCustomers(); const [values, setValues] = useState, string>>({ label: '', street: '', houseNumber: '', postalCode: '', city: '', contactPerson: '', deliveryNotes: '', }); const [activeField, setActiveField] = useState('label'); const [fieldErrors, setFieldErrors] = useState>>({}); const [countryQuery, setCountryQuery] = useState(''); const [countryCode, setCountryCode] = useState('DE'); const [countryName, setCountryName] = useState('Deutschland'); const [countries, setCountries] = useState([]); useEffect(() => { client.countries.search().then(setCountries).catch(() => {}); }, []); const setField = (field: Exclude) => (value: string) => { setValues((v) => ({ ...v, [field]: value })); }; useInput((_input, key) => { if (loading) return; if (key.tab || key.downArrow) { setActiveField((f) => { const idx = FIELDS.indexOf(f); return FIELDS[(idx + 1) % FIELDS.length] ?? f; }); } if (key.upArrow) { setActiveField((f) => { const idx = FIELDS.indexOf(f); return FIELDS[(idx - 1 + FIELDS.length) % FIELDS.length] ?? f; }); } if (key.escape) back(); }); const handleSubmit = async () => { const errors: Partial> = {}; if (!values.label.trim()) errors.label = 'Bezeichnung ist erforderlich.'; if (!values.street.trim()) errors.street = 'Straße ist erforderlich.'; if (!values.houseNumber.trim()) errors.houseNumber = 'Hausnummer ist erforderlich.'; if (!values.postalCode.trim()) errors.postalCode = 'PLZ ist erforderlich.'; if (!values.city.trim()) errors.city = 'Stadt ist erforderlich.'; setFieldErrors(errors); if (Object.keys(errors).length > 0) return; const updated = await addDeliveryAddress(customerId, { label: values.label.trim(), street: values.street.trim(), houseNumber: values.houseNumber.trim(), postalCode: values.postalCode.trim(), city: values.city.trim(), country: countryCode, ...(values.contactPerson.trim() ? { contactPerson: values.contactPerson.trim() } : {}), ...(values.deliveryNotes.trim() ? { deliveryNotes: values.deliveryNotes.trim() } : {}), }); if (updated) replace('customer-detail', { customerId }); }; const handleFieldSubmit = (field: Field) => (_value: string) => { const idx = FIELDS.indexOf(field); if (idx < FIELDS.length - 1) { setActiveField(FIELDS[idx + 1] ?? field); } else { void handleSubmit(); } }; if (loading) return ; return ( Lieferadresse hinzufügen {error && } {FIELDS.map((field) => { if (field === 'countryPicker') { return ( { setCountryCode(c.code); setCountryName(c.name); setCountryQuery(''); const idx = FIELDS.indexOf('countryPicker'); if (idx < FIELDS.length - 1) { setActiveField(FIELDS[idx + 1] ?? 'countryPicker'); } }} focus={activeField === 'countryPicker'} selectedName={countryName} /> ); } const f = field as Exclude; return ( ); })} Tab/↑↓ Feld wechseln · Enter auf letztem Feld speichern · Escape Abbrechen ); }