/**
* @file JavaScript Code Node - Code editor for particle physics functions
*/
import * as React from "react";
import type {
NodeDefinition,
NodeRendererProps,
InspectorRenderProps,
ExternalDataReference,
} from "../../../../../types/NodeDefinition";
import classes from "./JavaScriptCodeNode.module.css";
export type JavaScriptCodeData = {
id: string;
code: string;
label: string;
};
export const JavaScriptCodeRenderer = ({
node,
isSelected,
isDragging,
externalData,
onUpdateNode,
}: NodeRendererProps) => {
const codeData = externalData as JavaScriptCodeData | undefined;
const [localCode, setLocalCode] = React.useState(codeData?.code || "");
React.useEffect(() => {
if (codeData?.code !== undefined) {
setLocalCode(codeData.code);
}
}, [codeData?.code]);
const handleCodeChange = (newCode: string) => {
setLocalCode(newCode);
};
const handleApply = () => {
onUpdateNode({
data: {
...node.data,
code: localCode,
timestamp: Date.now(),
},
});
};
const lineCount = localCode.split("\n").length;
return (
📝 {codeData?.label || "JavaScript"}
{lineCount} lines
);
};
export const JavaScriptCodeInspectorRenderer = ({ externalData, onUpdateExternalData }: InspectorRenderProps) => {
const codeData = externalData as JavaScriptCodeData | undefined;
const [editedData, setEditedData] = React.useState({
id: codeData?.id || "",
code: codeData?.code || "",
label: codeData?.label || "JavaScript",
});
const handleSave = async () => {
if (onUpdateExternalData) {
await onUpdateExternalData(editedData);
}
};
return (
);
};
export const JavaScriptCodeNodeDefinition: NodeDefinition = {
type: "javascript-code",
displayName: "JavaScript Code",
description: "Code editor for custom particle physics functions",
category: "Code",
defaultData: {
title: "JavaScript Code",
},
defaultSize: { width: 320, height: 240 },
ports: [
{
id: "code-output",
type: "output",
label: "Code",
position: "right",
},
],
renderNode: JavaScriptCodeRenderer,
renderInspector: JavaScriptCodeInspectorRenderer,
loadExternalData: async (ref: ExternalDataReference) => {
await new Promise((resolve) => setTimeout(resolve, 200));
return {
id: ref.id,
code: `// Custom particle physics
particle.x += particle.vx;
particle.y += particle.vy;
particle.vy += gravity * 0.1;
particle.life -= 1 / (lifetime * 60);`,
label: "Physics Code",
};
},
updateExternalData: async (_ref: ExternalDataReference, data: unknown) => {
await new Promise((resolve) => setTimeout(resolve, 200));
console.log("Updated JavaScript code data:", data);
},
};