import { Box, Checkbox, CircularProgress, ClickAwayListener, createStyles, FormControlLabel, InputBase, makeStyles, Paper, Popper, Theme, Tooltip, useTheme, } from "@material-ui/core"; import IconButton from "@material-ui/core/IconButton"; import SearchIcon from "@material-ui/icons/Search"; import FilterListIcon from "@material-ui/icons/FilterList"; import React, { useRef, useState } from "react"; import { gql, useApolloClient, useMutation, useQuery } from "@apollo/client"; import { withoutTypename } from "../../lib/omitTypename"; import { Alert } from "@material-ui/lab"; const FILTER = gql` query HttpRequestLogFilter { httpRequestLogFilter { onlyInScope } } `; const SET_FILTER = gql` mutation SetHttpRequestLogFilter($filter: HttpRequestLogFilterInput) { setHttpRequestLogFilter(filter: $filter) { onlyInScope } } `; const useStyles = makeStyles((theme: Theme) => createStyles({ root: { padding: "2px 4px", display: "flex", alignItems: "center", width: 400, }, input: { marginLeft: theme.spacing(1), flex: 1, }, iconButton: { padding: 10, }, filterPopper: { width: 400, marginTop: 6, zIndex: 99, }, filterOptions: { padding: theme.spacing(2), }, filterLoading: { marginRight: 1, color: theme.palette.text.primary, }, }) ); export interface SearchFilter { onlyInScope: boolean; } function Search(): JSX.Element { const classes = useStyles(); const theme = useTheme(); const { loading: filterLoading, error: filterErr, data: filter } = useQuery( FILTER ); const client = useApolloClient(); const [ setFilterMutate, { error: setFilterErr, loading: setFilterLoading }, ] = useMutation<{ setHttpRequestLogFilter: SearchFilter | null; }>(SET_FILTER, { update(_, { data: { setHttpRequestLogFilter } }) { client.writeQuery({ query: FILTER, data: { httpRequestLogFilter: setHttpRequestLogFilter, }, }); }, }); const filterRef = useRef(); const [filterOpen, setFilterOpen] = useState(false); const handleSubmit = (e: React.SyntheticEvent) => { e.preventDefault(); }; const handleClickAway = (event: React.MouseEvent) => { if (filterRef.current.contains(event.target as HTMLElement)) { return; } setFilterOpen(false); }; return ( {filterErr && ( Error fetching filter: {filterErr.message} )} {setFilterErr && ( Error setting filter: {setFilterErr.message} )} setFilterOpen(!filterOpen)} style={{ color: filter?.httpRequestLogFilter !== null ? theme.palette.secondary.main : "inherit", }} > {filterLoading || setFilterLoading ? ( ) : ( )} setFilterOpen(true)} /> setFilterMutate({ variables: { filter: { ...withoutTypename(filter?.httpRequestLogFilter), onlyInScope: e.target.checked, }, }, }) } /> } label="Only show in-scope requests" /> ); } export default Search;