squiggle/packages/components/src/lib/hooks/useSquiggle.ts

57 lines
1.4 KiB
TypeScript
Raw Normal View History

2022-09-01 13:26:11 +00:00
import { environment, SqProject, SqValue } from "@quri/squiggle-lang";
import { useEffect, useMemo } from "react";
2022-09-01 13:26:11 +00:00
export type jsImports =
| number
| string
| jsImports[]
| {
[k: string]: jsImports;
};
2022-08-27 17:46:43 +00:00
type SquiggleArgs = {
code: string;
2022-07-27 09:03:23 +00:00
executionId?: number;
2022-09-01 13:26:11 +00:00
jsImports?: jsImports;
environment?: environment;
2022-08-28 17:33:16 +00:00
onChange?: (expr: SqValue | undefined) => void;
};
2022-08-27 17:46:43 +00:00
export const useSquiggle = (args: SquiggleArgs) => {
const result = useMemo(
() => {
2022-09-01 13:26:11 +00:00
const project = SqProject.create();
project.setSource("main", args.code);
if (args.environment) {
project.setEnvironment(args.environment);
}
if (args.jsImports) {
console.log(JSON.stringify(args.jsImports));
project.setSource(
"zzz", // due to bug in topology implementation, can be renamed later
"imports = " + JSON.stringify(args.jsImports)
);
}
project.run("main");
const result = project.getResult("main");
const bindings = project.getBindings("main");
return { result, bindings };
2022-08-27 17:46:43 +00:00
},
2022-07-27 09:03:23 +00:00
// eslint-disable-next-line react-hooks/exhaustive-deps
[
args.code,
2022-09-01 09:32:11 +00:00
args.environment,
2022-08-27 17:46:43 +00:00
// args.jsImports,
2022-07-27 09:03:23 +00:00
args.executionId,
]
);
const { onChange } = args;
useEffect(() => {
onChange?.(result.result.tag === "Ok" ? result.result.value : undefined);
}, [result, onChange]);
return result;
};