synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
104 lines (95 loc) • 4.23 kB
JavaScript
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