diff --git a/packages/bruno-app/src/components/Devtools/Console/RequestDetailsPanel/StyledWrapper.js b/packages/bruno-app/src/components/Devtools/Console/RequestDetailsPanel/StyledWrapper.js index 5d66cf493..9c596f230 100644 --- a/packages/bruno-app/src/components/Devtools/Console/RequestDetailsPanel/StyledWrapper.js +++ b/packages/bruno-app/src/components/Devtools/Console/RequestDetailsPanel/StyledWrapper.js @@ -305,7 +305,7 @@ const StyledWrapper = styled.div` } } - .network-logs-container { + .network-logs-wrapper { border: 1px solid ${(props) => props.theme.console.border}; border-radius: 4px; overflow: hidden; @@ -313,17 +313,17 @@ const StyledWrapper = styled.div` min-height: 200px; max-height: 400px; - .network-logs { + .network-logs-container { background: ${(props) => props.theme.console.contentBg} !important; color: ${(props) => props.theme.console.messageColor} !important; height: 100% !important; max-height: 400px !important; + padding: 0.5rem !important; - pre { + .network-logs-pre { color: ${(props) => props.theme.console.messageColor} !important; font-size: ${(props) => props.theme.font.size.xs} !important; line-height: 1.4 !important; - padding: 12px !important; } } } diff --git a/packages/bruno-app/src/components/Devtools/Console/RequestDetailsPanel/index.js b/packages/bruno-app/src/components/Devtools/Console/RequestDetailsPanel/index.js index 077c319dc..44f125c3a 100644 --- a/packages/bruno-app/src/components/Devtools/Console/RequestDetailsPanel/index.js +++ b/packages/bruno-app/src/components/Devtools/Console/RequestDetailsPanel/index.js @@ -141,7 +141,7 @@ const NetworkTab = ({ response }) => {

Network Logs

-
+
{timeline.length > 0 ? ( ) : ( diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/GrpcTimelineItem/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/GrpcTimelineItem/index.js index 86bc10034..ed26153cb 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/GrpcTimelineItem/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/GrpcTimelineItem/index.js @@ -245,7 +245,7 @@ const GrpcTimelineItem = ({ timestamp, request, response, eventType, eventData, }; return ( - +
{isCollapsed ? : }
diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Body/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Body/index.js index e86d40669..c4a918960 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Body/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Body/index.js @@ -6,7 +6,7 @@ const BodyBlock = ({ collection, data, dataBuffer, headers, error, item, type }) return (
toggleBody(!isBodyCollapsed)}> -
+        
           
{isBodyCollapsed ? '▼' : '▶'}
Body
@@ -26,7 +26,7 @@ const BodyBlock = ({ collection, data, dataBuffer, headers, error, item, type }) />
) : ( -
No Body found
+
No Body found
)}
)} diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Headers/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Headers/index.js index 4f28cf6e8..812a61de9 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Headers/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Headers/index.js @@ -6,7 +6,7 @@ const HeadersBlock = ({ headers, type }) => { return (
toggleHeaders(!areHeadersCollapsed)}> -
+        
           
{areHeadersCollapsed ? '▼' : '▶'}
Headers {headers && Object.keys(headers).length > 0 &&
({Object.keys(headers).length})
} @@ -16,7 +16,7 @@ const HeadersBlock = ({ headers, type }) => {
{headers && Object.keys(headers).length > 0 ? - :
No Headers found
} + :
No Headers found
}
)}
diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Method/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Method/index.js index 3f3cf7d36..bd4900cce 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Method/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Method/index.js @@ -1,19 +1,15 @@ +import { useTheme } from 'providers/Theme'; + const Method = ({ method }) => { + const { theme } = useTheme(); + const methodUpper = method?.toUpperCase(); + const methodColor = theme.request.methods[methodUpper?.toLowerCase()] || theme.text; + return ( - - {method?.toUpperCase()} + + {methodUpper} ); }; -const methodColors = { - GET: 'text-green-500', - POST: 'text-blue-500', - PUT: 'text-yellow-500', - DELETE: 'text-red-500', - PATCH: 'text-purple-500', - OPTIONS: 'text-gray-500', - HEAD: 'text-gray-500' -}; - export default Method; diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Status/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Status/index.js index 0d96a8e4c..e78c656e5 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Status/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Status/index.js @@ -1,26 +1,23 @@ +import { useTheme } from 'providers/Theme'; + const Status = ({ statusCode, statusText }) => { + const { theme } = useTheme(); + + let statusColor = theme.colors.text.muted; + if (statusCode >= 200 && statusCode < 300) { + statusColor = theme.requestTabPanel.responseOk; + } else if (statusCode >= 300 && statusCode < 400) { + statusColor = theme.colors.text.warning; + } else if (statusCode >= 400 && statusCode < 600) { + statusColor = theme.requestTabPanel.responseError; + } + return ( - + {statusCode}{' '} {statusText || ''} ); }; -const statusColor = (statusCode) => { - if (statusCode >= 200 && statusCode < 300) { - return 'text-green-500'; - } else if (statusCode >= 300 && statusCode < 400) { - return 'text-yellow-500'; - } else if (statusCode >= 400 && statusCode < 600) { - return 'text-red-500'; - } else { - return 'text-gray-500'; - } -}; - export default Status; diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Network/StyledWrapper.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Network/StyledWrapper.js new file mode 100644 index 000000000..3ea19abdd --- /dev/null +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Network/StyledWrapper.js @@ -0,0 +1,53 @@ +import styled from 'styled-components'; + +const StyledWrapper = styled.div` + .network-logs-container { + background: ${(props) => props.theme.codemirror.bg}; + color: ${(props) => props.theme.text}; + border-radius: 4px; + overflow: auto; + height: 24rem; + } + + .network-logs-pre { + white-space: pre-wrap; + font-size: ${(props) => props.theme.font.size.base}; + font-family: var(--font-family-mono); + } + + .network-logs-entry { + color: ${(props) => props.theme.colors.text.muted}; + + &--request { + color: ${(props) => props.theme.textLink}; + } + + &--response { + color: ${(props) => props.theme.colors.text.green}; + } + + &--error { + color: ${(props) => props.theme.colors.text.danger}; + } + + &--tls { + color: ${(props) => props.theme.colors.text.purple}; + } + + &--info { + color: ${(props) => props.theme.colors.text.yellow}; + } + } + + .network-logs-separator { + border-top: 2px solid ${(props) => props.theme.border.border1}; + width: 100%; + margin: 0.5rem 0; + } + + .network-logs-spacing { + margin-top: 1rem; + } +`; + +export default StyledWrapper; diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Network/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Network/index.js index d9d0e71a4..4096339e8 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Network/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Network/index.js @@ -1,52 +1,56 @@ +import StyledWrapper from './StyledWrapper'; + const Network = ({ logs }) => { return ( -
-
-        {logs.map((currentLog, index) => {
-          if (index > 0 && currentLog?.type === 'separator') {
-            return 
; - } - const nextLog = logs[index + 1]; - const isSameLogType = nextLog?.type === currentLog?.type; - return ( - <> - - {!isSameLogType &&
} - - ); - })} -
-
+ +
+
+          {logs.map((currentLog, index) => {
+            if (index > 0 && currentLog?.type === 'separator') {
+              return 
; + } + const nextLog = logs[index + 1]; + const isSameLogType = nextLog?.type === currentLog?.type; + return ( +
+ + {!isSameLogType &&
} +
+ ); + })} +
+
+
); }; const NetworkLogsEntry = ({ entry }) => { const { type, message } = entry; - let className = ''; + let className = 'network-logs-entry'; switch (type) { case 'request': - className = 'text-blue-500'; + className = 'network-logs-entry network-logs-entry--request'; break; case 'response': - className = 'text-green-500'; + className = 'network-logs-entry network-logs-entry--response'; break; case 'error': - className = 'text-red-500'; + className = 'network-logs-entry network-logs-entry--error'; break; case 'tls': - className = 'text-purple-500'; + className = 'network-logs-entry network-logs-entry--tls'; break; case 'info': - className = 'text-yellow-500'; + className = 'network-logs-entry network-logs-entry--info'; break; default: - className = 'text-gray-400'; + className = 'network-logs-entry'; break; } return ( -
+
{message}
); diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Response/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Response/index.js index 0f4a83645..84dd6920f 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Response/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Response/index.js @@ -27,8 +27,8 @@ const Response = ({ collection, response, item }) => { {/* Status */}
- {response.duration && {response.duration}ms} - {response.size && {response.size}B} + {response.duration && {response.duration}ms} + {response.size && {response.size}B}
{/* Headers */} diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/StyledWrapper.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/StyledWrapper.js new file mode 100644 index 000000000..0cb4ab5b7 --- /dev/null +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/StyledWrapper.js @@ -0,0 +1,113 @@ +import styled from 'styled-components'; +import { rgba } from 'polished'; + +const StyledWrapper = styled.div` + .timeline-item { + border-bottom: 2px solid ${(props) => rgba(props.theme.colors.text.warning, 0.5)}; + padding: 0.5rem 0; + + &--oauth2 { + border-bottom: 2px solid ${(props) => rgba(props.theme.primary.solid, 0.5)}; + } + } + + .timeline-item-header { + position: relative; + cursor: pointer; + } + + .timeline-item-header-content { + display: flex; + justify-content: space-between; + align-items: center; + min-width: 0; + } + + .timeline-item-header-items { + display: flex; + align-items: center; + gap: 0.5rem; + min-width: 0; + } + + .timeline-item-url { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-top: 0.25rem; + color: ${(props) => props.theme.colors.text.muted}; + } + + .timeline-item-timestamp { + color: ${(props) => props.theme.colors.text.muted}; + flex-shrink: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .timeline-item-timestamp-iso { + opacity: 0.7; + color: ${(props) => props.theme.colors.text.muted}; + } + + .timeline-item-oauth-label { + opacity: 0.5; + color: ${(props) => props.theme.text}; + } + + .timeline-item-content { + overflow: hidden; + } + + .timeline-item-tabs { + display: flex; + margin-bottom: 1rem; + } + + .timeline-item-tab { + margin-right: 1rem; + position: relative; + padding: 0.5rem 1rem; + color: ${(props) => props.theme.colors.text.muted}; + background: none; + border: none; + cursor: pointer; + font-size: ${(props) => props.theme.font.size.base}; + + &--active { + color: ${(props) => props.theme.tabs.active.color}; + + &:after { + content: ''; + position: absolute; + bottom: -1px; + left: 0; + right: 0; + height: 2px; + background: ${(props) => props.theme.tabs.active.border}; + } + } + } + + .timeline-item-tab-content { + word-break: break-all; + } + + .timeline-item-metadata { + color: ${(props) => props.theme.colors.text.muted}; + margin-left: 0.5rem; + font-size: ${(props) => props.theme.font.size.base}; + } + + .collapsible-section { + .section-header { + cursor: pointer; + pre { + color: ${(props) => rgba(props.theme.primary.solid, 0.8)}; + } + } + } +`; + +export default StyledWrapper; diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/index.js index b680c73ca..fc0c562cd 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/index.js @@ -5,6 +5,7 @@ import Response from './Response/index'; import Method from './Common/Method/index'; import Status from './Common/Status/index'; import { RelativeTime } from './Common/Time/index'; +import StyledWrapper from './StyledWrapper'; const TimelineItem = ({ timestamp, request, response, item, collection, isOauth2, hideTimestamp = false }) => { const [isCollapsed, _toggleCollapse] = useState(false); @@ -15,72 +16,74 @@ const TimelineItem = ({ timestamp, request, response, item, collection, isOauth2 const showNetworkLogs = response.timeline && response.timeline.length > 0; return ( -
-
-
-
- - - - {isOauth2 ?
[oauth2.0]
: null} - {!hideTimestamp && ( - <> -
[{new Date(timestamp).toISOString()}]
- - - - - )} + +
+
+
+
+ + + + {isOauth2 &&
[oauth2.0]
} + {!hideTimestamp && ( + <> +
[{new Date(timestamp).toISOString()}]
+ + + + + )} +
+
{url}
-
{url}
-
- {isCollapsed && ( -
- {/* Tabs */} -
- - - {showNetworkLogs && ( + {isCollapsed && ( +
+ {/* Tabs */} +
- )} + + {showNetworkLogs && ( + + )} +
+ + {/* Tab Content */} +
+ {/* Request Tab */} + {activeTab === 'request' && ( + + )} + + {/* Response Tab */} + {activeTab === 'response' && ( + + )} + + {/* Network Logs Tab */} + {activeTab === 'networkLogs' && showNetworkLogs && ( + + )} +
- - {/* Tab Content */} -
- {/* Request Tab */} - {activeTab === 'request' && ( - - )} - - {/* Response Tab */} - {activeTab === 'response' && ( - - )} - - {/* Network Logs Tab */} - {activeTab === 'networkLogs' && showNetworkLogs && ( - - )} -
-
- )} -
+ )} +
+ ); }; diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/index.js index 3b5ea4531..d371dcc04 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/index.js @@ -78,7 +78,7 @@ const Timeline = ({ collection, item }) => { if (isGrpcRequest) { return ( -
+
{ // Regular HTTP request return ( -
+