import { useState, useRef } from 'react'; import { DSP_DEFAULT_PARAMETERS, DSPTypes } from '../../types'; import Button from '../../components/Button/Button'; import Card from '../../components/Card/Card'; import ChoiceStepper from '../../components/ChoiceStepper/ChoiceStepper'; import ChoiceSelect from '../../components/ChoiceSelect/ChoiceSelect'; import './AddDspPage.css'; type DSPForm = { name: string; type: DSPTypes; ip: string; port: number; deviceId: number; demo: boolean; }; const DSP_TYPES = Object.keys(DSP_DEFAULT_PARAMETERS) as DSPTypes[]; function isValidIPv4(value: string): boolean { const parts = value.trim().split('.'); if (parts.length !== 4) return false; return parts.every((part) => { if (!/^\d+$/.test(part)) return false; const n = Number(part); return n >= 0 && n <= 255; }); } function AddDSPForm({ onCancel, onAdd, }: { onCancel: () => void; onAdd: (params: DSPForm) => void; }) { const [form, setForm] = useState({ name: '', type: 'DSP408', ip: DSP_DEFAULT_PARAMETERS['DSP408'].ip, port: DSP_DEFAULT_PARAMETERS['DSP408'].defaultPort, deviceId: DSP_DEFAULT_PARAMETERS['DSP408'].device_id, demo: false, }); const lastValidIp = useRef(form.ip); const validIp = form.demo || isValidIPv4(form.ip); const canSubmit = form.name.trim().length > 0 && validIp && Number.isInteger(form.deviceId) && form.deviceId >= 1 && form.deviceId <= 255; function validateIp() { if (form.demo) return; const ip = form.ip.trim(); if (isValidIPv4(ip)) { lastValidIp.current = ip; if (ip !== form.ip) { setForm((prev) => ({ ...prev, ip })); } return; } setForm((prev) => ({ ...prev, ip: lastValidIp.current, })); } function submit() { if (!canSubmit) return; onAdd(form); } return (

Add DSP

Register a new device to control from this app.

setForm({ ...form, name: e.target.value })} />
setForm({ ...form, type })} />
String(v)} onChange={(deviceId) => setForm({ ...form, deviceId })} />
setForm((prev) => ({ ...prev, ip: e.target.value, })) } onBlur={validateIp} onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); validateIp(); e.currentTarget.blur(); } }} />
String(v)} onChange={(port) => setForm({ ...form, port })} />
); } export default AddDSPForm;