@@ -24,9 +24,10 @@ import { generateCurlCommand, generateFetchCall } from '../third_party/devtools'
2424import { CopyToClipboardTextButton } from './copyToClipboard' ;
2525import { getAPIRequestCodeGen } from './codegen' ;
2626import type { Language } from '@isomorphic/locatorGenerators' ;
27- import { msToString , useAsyncMemo } from '@web/uiUtils' ;
27+ import { msToString , useAsyncMemo , useSetting } from '@web/uiUtils' ;
2828import type { Entry } from '@trace/har' ;
2929import { useTraceModel } from './traceModelContext' ;
30+ import { Expandable } from '@web/components/expandable' ;
3031
3132type RequestBody = { text : string , mimeType ?: string } | null ;
3233
@@ -105,42 +106,68 @@ const CopyDropdown: React.FC<{
105106 ) ;
106107} ;
107108
109+ const ExpandableSection : React . FC < {
110+ title : string ;
111+ children ?: React . ReactNode
112+ className ?: string ;
113+ } > = ( { title, children, className } ) => {
114+ const [ expanded , setExpanded ] = useSetting ( `trace-viewer-network-details-${ title . replaceAll ( ' ' , '-' ) } ` , true ) ;
115+ return < Expandable
116+ expanded = { expanded }
117+ setExpanded = { setExpanded }
118+ expandOnTitleClick
119+ title = { < span className = 'network-request-details-header' > { title } </ span > }
120+ className = { className }
121+ >
122+ { children }
123+ </ Expandable > ;
124+ } ;
125+
108126const RequestTab : React . FunctionComponent < {
109127 resource : ResourceSnapshot ;
110128 startTimeOffset : number ;
111129 requestBody : RequestBody ,
112130} > = ( { resource, startTimeOffset, requestBody } ) => {
113131 return < div className = 'vbox network-request-details-tab' >
114- < div className = 'network-request-details-header' > General</ div >
115- < div className = 'network-request-details-url' > { `URL: ${ resource . request . url } ` } </ div >
116- < div className = 'network-request-details-general' > { `Method: ${ resource . request . method } ` } </ div >
117- { resource . response . status !== - 1 && < div className = 'network-request-details-general' style = { { display : 'flex' } } >
118- Status Code: < span className = { statusClass ( resource . response . status ) } style = { { display : 'inline-flex' } } >
119- { `${ resource . response . status } ${ resource . response . statusText } ` }
120- </ span > </ div > }
121- { resource . request . queryString . length ? < >
122- < div className = 'network-request-details-header' > Query String Parameters</ div >
123- < div className = 'network-request-details-headers' >
124- { resource . request . queryString . map ( param => `${ param . name } : ${ param . value } ` ) . join ( '\n' ) }
125- </ div >
126- </ > : null }
127- < div className = 'network-request-details-header' > Request Headers</ div >
128- < div className = 'network-request-details-headers' > { resource . request . headers . map ( pair => `${ pair . name } : ${ pair . value } ` ) . join ( '\n' ) } </ div >
129- < div className = 'network-request-details-header' > Time</ div >
130- < div className = 'network-request-details-general' > { `Start: ${ msToString ( startTimeOffset ) } ` } </ div >
131- < div className = 'network-request-details-general' > { `Duration: ${ msToString ( resource . time ) } ` } </ div >
132-
133- { requestBody && < div className = 'network-request-details-header' > Request Body</ div > }
134- { requestBody && < CodeMirrorWrapper text = { requestBody . text } mimeType = { requestBody . mimeType } readOnly lineNumbers = { true } /> }
132+ < ExpandableSection title = 'General' >
133+ < div className = 'network-request-details-url' > { `URL: ${ resource . request . url } ` } </ div >
134+ < div className = 'network-request-details-general' > { `Method: ${ resource . request . method } ` } </ div >
135+ { resource . response . status !== - 1 && < div className = 'network-request-details-general' style = { { display : 'flex' } } >
136+ Status Code: < span className = { statusClass ( resource . response . status ) } style = { { display : 'inline-flex' } } >
137+ { `${ resource . response . status } ${ resource . response . statusText } ` }
138+ </ span > </ div > }
139+ </ ExpandableSection >
140+
141+ { resource . request . queryString . length ?
142+ < ExpandableSection title = 'Query String Parameters' >
143+ < div className = 'network-request-details-headers' >
144+ { resource . request . queryString . map ( param => `${ param . name } : ${ param . value } ` ) . join ( '\n' ) }
145+ </ div >
146+ </ ExpandableSection >
147+ : null }
148+
149+ < ExpandableSection title = 'Request Headers' >
150+ < div className = 'network-request-details-headers' > { resource . request . headers . map ( pair => `${ pair . name } : ${ pair . value } ` ) . join ( '\n' ) } </ div >
151+ </ ExpandableSection >
152+
153+ < ExpandableSection title = 'Time' >
154+ < div className = 'network-request-details-general' > { `Start: ${ msToString ( startTimeOffset ) } ` } </ div >
155+ < div className = 'network-request-details-general' > { `Duration: ${ msToString ( resource . time ) } ` } </ div >
156+ </ ExpandableSection >
157+
158+ { requestBody && < ExpandableSection title = 'Request Body' className = 'network-request-request-body' >
159+ < CodeMirrorWrapper text = { requestBody . text } mimeType = { requestBody . mimeType } readOnly lineNumbers = { true } />
160+ </ ExpandableSection > }
135161 </ div > ;
136162} ;
137163
138164const ResponseTab : React . FunctionComponent < {
139165 resource : ResourceSnapshot ;
140166} > = ( { resource } ) => {
141167 return < div className = 'vbox network-request-details-tab' >
142- < div className = 'network-request-details-header' > Response Headers</ div >
143- < div className = 'network-request-details-headers' > { resource . response . headers . map ( pair => `${ pair . name } : ${ pair . value } ` ) . join ( '\n' ) } </ div >
168+ < ExpandableSection title = 'Response Headers' >
169+ < div className = 'network-request-details-headers' > { resource . response . headers . map ( pair => `${ pair . name } : ${ pair . value } ` ) . join ( '\n' ) } </ div >
170+ </ ExpandableSection >
144171 </ div > ;
145172} ;
146173
0 commit comments