@kirz/react-native-toolkit
Version:
Toolkit to speed up React Native development
43 lines • 1.6 kB
JavaScript
import { useCallback, useContext, useEffect, useState } from 'react';
import { StorageContext } from '../contexts/StorageContext';
export function useStorage() {
const {
storage
} = useContext(StorageContext);
return storage;
}
const listeners = new Map();
export function useStoredState(key, initialState) {
const storage = useStorage();
const [value, setValue] = useState(storage.getItem(key) ?? initialState);
const setter = useCallback(newValue => {
var _listeners$get2;
if (typeof newValue === 'function') {
var _listeners$get;
// @ts-ignore
const resultValue = newValue(value);
storage.setItem(key, resultValue);
(_listeners$get = listeners.get(key)) === null || _listeners$get === void 0 ? void 0 : _listeners$get.forEach(listener => {
listener(resultValue);
});
return;
}
storage.setItem(key, newValue);
(_listeners$get2 = listeners.get(key)) === null || _listeners$get2 === void 0 ? void 0 : _listeners$get2.forEach(listener => {
listener(newValue);
});
}, [key, value, setValue, storage]);
useEffect(() => {
var _listeners$get3;
if (!listeners.has(key)) {
listeners.set(key, new Set());
}
(_listeners$get3 = listeners.get(key)) === null || _listeners$get3 === void 0 ? void 0 : _listeners$get3.add(setValue);
return () => {
var _listeners$get4;
(_listeners$get4 = listeners.get(key)) === null || _listeners$get4 === void 0 ? void 0 : _listeners$get4.delete(setValue);
};
}, []);
return [value, setter];
}
//# sourceMappingURL=useStorage.js.map