import { Button, Grid, GridCol, Group, LoadingOverlay, Popover, Stack, TextInput, } from '@mantine/core'; import { isNotEmpty, matches, 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 { buttonClasses, popoverClasses, textInputClasses } from 'styles'; import type { WolClient } from 'types'; import DebouncedWolClient from './DebouncedWolClient'; import WolClientSettingsItem from './WolClientSettingsItem'; export function WolClients() { const { isMobile, theme, settings, updateSetting } = useCommonHooks(); const defaultWolClient: WolClient = { id: undefined, hostname: '', macAddress: '', }; const form = useForm({ initialValues: defaultWolClient, validate: { hostname: isNotEmpty('Hostname is required'), macAddress: matches( /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/, 'Invalid MAC Address', ), }, }); const endpoint = 'api/wolClients'; const { data: wolClientsData, isFetching: wolClientsIsFetching } = useQueryAPI({ endpoint: endpoint, }); const [searchValue, setSearchValue] = useState(''); const [debouncedSearch] = useDebouncedValue(searchValue, 500); const wolClients: WolClient[] = wolClientsData .filter( (a: WolClient) => a.hostname.toLowerCase().includes((debouncedSearch as string).toLowerCase()) || a.macAddress.toLowerCase().includes((debouncedSearch as string).toLowerCase()), ) .sort((a: WolClient, b: WolClient) => { switch (settings.wolClientsSettingsSort) { case 'A>Z': return a.hostname.toLocaleLowerCase() > b.hostname.toLocaleLowerCase() ? 1 : -1; case 'Z>A': return a.hostname.toLocaleLowerCase() < b.hostname.toLocaleLowerCase() ? 1 : -1; case 'Newest': if (a.id && b.id) { return a.id < b.id ? 1 : -1; } return -1; case 'Oldest': if (a.id && b.id) { return a.id > b.id ? 1 : -1; } return -1; default: return 0; } }) || []; const { mutateAsync } = useMutationAPI(); const [modalOpened, { open: openModal, close: closeModal }] = useDisclosure(false); const [isOpen, setIsOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); const handleClose = () => { closeModal(); form.reset(); }; useEffect(() => { if (debouncedSearch === searchValue) { setIsLoading(false); } }, [debouncedSearch]); return ( {modalOpened && ( { mutateAsync({ method: 'POST', endpoint: endpoint, body: values, }).catch((error) => { console.error(error); }); handleClose(); })} > } /> )} { updateSetting('wolClientsSettingsSort', value); }} customSearchEnabled={false} /> {wolClients.length > 0 ? ( wolClients?.map((client: WolClient) => ( )) ) : ( )} ); }