import { Box, Button, Grid, GridCol, Group, Popover, Stack, Switch, TextInput, Tooltip, } from '@mantine/core'; import { isNotEmpty, useForm } from '@mantine/form'; import { useDebouncedValue, useDisclosure } from '@mantine/hooks'; import { AddItemModal, NoItemsFound, SettingsHeader } from 'components'; import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks'; import { useEffect, useState } from 'react'; import { FiPower } from 'react-icons/fi'; import { popoverClasses, switchClasses, textInputClasses, toolTipClasses } from 'styles'; import type { Provider } from 'types'; import DebouncedSearchProvider from './DebouncedSearchProvider'; import SearchProviderSettingsItem from './SearchProviderSettingsItem'; const SearchProviderSettings = () => { const defaultProvider = { id: undefined, name: '', url: '', prefix: '', default: 0, }; const form = useForm({ initialValues: defaultProvider, validate: { name: isNotEmpty('Name is required'), url: isNotEmpty('URL is required'), prefix: isNotEmpty('Prefix is required'), }, }); const endpoint = 'api/providers'; const { data: providerData, isFetched: providerDataIsFetched } = useQueryAPI({ endpoint: endpoint, }); const [providers, setProviders] = useState([]); const { isMobile, theme } = useCommonHooks(); const { mutateAsync } = useMutationAPI(); const [modalOpened, { open: openModal, close: closeModal }] = useDisclosure(false); const [searchValue, setSearchValue] = useState(''); const [debouncedSearch] = useDebouncedValue(searchValue, 500); const [isOpen, setIsOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); const handleClose = () => { closeModal(); form.reset(); }; useEffect(() => { if (providerData && providerDataIsFetched) { setProviders( providerData .filter( (a: Provider) => a.name.toLowerCase().includes(debouncedSearch.toLowerCase()) || a.url.toLowerCase().includes(debouncedSearch.toLowerCase()), ) .sort((a: Provider, b: Provider) => (a.prefix > b.prefix ? 1 : -1)), ); } if (debouncedSearch === searchValue) { setIsLoading(false); } }, [providerData, providerDataIsFetched, debouncedSearch]); return ( { mutateAsync({ method: 'POST', endpoint: endpoint, body: values, }); handleClose(); })} > } /> } /> {providers.length > 0 ? ( providers?.map((provider: Provider) => ( )) ) : ( )} ); }; export default SearchProviderSettings;