import React, { useState } from "react"; import { connect } from "react-redux"; import { withRouter, RouteComponentProps } from "react-router"; import { BaseText } from "components/designSystems/blueprint/TextComponent"; import styled from "styled-components"; import { AppState } from "reducers"; import { ActionResponse } from "api/ActionAPI"; import { formatBytes } from "utils/helpers"; import { APIEditorRouteParams } from "constants/routes"; import LoadingOverlayScreen from "components/editorComponents/LoadingOverlayScreen"; import ReadOnlyEditor from "components/editorComponents/ReadOnlyEditor"; import { getActionResponses } from "selectors/entitiesSelector"; import { Colors } from "constants/Colors"; import _ from "lodash"; import { RequestView } from "./RequestView"; import { useLocalStorage } from "utils/hooks/localstorage"; import { CHECK_REQUEST_BODY, DONT_SHOW_THIS_AGAIN, SHOW_REQUEST, } from "constants/messages"; import { TabComponent } from "components/ads/Tabs"; import Text, { Case, TextType } from "components/ads/Text"; import Icon from "components/ads/Icon"; import { Classes, Variant } from "components/ads/common"; import { EditorTheme } from "./CodeEditor/EditorConfig"; import Callout from "components/ads/Callout"; import Button from "components/ads/Button"; const ResponseWrapper = styled.div` position: relative; flex: 1; height: 50%; background-color: ${(props) => props.theme.colors.apiPane.responseBody.bg}; .react-tabs__tab-panel { overflow: hidden; } `; const ResponseMetaInfo = styled.div` display: flex; ${BaseText} { color: #768896; margin-left: ${(props) => props.theme.spaces[9]}px; } `; const ResponseMetaWrapper = styled.div` align-items: center; display: flex; position: absolute; right: ${(props) => props.theme.spaces[12]}px; top: ${(props) => props.theme.spaces[4]}px; `; const StatusCodeText = styled(BaseText)<{ code: string }>` color: ${(props) => props.code.match(/2\d\d/) ? props.theme.colors.primaryOld : Colors.RED}; `; // const TableWrapper = styled.div` // &&& { // table { // table-layout: fixed; // width: 100%; // td { // font-size: 12px; // width: 50%; // white-space: nowrap; // overflow: hidden; // text-overflow: ellipsis; // } // } // } // `; interface ReduxStateProps { responses: Record; isRunning: Record; } // const ResponseHeadersView = (props: { data: Record }) => { // if (!props.data) return
; // return ( // // // // // // // // // // {Object.keys(props.data).map(k => ( // // // // // ))} // //
KeyValue
{k}{props.data[k].join(", ")}
//
// ); // }; type Props = ReduxStateProps & RouteComponentProps & { theme?: EditorTheme }; export const EMPTY_RESPONSE: ActionResponse = { statusCode: "", duration: "", body: {}, headers: {}, request: { headers: {}, body: {}, httpMethod: "", url: "", }, size: "", }; const TabbedViewWrapper = styled.div<{ isCentered: boolean }>` height: calc(100% - 30px); &&& { ul.react-tabs__tab-list { padding: 0px ${(props) => props.theme.spaces[12]}px; } } ${(props) => props.isCentered ? ` &&& { .react-tabs__tab-panel { display: flex; align-items: center; justify-content: center; } } ` : null} `; const SectionDivider = styled.div` height: 2px; width: 100%; background: ${(props) => props.theme.colors.apiPane.dividerBg}; `; const Flex = styled.div` display: flex; align-items: center; margin-left: 20px; span:first-child { margin-right: ${(props) => props.theme.spaces[1] + 1}px; } `; const NoResponseContainer = styled.div` .${Classes.ICON} { margin-right: 0px; svg { width: 150px; height: 150px; } } .${Classes.TEXT} { margin-top: ${(props) => props.theme.spaces[9]}px; } `; const FailedMessage = styled.div` display: flex; align-items: center; justify-content: space-between; width: 100%; `; const ButtonContainer = styled.div` display: flex; align-items: center; span { color: ${Colors.Galliano}; cursor: pointer; } button { margin-left: ${(props) => props.theme.spaces[9]}px; } `; const ApiResponseView = (props: Props) => { const { match: { params: { apiId }, }, responses, } = props; let response: ActionResponse = EMPTY_RESPONSE; let isRunning = false; let hasFailed = false; if (apiId && apiId in responses) { response = responses[apiId] || EMPTY_RESPONSE; isRunning = props.isRunning[apiId]; hasFailed = response.statusCode ? response.statusCode[0] !== "2" : false; } const [requestDebugVisible, setRequestDebugVisible] = useLocalStorage( "requestDebugVisible", "true", ); const [selectedIndex, setSelectedIndex] = useState(0); const tabs = [ { key: "body", title: "Response Body", panelComponent: ( <> {hasFailed && !isRunning && requestDebugVisible && ( {CHECK_REQUEST_BODY} { setRequestDebugVisible(false); }} > {DONT_SHOW_THIS_AGAIN}