import React, { useState } from 'react'; import { Box, Text, useInput } from 'ink'; import type { Unit, PriceModel } from '@effigenix/api-client'; import { UNIT_LABELS, PRICE_MODEL_LABELS } from '@effigenix/api-client'; import { useNavigation } from '../../../state/navigation-context.js'; import { useArticles } from '../../../hooks/useArticles.js'; import { FormInput } from '../../shared/FormInput.js'; import { LoadingSpinner } from '../../shared/LoadingSpinner.js'; import { ErrorDisplay } from '../../shared/ErrorDisplay.js'; const UNITS: Unit[] = ['PIECE_FIXED', 'KG', 'HUNDRED_GRAM', 'PIECE_VARIABLE']; const UNIT_PRICE_MODEL: Record = { PIECE_FIXED: 'FIXED', KG: 'WEIGHT_BASED', HUNDRED_GRAM: 'WEIGHT_BASED', PIECE_VARIABLE: 'WEIGHT_BASED', }; export function AddSalesUnitScreen() { const { params, navigate, back } = useNavigation(); const articleId = params['articleId'] ?? ''; const { addSalesUnit, loading, error, clearError } = useArticles(); const [unitIndex, setUnitIndex] = useState(0); const [price, setPrice] = useState(''); const [activeField, setActiveField] = useState<'unit' | 'price'>('unit'); const [priceError, setPriceError] = useState(null); const selectedUnit = UNITS[unitIndex] ?? 'PIECE_FIXED'; const autoModel = UNIT_PRICE_MODEL[selectedUnit]; useInput((_input, key) => { if (loading) return; if (activeField === 'unit') { if (key.leftArrow) setUnitIndex((i) => Math.max(0, i - 1)); if (key.rightArrow) setUnitIndex((i) => Math.min(UNITS.length - 1, i + 1)); if (key.tab || key.downArrow || key.return) setActiveField('price'); } if (key.upArrow && activeField === 'price') setActiveField('unit'); if (key.escape) back(); }); const handleSubmit = async () => { const priceNum = parseFloat(price.replace(',', '.')); if (isNaN(priceNum) || priceNum <= 0) { setPriceError('Gültiger Preis erforderlich.'); return; } setPriceError(null); const updated = await addSalesUnit(articleId, { unit: selectedUnit, priceModel: autoModel, price: priceNum }); if (updated) navigate('article-detail', { articleId }); }; if (loading) return ; return ( Verkaufseinheit hinzufügen {error && } Einheit * {'< '} {UNIT_LABELS[selectedUnit]} {' >'} → {PRICE_MODEL_LABELS[autoModel]} {activeField === 'unit' && ←→ Einheit · Tab/Enter weiter} void handleSubmit()} focus={activeField === 'price'} placeholder="z.B. 2.49" {...(priceError ? { error: priceError } : {})} /> Tab/↑↓ Feld · ←→ Einheit · Enter speichern · Escape Abbrechen ); }