import CloseIcon from '@mui/icons-material/Close'; import FindReplaceIcon from '@mui/icons-material/FindReplace'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; import Button from '@mui/material/Button'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; import FormHelperText from '@mui/material/FormHelperText'; import IconButton from '@mui/material/IconButton'; import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import ToggleButton from '@mui/material/ToggleButton'; import Toolbar from '@mui/material/Toolbar'; import useMediaQuery from '@mui/material/useMediaQuery'; import { observer } from 'mobx-react-lite'; import React, { useCallback, useState } from 'react'; import type SearchPanelStore from './SearchPanelStore'; const SPLIT_MEDIA_QUERY = '@media (max-width: 1200px)'; const ABBREVIATE_MEDIA_QUERY = '@media (max-width: 720px)'; function SearchToolbar({ store }: { store: SearchPanelStore }): JSX.Element { const { id: panelId, query: { search, valid, caseSensitive, literal, regexp, replace }, invalidRegexp, } = store; const split = useMediaQuery(SPLIT_MEDIA_QUERY); const abbreviate = useMediaQuery(ABBREVIATE_MEDIA_QUERY); const [showRepalceState, setShowReplaceState] = useState(false); const showReplace = !split || showRepalceState || replace !== ''; const searchHelperId = `${panelId}-search-helper`; const replaceId = `${panelId}-replace`; const searchFieldRef = useCallback( (element: HTMLInputElement | null) => store.setSearchField(element ?? undefined), [store], ); return ( store.updateQuery({ search: event.target.value }) } onKeyDown={(event) => { if (event.key === 'Enter') { event.preventDefault(); if (event.shiftKey) { store.findPrevious(); } else { store.findNext(); } } }} variant="standard" size="small" sx={{ mt: '4px', mr: 1 }} inputRef={searchFieldRef} /> {invalidRegexp && ( ({ my: 0, mr: 1, fontSize: 'inherit', color: theme.palette.error.main, })} > Invalid regexp )} store.findPrevious()} color="inherit" > store.findNext()} color="inherit" > store.updateQuery({ caseSensitive: event.target.checked }) } size="small" /> } aria-label="Match case" label={abbreviate ? 'Case' : 'Match case'} /> store.updateQuery({ literal: event.target.checked }) } size="small" /> } aria-label="Literal" label={abbreviate ? 'Lit' : 'Literal'} /> store.updateQuery({ regexp: event.target.checked }) } size="small" /> } label="Regexp" /> {split && ( { if (showReplace) { store.updateQuery({ replace: '' }); setShowReplaceState(false); } else { setShowReplaceState(true); } }} aria-label="Show replace options" aria-controls={replaceId} size="small" className="iconOnly" > )} store.updateQuery({ replace: event.target.value }) } onKeyDown={(event) => { if (event.key === 'Enter') { event.preventDefault(); store.replaceNext(); } }} variant="standard" size="small" sx={{ mt: '4px', mr: 1 }} /> store.close()} color="inherit" > ); } export default observer(SearchToolbar);