diff --git a/biome.json b/biome.json index 2eb0751..0eae55e 100644 --- a/biome.json +++ b/biome.json @@ -1,9 +1,10 @@ { "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", "vcs": { - "enabled": false, + "enabled": true, "clientKind": "git", - "useIgnoreFile": false + "useIgnoreFile": true, + "defaultBranch": "main" }, "files": { "ignoreUnknown": false, diff --git a/src/App.tsx b/src/App.tsx index 6a34733..11eb772 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,155 +1,31 @@ -import { useState } from "react"; import "./App.css"; import BracketDescription from "./components/BracketDescription"; import Footer from "./components/Footer"; import ScaleSelection from "./components/ScaleSelection"; import ScoreSelection from "./components/ScoreSelection"; -import { scales } from "./data/scales"; -import type { Bracket, JudgeBracket, ScaleType, SpeakerBracket } from "./types"; +import { useBinarySearch } from "./hooks/useBinarySearch"; import { isSpeakerBracket } from "./utils"; function App() { - const [selectedScale, setSelectedScale] = useState("speaker"); - const [low, setLow] = useState(0); - const [high, setHigh] = useState(scales[selectedScale].length - 1); - const [mid, setMid] = useState( - Math.floor((0 + scales[selectedScale].length - 1) / 2), - ); - const [phase, setPhase] = useState<"search" | "select" | "done" | "between">( - "search", - ); - const [selectedBracketIndex, setSelectedBracketIndex] = useState< - number | null - >(null); - const [exactScore, setExactScore] = useState(null); - const [showScale, setShowScale] = useState(false); - const [betweenBracketIndices, setBetweenBracketIndices] = useState< - [number, number] | null - >(null); - - const currentScale = scales[selectedScale] as Bracket[]; - - const handleScaleChange = (newScale: ScaleType) => { - setSelectedScale(newScale); - setLow(0); - setHigh(scales[newScale].length - 1); - setMid(Math.floor((0 + scales[newScale].length - 1) / 2)); - setPhase("search"); - setSelectedBracketIndex(null); - setExactScore(null); - setBetweenBracketIndices(null); - setShowScale(false); - }; - - const handleBetter = () => { - const newHigh = mid - 1; - if (newHigh < low) { - // No more higher brackets. - if (mid === 0) { - // At the top bracket. - setSelectedBracketIndex(mid); - const bracket = currentScale[mid]; - if (!isSpeakerBracket(bracket)) { - setExactScore((bracket as JudgeBracket).score); - setPhase("done"); - } else { - setPhase("select"); - } - } else { - // Between mid-1 and mid. - setBetweenBracketIndices([mid - 1, mid]); - setPhase("between"); - } - } else { - setHigh(newHigh); - const newMid = Math.floor((low + newHigh) / 2); - setMid(newMid); - } - }; - - const handleWorse = () => { - const newLow = mid + 1; - if (newLow > high) { - // No more lower brackets. - if (mid === currentScale.length - 1) { - // At the lowest bracket. - setSelectedBracketIndex(mid); - const bracket = currentScale[mid]; - if (!isSpeakerBracket(bracket)) { - setExactScore((bracket as JudgeBracket).score); - setPhase("done"); - } else { - setPhase("select"); - } - } else { - // Between mid and mid+1. - setBetweenBracketIndices([mid, mid + 1]); - setPhase("between"); - } - } else { - setLow(newLow); - const newMid = Math.floor((newLow + high) / 2); - setMid(newMid); - } - }; - - const handleMatched = () => { - setSelectedBracketIndex(mid); - const bracket = currentScale[mid]; - if (!isSpeakerBracket(bracket)) { - setExactScore((bracket as JudgeBracket).score); - setPhase("done"); - } else { - setPhase("select"); - } - }; - - const handleSelectScore = (position: string) => { - if (selectedBracketIndex !== null) { - const bracket = currentScale[selectedBracketIndex]; - if (isSpeakerBracket(bracket)) { - let score: number; - - if (position === "lower") { - score = bracket.minScore; - } else if (position === "higher") { - score = bracket.maxScore; - } else { - score = Math.floor((bracket.minScore + bracket.maxScore) / 2); - } - - setExactScore(score); - setPhase("done"); - } - } - }; - - const handleSelectExactScore = (score: number) => { - setExactScore(score); - setPhase("done"); - }; - - const selectBracket = (index: number) => { - setSelectedBracketIndex(index); - const bracket = currentScale[index]; - if (!isSpeakerBracket(bracket)) { - setExactScore((bracket as JudgeBracket).score); - setPhase("done"); - } else { - setPhase("select"); - } - }; - - const reset = () => { - setLow(0); - setHigh(currentScale.length - 1); - setMid(Math.floor((0 + currentScale.length - 1) / 2)); - setPhase("search"); - setSelectedBracketIndex(null); - setExactScore(null); - setBetweenBracketIndices(null); - setShowScale(false); - }; + const { + selectedScale, + handleScaleChange, + mid, + phase, + selectedBracketIndex, + exactScore, + betweenBracketIndices, + showScale, + currentScale, + handleBetter, + handleWorse, + handleMatched, + handleSelectScore, + handleSelectExactScore, + selectBracket, + reset, + toggleShowScale, + } = useBinarySearch(); return (
@@ -228,13 +104,11 @@ function App() { {phase === "select" && selectedBracketIndex !== null && (

Selected Bracket:

- + {isSpeakerBracket(currentScale[selectedBracketIndex]) && ( @@ -262,7 +136,7 @@ function App() {
-
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 4fbfbcc..7db5afa 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -2,7 +2,7 @@ import type React from "react"; const Footer: React.FC = () => { return ( -