@yandex/ui
Version:
Yandex UI components
45 lines (44 loc) • 1.58 kB
JavaScript
import { __read } from "tslib";
import { useState, useEffect } from 'react';
import { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect';
/**
* Фабрика, для создания реакт-хука с глобальным состоянием.
*
* Используется, когда необходимо использовать общее состояние в нескольких компонентах.
*
* @example
* const useSharedState = createGlobalState()
*
* function ComponentA() {
* const [value, setValue] = useSharedState()
* return <div>{value}</div>
* }
*
* function ComponentB() {
* const [value, setValue] = useSharedState()
* return <div>{value}</div>
* }
*/
export function createGlobalState(initialState) {
var store = {
state: initialState,
setState: function (state) {
store.state = state;
store.setters.forEach(function (setter) { return setter(store.state); });
},
setters: [],
};
return function () {
var _a = __read(useState(store.state), 2), globalState = _a[0], stateSetter = _a[1];
// prettier-ignore
useEffect(function () { return function () {
store.setters = store.setters.filter(function (setter) { return setter !== stateSetter; });
}; }, []);
useIsomorphicLayoutEffect(function () {
if (store.setters.indexOf(stateSetter) === -1) {
store.setters.push(stateSetter);
}
});
return [globalState, store.setState];
};
}