blob: 06f3307c36f63e5e105b0def92b688203f784fb7 [file] [log] [blame]
import { NodeType, useNodeMessages } from "@/lib/state";
import { Icon } from "./icon";
import { useEffect, useState } from "react";
export type Props = {
id: string;
selected?: boolean;
children: any;
type: NodeType;
state: string | null;
};
export function NodeRect(p: Props) {
const { id, selected, children, state } = p;
const messages = useNodeMessages(id);
const hasFatal = messages.some((m) => m.type === "FATAL");
const hasWarning = messages.some((m) => m.type === "WARNING");
const [classes, setClasses] = useState<string[]>([]);
const [stateClasses, setStateClasses] = useState<string[]>([]);
useEffect(() => {
const classes = ["px-4", "py-2", "rounded-md", "bg-white"];
if (hasFatal) {
classes.push("border-red-500");
} else if (hasWarning) {
classes.push("border-yellow-500");
} else {
classes.push("border-black");
}
if (selected) {
classes.push("border-2");
} else {
classes.push("border");
}
setClasses(classes);
let stateClasses: string[] = [];
if (state === "processing") {
stateClasses.push("bg-yellow-500");
stateClasses.push("animate-pulse");
} else if (state === "success") {
stateClasses.push("bg-green-500");
} else if (state === "failure") {
stateClasses.push("bg-red-500");
} else {
stateClasses.push("bg-black");
}
setStateClasses(stateClasses);
}, [selected, hasFatal, hasWarning, state, setClasses, setStateClasses]);
return (
<div className={classes.join(" ")}>
<div style={{ position: "absolute", top: "5px", left: "5px" }}>
{Icon(p.type)}
</div>
<div style={{ position: "absolute", top: "5px", right: "5px", borderRadius: "50%", width: "5px", height: "5px" }} className={stateClasses.join(" ")}>
</div>
{children}
</div>
)
}