UNPKG

synapse-storage

Version:

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

78 lines (71 loc) 2.17 kB
import { useCallback, useEffect, useState } from "react"; import { StorageStatus } from "../../core/index.js"; /** * Хук для управления lifecycle внешнего хранилища. * * В отличие от useCreateStorage, не создаёт и не уничтожает хранилище — * только инициализирует и отслеживает статус. * * Предназначен для хранилищ, созданных вне компонентов (на уровне модуля): * ```ts * // stores.ts * export const todoStorage = new IndexedDBStorage({ name: 'todos', ... }) * * // Component.tsx * const { isReady } = useStorage(todoStorage) * ``` */ function useStorage(storage, options = {}) { const { autoInitialize = true } = options; const [status, setStatus] = useState({ status: StorageStatus.IDLE }); const initialize = useCallback(async ()=>{ try { await storage.initialize(); } catch { // Ошибка будет отражена через onStatusChange } }, [ storage ]); // Подписка на изменения статуса useEffect(()=>{ return storage.onStatusChange(setStatus); }, [ storage ]); // Автоинициализация useEffect(()=>{ if (autoInitialize && status.status === StorageStatus.IDLE) { initialize(); } }, [ autoInitialize, storage, status.status, initialize ]); const isReady = status.status === StorageStatus.READY; const isLoading = status.status === StorageStatus.LOADING; const hasError = status.status === StorageStatus.ERROR; if (isReady) { return { storage, status, initialize, isReady: true, isLoading: false, hasError: false }; } return { storage, status, initialize, isReady: false, isLoading, hasError }; } export { useStorage }; //# sourceMappingURL=useStorage.js.map