import { reverse } from 'dns'; import React, { Fragment, useEffect, useMemo, useState } from 'react'; import './App.css'; import {prompts, Categories} from './prompts'; const alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"; const lskey_prompts = "cs_bingo_prompts-day3"; const lskey_ticked = "cs_bingo_ticked-day3"; const shuffle = (array: T[]): T[] => { return array .map((item) => ({ key: Math.random(), value: item })) .sort((a, b) => b.key - a.key) .map((item) => item.value); } const App: React.FC<{}> = () => { const [resetCounter, setResetCounter] = useState(0); //const [lines, setLines] = useState<[Categories,string][]>([]); const [linesP, setLinesP] = useState([]); const saveLines = (theLines: T[]) => { localStorage.setItem(lskey_prompts, JSON.stringify(theLines)); }; const saveTicks = (theLines: boolean[]) => { localStorage.setItem(lskey_ticked, JSON.stringify(theLines)); }; const [highlighted, setHighlighted] = useState(null); const highlight = (index: number) => { setHighlighted(index); setTimeout(() => setHighlighted(null), 1500); document.getElementById(`letter-${alphabet[index]}`)?.scrollIntoView(); }; useEffect(() => { console.log("no lines"); if (linesP.length !== 0) return; const loadLines = localStorage.getItem(lskey_prompts); const loadTicks = localStorage.getItem(lskey_ticked); if (loadLines === null || loadTicks === null) { const newPromptsP = shuffle([...(new Array(prompts.length)).fill(0).map((_, i ) => i)]); console.log(newPromptsP); const newTicks = new Array(25).fill(false); setLinesP(newPromptsP); setTicked(newTicks); saveLines(newPromptsP); saveTicks(newTicks); } else { setLinesP(JSON.parse(loadLines)); setTicked(JSON.parse(loadTicks)); } }, [linesP]) const reverseLookup: {[x: number]: number} = useMemo(() => { const x= Object.fromEntries(linesP.map((val, ind) => [val, ind])); console.log("x", x); return x; }, [linesP]); const reverseAlphabetLookup: {[x: string]: number} = useMemo(() => { const x= Object.fromEntries(linesP.flatMap((_, ind) => { const e = alphabet[reverseLookup[ind]]; if (!e) return []; return [[e, ind]] } )); console.log("x", x); return x; }, [linesP]); const [ticked, setTicked] = useState(new Array(25).fill(false) ); const toggleField = (index: number) => { console.log("ticking", index); setTicked((old) => { const newTicks = old.map((e, i) => i === index ? !e : e); saveTicks(newTicks); return newTicks; }); }; const incCounter = () => { setResetCounter((old) => { if (old === 15) { const newPromptsP = shuffle([...(new Array(prompts.length)).fill(0).map((_, i ) => i)]); const newTicked = new Array(25).fill(false) ; setLinesP(newPromptsP); setTicked(newTicked); saveLines(newPromptsP); saveTicks(newTicked) } return old + 1; }); } return (

CS Bingo

{Array.from(alphabet).map((e, index) =>
{ // fuck IOS not sending onContextMenu events if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { toggleField(index); } else { highlight(index); } }} onContextMenu={(e) => {e.preventDefault(); toggleField(index);}}> {e}
)}

Id

Letter

Goal

{linesP.map((permutation, index)=>
{index}
{alphabet[reverseLookup[index]]}
{prompts[index][1]}
)}
); } export default App;