add hooks for scheduler and evaluator

This commit is contained in:
Felix Roos 2022-08-17 23:57:49 +02:00
parent ee84b4e013
commit bc345b569b
2 changed files with 48 additions and 0 deletions

View 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;

View 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;