import {ActionDispatch, FormEvent, useState} from 'react'; import ValidatingInputNumberField, {ValidatorFunction} from "./validating-input-number-field.tsx"; import {Action, actionLoadedMaze, actionLoadingFailed, actionStartedLoading} from "./state/action.ts"; import styles from "./input-form.module.css"; import "./input-form.css"; import {State} from "@/app/state/state.ts"; export default function InputForm({state, dispatch}: { state: State, dispatch: ActionDispatch<[Action]> }) { const [width, setWidth] = useState(10); const [height, setHeight] = useState(10); const [id, setId] = useState(); const [algorithm, setAlgorithm] = useState('wilson'); const handleSubmit = (e: FormEvent) => { e.preventDefault(); dispatch(actionStartedLoading()); const url = `https://manuel.friedli.info/labyrinth/create/json?w=${width}&h=${height}&id=${id || ''}&algorithm=${algorithm}`; fetch(url) .then(response => response.json()) // .then(result => new Promise(resolve => setTimeout(resolve, 600, result))) .then(result => { dispatch(actionLoadedMaze(result)); }) .catch(reason => { console.error("Failed to fetch maze data.", reason); dispatch(actionLoadingFailed(reason)); }); }; const validateWidthHeightInput: ValidatorFunction = value => { const numberValue = Number(value); if (isNaN(numberValue) || "" === value || (Math.floor(numberValue) !== numberValue)) { return { valid: false, message: "Must be an integer greater than 1." }; } if (numberValue < 1) { return { valid: false, message: "Must be greater than 1." }; } return { valid: true, value: numberValue }; }; const validateIdInput: ValidatorFunction = value => { if ("" === value) { return { valid: true }; } const numberValue = Number(value); // FIXME doesn't handle strings with characters correctly (e.g. "asdf" yields an empty value, due to "type=number"). if (isNaN(numberValue) || Math.floor(numberValue) !== numberValue) { return { valid: false, message: "Must be empty or an integer" }; } return { valid: true, value: numberValue } }; return (
); }