-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDispatchUniqueProvider.tsx
36 lines (29 loc) · 1.06 KB
/
DispatchUniqueProvider.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import constate from 'constate';
import { useCallback, useRef } from 'react';
import { NotVoid, uniqBy } from 'lodash';
import { Action, useStoreContext } from '../../../store/useStore';
export interface DispatchUniqueHook {
addToDispatchQueue: (action: Action) => void;
flushDispatchQueue: () => NotVoid;
}
export const actionUniqBy = (action: Action): string => JSON.stringify(action);
export const useDispatchUnique = (): DispatchUniqueHook => {
const actions = useRef<Action[]>();
const [, dispatch] = useStoreContext();
const addToDispatchQueue = useCallback((action: Action) => {
const newActions = [...(actions.current ?? []), action];
actions.current = uniqBy(newActions, actionUniqBy);
}, []);
const flushDispatchQueue = useCallback(() => {
if (!actions.current?.length) return;
actions.current?.forEach(dispatch);
// clear actions
actions.current = [];
}, [actions]);
return {
addToDispatchQueue,
flushDispatchQueue,
};
};
export const [DispatchUniqueProvider, useDispatchUniqueContext] =
constate(useDispatchUnique);