diff --git a/frontend/src/components/ActiveClue.tsx b/frontend/src/components/ActiveClue.tsx new file mode 100644 index 0000000..887c5c7 --- /dev/null +++ b/frontend/src/components/ActiveClue.tsx @@ -0,0 +1,77 @@ +import { useState, useEffect, useRef } from 'react' +import { useTranslation } from 'react-i18next' +import { useStore } from '../store' +import Tooltip from './ui/Tooltip' + +export default function ActiveClue() { + const { t } = useTranslation() + const puzzle = useStore((s) => s.puzzle) + const activeClue = useStore((s) => s.activeClue) + const direction = useStore((s) => s.direction) + const toggleDirection = useStore((s) => s.toggleDirection) + const [display, setDisplay] = useState<{ dir: string; text: string; num: number | null }>({ + dir: '', text: '', num: null, + }) + const [animating, setAnimating] = useState(false) + const prevKey = useRef('') + + useEffect(() => { + if (!puzzle || !activeClue) { + if (display.num !== null) { + queueMicrotask(() => setAnimating(true)) + setTimeout(() => { + setDisplay({ dir: '', text: '', num: null }) + setAnimating(false) + }, 150) + } + return + } + + const clues = direction === 'across' ? puzzle.clues_across : puzzle.clues_down + const clue = clues.find((c) => c.number === activeClue) + if (!clue) return + + const key = `${activeClue}-${direction}` + if (key === prevKey.current) return + prevKey.current = key + + queueMicrotask(() => setAnimating(true)) + setTimeout(() => { + setDisplay({ dir: `${activeClue} ${direction}`, text: clue.text, num: activeClue }) + setAnimating(false) + }, 150) + }, [puzzle, activeClue, direction]) + + if (!puzzle) return null + + return ( + + + + ) +}