mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-03-23 16:17:46 +00:00
53 lines
1.7 KiB
JavaScript
53 lines
1.7 KiB
JavaScript
// Copyright (C) 2017-2020 Smart code 203358507
|
|
|
|
const React = require('react');
|
|
const throttle = require('lodash.throttle');
|
|
const { useRouteFocused } = require('stremio-router');
|
|
const { useServices } = require('stremio/services');
|
|
const useDeepEqualState = require('stremio/common/useDeepEqualState');
|
|
|
|
const useModelState = ({ init, action, ...args }) => {
|
|
const { core } = useServices();
|
|
const routeFocused = useRouteFocused();
|
|
const mountedRef = React.useRef(false);
|
|
const [model, timeout, map] = React.useMemo(() => {
|
|
return [args.model, args.timeout, args.map];
|
|
}, []);
|
|
const [state, setState] = useDeepEqualState(init);
|
|
React.useLayoutEffect(() => {
|
|
if (action) {
|
|
core.transport.dispatch(action, model);
|
|
}
|
|
}, [action]);
|
|
React.useLayoutEffect(() => {
|
|
return () => {
|
|
core.transport.dispatch({ action: 'Unload' }, model);
|
|
};
|
|
}, []);
|
|
React.useLayoutEffect(() => {
|
|
const onNewStateThrottled = throttle(() => {
|
|
const state = core.transport.getState(model);
|
|
if (typeof map === 'function') {
|
|
setState(map(state));
|
|
} else {
|
|
setState(state);
|
|
}
|
|
}, timeout);
|
|
if (routeFocused) {
|
|
core.transport.on('NewState', onNewStateThrottled);
|
|
if (mountedRef.current) {
|
|
onNewStateThrottled.call();
|
|
}
|
|
}
|
|
return () => {
|
|
onNewStateThrottled.cancel();
|
|
core.transport.off('NewState', onNewStateThrottled);
|
|
};
|
|
}, [routeFocused]);
|
|
React.useLayoutEffect(() => {
|
|
mountedRef.current = true;
|
|
}, []);
|
|
return state;
|
|
};
|
|
|
|
module.exports = useModelState;
|