import { useEffect, useState } from 'react' import './App.css' type Pair = { id: number playerA: string playerB: string } type DrawResult = { pairs: Pair[] benchA: string[] benchB: string[] } const STORAGE_KEYS = { areaA: 'badminton-match-hub::area-a', areaB: 'badminton-match-hub::area-b', } as const const defaultAreaA = ['小杰', '阿誠', '建宏', '柏宇', 'Eason'] const defaultAreaB = ['小安', '佩珊', '阿廷', 'Luna', 'Mina'] function App() { const [areaAInput, setAreaAInput] = useState(() => loadRoster(STORAGE_KEYS.areaA, defaultAreaA), ) const [areaBInput, setAreaBInput] = useState(() => loadRoster(STORAGE_KEYS.areaB, defaultAreaB), ) const [result, setResult] = useState(null) const [error, setError] = useState('') useEffect(() => { window.localStorage.setItem(STORAGE_KEYS.areaA, areaAInput) }, [areaAInput]) useEffect(() => { window.localStorage.setItem(STORAGE_KEYS.areaB, areaBInput) }, [areaBInput]) const parsedAreaA = parseRoster(areaAInput) const parsedAreaB = parseRoster(areaBInput) function generateMatches() { if (parsedAreaA.length < 3 || parsedAreaB.length < 3) { setResult(null) setError('A 區與 B 區都至少要有 3 位不重複成員,才能產生三組配對。') return } const shuffledA = shuffleList(parsedAreaA) const shuffledB = shuffleList(parsedAreaB) const selectedA = shuffledA.slice(0, 3) const selectedB = shuffledB.slice(0, 3) const pairs = selectedA.map((playerA, index) => ({ id: index + 1, playerA, playerB: selectedB[index], })) setResult({ pairs, benchA: shuffledA.slice(3), benchB: shuffledB.slice(3), }) setError('') } function resetDemo() { setAreaAInput(defaultAreaA.join('\n')) setAreaBInput(defaultAreaB.join('\n')) setResult(null) setError('') } return (

使用 React、Vite 與 TypeScript 建置

羽毛球隊伍配對器

分別輸入 A 區與 B 區名單後,系統會從兩區各抽出 3 位成員, 自動組成 3 組隊伍。每一組都是 A 區 1 位搭配 B 區 1 位, 同一輪內三組成員都不會重複。

A 區可用人數 {parsedAreaA.length}
B 區可用人數 {parsedAreaB.length}

配對規則

固定產生 3 組,且每組皆為 A 區 1 位加上 B 區 1 位,當輪不重複。

名單輸入

輸入 A 區與 B 區成員