Files
hetty/admin/src/lib/components/RequestTabs.tsx

92 lines
3.1 KiB
TypeScript
Raw Normal View History

2022-02-22 14:10:39 +01:00
import { TabContext, TabList, TabPanel } from "@mui/lab";
import { Box, Tab } from "@mui/material";
2022-02-23 15:20:23 +01:00
import React, { useState } from "react";
2022-02-22 14:10:39 +01:00
2022-02-23 15:20:23 +01:00
import { KeyValuePairTable, KeyValuePair, KeyValuePairTableProps } from "./KeyValuePair";
import Editor from "lib/components/Editor";
2022-02-22 14:10:39 +01:00
enum TabValue {
QueryParams = "queryParams",
Headers = "headers",
Body = "body",
}
interface RequestTabsProps {
2022-02-22 14:10:39 +01:00
queryParams: KeyValuePair[];
headers: KeyValuePair[];
onQueryParamChange?: KeyValuePairTableProps["onChange"];
onQueryParamDelete?: KeyValuePairTableProps["onDelete"];
onHeaderChange?: KeyValuePairTableProps["onChange"];
onHeaderDelete?: KeyValuePairTableProps["onDelete"];
body?: string | null;
onBodyChange?: (value: string) => void;
2022-02-23 15:20:23 +01:00
}
2022-02-22 14:10:39 +01:00
function RequestTabs(props: RequestTabsProps): JSX.Element {
2022-02-22 14:10:39 +01:00
const {
queryParams,
onQueryParamChange,
onQueryParamDelete,
headers,
onHeaderChange,
onHeaderDelete,
body,
onBodyChange,
} = props;
const [tabValue, setTabValue] = useState(TabValue.QueryParams);
const tabSx = {
textTransform: "none",
};
const queryParamsLength = onQueryParamChange ? queryParams.length - 1 : queryParams.length;
const headersLength = onHeaderChange ? headers.length - 1 : headers.length;
2022-02-22 14:10:39 +01:00
return (
<Box sx={{ display: "flex", flexDirection: "column", height: "100%" }}>
2022-02-22 14:10:39 +01:00
<TabContext value={tabValue}>
<Box sx={{ borderBottom: 1, borderColor: "divider", mb: 1 }}>
2022-02-22 14:10:39 +01:00
<TabList onChange={(_, value) => setTabValue(value)}>
<Tab
value={TabValue.QueryParams}
label={"Query Params" + (queryParamsLength ? ` (${queryParamsLength})` : "")}
2022-02-22 14:10:39 +01:00
sx={tabSx}
/>
<Tab value={TabValue.Headers} label={"Headers" + (headersLength ? ` (${headersLength})` : "")} sx={tabSx} />
2022-02-22 14:10:39 +01:00
<Tab
value={TabValue.Body}
label={"Body" + (body?.length ? ` (${body.length} byte` + (body.length > 1 ? "s" : "") + ")" : "")}
2022-02-22 14:10:39 +01:00
sx={tabSx}
/>
</TabList>
</Box>
<Box flex="1 auto" overflow="scroll" height="100%">
<TabPanel value={TabValue.QueryParams} sx={{ p: 0, height: "100%" }}>
2022-02-22 14:10:39 +01:00
<Box>
<KeyValuePairTable items={queryParams} onChange={onQueryParamChange} onDelete={onQueryParamDelete} />
</Box>
</TabPanel>
<TabPanel value={TabValue.Headers} sx={{ p: 0, height: "100%" }}>
2022-02-22 14:10:39 +01:00
<Box>
<KeyValuePairTable items={headers} onChange={onHeaderChange} onDelete={onHeaderDelete} />
</Box>
</TabPanel>
<TabPanel value={TabValue.Body} sx={{ p: 0, height: "100%" }}>
<Editor
content={body || ""}
2022-02-22 14:10:39 +01:00
onChange={(value) => {
onBodyChange && onBodyChange(value || "");
2022-02-22 14:10:39 +01:00
}}
monacoOptions={{ readOnly: onBodyChange === undefined }}
2022-02-22 14:10:39 +01:00
contentType={headers.find(({ key }) => key.toLowerCase() === "content-type")?.value}
/>
</TabPanel>
</Box>
</TabContext>
</Box>
);
}
export default RequestTabs;