From bc345b569b69ed810c06a1a31bdf94f91f875cc6 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Wed, 17 Aug 2022 23:57:49 +0200 Subject: [PATCH] add hooks for scheduler and evaluator --- packages/react/src/hooks/useEvaluator.jsx | 30 +++++++++++++++++++++++ packages/react/src/hooks/useScheduler.jsx | 18 ++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 packages/react/src/hooks/useEvaluator.jsx create mode 100644 packages/react/src/hooks/useScheduler.jsx diff --git a/packages/react/src/hooks/useEvaluator.jsx b/packages/react/src/hooks/useEvaluator.jsx new file mode 100644 index 00000000..e9929555 --- /dev/null +++ b/packages/react/src/hooks/useEvaluator.jsx @@ -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; diff --git a/packages/react/src/hooks/useScheduler.jsx b/packages/react/src/hooks/useScheduler.jsx new file mode 100644 index 00000000..52c61ef4 --- /dev/null +++ b/packages/react/src/hooks/useScheduler.jsx @@ -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;