import { ActionIcon, Box, Button, Card, Divider, Grid, GridCol, Group, Highlight, Modal, Popover, Stack, Text, TextInput, } from '@mantine/core'; import { useDebouncedValue, useDisclosure } from '@mantine/hooks'; import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks'; import { useEffect, useState } from 'react'; import { FiHelpCircle, FiPlus } from 'react-icons/fi'; import { actionIconClasses, buttonClasses, cardClasses, modalClasses, textClasses, textInputClasses, } from 'styles'; import type { Provider } from 'types'; import DebouncedSearchProvider from './DebouncedSearchProvider'; import SearchProviderSettingsItem from './SearchProviderSettingsItem'; const SearchProviderSettings = () => { const endpoint = 'api/providers'; const { data: providers, isFetched: providersIsFetched } = useQueryAPI({ endpoint: endpoint, }); const [providerData, setProviderData] = useState([]); const { theme, isMobile, modalStyle } = useCommonHooks(); const { mutateAsync } = useMutationAPI(); const [newProvider, setNewProvider] = useState({ id: undefined, name: '', url: '', prefix: '', }); const [modalOpened, { open: openModal, close: closeModal }] = useDisclosure(false); const [searchValue, setSearchValue] = useState(''); const [debouncedSearch] = useDebouncedValue(searchValue, 500); useEffect(() => { if (providers && providersIsFetched) { setProviderData( providers .filter((a: Provider) => a.name.toLowerCase().includes(debouncedSearch.toLowerCase()), ) .sort((a: Provider, b: Provider) => (a.prefix > b.prefix ? 1 : -1)), ); } }, [providers, providersIsFetched, debouncedSearch]); return ( { closeModal(); }} style={modalStyle} closeOnEscape closeOnClickOutside > Add a new Search Provider { setNewProvider({ ...newProvider, name: event.target.value, }); }} /> { setNewProvider({ ...newProvider, prefix: event.target.value, }); }} /> { setNewProvider({ ...newProvider, url: event.target.value, }); }} /> Search Providers {'Search providers and shortcuts can be configured here.'} { 'Providers can be used in the search bar. By starting a search with the prefix, it will be redirected to the url of the provider to complete the search.' } { setSearchValue(event.target.value); }} /> {providerData?.map((provider: Provider) => ( { e.stopPropagation(); }} > ))} ); }; export default SearchProviderSettings;