diff --git a/packages/react-devtools-shared/src/devtools/constants.js b/packages/react-devtools-shared/src/devtools/constants.js index cfa3d5af164..ee13e5b1630 100644 --- a/packages/react-devtools-shared/src/devtools/constants.js +++ b/packages/react-devtools-shared/src/devtools/constants.js @@ -135,6 +135,9 @@ export const THEME_STYLES: {[style: Theme | DisplayDensity]: any, ...} = { '--color-timeline-text-color': '#000000', '--color-timeline-text-dim-color': '#ccc', '--color-timeline-react-work-border': '#eeeeee', + '--color-timebar-background': '#f6f6f6', + '--color-timespan-background': '#62bc6a', + '--color-timespan-background-errored': '#d57066', '--color-search-match': 'yellow', '--color-search-match-current': '#f7923b', '--color-selected-tree-highlight-active': 'rgba(0, 136, 250, 0.1)', @@ -283,6 +286,9 @@ export const THEME_STYLES: {[style: Theme | DisplayDensity]: any, ...} = { '--color-timeline-text-color': '#282c34', '--color-timeline-text-dim-color': '#555b66', '--color-timeline-react-work-border': '#3d424a', + '--color-timebar-background': '#1d2129', + '--color-timespan-background': '#62bc6a', + '--color-timespan-background-errored': '#d57066', '--color-search-match': 'yellow', '--color-search-match-current': '#f7923b', '--color-selected-tree-highlight-active': 'rgba(23, 143, 185, 0.15)', diff --git a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSharedStyles.css b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSharedStyles.css index 65dd6baf4a6..c0d3c95bec1 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSharedStyles.css +++ b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSharedStyles.css @@ -89,3 +89,23 @@ .PreviewContainer { padding: 0 0.25rem 0.25rem 0.25rem; } + +.TimeBarContainer { + position: relative; + flex: 0 0 20%; + height: 0.25rem; + border-radius: 0.125rem; + background-color: var(--color-timebar-background); +} + +.TimeBarSpan, .TimeBarSpanErrored { + position: absolute; + border-radius: 0.125rem; + background-color: var(--color-timespan-background); + width: 100%; + height: 100%; +} + +.TimeBarSpanErrored { + background-color: var(--color-timespan-background-errored); +} \ No newline at end of file diff --git a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSuspendedBy.js b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSuspendedBy.js index a0bc761c506..93f4078a0ea 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSuspendedBy.js +++ b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSuspendedBy.js @@ -19,10 +19,13 @@ import styles from './InspectedElementSharedStyles.css'; import {withPermissionsCheck} from 'react-devtools-shared/src/frontend/utils/withPermissionsCheck'; import StackTraceView from './StackTraceView'; import OwnerView from './OwnerView'; +import {meta} from '../../../hydration'; -import type {InspectedElement} from 'react-devtools-shared/src/frontend/types'; +import type { + InspectedElement, + SerializedAsyncInfo, +} from 'react-devtools-shared/src/frontend/types'; import type {FrontendBridge} from 'react-devtools-shared/src/bridge'; -import type {SerializedAsyncInfo} from 'react-devtools-shared/src/frontend/types'; type RowProps = { bridge: FrontendBridge, @@ -31,6 +34,8 @@ type RowProps = { store: Store, asyncInfo: SerializedAsyncInfo, index: number, + minTime: number, + maxTime: number, }; function SuspendedByRow({ @@ -40,6 +45,8 @@ function SuspendedByRow({ store, asyncInfo, index, + minTime, + maxTime, }: RowProps) { const [isOpen, setIsOpen] = useState(false); const name = asyncInfo.awaited.name; @@ -52,17 +59,47 @@ function SuspendedByRow({ stack = asyncInfo.stack; owner = asyncInfo.owner; } + const start = asyncInfo.awaited.start; + const end = asyncInfo.awaited.end; + const timeScale = 100 / (maxTime - minTime); + let left = (start - minTime) * timeScale; + let width = (end - start) * timeScale; + if (width < 5) { + // Use at least a 5% width to avoid showing too small indicators. + width = 5; + if (left > 95) { + left = 95; + } + } + + const value: any = asyncInfo.awaited.value; + const isErrored = + value !== null && + typeof value === 'object' && + value[meta.name] === 'rejected Thenable'; + return (