jsketcher/modules/ui/effects.js
Val Erastov (xibyte) 54cf903ae8 documentation system
2020-05-06 23:46:57 -07:00

43 lines
No EOL
998 B
JavaScript

import React, {useCallback, useContext, useEffect, useState} from 'react';
import {StreamsContext} from "./streamsContext";
export function useStream(getStream) {
const basicStreams = useContext(StreamsContext);
const [state, setState] = useState();
const stream = typeof getStream === 'function' ? getStream(basicStreams) : getStream;
if (!stream) {
console.log(getStream);
throw "no stream ^";
}
useEffect(() => stream.attach(data => setState({data})), EMPTY_ARR);
return state ? state.data : (stream.value ? stream.value : null);
}
export function useStreamWithUpdater(getStream) {
const data = useStream(getStream);
const basicStreams = useContext(StreamsContext);
const stream = typeof getStream === 'function' ? getStream(basicStreams) : getStream;
const updater = useCallback((val) => {
if (typeof val === 'function') {
val = val(data)
}
stream.next(val)
}, [data, stream]);
return [data, updater];
}
const EMPTY_ARR = [];