strudel/packages/react/src/hooks/useStrudel.mjs
2022-08-26 23:58:39 +02:00

49 lines
1.6 KiB
JavaScript

// import { Scheduler } from '@strudel.cycles/core';
import { useRef, useCallback, useEffect, useMemo, useState } from 'react';
import { evaluate as _evaluate } from '@strudel.cycles/eval';
import { Cyclist } from '@strudel.cycles/core/cyclist.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;
// TODO: how / when to remove schedulerError?
const scheduler = useMemo(
// () => new Scheduler({ interval, onTrigger: defaultOutput, onError: setSchedulerError, getTime }),
() => new Cyclist({ interval, onTrigger: defaultOutput, onError: setSchedulerError, getTime }),
[defaultOutput, interval],
);
const evaluate = useCallback(async () => {
if (!code) {
console.log('no code..');
return;
}
try {
// TODO: let user inject custom eval function?
const { pattern: _pattern } = await _evaluate(code);
setActiveCode(code);
scheduler?.setPattern(_pattern);
setPattern(_pattern);
setEvalError();
} catch (err) {
setEvalError(err);
console.warn('eval error', err);
}
}, [code, scheduler]);
const inited = useRef();
useEffect(() => {
if (!inited.current && evalOnMount) {
inited.current = true;
evaluate();
}
}, [evaluate, evalOnMount]);
return { schedulerError, scheduler, evalError, evaluate, activeCode, isDirty, pattern };
}
export default useStrudel;