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