import FilterListIcon from "@mui/icons-material/FilterList"; import SearchIcon from "@mui/icons-material/Search"; import { Alert } from "@mui/lab"; import { Box, Checkbox, CircularProgress, ClickAwayListener, FormControlLabel, InputBase, Paper, Popper, Tooltip, useTheme, } from "@mui/material"; import IconButton from "@mui/material/IconButton"; import React, { useRef, useState } from "react"; import { HttpRequestLogFilterDocument, useHttpRequestLogFilterQuery, useSetHttpRequestLogFilterMutation, } from "lib/graphql/generated"; import { withoutTypename } from "lib/graphql/omitTypename"; function Search(): JSX.Element { const theme = useTheme(); const [searchExpr, setSearchExpr] = useState(""); const filterResult = useHttpRequestLogFilterQuery({ onCompleted: (data) => { setSearchExpr(data.httpRequestLogFilter?.searchExpression || ""); }, }); const filter = filterResult.data?.httpRequestLogFilter; const [setFilterMutate, setFilterResult] = useSetHttpRequestLogFilterMutation({ update(cache, { data }) { cache.writeQuery({ query: HttpRequestLogFilterDocument, data: { httpRequestLogFilter: data?.setHttpRequestLogFilter, }, }); }, }); const filterRef = useRef(null); const [filterOpen, setFilterOpen] = useState(false); const handleSubmit = (e: React.SyntheticEvent) => { setFilterMutate({ variables: { filter: { ...withoutTypename(filter), 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?.onlyInScope ? "primary.main" : "inherit", }} > {filterResult.loading || setFilterResult.loading ? ( ) : ( )} setSearchExpr(e.target.value)} onFocus={() => setFilterOpen(true)} /> setFilterMutate({ variables: { filter: { ...withoutTypename(filter), onlyInScope: e.target.checked, }, }, }) } /> } label="Only show in-scope requests" /> ); } function Error(props: { prefix: string; error?: Error }) { if (!props.error) return null; return ( {props.prefix}: {props.error.message} ); } export default Search;