import { h } from 'preact'; import { useEffect, useRef, useState } from 'preact/hooks'; import styles from '../NewGame.module.css'; import { UI_CONSTANTS, ERROR_MESSAGES, ARIA_LABELS, FORM_CONFIG, ERROR_STYLES } from '../../utils/constants'; import { PlayerSelectModal } from './PlayerSelectModal'; interface PlayerStepProps { playerNameHistory: string[]; onNext: (name: string) => void; onCancel: () => void; initialValue?: string; } export const Player1Step = ({ playerNameHistory, onNext, onCancel, initialValue = '' }: PlayerStepProps) => { const [player1, setPlayer1] = useState(initialValue); const [error, setError] = useState(null); const [filteredNames, setFilteredNames] = useState(playerNameHistory); const [isModalOpen, setIsModalOpen] = useState(false); const inputRef = useRef(null); useEffect(() => { if (!player1) { setFilteredNames(playerNameHistory); } else { setFilteredNames( playerNameHistory.filter(name => name.toLowerCase().includes(player1.toLowerCase()) ) ); } }, [player1, playerNameHistory]); const handleSubmit = (e: Event) => { e.preventDefault(); const trimmedName = player1.trim(); if (!trimmedName) { setError(ERROR_MESSAGES.PLAYER1_REQUIRED); if (inputRef.current) { inputRef.current.focus(); inputRef.current.setAttribute('aria-invalid', 'true'); } return; } if (trimmedName.length > FORM_CONFIG.MAX_PLAYER_NAME_LENGTH) { setError(`Spielername darf maximal ${FORM_CONFIG.MAX_PLAYER_NAME_LENGTH} Zeichen lang sein`); if (inputRef.current) { inputRef.current.focus(); inputRef.current.setAttribute('aria-invalid', 'true'); } return; } setError(null); if (inputRef.current) { inputRef.current.setAttribute('aria-invalid', 'false'); } onNext(trimmedName); }; const handleQuickPick = (name: string) => { setError(null); onNext(name); }; const handleModalSelect = (name: string) => { setIsModalOpen(false); handleQuickPick(name); }; const handleClear = () => { setPlayer1(''); setError(null); if (inputRef.current) inputRef.current.focus(); }; return (
Name Spieler 1
{ const target = e.target as HTMLInputElement; const value = target.value; setPlayer1(value); if (value.length > FORM_CONFIG.MAX_PLAYER_NAME_LENGTH) { setError(`Spielername darf maximal ${FORM_CONFIG.MAX_PLAYER_NAME_LENGTH} Zeichen lang sein`); target.setAttribute('aria-invalid', 'true'); } else if (value.trim() && error) { setError(null); target.setAttribute('aria-invalid', 'false'); } }} autoComplete="off" aria-label="Name Spieler 1" aria-describedby="player1-help" style={{ fontSize: UI_CONSTANTS.INPUT_FONT_SIZE, minHeight: UI_CONSTANTS.INPUT_MIN_HEIGHT, marginTop: 12, marginBottom: 12, width: '100%', paddingRight: UI_CONSTANTS.INPUT_PADDING_RIGHT }} ref={inputRef} />
Geben Sie den Namen für Spieler 1 ein. Maximal {FORM_CONFIG.MAX_PLAYER_NAME_LENGTH} Zeichen erlaubt.
{player1.length > FORM_CONFIG.CHARACTER_COUNT_WARNING_THRESHOLD && (
FORM_CONFIG.MAX_PLAYER_NAME_LENGTH ? '#f44336' : '#ff9800', marginTop: '4px', textAlign: 'right' }}> {player1.length}/{FORM_CONFIG.MAX_PLAYER_NAME_LENGTH} Zeichen
)} {player1 && ( )}
{filteredNames.length > 0 && (
{filteredNames.slice(0, UI_CONSTANTS.MAX_QUICK_PICKS).map((name, idx) => ( ))} {playerNameHistory.length > UI_CONSTANTS.MAX_QUICK_PICKS && ( )}
)}
{error && (
⚠️ {error}
)}
{isModalOpen && ( setIsModalOpen(false)} /> )} ); };