import { Box, Checkbox, CircularProgress, ClickAwayListener, FormControlLabel, InputBase, Paper, Popper, Tooltip, useTheme, } from "@mui/material"; import IconButton from "@mui/material/IconButton"; import SearchIcon from "@mui/icons-material/Search"; import FilterListIcon from "@mui/icons-material/FilterList"; import DeleteIcon from "@mui/icons-material/Delete"; import React, { useRef, useState } from "react"; import { gql, useMutation, useQuery } from "@apollo/client"; import { withoutTypename } from "../../lib/omitTypename"; import { Alert } from "@mui/lab"; import { useClearHTTPRequestLog } from "./hooks/useClearHTTPRequestLog"; import { ConfirmationDialog, useConfirmationDialog } from "./ConfirmationDialog"; const FILTER = gql` query HttpRequestLogFilter { httpRequestLogFilter { onlyInScope searchExpression } } `; const SET_FILTER = gql` mutation SetHttpRequestLogFilter($filter: HttpRequestLogFilterInput) { setHttpRequestLogFilter(filter: $filter) { onlyInScope searchExpression } } `; export interface SearchFilter { onlyInScope: boolean; searchExpression: string; } function Search(): JSX.Element { const theme = useTheme(); const [searchExpr, setSearchExpr] = useState(""); const { loading: filterLoading, error: filterErr, data: filter, } = useQuery(FILTER, { onCompleted: (data) => { setSearchExpr(data.httpRequestLogFilter?.searchExpression || ""); }, }); const [setFilterMutate, { error: setFilterErr, loading: setFilterLoading }] = useMutation<{ setHttpRequestLogFilter: SearchFilter | null; }>(SET_FILTER, { update(cache, { data }) { cache.writeQuery({ query: FILTER, data: { httpRequestLogFilter: data?.setHttpRequestLogFilter, }, }); }, onError: () => {}, }); const [clearHTTPRequestLog, clearHTTPRequestLogResult] = useClearHTTPRequestLog(); const clearHTTPConfirmationDialog = useConfirmationDialog(); const filterRef = useRef(null); const [filterOpen, setFilterOpen] = useState(false); const handleSubmit = (e: React.SyntheticEvent) => { setFilterMutate({ variables: { filter: { ...withoutTypename(filter?.httpRequestLogFilter), searchExpression: searchExpr, }, }, }); setFilterOpen(false); e.preventDefault(); }; const handleClickAway = (event: MouseEvent | TouchEvent) => { if (filterRef?.current && filterRef.current.contains(event.target as HTMLElement)) { return; } setFilterOpen(false); }; return ( setFilterOpen(!filterOpen)} sx={{ p: 1, color: filter?.httpRequestLogFilter?.onlyInScope ? "primary.main" : "inherit", }} > {filterLoading || setFilterLoading ? ( ) : ( )} setSearchExpr(e.target.value)} onFocus={() => setFilterOpen(true)} /> setFilterMutate({ variables: { filter: { ...withoutTypename(filter?.httpRequestLogFilter), onlyInScope: e.target.checked, }, }, }) } /> } label="Only show in-scope requests" /> All proxy logs are going to be removed. This action cannot be undone. ); } function Error(props: { prefix: string; error?: Error }) { if (!props.error) return null; return ( {props.prefix}: {props.error.message} ); } export default Search;