import React, { useEffect, useRef, useState } from "react" import { Card, CardContent, Grid, IconButton, TextField, Typography } from "@mui/material" import { Instruction } from "../instructions" import KeyboardDoubleArrowRightIcon from "@mui/icons-material/KeyboardDoubleArrowRight" import PlayArrowIcon from "@mui/icons-material/PlayArrow" import StopIcon from "@mui/icons-material/Stop" import { DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_TILE_COLOR, SELECTED_TILE_COLOR, SIDEBAR_WIDTH, STEP_DELAY, TILE_SIZE } from "../const" import { iterate, newProgram, ProgramState, resetProgram } from "../interpreter" function Board() { let key = 0 const [program, setProgram] = useState(newProgram(DEFAULT_WIDTH, DEFAULT_HEIGHT)) const [playing, setPlaying] = useState(false) const intervalRef = useRef() useEffect(() => { if (playing) { intervalRef.current = setInterval(() => { step() }, STEP_DELAY) } else { clearInterval(intervalRef.current) } }, [playing]) useEffect(() => { if (program.done) { const x = structuredClone(program) resetProgram(x) setPlaying(false) x.done = false setProgram(x) } }, [program]) const step = () => { //const x = structuredClone(program) //iterate(x) setProgram((prog) => { const x = structuredClone(prog) iterate(x) return x }) } const handleDrop = ( col: number, row: number, event: React.DragEvent | undefined ): void => { if (event === undefined) { return } const data = JSON.parse(event.dataTransfer.getData("instruction")) as Instruction const x = structuredClone(program) x.board[row][col] = data setProgram(x) const target = event.target as HTMLInputElement target.value = data.emoji } const handleOnDragOver = (event: React.DragEvent | undefined) => { event?.preventDefault() return false } const handleTextFieldChange = ( col: number, row: number, event: React.ChangeEvent ) => { const x = structuredClone(program) x.board[row][col].emoji = event.target.value x.board[row][col].bytecode = event.target.value setProgram(x) } return (
{/* BUTTON PANEL */}
setPlaying(!playing)}> {playing ? : } step()}> output: {program.output} stack: {JSON.stringify(program.stack)}
{/* BOARD */} {program.board.map((row, rowNo): JSX.Element => { return ( {row.map((tile, colNo): JSX.Element => { return (
handleTextFieldChange(colNo, rowNo, event)} onDragOver={handleOnDragOver} onDrop={(event) => { handleDrop(colNo, rowNo, event) }} />
) })}
) })}
) } export default Board