import { asset, SEARCH_KEYS, TankDefinition, TIER_ROMAN_NUMERALS, } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n"; import { ArrowRightIcon, EyeOpenIcon, MagnifyingGlassIcon, PaperPlaneIcon, } from "@radix-ui/react-icons"; import { AlertDialog, Box, Button, Card, Flex, IconButton, Spinner, Text, TextField, } from "@radix-ui/themes"; import fuzzysort from "fuzzysort"; import { debounce } from "lodash-es"; import { useCallback, useEffect, useRef, useState } from "react"; import { awaitableTankDefinitions } from "../core/awaitables/tankDefinitions"; import { awaitableTankNames } from "../core/awaitables/tankNames"; import { useLocale } from "../hooks/useLocale"; import { Guess, GuessState } from "../stores/guess"; import { classIcons } from "./ClassIcon"; import { SearchResults } from "./SearchResults"; const { go } = fuzzysort; const [tankNames, tankDefinitions] = await Promise.all([ awaitableTankNames, awaitableTankDefinitions, ]); const ids = Object.keys(tankDefinitions.tanks); export function Guesser() { const tank = Guess.use((state) => state.tank); const guessState = Guess.use((state) => state.guessState); const correctGuesses = Guess.use((state) => state.correctGuesses); const totalGuesses = Guess.use((state) => state.totalGuesses); const helpingReveal = Guess.use((state) => state.helpingReveal); const streak = Guess.use((state) => state.streak); const { strings, unwrap } = useLocale(); const input = useRef(null); const [searching, setSearching] = useState(false); const [results, setResults] = useState(null); const [selected, setSelected] = useState(null); const requestSearch = useCallback(() => { setSelected(null); setSearching(true); search(); }, []); const search = useCallback( debounce(() => { if (!input.current) return; setSearching(false); const trimmed = input.current.value.trim(); if (trimmed.length === 0) { setResults(null); return; } const searchResults = go(trimmed, tankNames, { keys: SEARCH_KEYS, limit: 6, }); setResults( searchResults.map((result) => tankDefinitions.tanks[result.obj.id]) ); }, 500), [] ); useEffect(() => { if (guessState !== GuessState.NotGuessed) setSelected(null); }, [guessState]); return ( {results !== null && ( {results.length === 0 && ( {strings.website.tools.guess.search.no_results} )} {results.map((result) => { const Icon = classIcons[result.class]; return ( { if (!input.current) return; input.current.value = unwrap(result.name); setSelected(result); setResults(null); }} text={unwrap(result.name)} prefix={ } discriminator={ {TIER_ROMAN_NUMERALS[result.tier]} } /> ); })} )} {literals(strings.website.tools.guess.stats, { correct: correctGuesses, total: totalGuesses, streak: streak, })} {searching ? : } {strings.website.tools.guess.help.title} {strings.website.tools.guess.help.description} ); }