Skip to content

Commit 59f7afe

Browse files
committed
[dev-tools] refactor: merge devtools-related states into single state
1 parent d3575aa commit 59f7afe

File tree

12 files changed

+125
-112
lines changed

12 files changed

+125
-112
lines changed

packages/next/src/client/components/react-dev-overlay/app/hot-reloader-client.tsx

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ import {
99
ACTION_BEFORE_REFRESH,
1010
ACTION_BUILD_ERROR,
1111
ACTION_BUILD_OK,
12-
ACTION_DEBUG_INFO,
13-
ACTION_DEV_INDICATOR,
12+
ACTION_DEV_TOOLS,
1413
ACTION_REFRESH,
1514
ACTION_STATIC_INDICATOR,
1615
ACTION_UNHANDLED_ERROR,
1716
ACTION_UNHANDLED_REJECTION,
18-
ACTION_VERSION_INFO,
1917
REACT_REFRESH_FULL_RELOAD,
2018
reportInvalidHmrMessage,
2119
useErrorOverlayReducer,
@@ -31,14 +29,12 @@ import {
3129
useWebsocketPing,
3230
} from '../utils/use-websocket'
3331
import { parseComponentStack } from '../utils/parse-component-stack'
34-
import type { VersionInfo } from '../../../../server/dev/parse-version-info'
3532
import { HMR_ACTIONS_SENT_TO_BROWSER } from '../../../../server/dev/hot-reloader-types'
3633
import type {
3734
HMR_ACTION_TYPES,
3835
TurbopackMsgToBrowser,
3936
} from '../../../../server/dev/hot-reloader-types'
4037
import { REACT_REFRESH_FULL_RELOAD_FROM_ERROR } from '../shared'
41-
import type { DebugInfo } from '../types'
4238
import { useUntrackedPathname } from '../../navigation-untracked'
4339
import { getComponentStack, getOwnerStack } from '../../errors/stitched-error'
4440
import { handleDevBuildIndicatorHmrEvents } from '../../../dev/dev-build-indicator/internal/handle-dev-build-indicator-hmr-events'
@@ -51,12 +47,10 @@ import { NEXT_HMR_REFRESH_HASH_COOKIE } from '../../app-router-headers'
5147
export interface Dispatcher {
5248
onBuildOk(): void
5349
onBuildError(message: string): void
54-
onVersionInfo(versionInfo: VersionInfo): void
55-
onDebugInfo(debugInfo: DebugInfo): void
5650
onBeforeRefresh(): void
5751
onRefresh(): void
5852
onStaticIndicator(status: boolean): void
59-
onDevIndicator(devIndicator: DevToolsServerState['devIndicator']): void
53+
onDevTools(devTools: DevToolsServerState): void
6054
}
6155

6256
let mostRecentCompilationHash: any = null
@@ -316,9 +310,9 @@ function processMessage(
316310
const { errors, warnings } = obj
317311

318312
// Is undefined when it's a 'built' event
319-
if ('versionInfo' in obj) dispatcher.onVersionInfo(obj.versionInfo)
320-
if ('debug' in obj && obj.debug) dispatcher.onDebugInfo(obj.debug)
321-
if ('devIndicator' in obj) dispatcher.onDevIndicator(obj.devIndicator)
313+
if ('devTools' in obj) {
314+
dispatcher.onDevTools(obj.devTools)
315+
}
322316

323317
const hasErrors = Boolean(errors && errors.length)
324318
// Compilation with errors (e.g. syntax error or missing modules).
@@ -496,20 +490,11 @@ export default function HotReload({
496490
onRefresh() {
497491
dispatch({ type: ACTION_REFRESH })
498492
},
499-
onVersionInfo(versionInfo) {
500-
dispatch({ type: ACTION_VERSION_INFO, versionInfo })
501-
},
502493
onStaticIndicator(status: boolean) {
503494
dispatch({ type: ACTION_STATIC_INDICATOR, staticIndicator: status })
504495
},
505-
onDebugInfo(debugInfo) {
506-
dispatch({ type: ACTION_DEBUG_INFO, debugInfo })
507-
},
508-
onDevIndicator(devIndicator) {
509-
dispatch({
510-
type: ACTION_DEV_INDICATOR,
511-
devIndicator,
512-
})
496+
onDevTools(devTools: DevToolsServerState) {
497+
dispatch({ type: ACTION_DEV_TOOLS, devTools })
513498
},
514499
}
515500
}, [dispatch])

packages/next/src/client/components/react-dev-overlay/pages/client.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@ import {
99
ACTION_BEFORE_REFRESH,
1010
ACTION_BUILD_ERROR,
1111
ACTION_BUILD_OK,
12-
ACTION_DEV_INDICATOR,
12+
ACTION_DEV_TOOLS,
1313
ACTION_REFRESH,
1414
ACTION_STATIC_INDICATOR,
1515
ACTION_UNHANDLED_ERROR,
1616
ACTION_UNHANDLED_REJECTION,
17-
ACTION_VERSION_INFO,
1817
} from '../shared'
19-
import type { VersionInfo } from '../../../../server/dev/parse-version-info'
2018
import { getComponentStack, getOwnerStack } from '../../errors/stitched-error'
2119
import type { DevToolsServerState } from '../../../../server/dev/dev-tools-server-state'
2220

@@ -118,18 +116,12 @@ export function onBeforeRefresh() {
118116
Bus.emit({ type: ACTION_BEFORE_REFRESH })
119117
}
120118

121-
export function onVersionInfo(versionInfo: VersionInfo) {
122-
Bus.emit({ type: ACTION_VERSION_INFO, versionInfo })
123-
}
124-
125119
export function onStaticIndicator(isStatic: boolean) {
126120
Bus.emit({ type: ACTION_STATIC_INDICATOR, staticIndicator: isStatic })
127121
}
128122

129-
export function onDevIndicator(
130-
devIndicator: DevToolsServerState['devIndicator']
131-
) {
132-
Bus.emit({ type: ACTION_DEV_INDICATOR, devIndicator })
123+
export function onDevTools(devTools: DevToolsServerState) {
124+
Bus.emit({ type: ACTION_DEV_TOOLS, devTools })
133125
}
134126

135127
export { getErrorByType } from '../utils/get-error-by-type'

packages/next/src/client/components/react-dev-overlay/pages/hot-reloader-client.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@ import {
3838
onBuildOk,
3939
onBeforeRefresh,
4040
onRefresh,
41-
onVersionInfo,
41+
onDevTools,
4242
onStaticIndicator,
43-
onDevIndicator,
4443
} from './client'
4544
import stripAnsi from 'next/dist/compiled/strip-ansi'
4645
import { addMessageListener, sendMessage } from './websocket'
@@ -287,8 +286,9 @@ function processMessage(obj: HMR_ACTION_TYPES) {
287286
const { errors, warnings } = obj
288287

289288
// Is undefined when it's a 'built' event
290-
if ('versionInfo' in obj) onVersionInfo(obj.versionInfo)
291-
if ('devIndicator' in obj) onDevIndicator(obj.devIndicator)
289+
if ('devTools' in obj) {
290+
onDevTools(obj.devTools)
291+
}
292292

293293
const hasErrors = Boolean(errors && errors.length)
294294
if (hasErrors) {

packages/next/src/client/components/react-dev-overlay/shared.ts

Lines changed: 48 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,23 @@ type FastRefreshState =
1515
/** The refresh process has been triggered, but the new code has not been executed yet. */
1616
| { type: 'pending'; errors: SupportedErrorEvent[] }
1717

18+
export type DevToolsClientState = {
19+
versionInfo: VersionInfo
20+
debugInfo: DebugInfo
21+
devIndicator: {
22+
staticIndicator: boolean
23+
showIndicator: boolean
24+
disableDevIndicator: boolean
25+
}
26+
}
27+
1828
export interface OverlayState {
1929
nextId: number
2030
buildError: string | null
2131
errors: SupportedErrorEvent[]
2232
refreshState: FastRefreshState
23-
versionInfo: VersionInfo
2433
notFound: boolean
25-
staticIndicator: boolean
26-
showIndicator: boolean
27-
disableDevIndicator: boolean
28-
debugInfo: DebugInfo
34+
devToolsClientState: DevToolsClientState
2935
routerType: 'pages' | 'app'
3036
}
3137

@@ -34,11 +40,9 @@ export const ACTION_BUILD_OK = 'build-ok'
3440
export const ACTION_BUILD_ERROR = 'build-error'
3541
export const ACTION_BEFORE_REFRESH = 'before-fast-refresh'
3642
export const ACTION_REFRESH = 'fast-refresh'
37-
export const ACTION_VERSION_INFO = 'version-info'
3843
export const ACTION_UNHANDLED_ERROR = 'unhandled-error'
3944
export const ACTION_UNHANDLED_REJECTION = 'unhandled-rejection'
40-
export const ACTION_DEBUG_INFO = 'debug-info'
41-
export const ACTION_DEV_INDICATOR = 'dev-indicator'
45+
export const ACTION_DEV_TOOLS = 'dev-tools'
4246

4347
export const STORAGE_KEY_THEME = '__nextjs-dev-tools-theme'
4448
export const STORAGE_KEY_POSITION = '__nextjs-dev-tools-position'
@@ -75,19 +79,9 @@ export interface UnhandledRejectionAction {
7579
frames: StackFrame[]
7680
}
7781

78-
export interface DebugInfoAction {
79-
type: typeof ACTION_DEBUG_INFO
80-
debugInfo: any
81-
}
82-
83-
interface VersionInfoAction {
84-
type: typeof ACTION_VERSION_INFO
85-
versionInfo: VersionInfo
86-
}
87-
88-
interface DevIndicatorAction {
89-
type: typeof ACTION_DEV_INDICATOR
90-
devIndicator: DevToolsServerState['devIndicator']
82+
interface DevToolsAction {
83+
type: typeof ACTION_DEV_TOOLS
84+
devTools: DevToolsServerState
9185
}
9286

9387
export type BusEvent =
@@ -97,10 +91,8 @@ export type BusEvent =
9791
| FastRefreshAction
9892
| UnhandledErrorAction
9993
| UnhandledRejectionAction
100-
| VersionInfoAction
10194
| StaticIndicatorAction
102-
| DebugInfoAction
103-
| DevIndicatorAction
95+
| DevToolsAction
10496

10597
const REACT_ERROR_STACK_BOTTOM_FRAME_REGEX =
10698
// 1st group: v8
@@ -141,17 +133,21 @@ export const INITIAL_OVERLAY_STATE: Omit<OverlayState, 'routerType'> = {
141133
buildError: null,
142134
errors: [],
143135
notFound: false,
144-
staticIndicator: false,
145-
/*
136+
refreshState: { type: 'idle' },
137+
devToolsClientState: {
138+
versionInfo: { installed: '0.0.0', staleness: 'unknown' },
139+
debugInfo: { devtoolsFrontendUrl: undefined },
140+
devIndicator: {
141+
staticIndicator: false,
142+
disableDevIndicator: false,
143+
/*
146144
This is set to `true` when we can reliably know
147145
whether the indicator is in disabled state or not.
148146
Otherwise the surface would flicker because the disabled flag loads from the config.
149147
*/
150-
showIndicator: false,
151-
disableDevIndicator: false,
152-
refreshState: { type: 'idle' },
153-
versionInfo: { installed: '0.0.0', staleness: 'unknown' },
154-
debugInfo: { devtoolsFrontendUrl: undefined },
148+
showIndicator: false,
149+
},
150+
},
155151
}
156152

157153
function getInitialState(
@@ -166,11 +162,17 @@ function getInitialState(
166162
export function useErrorOverlayReducer(routerType: 'pages' | 'app') {
167163
return useReducer((state: OverlayState, action: BusEvent): OverlayState => {
168164
switch (action.type) {
169-
case ACTION_DEBUG_INFO: {
170-
return { ...state, debugInfo: action.debugInfo }
171-
}
172165
case ACTION_STATIC_INDICATOR: {
173-
return { ...state, staticIndicator: action.staticIndicator }
166+
return {
167+
...state,
168+
devToolsClientState: {
169+
...state.devToolsClientState,
170+
devIndicator: {
171+
...state.devToolsClientState.devIndicator,
172+
staticIndicator: action.staticIndicator,
173+
},
174+
},
175+
}
174176
}
175177
case ACTION_BUILD_OK: {
176178
return { ...state, buildError: null }
@@ -228,15 +230,19 @@ export function useErrorOverlayReducer(routerType: 'pages' | 'app') {
228230
return state
229231
}
230232
}
231-
case ACTION_VERSION_INFO: {
232-
return { ...state, versionInfo: action.versionInfo }
233-
}
234-
case ACTION_DEV_INDICATOR: {
233+
case ACTION_DEV_TOOLS: {
235234
return {
236235
...state,
237-
showIndicator: true,
238-
disableDevIndicator:
239-
shouldDisableDevIndicator || !!action.devIndicator.disabledUntil,
236+
devToolsClientState: {
237+
...state.devToolsClientState,
238+
devIndicator: {
239+
...state.devToolsClientState.devIndicator,
240+
showIndicator: true,
241+
disableDevIndicator:
242+
shouldDisableDevIndicator ||
243+
!!action.devTools.devIndicator.disabledUntil,
244+
},
245+
},
240246
}
241247
}
242248
default: {

packages/next/src/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.stories.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,16 @@ const state: OverlayState = {
5050
buildError: null,
5151
errors: [],
5252
refreshState: { type: 'idle' },
53-
disableDevIndicator: false,
54-
showIndicator: true,
55-
versionInfo: mockVersionInfo,
5653
notFound: false,
57-
staticIndicator: true,
58-
debugInfo: { devtoolsFrontendUrl: undefined },
54+
devToolsClientState: {
55+
versionInfo: mockVersionInfo,
56+
debugInfo: { devtoolsFrontendUrl: undefined },
57+
devIndicator: {
58+
staticIndicator: true,
59+
showIndicator: true,
60+
disableDevIndicator: false,
61+
},
62+
},
5963
}
6064

6165
export const StaticRoute: Story = {
@@ -71,7 +75,13 @@ export const DynamicRoute: Story = {
7175
errorCount: 0,
7276
state: {
7377
...state,
74-
staticIndicator: false,
78+
devToolsClientState: {
79+
...state.devToolsClientState,
80+
devIndicator: {
81+
...state.devToolsClientState.devIndicator,
82+
staticIndicator: false,
83+
},
84+
},
7585
},
7686
setIsErrorOverlayOpen: () => {},
7787
},

packages/next/src/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ export function DevToolsIndicator({
4848
return (
4949
<DevToolsPopover
5050
routerType={state.routerType}
51-
semver={state.versionInfo.installed}
51+
semver={state.devToolsClientState.versionInfo.installed}
5252
issueCount={errorCount}
53-
isStaticRoute={state.staticIndicator}
53+
isStaticRoute={state.devToolsClientState.devIndicator.staticIndicator}
5454
hide={() => {
5555
setIsDevToolsIndicatorVisible(false)
5656
fetch('/__nextjs_disable_dev_indicator', {
@@ -59,7 +59,10 @@ export function DevToolsIndicator({
5959
}}
6060
setIsErrorOverlayOpen={setIsErrorOverlayOpen}
6161
isTurbopack={!!process.env.TURBOPACK}
62-
disabled={state.disableDevIndicator || !isDevToolsIndicatorVisible}
62+
disabled={
63+
state.devToolsClientState.devIndicator.disableDevIndicator ||
64+
!isDevToolsIndicatorVisible
65+
}
6366
isBuildError={isBuildError}
6467
{...props}
6568
/>

packages/next/src/client/components/react-dev-overlay/ui/components/errors/error-overlay/error-overlay.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { OverlayState } from '../../../../shared'
1+
import type { DevToolsClientState, OverlayState } from '../../../../shared'
22

33
import { Suspense } from 'react'
44
import { BuildError } from '../../../container/build-error'
@@ -12,7 +12,7 @@ export interface ErrorBaseProps {
1212
rendered: boolean
1313
transitionDurationMs: number
1414
isTurbopack: boolean
15-
versionInfo: OverlayState['versionInfo']
15+
versionInfo: DevToolsClientState['versionInfo']
1616
errorCount: number
1717
}
1818

@@ -40,7 +40,7 @@ export function ErrorOverlay({
4040
rendered,
4141
transitionDurationMs,
4242
isTurbopack,
43-
versionInfo: state.versionInfo,
43+
versionInfo: state.devToolsClientState.versionInfo,
4444
errorCount,
4545
}
4646

@@ -71,7 +71,7 @@ export function ErrorOverlay({
7171
return (
7272
<Errors
7373
{...commonProps}
74-
debugInfo={state.debugInfo}
74+
debugInfo={state.devToolsClientState.debugInfo}
7575
runtimeErrors={runtimeErrors}
7676
onClose={() => {
7777
setIsErrorOverlayOpen(false)

0 commit comments

Comments
 (0)