react-native-wishlist
Version:
The fastest List component for React Native.
64 lines (60 loc) • 1.65 kB
JavaScript
import { useEffect, useMemo } from 'react';
import { getUIInflatorRegistry } from './InflatorRepository';
import { generateId } from './Utils';
import { createRunInWishlistFn } from './WishlistJsRuntime';
export function createTemplateValue(mapper) {
const id = generateId();
function getOrCreateUIState() {
'worklet';
const registry = getUIInflatorRegistry();
let state = registry.getTemplateValueState(id);
if (!state) {
state = {
dirty: true,
current: undefined
};
registry.setTemplateValueState(id, state);
}
return state;
}
function setDirty() {
'worklet';
const state = getOrCreateUIState();
state.dirty = true;
}
function value() {
'worklet';
const registry = getUIInflatorRegistry();
const state = getOrCreateUIState();
if (state.dirty) {
state.current = mapper(registry.getCurrentValue(), registry.getCurrentRootValue());
state.dirty = false;
}
return state.current;
}
function remove() {
createRunInWishlistFn(() => {
'worklet';
getUIInflatorRegistry().deleteTemplateValueState(id);
});
}
return {
__isTemplateValue: true,
__setDirty: setDirty,
__remove: remove,
value
};
}
export function isTemplateValue(value) {
return value !== null && typeof value === 'object' && value.__isTemplateValue === true;
}
export function useTemplateValue(mapper) {
const value = useMemo(() => {
return createTemplateValue(mapper);
}, [mapper]);
useEffect(() => {
return () => value.__remove();
}, [value]);
return value;
}
//# sourceMappingURL=TemplateValue.js.map