on d760cbf help sign in
bridge/src/store/lib/useOptimisticDetailsStore.js
38 lines 1.2 kB history raw
1import { useCallback } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
4import useSetState from 'lib/useSetState';
6const DEFAULT_OPTIMISTIC_DETAILS = {
7 keyRevisionNumber: Nothing(),
8};
10export default function useOptimisticDetailsStore() {
11 const [optimisticDetails, addToOptimisticDetails] = useSetState({});
13 const getOptimisticDetails = useCallback(
14 point => optimisticDetails[point] || DEFAULT_OPTIMISTIC_DETAILS,
15 [optimisticDetails]
16 );
18 const _buildSetter = key =>
19 useCallback(
20 (point, value) =>
21 addToOptimisticDetails({
22 [point]: {
23 ...DEFAULT_OPTIMISTIC_DETAILS,
24 ...optimisticDetails[point],
25 ...optimisticDetails({ [key]: Just(value) }),
26 },
27 }),
28 // NOTE: this usage of useCallback is ok because it is called a constant
29 // number of times. the linter also doesn't understand that it's within
30 // a closure, so we disable the rule here.
31 // eslint-disable-next-line react-hooks/exhaustive-deps
32 [addToOptimisticDetails, optimisticDetails]
33 );
35 const setOptimisticKeyRevision = _buildSetter('keyRevisionNumber');
37 return { getOptimisticDetails, setOptimisticKeyRevision };