import React, { useState } from 'react'; import { Box, Text, useInput } from 'ink'; import { useNavigation } from '../../state/navigation-context.js'; import { useStorageLocations } from '../../hooks/useStorageLocations.js'; import { FormInput } from '../shared/FormInput.js'; import { LoadingSpinner } from '../shared/LoadingSpinner.js'; import { ErrorDisplay } from '../shared/ErrorDisplay.js'; import { STORAGE_TYPE_LABELS } from '@effigenix/api-client'; import type { StorageType } from '@effigenix/api-client'; type Field = 'name' | 'storageType' | 'minTemperature' | 'maxTemperature'; const FIELDS: Field[] = ['name', 'storageType', 'minTemperature', 'maxTemperature']; const FIELD_LABELS: Record = { name: 'Name *', storageType: 'Lagertyp * (←→ wechseln)', minTemperature: 'Min. Temperatur (°C)', maxTemperature: 'Max. Temperatur (°C)', }; const STORAGE_TYPES: StorageType[] = ['COLD_ROOM', 'FREEZER', 'DRY_STORAGE', 'DISPLAY_COUNTER', 'PRODUCTION_AREA']; export function StorageLocationCreateScreen() { const { replace, back } = useNavigation(); const { createStorageLocation, loading, error, clearError } = useStorageLocations(); const [values, setValues] = useState>({ name: '', storageType: 'DRY_STORAGE', minTemperature: '', maxTemperature: '', }); const [activeField, setActiveField] = useState('name'); const [fieldErrors, setFieldErrors] = useState>>({}); const setField = (field: Field) => (value: string) => { setValues((v) => ({ ...v, [field]: value })); }; useInput((input, key) => { if (loading) return; if (activeField === 'storageType') { if (key.leftArrow || key.rightArrow) { const idx = STORAGE_TYPES.indexOf(values.storageType as StorageType); const dir = key.rightArrow ? 1 : -1; const next = STORAGE_TYPES[(idx + dir + STORAGE_TYPES.length) % STORAGE_TYPES.length]; if (next) setValues((v) => ({ ...v, storageType: next })); 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.name.trim()) errors.name = 'Name ist erforderlich.'; if (!values.storageType) errors.storageType = 'Lagertyp ist erforderlich.'; setFieldErrors(errors); if (Object.keys(errors).length > 0) return; const result = await createStorageLocation({ name: values.name.trim(), storageType: values.storageType, ...(values.minTemperature.trim() ? { minTemperature: values.minTemperature.trim() } : {}), ...(values.maxTemperature.trim() ? { maxTemperature: values.maxTemperature.trim() } : {}), }); if (result) replace('storage-location-list'); }; 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 ( ); } const storageTypeLabel = STORAGE_TYPE_LABELS[values.storageType as StorageType] ?? values.storageType; return ( Neuer Lagerort {error && } {FIELDS.map((field) => { if (field === 'storageType') { return ( {FIELD_LABELS[field]}: {storageTypeLabel} {fieldErrors[field] && {fieldErrors[field]}} ); } return ( ); })} Tab/↑↓ Feld wechseln · ←→ Lagertyp · Enter auf letztem Feld speichern · Escape Abbrechen ); }