+ breaking change: evalScope is now imported from core + breaking change: deprecated extend is now removed + add repl.mjs
44 lines
1.4 KiB
JavaScript
44 lines
1.4 KiB
JavaScript
// import { Scheduler } from '@strudel.cycles/core';
|
|
import { useRef, useCallback, useEffect, useMemo, useState } from 'react';
|
|
import shapeshifter from '@strudel.cycles/eval/shapeshifter.mjs';
|
|
import { repl } from '@strudel.cycles/core/repl.mjs';
|
|
|
|
function useStrudel({ defaultOutput, interval, getTime, code, evalOnMount = false }) {
|
|
// scheduler
|
|
const [schedulerError, setSchedulerError] = useState();
|
|
const [evalError, setEvalError] = useState();
|
|
const [activeCode, setActiveCode] = useState(code);
|
|
const [pattern, setPattern] = useState();
|
|
const isDirty = code !== activeCode;
|
|
const { scheduler, evaluate: _evaluate } = useMemo(
|
|
() =>
|
|
repl({
|
|
interval,
|
|
defaultOutput,
|
|
onSchedulerError: setSchedulerError,
|
|
onEvalError: setEvalError,
|
|
getTime,
|
|
transpiler: shapeshifter,
|
|
onEval: ({ pattern: _pattern, code }) => {
|
|
setActiveCode(code);
|
|
setPattern(_pattern);
|
|
setEvalError();
|
|
},
|
|
onEvalError: setEvalError,
|
|
}),
|
|
[defaultOutput, interval, getTime],
|
|
);
|
|
const evaluate = useCallback(() => _evaluate(code), [_evaluate, code]);
|
|
|
|
const inited = useRef();
|
|
useEffect(() => {
|
|
if (!inited.current && evalOnMount && code) {
|
|
inited.current = true;
|
|
evaluate();
|
|
}
|
|
}, [evaluate, evalOnMount, code]);
|
|
|
|
return { schedulerError, scheduler, evalError, evaluate, activeCode, isDirty, pattern };
|
|
}
|
|
|
|
export default useStrudel;
|