UNPKG

synapse-storage

Version:

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

137 lines (128 loc) 3.97 kB
import { useCallback, useEffect, useRef, useState } from "react"; import { handleCleanupError } from "../../_utils/error-handling.util.js"; import { StorageFactory, StorageStatus } from "../../core/index.js"; // ─── Реализация ───────────────────────────────────────────────────────────── function useCreateStorage(config, options = {}, eventEmitter, logger) { const destroyDefault = config.type === 'indexedDB' ? false : true; const { autoInitialize = true, destroyOnUnmount = destroyDefault } = options; const [status, setStatus] = useState({ status: StorageStatus.IDLE }); const [storage] = useState(()=>{ try { return StorageFactory.create(config, eventEmitter, logger); } catch (error) { setStatus({ status: StorageStatus.ERROR, error: error }); return null; } }); const destroyOnUnmountRef = useRef(destroyOnUnmount); destroyOnUnmountRef.current = destroyOnUnmount; const initialize = useCallback(async ()=>{ if (!storage) return; try { setStatus({ status: StorageStatus.LOADING }); await storage.initialize(); setStatus({ status: StorageStatus.READY }); } catch (error) { setStatus({ status: StorageStatus.ERROR, error: error }); } }, [ storage ]); const destroy = useCallback(async ()=>{ if (!storage) return; try { await storage.destroy(); setStatus({ status: StorageStatus.IDLE }); } catch (error) { setStatus({ status: StorageStatus.ERROR, error: error }); } }, [ storage ]); useEffect(()=>{ if (!storage) return; const unsubscribe = storage.onStatusChange((newStatus)=>{ setStatus(newStatus); }); return unsubscribe; }, [ storage ]); // Автоматическая инициализация useEffect(()=>{ let cancelled = false; if (autoInitialize && storage && status.status === StorageStatus.IDLE) { setStatus({ status: StorageStatus.LOADING }); storage.initialize().then(()=>{ if (!cancelled) setStatus({ status: StorageStatus.READY }); }).catch((error)=>{ if (!cancelled) setStatus({ status: StorageStatus.ERROR, error: error }); }); } return ()=>{ cancelled = true; }; }, [ autoInitialize, storage, status.status ]); useEffect(()=>{ return ()=>{ if (destroyOnUnmountRef.current && storage) { storage.destroy().catch((err)=>handleCleanupError('useCreateStorage: error during unmount destroy', err)); } }; }, [ storage ]); const isReady = status.status === StorageStatus.READY; const isLoading = status.status === StorageStatus.LOADING; const hasError = status.status === StorageStatus.ERROR; if (isReady && storage) { return { storage, status, initialize, destroy, isReady: true, isLoading: false, hasError: false }; } return { storage: null, status, initialize, destroy, isReady: false, isLoading, hasError }; } export { useCreateStorage }; //# sourceMappingURL=useCreateStorage.js.map