import {Level, Palette, RawLevel} from "../types"; import _backgrounds from "../data/backgrounds.json"; import _palette from "../data/palette.json"; // import _allLevels from "../data/levels.json"; import { getLevelBackground, hashCode } from "../getLevelBackground"; import { createRoot } from "react-dom/client"; import { useCallback, useEffect, useState } from "react"; import { moveLevel, resizeLevel, setBrick } from "./levels_editor_util"; const backgrounds = _backgrounds as string[]; const palette = _palette as Palette; // let allLevels = _allLevels ; let allLevels=null function App() { const [selected, setSelected] = useState("W"); const [applying, setApplying] = useState(""); const [levels, setLevels] = useState([]); useEffect(()=>{ fetch('http://localhost:4400/src/data/levels.json') .then(r=>r.json()) .then(list=>{ setLevels(list as RawLevel[]) allLevels=list }) },[]) const updateLevel = (index: number, change: Partial) => { setLevels((list) => list.map((l, li) => (li === index ? { ...l, ...change } : l)), ); } const deleteLevel = (index: number) => { if (confirm("Delete level")) { setLevels(levels.filter((l, i) => i!==index)); } } useEffect(() => { if(!allLevels||JSON.stringify(allLevels) === JSON.stringify(levels)) return const timoutId = setTimeout(() => { return fetch("http://localhost:4400/src/data/levels.json", { method: "POST", headers: { "Content-Type": "text/plain", }, body: JSON.stringify(levels, null, 2), }); }, 500); return () => clearTimeout(timoutId); }, [levels]); return (
{ setApplying(""); }} >
{levels.map((level, li) => { const { name, credit, bricks, size, svg, color } = level; const brickButtons = []; for (let x = 0; x < size; x++) { for (let y = 0; y < size; y++) { const index = y * size + x; brickButtons.push( , ); } } const background = color ? { backgroundImage: "none", backgroundColor: color } : { backgroundImage: `url("data:image/svg+xml;UTF8,${encodeURIComponent(getLevelBackground(level) as string)}")`, backgroundColor: "transparent", }; return (
updateLevel(li, { name: e.target.value })} /> updateLevel(li, { credit: e.target.value })} />
e.target.value && updateLevel(li, { color: e.target.value }) } /> !isNaN(parseFloat(e.target.value)) && updateLevel(li, { color: "", svg: parseFloat(e.target.value), }) } />
{brickButtons}
); })}
{Object.entries(palette).map(([code, color]) => ( ))}
); } const root = createRoot(document.getElementById("app") as HTMLDivElement); root.render();