recoil
Version:
Recoil - A state management library for React
37 lines (32 loc) • 1.09 kB
Flow
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall recoil
*/
;
import type {TransactionInterface} from '../core/Recoil_AtomicUpdates';
const {atomicUpdater} = require('../core/Recoil_AtomicUpdates');
const {useStoreRef} = require('../core/Recoil_RecoilRoot');
const {useMemo} = require('react');
function useRecoilTransaction<Arguments: $ReadOnlyArray<mixed>>(
fn: TransactionInterface => (...Arguments) => void,
deps?: $ReadOnlyArray<mixed>,
): (...Arguments) => void {
const storeRef = useStoreRef();
return useMemo(
() =>
(...args: Arguments): void => {
const atomicUpdate = atomicUpdater(storeRef.current);
atomicUpdate(transactionInterface => {
fn(transactionInterface)(...args);
});
},
deps != null ? [...deps, storeRef] : undefined, // eslint-disable-line fb-www/react-hooks-deps
);
}
module.exports = useRecoilTransaction;