import React, { RefObject } from 'react'; import { Box, ClickAwayListener, Divider, List, ListItem, Paper, TextField, Typography } from '@mui/material'; import { SearchResponse } from '../../../../../../@types/messageHandler'; import useStore from '../../../hooks/useStore'; import { messageChannelContext } from '../../../provider/MessageChannel'; import './SearchBox.css'; import ContextMenu from '../../reusable/ContextMenu'; import { useSnackbar } from 'notistack'; const SearchBox: React.FC = () => { const messageHandler = React.useContext(messageChannelContext); const [store, dispatch] = useStore(); const [search, setSearch] = React.useState(''); const [focus, setFocus] = React.useState(false); const [searchResult, setSearchResult] = React.useState(); const anchor = React.useRef(null); const { enqueueSnackbar } = useSnackbar(); const selectItem = (id: string) => { dispatch({ type: 'downloadOptions', payload: { ...store.downloadOptions, id } }); }; React.useEffect(() => { if (search.trim().length === 0) return setSearchResult({ isOk: true, value: [] }); const timeOutId = setTimeout(async () => { if (search.trim().length > 3) { const s = await messageHandler?.search({search}); if (s && s.isOk) s.value = s.value.slice(0, 10); setSearchResult(s); } }, 500); return () => clearTimeout(timeOutId); }, [search]); const anchorBounding = anchor.current?.getBoundingClientRect(); return setFocus(false)}> setFocus(true)} onChange={e => setSearch(e.target.value)} variant='outlined' label='Search' fullWidth /> {searchResult !== undefined && searchResult.isOk && searchResult.value.length > 0 && focus && {searchResult && searchResult.isOk ? searchResult.value.map((a, ind, arr) => { const imageRef = React.createRef(); const summaryRef = React.createRef(); return { selectItem(a.id); setFocus(false); }}> thumbnail {a.name} {a.desc && {a.desc} } {a.lang && Languages: {a.lang.join(', ')} } ID: {a.id} { await navigator.clipboard.writeText(a.image); enqueueSnackbar('Copied URL to clipboard', { variant: 'info' }); }}, { text: 'Open image in new tab', onClick: () => { window.open(a.image); } } ]} popupItem={imageRef as RefObject} /> {a.desc && { await navigator.clipboard.writeText(a.desc!); enqueueSnackbar('Copied summary to clipboard', { variant: 'info' }); }, text: 'Copy summary to clipboard' } ]} popupItem={summaryRef as RefObject} /> } {(ind < arr.length - 1) && } ; }) : <>} } ; }; export default SearchBox;