mirror of
https://github.com/eliasstepanik/strudel.git
synced 2026-01-12 14:18:36 +00:00
49 lines
1.6 KiB
JavaScript
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;
|