mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-26 21:18:49 +00:00
add hooks for scheduler and evaluator
This commit is contained in:
parent
ee84b4e013
commit
bc345b569b
30
packages/react/src/hooks/useEvaluator.jsx
Normal file
30
packages/react/src/hooks/useEvaluator.jsx
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import { useRef, useState, useCallback, useEffect } from 'react';
|
||||||
|
|
||||||
|
function useEvaluator(code, evalOnMount = true) {
|
||||||
|
const [error, setError] = useState();
|
||||||
|
const [activeCode, setActiveCode] = useState(code);
|
||||||
|
const [pattern, setPattern] = useState();
|
||||||
|
const isDirty = code !== activeCode;
|
||||||
|
const evaluate = useCallback(() => {
|
||||||
|
try {
|
||||||
|
// TODO: use @strudel.cycles/eval or let user inject custom eval function
|
||||||
|
const _pattern = eval(code);
|
||||||
|
setActiveCode(activeCode);
|
||||||
|
setPattern(_pattern);
|
||||||
|
setError();
|
||||||
|
} catch (err) {
|
||||||
|
setError(err);
|
||||||
|
console.warn('eval error', err);
|
||||||
|
}
|
||||||
|
}, [code, scheduler]);
|
||||||
|
const inited = useRef();
|
||||||
|
useEffect(() => {
|
||||||
|
if (!inited.current && evalOnMount) {
|
||||||
|
evaluate();
|
||||||
|
}
|
||||||
|
inited.current = true;
|
||||||
|
}, [evaluate, evalOnMount]);
|
||||||
|
return { error, evaluate, activeCode, pattern, isDirty };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useEvaluator;
|
||||||
18
packages/react/src/hooks/useScheduler.jsx
Normal file
18
packages/react/src/hooks/useScheduler.jsx
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { Scheduler } from '@strudel.cycles/core';
|
||||||
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
|
|
||||||
|
function useScheduler(pattern, defaultOutput, interval = 0.1) {
|
||||||
|
const [error, setError] = useState();
|
||||||
|
// TODO: how / when to remove schedulerError?
|
||||||
|
const scheduler = useMemo(
|
||||||
|
() => new Scheduler({ interval, onTrigger: defaultOutput, onError: setError }),
|
||||||
|
[defaultOutput, interval],
|
||||||
|
);
|
||||||
|
useEffect(() => {
|
||||||
|
// console.log('pattern', pattern);
|
||||||
|
pattern && scheduler?.setPattern(pattern);
|
||||||
|
}, [pattern, scheduler]);
|
||||||
|
return { error, scheduler };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useScheduler;
|
||||||
Loading…
x
Reference in New Issue
Block a user