@dark-engine/core
Version:
The lightweight and powerful UI rendering engine without dependencies and written in TypeScript (Browser, Node.js, Android, iOS, Windows, Linux, macOS)
49 lines (48 loc) • 1.69 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
exports.useState = void 0;
const utils_1 = require('../utils');
const use_callback_1 = require('../use-callback');
const use_update_1 = require('../use-update');
const use_memo_1 = require('../use-memo');
const scope_1 = require('../scope');
function createTools(options) {
const { get, set, reset, next, shouldUpdate: $shouldUpdate } = options;
const tools = () => {
const prevValue = get();
const newValue = (0, utils_1.detectIsFunction)(next) ? next(prevValue) : next;
const shouldUpdate = () => $shouldUpdate(prevValue, newValue);
const setValue = () => set(newValue);
const resetValue = () => reset(prevValue);
return { shouldUpdate, setValue, resetValue };
};
return tools;
}
function useState(initialValue) {
const update = (0, use_update_1.useUpdate)();
const scope = (0, use_memo_1.useMemo)(
() => ({
value: (0, utils_1.detectIsFunction)(initialValue) ? initialValue() : initialValue,
}),
[],
);
const setState = (0, use_callback_1.useCallback)(next => {
const $scope = (0, scope_1.$$scope)();
const isBatch = $scope.getIsBatch();
const isForce = $scope.getIsForce();
const getTools = createTools({
next,
get: () => scope.value,
set: x => (scope.value = x),
reset: x => (scope.value = x),
shouldUpdate: (p, n) => isBatch || isForce || !(0, utils_1.detectIsEqual)(p, n),
});
update({
getTools,
setupBatch: isBatch ? () => getTools().setValue() : undefined,
});
}, []);
return [scope.value, setState];
}
exports.useState = useState;
//# sourceMappingURL=use-state.js.map