import { Button, type ComboboxItem, type ComboboxLikeRenderOptionInput, Grid, GridCol, Group, LoadingOverlay, Popover, Select, Stack, TextInput, } 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 { FaComputer, FaDesktop, FaTerminal } from 'react-icons/fa6'; import { buttonClasses, popoverClasses, selectClasses, textInputClasses } from 'styles'; import type { GuacamoleClient } from 'types'; import DebouncedGuacamoleClient from './DebouncedGuacamoleClient'; import GuacamoleClientSettingsItem from './GuacamoleClientSettingsItem'; export function GuacamoleClients() { const defaultGuacamoleClient: GuacamoleClient = { id: undefined, clientName: '', clientIdentifier: '', enabled: 1, type: 'SSH', }; const form = useForm({ initialValues: defaultGuacamoleClient, validate: { clientName: isNotEmpty('Client Name is required'), clientIdentifier: isNotEmpty('Client Identifier is required'), }, }); const types: string[] = ['SSH', 'RDP', 'VNC']; const [searchValue, setSearchValue] = useState(''); const [debouncedSearch] = useDebouncedValue(searchValue, 500); const endpoint = 'api/guacamoleClients'; const { data: guacamoleClientsData, isFetching: guacamoleClientsIsFetching } = useQueryAPI({ endpoint: endpoint, }); const guacamoleClients: GuacamoleClient[] = guacamoleClientsData.filter( (a: GuacamoleClient) => a.clientName.toLowerCase().includes((debouncedSearch as string).toLowerCase()) || a.clientIdentifier .toLowerCase() .includes((debouncedSearch as string).toLowerCase()), ) || []; const { mutateAsync } = useMutationAPI(); const { isMobile, theme } = useCommonHooks(); 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, enabled: 1 }, }); handleClose(); })} >