import { Level, Palette, RawLevel } from "../types"; import _backgrounds from "../data/backgrounds.json"; import _palette from "../data/palette.json"; import { createRoot } from "react-dom/client"; import { useEffect, useState } from "react"; import { moveLevel, resizeLevel, setBrick } from "./levels_editor_util"; import { automaticBackgroundColor, levelCodeToRawLevel, } from "../pure_functions"; const palette = _palette as Palette; 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((lvls) => { const cleaned = lvls.map(l=>({name:l.name, size:l.size, bricks:(l.bricks+'_'.repeat(l.size*l.size)).slice(0,l.size*l.size), credit:l.credit||''})) const sorted = [ ...cleaned.filter(l=>l.name.match('icon:')).sort((a,b)=>a.name>b.name ? 1:-1), ...cleaned.filter(l=>!l.name.match('icon:')) ] setLevels(sorted as RawLevel[]) allLevels = sorted; }); }, []); 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( , ); } } return (
updateLevel(li, { name: e.target.value })} /> updateLevel(li, { credit: e.target.value })} />
{brickButtons}
); })}
{Object.entries(palette).map(([code, color]) => ( ))}
); } const root = createRoot(document.getElementById("app") as HTMLDivElement); root.render();