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