22
Dispatcher,
23
HookType,
24
MemoCache,
25
- EventFunctionWrapper,
25
} from './ReactInternalTypes';
26
import type {Lanes, Lane} from './ReactFiberLane.new';
27
import type {HookFlags} from './ReactHookEffectTags';
188
getSnapshot: () => T,
189
};
190
191
+type EventFunctionPayload<Args, Return, F: (...Array<Args>) => Return> = {
192
+ ref: {
193
+ eventFn: F,
194
+ impl: F,
195
+ },
196
+ nextImpl: F,
197
+};
198
+
199
export type FunctionComponentUpdateQueue = {
200
lastEffect: Effect | null,
194
- events: Array<() => mixed> | null,
201
+ events: Array<EventFunctionPayload<any, any, any>> | null,
202
stores: Array<StoreConsistencyCheck<any>> | null,
203
// NOTE: optional, only set when enableUseMemoCacheHook is enabled
204
memoCache?: MemoCache | null,
1916
}
1917
1918
function useEventImpl<Args, Return, F: (...Array<Args>) => Return>(
1912
- event: EventFunctionWrapper<Args, Return, F>,
1913
- nextImpl: F,
1919
+ payload: EventFunctionPayload<Args, Return, F>,
1920
) {
1921
currentlyRenderingFiber.flags |= UpdateEffect;
1922
let componentUpdateQueue: null | FunctionComponentUpdateQueue = (currentlyRenderingFiber.updateQueue: any);
1923
if (componentUpdateQueue === null) {
1924
componentUpdateQueue = createFunctionComponentUpdateQueue();
1925
currentlyRenderingFiber.updateQueue = (componentUpdateQueue: any);
1920
- componentUpdateQueue.events = [event, nextImpl];
1926
+ componentUpdateQueue.events = [payload];
1927
} else {
1928
const events = componentUpdateQueue.events;
1929
if (events === null) {
1924
- componentUpdateQueue.events = [event, nextImpl];
1930
+ componentUpdateQueue.events = [payload];
1931
} else {
1926
- events.push(event, nextImpl);
1932
+ events.push(payload);
1933
}
1934
}
1935
}
1936
1937
function mountEvent<Args, Return, F: (...Array<Args>) => Return>(
1938
callback: F,
1933
-): EventFunctionWrapper<Args, Return, F> {
1939
+): F {
1940
const hook = mountWorkInProgressHook();
1935
- const eventFn: EventFunctionWrapper<Args, Return, F> = function eventFn() {
1941
+ const ref = {impl: callback};
1942
+ hook.memoizedState = ref;
1943
+ // $FlowIgnore[incompatible-return]
1944
+ return function eventFn() {
1945
if (isInvalidExecutionContextForEventFunction()) {
1946
throw new Error(
1947
"A function wrapped in useEvent can't be called during rendering.",
1948
);
1949
}
1941
- // $FlowFixMe[prop-missing] found when upgrading Flow
1942
- return eventFn._impl.apply(undefined, arguments);
1950
+ return ref.impl.apply(undefined, arguments);
1951
};
1944
- eventFn._impl = callback;
1945
-
1946
- useEventImpl(eventFn, callback);
1947
- hook.memoizedState = eventFn;
1948
- return eventFn;
1952
}
1953
1954
function updateEvent<Args, Return, F: (...Array<Args>) => Return>(
1955
callback: F,
1953
-): EventFunctionWrapper<Args, Return, F> {
1956
+): F {
1957
const hook = updateWorkInProgressHook();
1955
- const eventFn = hook.memoizedState;
1956
- useEventImpl(eventFn, callback);
1957
- return eventFn;
1958
+ const ref = hook.memoizedState;
1959
+ useEventImpl({ref, nextImpl: callback});
1960
+ // $FlowIgnore[incompatible-return]
1961
+ return function eventFn() {
1962
+ if (isInvalidExecutionContextForEventFunction()) {
1963
+ throw new Error(
1964
+ "A function wrapped in useEvent can't be called during rendering.",
1965
+ );
1966
+ }
1967
+ return ref.impl.apply(undefined, arguments);
1968
+ };
1969
}
1970
1971
function mountInsertionEffect(
2927
Args,
2928
Return,
2929
F: (...Array<Args>) => Return,
2919
- >(callback: F): EventFunctionWrapper<Args, Return, F> {
2930
+ >(callback: F): F {
2931
currentHookNameInDev = 'useEvent';
2932
mountHookTypesDev();
2933
return mountEvent(callback);
3084
Args,
3085
Return,
3086
F: (...Array<Args>) => Return,
3076
- >(callback: F): EventFunctionWrapper<Args, Return, F> {
3087
+ >(callback: F): F {
3088
currentHookNameInDev = 'useEvent';
3089
updateHookTypesDev();
3090
return mountEvent(callback);
3241
Args,
3242
Return,
3243
F: (...Array<Args>) => Return,
3233
- >(callback: F): EventFunctionWrapper<Args, Return, F> {
3244
+ >(callback: F): F {
3245
currentHookNameInDev = 'useEvent';
3246
updateHookTypesDev();
3247
return updateEvent(callback);
3399
Args,
3400
Return,
3401
F: (...Array<Args>) => Return,
3391
- >(callback: F): EventFunctionWrapper<Args, Return, F> {
3402
+ >(callback: F): F {
3403
currentHookNameInDev = 'useEvent';
3404
updateHookTypesDev();
3405
return updateEvent(callback);
3583
Args,
3584
Return,
3585
F: (...Array<Args>) => Return,
3575
- >(callback: F): EventFunctionWrapper<Args, Return, F> {
3586
+ >(callback: F): F {
3587
currentHookNameInDev = 'useEvent';
3588
warnInvalidHookAccess();
3589
mountHookTypesDev();
3768
Args,
3769
Return,
3770
F: (...Array<Args>) => Return,
3760
- >(callback: F): EventFunctionWrapper<Args, Return, F> {
3771
+ >(callback: F): F {
3772
currentHookNameInDev = 'useEvent';
3773
warnInvalidHookAccess();
3774
updateHookTypesDev();
3954
Args,
3955
Return,
3956
F: (...Array<Args>) => Return,
3946
- >(callback: F): EventFunctionWrapper<Args, Return, F> {
3957
+ >(callback: F): F {
3958
currentHookNameInDev = 'useEvent';
3959
warnInvalidHookAccess();
3960
updateHookTypesDev();