UNPKG

@yandex/ui

Version:

Yandex UI components

45 lines (44 loc) 1.58 kB
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]; }; }