import { Button, GridItem, Icon, SimpleGrid, Flex, Box, Card } from '@chakra-ui/react'; import React, { useEffect, useState } from 'react'; import MediaQuery from 'react-responsive' import { TbBook2, TbBuilding, TbFileDescription, TbHash, TbReportSearch, TbUserCircle } from 'react-icons/tb'; import search, { Book } from '../scripts/searcher'; import { IoLanguage } from 'react-icons/io5'; import { IoShareSocialOutline } from 'react-icons/io5'; import SearchInput from './SearchInput'; import { useDebounceEffect } from 'ahooks'; import { useTranslation } from 'react-i18next'; import SearchLanguage from './SearchLanguage'; import { MEDIA_QUERY_DESKTOP_STARTS, MEDIA_QUERY_MOBILE_ENDS } from '../constants/mediaquery'; import CopyToClipboardButton from './CopyToClipboardButton'; function constructQuery(parts: Record): string { return Object.keys(parts) .map((key) => parts[key] .split(' ') .filter((s) => s !== '') .map((s) => `${key}:"${s}"`) ) .flat() .join(''); } export interface SearchProps { setBooks: (books: Book[]) => void; } const Search: React.FC = ({ setBooks }) => { const { t } = useTranslation(); const [title, setTitle] = useState(''); const [author, setAuthor] = useState(''); const [publisher, setPublisher] = useState(''); const [extension, setExtension] = useState(''); const [language, setLanguage] = useState(''); const [isbn, setISBN] = useState(''); const [complexQuery, setComplexQuery] = useState(''); const [showLanguageDropdown, setShowLanguageDropdown] = useState(true) useEffect(() => { const params = new Proxy(new URLSearchParams(decodeURIComponent(window.location.search)), { //@ts-ignore get: (searchParams, prop) => searchParams.get(prop), }); //@ts-ignore params.title && setTitle(String(params.title)) //@ts-ignore params.author && setAuthor(String(params.author)) //@ts-ignore if (params.language) { //@ts-ignore setLanguage(String(params.language)) setShowLanguageDropdown(false) } }, []) const handleLanguageChange = (language: string) => { if (language == 'input') { setShowLanguageDropdown(false) } else { setLanguage(language) } } const handleLanguageReset = () => { setShowLanguageDropdown(true) setLanguage('') } const hasAnySearchBeenMade = () => { return ( title !== '' || author !== '' || language !== '' || publisher !== '' || extension !== '' || isbn !== '' ) } const copyToClipboard = () => { const searchBase = `${window.location.protocol}//${window.location.host}/?`; const searchQuery = encodeURIComponent(`title=${title}&author=${author}&language=${language}&publisher=${publisher}&isbn=${isbn}&extension=${extension}`) navigator.clipboard.writeText(`${searchBase}${searchQuery}`).then(() => { //console.log('Async: Copying to clipboard was successful!'); }, (err) => { //console.error('Async: Could not copy text: ', err); }); } useDebounceEffect( () => { const query = complexQuery ? complexQuery : constructQuery({ title, author, publisher, extension, language, isbn }); search(query, 100).then((books) => { setBooks(books); }); }, [title, author, publisher, extension, language, isbn, complexQuery], { wait: 300 } ); return ( <> } placeholder={t('book.title')} value={title} onChange={setTitle} /> } placeholder={t('book.author')} value={author} onChange={setAuthor} /> } placeholder={t('book.publisher')} value={publisher} onChange={setPublisher} /> } placeholder={t('book.extension')} value={extension} onChange={setExtension} /> {!showLanguageDropdown && (} placeholder={t('input.select_language')} value={language} onChange={handleLanguageChange} onClear={handleLanguageReset} />)} {showLanguageDropdown && (} placeholder={t('input.select_language')} value={language} onChange={handleLanguageChange} />)} } placeholder={t('book.isbn')} value={isbn} onChange={setISBN} /> } placeholder={t('search.complex')} value={complexQuery} onChange={setComplexQuery} /> ); }; export default Search;