diff --git a/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarEventInfo.js b/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarEventInfo.js
index 77f0d13feb..8b55e0f8c0 100644
--- a/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarEventInfo.js
+++ b/packages/react-devtools-shared/src/devtools/views/Profiler/SidebarEventInfo.js
@@ -8,6 +8,7 @@
*/
import type {SchedulingEvent} from 'react-devtools-timeline/src/types';
+import type {ReactFunctionLocation} from 'shared/ReactTypes';
import * as React from 'react';
import Button from '../Button';
@@ -27,6 +28,28 @@ import styles from './SidebarEventInfo.css';
export type Props = {};
+type FunctionLocationProps = {
+ location: ReactFunctionLocation,
+ displayName: string,
+};
+function FunctionLocation({location, displayName}: FunctionLocationProps) {
+ // TODO: We should support symbolication here as well, but
+ // symbolicating the whole stack can be expensive
+ const [canViewSource, viewSource] = useOpenResource(location, null);
+ return (
+
+
+
+ );
+}
+
type SchedulingEventProps = {
eventInfo: SchedulingEvent,
};
@@ -74,25 +97,12 @@ function SchedulingEventInfo({eventInfo}: SchedulingEventProps) {
);
}
- // TODO: We should support symbolication here as well, but
- // symbolicating the whole stack can be expensive
- const [canViewSource, viewSource] = useOpenResource(
- location,
- null,
- );
return (
-
-
-
+
);
},
)}
diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTimeline.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTimeline.js
index d618bfcea6..51479ac829 100644
--- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTimeline.js
+++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTimeline.js
@@ -39,28 +39,6 @@ function SuspenseTimelineInput() {
const min = 0;
const max = timeline.length > 0 ? timeline.length - 1 : 0;
- if (rootID === null) {
- return (
- No root selected.
- );
- }
-
- if (!store.supportsTogglingSuspense(rootID)) {
- return (
-
- Can't step through Suspense in production apps.
-
- );
- }
-
- if (timeline.length === 0) {
- return (
-
- Root contains no Suspense nodes.
-
- );
- }
-
function switchSuspenseNode(nextTimelineIndex: number) {
const nextSelectedSuspenseID = timeline[nextTimelineIndex];
highlightHostInstance(nextSelectedSuspenseID);
@@ -175,6 +153,28 @@ function SuspenseTimelineInput() {
};
}, [playing]);
+ if (rootID === null) {
+ return (
+ No root selected.
+ );
+ }
+
+ if (!store.supportsTogglingSuspense(rootID)) {
+ return (
+
+ Can't step through Suspense in production apps.
+
+ );
+ }
+
+ if (timeline.length === 0) {
+ return (
+
+ Root contains no Suspense nodes.
+
+ );
+ }
+
return (
<>