import React, { useEffect, useState } from 'react'; import { FormGroup, Spinner, Select, SelectList, SelectOption, MenuToggleElement, MenuToggle, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, Button, } from '@patternfly/react-core'; import { TimesIcon } from '@patternfly/react-icons'; import { useAppDispatch, useAppSelector } from '../../../../../store/hooks'; import { useGetSourceUploadInfoQuery } from '../../../../../store/provisioningApi'; import { changeAzureResourceGroup, selectAzureResourceGroup, selectAzureSource, } from '../../../../../store/wizardSlice'; export const AzureResourceGroups = () => { const azureSource = useAppSelector(selectAzureSource); const azureResourceGroup = useAppSelector(selectAzureResourceGroup); const dispatch = useAppDispatch(); const [isOpen, setIsOpen] = useState(false); const [inputValue, setInputValue] = useState(''); const [filterValue, setFilterValue] = useState(''); const [selectOptions, setSelectOptions] = useState([]); const { data: sourceDetails, isFetching, isSuccess, } = useGetSourceUploadInfoQuery( { id: parseInt(azureSource as string) }, { skip: !azureSource, } ); const resourceGroups = sourceDetails?.azure?.resource_groups || []; useEffect(() => { let filteredGroups = resourceGroups; if (filterValue) { filteredGroups = resourceGroups.filter((group: string) => String(group).toLowerCase().includes(filterValue.toLowerCase()) ); if (!isOpen) { setIsOpen(true); } } setSelectOptions(filteredGroups); // This useEffect hook should run *only* on when the filter value changes. // eslint's exhaustive-deps rule does not support this use. // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterValue, resourceGroups]); const onInputClick = () => { if (!isOpen) { setIsOpen(true); } else if (!inputValue) { setIsOpen(false); } }; const onTextInputChange = (_event: React.FormEvent, value: string) => { setInputValue(value); setFilterValue(value); if (value !== azureResourceGroup) { dispatch(changeAzureResourceGroup('')); } }; const setResourceGroup = ( _event: React.MouseEvent, selection: string ) => { const resource = resourceGroups.find((resource) => resource === selection) || ''; setIsOpen(false); dispatch(changeAzureResourceGroup(resource)); }; const handleClear = () => { dispatch(changeAzureResourceGroup('')); setInputValue(''); setFilterValue(''); }; const toggle = (toggleRef: React.Ref) => ( setIsOpen(!isOpen)} isExpanded={isOpen} isDisabled={!azureSource} > {azureResourceGroup && ( )} ); return ( ); };