UNPKG

synapse-storage

Version:

Набор инструментов для управления состоянием и апи-запросами

104 lines (95 loc) 4.23 kB
import { Fragment, jsx, jsxs } from "react/jsx-runtime"; import { useEffect, useState } from "react"; import { createSynapseAwaiter } from "../../utils/index.js"; /** * React-обертка для фреймворк-независимой утилиты ожидания Synapse. * Добавляет React-специфичные методы поверх createSynapseAwaiter. Принимает * `SynapseModule`-handle (PromiseLike), Promise готового synapse или сам synapse. */ function awaitSynapse(synapseStorePromise, options) { const { loadingComponent = /*#__PURE__*/ jsx("div", { children: "Инициализация..." }), errorComponent = (error)=>/*#__PURE__*/ jsxs("div", { children: [ "Ошибка инициализации: ", error.message ] }) } = options || {}; const awaiter = createSynapseAwaiter(synapseStorePromise); /** * Хук для получения текущего состояния готовности */ function useSynapseReady() { const [status, setStatus] = useState(()=>awaiter.getStatus()); const [store, setStore] = useState(()=>awaiter.getStoreIfReady()); const [error, setError] = useState(()=>awaiter.getError()); useEffect(()=>{ // Проверяем текущее состояние при монтировании const currentStatus = awaiter.getStatus(); const currentStore = awaiter.getStoreIfReady(); const currentError = awaiter.getError(); setStatus(currentStatus); setStore(currentStore); setError(currentError); // Подписываемся на изменения const unsubscribeReady = awaiter.onReady((readyStore)=>{ setStatus('ready'); setStore(readyStore); setError(null); }); const unsubscribeError = awaiter.onError((err)=>{ setStatus('error'); setStore(undefined); setError(err); }); return ()=>{ unsubscribeReady(); unsubscribeError(); }; }, []); return { isReady: status === 'ready', isError: status === 'error', isPending: status === 'pending', store, error }; } /** * Обертка, которая ждет готовности Synapse */ function withSynapseReady(Component) { function WrappedComponent(props) { const { isReady, isError, error } = useSynapseReady(); // Показываем ошибку if (isError && error) return /*#__PURE__*/ jsx(Fragment, { children: errorComponent(error) }); // Показываем загрузку if (!isReady) return /*#__PURE__*/ jsx(Fragment, { children: loadingComponent }); // Рендерим компонент когда все готово return /*#__PURE__*/ jsx(Component, { ...props }); } // Устанавливаем отображаемое имя для отладки const componentName = Component.displayName || Component.name || 'Component'; WrappedComponent.displayName = `AwaitSynapse(${componentName})`; return WrappedComponent; } return { // React методы withSynapseReady, useSynapseReady, // Проксируем все методы из awaiter (обёртки сохраняют контекст при деструктуризации) waitForReady: ()=>awaiter.waitForReady(), isReady: ()=>awaiter.isReady(), getStoreIfReady: ()=>awaiter.getStoreIfReady(), onReady: (cb)=>awaiter.onReady(cb), onError: (cb)=>awaiter.onError(cb), getStatus: ()=>awaiter.getStatus(), getError: ()=>awaiter.getError(), destroy: ()=>awaiter.destroy() }; } export { awaitSynapse }; //# sourceMappingURL=awaitSynapse.js.map