import React, { useEffect, useState } from "react"; import { AllEvents } from "../schema"; import { Engine, EventEpoch } from "../engine/engine"; import EventList from "./EventList/index"; import VariablesGraph from "./Graph/VariablesGraph"; import { TypedEmitter } from "tiny-typed-emitter"; import { EventListMessage, GlobalMessage, GraphMessage, LoadEpochView, } from "../utils/events"; import { assertExhaustive } from "../utils/exhaustive"; import { SubsSnapshot } from "../engine/subs"; interface UiProps { events: AllEvents; } export default function Ui({ events }: UiProps): JSX.Element { const engine = React.useRef(new Engine(events)); const graphEe = React.useRef(new TypedEmitter()); const eventListEe = React.useRef(new TypedEmitter()); const globalEe = React.useRef(new TypedEmitter()); const [subsTop, setSubsTop] = useState(undefined); const [subsBot, setSubsBot] = useState(undefined); useEffect(() => { globalEe.current.on("loadEpoch", (epoch, view) => { switch (view) { case LoadEpochView.Top: { setSubsTop(engine.current.stepToSnapshot(epoch)); break; } case LoadEpochView.Bot: { setSubsBot(engine.current.stepToSnapshot(epoch)); break; } default: assertExhaustive(view); } }); }, []); const selectedEpochs = [subsTop?.epoch, subsBot?.epoch] .filter((x): x is EventEpoch => x !== undefined) .sort(); return (
{ graphEe.current.emit("keydown", e.key); }} >
{selectedEpochs.length === 0 && ( Select an event to view. )} {subsTop !== undefined && ( )} {/* */} {subsBot !== undefined && ( )}
); } interface VariablesGraphViewProps { subs: SubsSnapshot; graphEe: TypedEmitter; eventListEe: TypedEmitter; } function VariablesGraphView({ subs, graphEe, eventListEe, }: VariablesGraphViewProps): JSX.Element { return ( ); }