greatly simplify state + cleanup code

This commit is contained in:
Joeri Exelmans 2025-05-14 08:09:35 +02:00
parent 2d0deca127
commit 5964510036
11 changed files with 268 additions and 321 deletions

View file

@ -1,19 +1,20 @@
import { useContext, useEffect, useRef } from "react";
import { growEnv } from "dope2";
import { Editor, type EditorState } from "./Editor";
import { EnvContext } from "./EnvContext";
import { DeepError, type ResolvedType, type State2Props } from "./types";
import { growEnv } from "dope2";
import { DeepError, evalEditorBlock, type ResolvedType } from "./eval";
import { type State2Props } from "./Editor";
import { autoInputWidth } from "./util/dom_trickery";
import "./LetInBlock.css";
import { useEffectBetter } from "./util/use_effect_better";
export interface LetInBlockState {
kind: "let";
name: string;
value: EditorState;
inner: EditorState;
resolved: ResolvedType;
}
interface LetInBlockProps extends State2Props<LetInBlockState> {
@ -29,7 +30,8 @@ export function makeInnerEnv(env, name: string, value: ResolvedType) {
export function LetInBlock({state, setState}: LetInBlockProps) {
const {name, value, inner} = state;
const env = useContext(EnvContext);
const innerEnv = makeInnerEnv(env, name, value.resolved);
const valueResolved = evalEditorBlock(value, env);
const innerEnv = makeInnerEnv(env, name, valueResolved);
const nameRef = useRef<HTMLInputElement>(null);
const setInner = callback => setState(state => ({...state, inner: callback(state.inner)}));
@ -43,11 +45,6 @@ export function LetInBlock({state, setState}: LetInBlockProps) {
nameRef.current?.focus();
}, []);
useEffectBetter(() => {
// bubble up
setState(state => ({...state, resolved: inner.resolved}));
}, [inner.resolved])
useEffect(() => autoInputWidth(nameRef, name, 60), [nameRef, name]);