From 98f82a323a31642a08b7e17d8a8da1a4a9dc34bc Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Tue, 15 Jan 2019 11:18:17 -0800 Subject: [PATCH 1/2] Added Flow type to keep hooks dispatchers in-sync --- .../react-debug-tools/src/ReactDebugHooks.js | 3 ++- .../src/server/ReactPartialRendererHooks.js | 17 +++++++++++------ .../src/ReactFiberDispatcher.js | 4 +++- .../react-reconciler/src/ReactFiberHooks.js | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/packages/react-debug-tools/src/ReactDebugHooks.js b/packages/react-debug-tools/src/ReactDebugHooks.js index 1256c8fa8330..d9089123c742 100644 --- a/packages/react-debug-tools/src/ReactDebugHooks.js +++ b/packages/react-debug-tools/src/ReactDebugHooks.js @@ -10,6 +10,7 @@ import type {ReactContext, ReactProviderType} from 'shared/ReactTypes'; import type {Fiber} from 'react-reconciler/src/ReactFiber'; import type {Hook} from 'react-reconciler/src/ReactFiberHooks'; +import type {DispatcherHooks} from 'react-reconciler/src/ReactFiberHooks'; import ErrorStackParser from 'error-stack-parser'; import ReactSharedInternals from 'shared/ReactSharedInternals'; @@ -209,7 +210,7 @@ function useMemo( return value; } -const Dispatcher = { +const Dispatcher: DispatcherHooks = { readContext, useCallback, useContext, diff --git a/packages/react-dom/src/server/ReactPartialRendererHooks.js b/packages/react-dom/src/server/ReactPartialRendererHooks.js index 6eb62c7bd7c2..40e3b6cca652 100644 --- a/packages/react-dom/src/server/ReactPartialRendererHooks.js +++ b/packages/react-dom/src/server/ReactPartialRendererHooks.js @@ -7,6 +7,7 @@ * @flow */ +import type {DispatcherHooks} from 'react-reconciler/src/ReactFiberHooks'; import type {ThreadID} from './ReactThreadIDAllocator'; import type {ReactContext} from 'shared/ReactTypes'; import areHookInputsEqual from 'shared/areHookInputsEqual'; @@ -326,18 +327,23 @@ function dispatchAction( } } -function noop(): void {} -function identity(fn: Function): Function { - return fn; +export function useCallback( + callback: T, + inputs: Array | void | null, +): T { + // Callbacks are passed as they are in the server environment. + return callback; } +function noop(): void {} + export let currentThreadID: ThreadID = 0; export function setCurrentThreadID(threadID: ThreadID) { currentThreadID = threadID; } -export const Dispatcher = { +export const Dispatcher: DispatcherHooks = { readContext, useContext, useMemo, @@ -345,8 +351,7 @@ export const Dispatcher = { useRef, useState, useLayoutEffect, - // Callbacks are passed as they are in the server environment. - useCallback: identity, + useCallback, // useImperativeHandle is not run in the server environment useImperativeHandle: noop, // Effects are not run in the server environment. diff --git a/packages/react-reconciler/src/ReactFiberDispatcher.js b/packages/react-reconciler/src/ReactFiberDispatcher.js index ed2ed3b2f315..0e19b785b439 100644 --- a/packages/react-reconciler/src/ReactFiberDispatcher.js +++ b/packages/react-reconciler/src/ReactFiberDispatcher.js @@ -7,6 +7,8 @@ * @flow */ +import type {DispatcherHooks} from './ReactFiberHooks'; + import {readContext} from './ReactFiberNewContext'; import { useCallback, @@ -21,7 +23,7 @@ import { useState, } from './ReactFiberHooks'; -export const Dispatcher = { +export const Dispatcher: DispatcherHooks = { readContext, useCallback, useContext, diff --git a/packages/react-reconciler/src/ReactFiberHooks.js b/packages/react-reconciler/src/ReactFiberHooks.js index 2f8d9a24a565..2690bc3a75dd 100644 --- a/packages/react-reconciler/src/ReactFiberHooks.js +++ b/packages/react-reconciler/src/ReactFiberHooks.js @@ -641,6 +641,20 @@ export function useMemo( return nextValue; } +// Single source of truth that keeps various hooks APIs in-sync. +export type DispatcherHooks = { + useCallback: typeof useCallback, + useContext: typeof useContext, + useEffect: typeof useEffect, + useDebugValue: typeof useDebugValue, + useImperativeHandle: typeof useImperativeHandle, + useLayoutEffect: typeof useLayoutEffect, + useMemo: typeof useMemo, + useReducer: typeof useReducer, + useRef: typeof useRef, + useState: typeof useState, +}; + function dispatchAction(fiber: Fiber, queue: UpdateQueue, action: A) { invariant( numberOfReRenders < RE_RENDER_LIMIT, From d63772c7d22e28977a4d659f6637263c702f6eb1 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Tue, 15 Jan 2019 11:35:22 -0800 Subject: [PATCH 2/2] Improved Dispatch type check --- packages/react-debug-tools/src/ReactDebugHooks.js | 4 ++-- .../src/server/ReactPartialRendererHooks.js | 4 ++-- .../react-reconciler/src/ReactFiberDispatcher.js | 4 +--- packages/react-reconciler/src/ReactFiberHooks.js | 14 -------------- 4 files changed, 5 insertions(+), 21 deletions(-) diff --git a/packages/react-debug-tools/src/ReactDebugHooks.js b/packages/react-debug-tools/src/ReactDebugHooks.js index d9089123c742..b53fab87d46d 100644 --- a/packages/react-debug-tools/src/ReactDebugHooks.js +++ b/packages/react-debug-tools/src/ReactDebugHooks.js @@ -10,7 +10,7 @@ import type {ReactContext, ReactProviderType} from 'shared/ReactTypes'; import type {Fiber} from 'react-reconciler/src/ReactFiber'; import type {Hook} from 'react-reconciler/src/ReactFiberHooks'; -import type {DispatcherHooks} from 'react-reconciler/src/ReactFiberHooks'; +import typeof {Dispatcher as DispatcherType} from 'react-reconciler/src/ReactFiberDispatcher'; import ErrorStackParser from 'error-stack-parser'; import ReactSharedInternals from 'shared/ReactSharedInternals'; @@ -210,7 +210,7 @@ function useMemo( return value; } -const Dispatcher: DispatcherHooks = { +const Dispatcher: DispatcherType = { readContext, useCallback, useContext, diff --git a/packages/react-dom/src/server/ReactPartialRendererHooks.js b/packages/react-dom/src/server/ReactPartialRendererHooks.js index 40e3b6cca652..a4cf6ce04f8d 100644 --- a/packages/react-dom/src/server/ReactPartialRendererHooks.js +++ b/packages/react-dom/src/server/ReactPartialRendererHooks.js @@ -7,7 +7,7 @@ * @flow */ -import type {DispatcherHooks} from 'react-reconciler/src/ReactFiberHooks'; +import typeof {Dispatcher as DispatcherType} from 'react-reconciler/src/ReactFiberDispatcher'; import type {ThreadID} from './ReactThreadIDAllocator'; import type {ReactContext} from 'shared/ReactTypes'; import areHookInputsEqual from 'shared/areHookInputsEqual'; @@ -343,7 +343,7 @@ export function setCurrentThreadID(threadID: ThreadID) { currentThreadID = threadID; } -export const Dispatcher: DispatcherHooks = { +export const Dispatcher: DispatcherType = { readContext, useContext, useMemo, diff --git a/packages/react-reconciler/src/ReactFiberDispatcher.js b/packages/react-reconciler/src/ReactFiberDispatcher.js index 0e19b785b439..ed2ed3b2f315 100644 --- a/packages/react-reconciler/src/ReactFiberDispatcher.js +++ b/packages/react-reconciler/src/ReactFiberDispatcher.js @@ -7,8 +7,6 @@ * @flow */ -import type {DispatcherHooks} from './ReactFiberHooks'; - import {readContext} from './ReactFiberNewContext'; import { useCallback, @@ -23,7 +21,7 @@ import { useState, } from './ReactFiberHooks'; -export const Dispatcher: DispatcherHooks = { +export const Dispatcher = { readContext, useCallback, useContext, diff --git a/packages/react-reconciler/src/ReactFiberHooks.js b/packages/react-reconciler/src/ReactFiberHooks.js index 2690bc3a75dd..2f8d9a24a565 100644 --- a/packages/react-reconciler/src/ReactFiberHooks.js +++ b/packages/react-reconciler/src/ReactFiberHooks.js @@ -641,20 +641,6 @@ export function useMemo( return nextValue; } -// Single source of truth that keeps various hooks APIs in-sync. -export type DispatcherHooks = { - useCallback: typeof useCallback, - useContext: typeof useContext, - useEffect: typeof useEffect, - useDebugValue: typeof useDebugValue, - useImperativeHandle: typeof useImperativeHandle, - useLayoutEffect: typeof useLayoutEffect, - useMemo: typeof useMemo, - useReducer: typeof useReducer, - useRef: typeof useRef, - useState: typeof useState, -}; - function dispatchAction(fiber: Fiber, queue: UpdateQueue, action: A) { invariant( numberOfReRenders < RE_RENDER_LIMIT,