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 DeleteIcon from "@material-ui/icons/Delete"; import React, { useRef, useState } from "react"; import { gql, useMutation, useQuery } from "@apollo/client"; import { withoutTypename } from "../../lib/omitTypename"; import { Alert } from "@material-ui/lab"; import { useClearHTTPRequestLog } from "./hooks/useClearHTTPRequestLog"; import { ConfirmationDialog, useConfirmationDialog, } from "./ConfirmationDialog"; 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 [ setFilterMutate, { error: setFilterErr, loading: setFilterLoading }, ] = useMutation<{ setHttpRequestLogFilter: SearchFilter | null; }>(SET_FILTER, { update(cache, { data: { setHttpRequestLogFilter } }) { cache.writeQuery({ query: FILTER, data: { httpRequestLogFilter: setHttpRequestLogFilter, }, }); }, }); const [ clearHTTPRequestLog, clearHTTPRequestLogResult, ] = useClearHTTPRequestLog(); const clearHTTPConfirmationDialog = useConfirmationDialog(); 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 ( 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" /> 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;