react-native-mmkv
Version:
⚡️ The fastest key/value storage for React Native.
41 lines (40 loc) • 1.7 kB
JavaScript
import { useCallback, useSyncExternalStore } from 'react';
import { getDefaultMMKVInstance } from '../createMMKV/getDefaultMMKVInstance';
export function createMMKVHook(getter) {
return (key, instance) => {
const mmkv = instance ?? getDefaultMMKVInstance();
const value = useSyncExternalStore(useCallback((onStoreChange) => {
const listener = mmkv.addOnValueChangedListener((changedKey) => {
if (changedKey === key) {
onStoreChange();
}
});
return () => listener.remove();
}, [key, mmkv]), useCallback(() => getter(mmkv, key), [key, mmkv]), useCallback(() => getter(mmkv, key), [key, mmkv]));
// update value by user set
const set = useCallback((v) => {
const newValue = typeof v === 'function' ? v(getter(mmkv, key)) : v;
switch (typeof newValue) {
case 'number':
case 'string':
case 'boolean':
mmkv.set(key, newValue);
break;
case 'undefined':
mmkv.remove(key);
break;
case 'object':
if (newValue instanceof ArrayBuffer) {
mmkv.set(key, newValue);
break;
}
else {
throw new Error(`MMKV: Type object (${newValue}) is not supported!`);
}
default:
throw new Error(`MMKV: Type ${typeof newValue} is not supported!`);
}
}, [key, mmkv]);
return [value, set];
};
}