From 801c0c8bee087f18317b359ccdb849ad370c159b Mon Sep 17 00:00:00 2001 From: regexowl Date: Fri, 15 Aug 2025 15:21:38 +0200 Subject: [PATCH] src: Fix function types This updates types in several places to match their calls. --- .../Blueprints/BlueprintVersionFilter.tsx | 9 ++-- .../Blueprints/BuildImagesButton.tsx | 22 ++++++---- .../Blueprints/ImportBlueprintModal.tsx | 8 ++-- .../FileSystem/components/FileSystemTable.tsx | 23 ++++++---- .../ImageOutput/components/ArchSelect.tsx | 8 ++-- .../ImageOutput/components/ReleaseSelect.tsx | 10 +++-- .../steps/Kernel/components/KernelName.tsx | 4 +- .../Locale/components/KeyboardDropDown.tsx | 4 +- .../Locale/components/LanguagesDropDown.tsx | 4 +- .../steps/Oscap/components/PolicySelector.tsx | 12 ++--- .../Oscap/components/ProfileSelector.tsx | 16 +++---- .../steps/Packages/Packages.tsx | 31 ++++++++++--- .../components/ActivationKeysList.tsx | 13 ++++-- .../steps/Repositories/Repositories.tsx | 5 ++- .../steps/Snapshot/components/Templates.tsx | 5 ++- .../Aws/AwsSourcesSelect.tsx | 7 +-- .../Azure/AzureHyperVSelect.tsx | 8 +++- .../Azure/AzureResourceGroups.tsx | 5 ++- .../Azure/AzureSourcesSelect.tsx | 7 +-- .../Timezone/components/TimezoneDropDown.tsx | 4 +- .../steps/Users/components/UserInfo.tsx | 44 ++++++++++--------- .../CreateImageWizard/validators.ts | 29 ++++++++---- .../ImagesTable/ImagesTableToolbar.tsx | 8 +++- .../useMutationWithNotification.tsx | 2 +- src/Utilities/getErrorMessage.ts | 18 ++++++++ src/Utilities/useOnPremOpenSCAP.tsx | 14 +++--- src/test/setup.ts | 4 +- 27 files changed, 208 insertions(+), 116 deletions(-) create mode 100644 src/Utilities/getErrorMessage.ts diff --git a/src/Components/Blueprints/BlueprintVersionFilter.tsx b/src/Components/Blueprints/BlueprintVersionFilter.tsx index f3750f19..72a09cb3 100644 --- a/src/Components/Blueprints/BlueprintVersionFilter.tsx +++ b/src/Components/Blueprints/BlueprintVersionFilter.tsx @@ -32,10 +32,13 @@ const BlueprintVersionFilter: React.FC = ({ }; const onSelect = ( - _event: React.MouseEvent | undefined, - value: versionFilterType, + _event?: React.MouseEvent, + value?: string | number, ) => { - dispatch(setBlueprintVersionFilter(value)); + if (value === undefined) return; + + const typedValue = value as versionFilterType; + dispatch(setBlueprintVersionFilter(typedValue)); if (onFilterChange) onFilterChange(); setIsOpen(false); }; diff --git a/src/Components/Blueprints/BuildImagesButton.tsx b/src/Components/Blueprints/BuildImagesButton.tsx index 6304d98a..c7d41876 100644 --- a/src/Components/Blueprints/BuildImagesButton.tsx +++ b/src/Components/Blueprints/BuildImagesButton.tsx @@ -81,17 +81,21 @@ export const BuildImagesButton = ({ children }: BuildImagesButtonPropTypes) => { ); const onSelect = ( - _event: React.MouseEvent, - itemId: number, + _event?: React.MouseEvent, + itemId?: string | number, ) => { - const imageType = blueprintImageType?.[itemId]; + if (itemId === undefined) return; - if (imageType && deselectedTargets.includes(imageType)) { - setDeselectedTargets( - deselectedTargets.filter((target) => target !== imageType), - ); - } else if (imageType) { - setDeselectedTargets([...deselectedTargets, imageType]); + if (typeof itemId === 'number') { + const imageType = blueprintImageType?.[itemId]; + + if (imageType && deselectedTargets.includes(imageType)) { + setDeselectedTargets( + deselectedTargets.filter((target) => target !== imageType), + ); + } else if (imageType) { + setDeselectedTargets([...deselectedTargets, imageType]); + } } }; diff --git a/src/Components/Blueprints/ImportBlueprintModal.tsx b/src/Components/Blueprints/ImportBlueprintModal.tsx index e25908f4..b6f1cf4a 100644 --- a/src/Components/Blueprints/ImportBlueprintModal.tsx +++ b/src/Components/Blueprints/ImportBlueprintModal.tsx @@ -35,6 +35,7 @@ import { CustomRepository, } from '../../store/imageBuilderApi'; import { wizardState } from '../../store/wizardSlice'; +import { getErrorMessage } from '../../Utilities/getErrorMessage'; import { resolveRelPath } from '../../Utilities/path'; import { mapExportRequestToState, @@ -69,10 +70,7 @@ export const ImportBlueprintModal: React.FunctionComponent< const addNotification = useAddNotification(); const [importRepositories] = useBulkImportRepositoriesMutation(); - const handleFileInputChange = ( - _event: React.ChangeEvent | React.DragEvent, - file: File, - ) => { + const handleFileInputChange = (_event: DropEvent, file: File) => { setFileContent(''); setFilename(file.name); }; @@ -195,7 +193,7 @@ export const ImportBlueprintModal: React.FunctionComponent< addNotification({ variant: 'warning', title: 'File is not a valid blueprint', - description: error?.data?.error?.message, + description: getErrorMessage(error), }); } }; diff --git a/src/Components/CreateImageWizard/steps/FileSystem/components/FileSystemTable.tsx b/src/Components/CreateImageWizard/steps/FileSystem/components/FileSystemTable.tsx index 1eb5a204..5a69d6c4 100644 --- a/src/Components/CreateImageWizard/steps/FileSystem/components/FileSystemTable.tsx +++ b/src/Components/CreateImageWizard/steps/FileSystem/components/FileSystemTable.tsx @@ -176,12 +176,14 @@ const MountpointPrefix = ({ partition }: MountpointPrefixPropTypes) => { const prefix = getPrefix(partition.mountpoint); const suffix = getSuffix(partition.mountpoint); - const onSelect = (event: React.MouseEvent, selection: string) => { - setIsOpen(false); - const mountpoint = selection + (suffix.length > 0 ? '/' + suffix : ''); - dispatch( - changePartitionMountpoint({ id: partition.id, mountpoint: mountpoint }), - ); + const onSelect = (event?: React.MouseEvent, selection?: string | number) => { + if (selection && typeof selection === 'string') { + setIsOpen(false); + const mountpoint = selection + (suffix.length > 0 ? '/' + suffix : ''); + dispatch( + changePartitionMountpoint({ id: partition.id, mountpoint: mountpoint }), + ); + } }; const onToggleClick = () => { @@ -313,8 +315,9 @@ const SizeUnit = ({ partition }: SizeUnitPropTypes) => { const initialValue = useRef(partition).current; - const onSelect = (event: React.MouseEvent, selection: Units) => { - if (initialValue.unit === 'B' && selection === 'B') { + const onSelect = (event?: React.MouseEvent, selection?: string | number) => { + if (selection === undefined) return; + if (initialValue.unit === 'B' && selection === ('B' as Units)) { dispatch( changePartitionMinSize({ id: partition.id, @@ -322,7 +325,9 @@ const SizeUnit = ({ partition }: SizeUnitPropTypes) => { }), ); } - dispatch(changePartitionUnit({ id: partition.id, unit: selection })); + dispatch( + changePartitionUnit({ id: partition.id, unit: selection as Units }), + ); setIsOpen(false); }; diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/components/ArchSelect.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/components/ArchSelect.tsx index f5bc8865..8b704dc2 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/components/ArchSelect.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/components/ArchSelect.tsx @@ -22,11 +22,9 @@ const ArchSelect = () => { const dispatch = useAppDispatch(); const [isOpen, setIsOpen] = useState(false); - const setArch = ( - _event: React.MouseEvent, - selection: ImageRequest['architecture'], - ) => { - dispatch(changeArchitecture(selection)); + const setArch = (_event?: React.MouseEvent, selection?: string | number) => { + if (selection === undefined) return; + dispatch(changeArchitecture(selection as ImageRequest['architecture'])); setIsOpen(false); }; diff --git a/src/Components/CreateImageWizard/steps/ImageOutput/components/ReleaseSelect.tsx b/src/Components/CreateImageWizard/steps/ImageOutput/components/ReleaseSelect.tsx index b0abbd23..aa989f5c 100644 --- a/src/Components/CreateImageWizard/steps/ImageOutput/components/ReleaseSelect.tsx +++ b/src/Components/CreateImageWizard/steps/ImageOutput/components/ReleaseSelect.tsx @@ -43,14 +43,18 @@ const ReleaseSelect = () => { const releases = process.env.IS_ON_PREMISE ? ON_PREM_RELEASES : RELEASES; - const handleSelect = (_event: React.MouseEvent, selection: Distributions) => { + const handleSelect = ( + _event?: React.MouseEvent, + selection?: string | number, + ) => { + if (selection === undefined) return; if (selection !== ('loader' as Distributions)) { - if (!isRhel(selection)) { + if (!isRhel(selection as Distributions)) { dispatch(changeRegistrationType('register-later')); } else { dispatch(changeRegistrationType('register-now-rhc')); } - dispatch(changeDistribution(selection)); + dispatch(changeDistribution(selection as Distributions)); setIsOpen(false); } }; diff --git a/src/Components/CreateImageWizard/steps/Kernel/components/KernelName.tsx b/src/Components/CreateImageWizard/steps/Kernel/components/KernelName.tsx index 2bd63390..cc30ab15 100644 --- a/src/Components/CreateImageWizard/steps/Kernel/components/KernelName.tsx +++ b/src/Components/CreateImageWizard/steps/Kernel/components/KernelName.tsx @@ -73,8 +73,8 @@ const KernelName = () => { } }; - const onSelect = (_event: React.MouseEvent, value: string) => { - if (value) { + const onSelect = (_event?: React.MouseEvent, value?: string | number) => { + if (value && typeof value === 'string') { if (/custom kernel package/i.test(value)) { if (!kernelOptions.some((kernel) => kernel === filterValue)) { kernelOptions = [...kernelOptions, filterValue]; diff --git a/src/Components/CreateImageWizard/steps/Locale/components/KeyboardDropDown.tsx b/src/Components/CreateImageWizard/steps/Locale/components/KeyboardDropDown.tsx index ae8b7df3..7396f5d2 100644 --- a/src/Components/CreateImageWizard/steps/Locale/components/KeyboardDropDown.tsx +++ b/src/Components/CreateImageWizard/steps/Locale/components/KeyboardDropDown.tsx @@ -65,8 +65,8 @@ const KeyboardDropDown = () => { } }; - const onSelect = (_event: React.MouseEvent, value: string) => { - if (value) { + const onSelect = (_event?: React.MouseEvent, value?: string | number) => { + if (value && typeof value === 'string') { setInputValue(value); setFilterValue(''); setErrorText(''); diff --git a/src/Components/CreateImageWizard/steps/Locale/components/LanguagesDropDown.tsx b/src/Components/CreateImageWizard/steps/Locale/components/LanguagesDropDown.tsx index c531cba4..55d2585f 100644 --- a/src/Components/CreateImageWizard/steps/Locale/components/LanguagesDropDown.tsx +++ b/src/Components/CreateImageWizard/steps/Locale/components/LanguagesDropDown.tsx @@ -97,8 +97,8 @@ const LanguagesDropDown = () => { } }; - const onSelect = (_event: React.MouseEvent, value: string) => { - if (value) { + const onSelect = (_event?: React.MouseEvent, value?: string | number) => { + if (value && typeof value === 'string') { setInputValue(''); setFilterValue(''); dispatch(addLanguage(value)); diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx index 6f407aec..1f12b75c 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx @@ -185,13 +185,13 @@ const PolicySelector = () => { }; const handleSelect = ( - _event: React.MouseEvent, - selection: string, + _event?: React.MouseEvent, + selection?: string | number, ) => { - if (selection) { - applyChanges(selection as unknown as ComplianceSelectOptionValueType); - setIsOpen(false); - } + if (selection === undefined) return; + + applyChanges(selection as unknown as ComplianceSelectOptionValueType); + setIsOpen(false); }; const complianceOptions = () => { diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx index a35b4caa..b2651cb1 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/ProfileSelector.tsx @@ -269,15 +269,15 @@ const ProfileSelector = () => { }; const handleSelect = ( - _event: React.MouseEvent, - selection: string, + _event?: React.MouseEvent, + selection?: string | number, ) => { - if (selection) { - setInputValue(selection); - setFilterValue(''); - applyChanges(selection as unknown as OScapSelectOptionValueType); - setIsOpen(false); - } + if (selection === undefined) return; + + setInputValue(selection as OScapSelectOptionValueType['profileID']); + setFilterValue(''); + applyChanges(selection as unknown as OScapSelectOptionValueType); + setIsOpen(false); }; const toggleOpenSCAP = (toggleRef: React.Ref) => ( diff --git a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx index f067d16c..fb6af868 100644 --- a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx @@ -927,19 +927,34 @@ const Packages = () => { } }; - const handleFilterToggleClick = (event: React.MouseEvent) => { - const id = event.currentTarget.id; + const handleFilterToggleClick = ( + event: + | MouseEvent + | React.KeyboardEvent + | React.MouseEvent, + _selected: boolean, + ) => { + const id = (event.currentTarget as HTMLElement).id ?? ''; setCurrentlyRemovedPackages([]); setPage(1); setToggleSelected(id); }; - const handleSetPage = (_: React.MouseEvent, newPage: number) => { + const handleSetPage = ( + _: + | MouseEvent + | React.MouseEvent + | React.KeyboardEvent, + newPage: number, + ) => { setPage(newPage); }; const handlePerPageSelect = ( - _: React.MouseEvent, + _: + | MouseEvent + | React.MouseEvent + | React.KeyboardEvent, newPerPage: number, newPage: number, ) => { @@ -985,11 +1000,15 @@ const Packages = () => { setIsRepoModalOpen(!isRepoModalOpen); }; - const handleTabClick = (event: React.MouseEvent, tabIndex: Repos) => { + const handleTabClick = ( + event?: React.MouseEvent, + tabIndex?: string | number, + ) => { + if (tabIndex === undefined) return; if (tabIndex !== activeTabKey) { setCurrentlyRemovedPackages([]); setPage(1); - setActiveTabKey(tabIndex); + setActiveTabKey(tabIndex as Repos); } }; diff --git a/src/Components/CreateImageWizard/steps/Registration/components/ActivationKeysList.tsx b/src/Components/CreateImageWizard/steps/Registration/components/ActivationKeysList.tsx index 0bf0571e..80d8fc4e 100644 --- a/src/Components/CreateImageWizard/steps/Registration/components/ActivationKeysList.tsx +++ b/src/Components/CreateImageWizard/steps/Registration/components/ActivationKeysList.tsx @@ -32,6 +32,7 @@ import { selectActivationKey, selectRegistrationType, } from '../../../../../store/wizardSlice'; +import { getErrorMessage } from '../../../../../Utilities/getErrorMessage'; import sortfn from '../../../../../Utilities/sortfn'; import { useGetEnvironment } from '../../../../../Utilities/useGetEnvironment'; import { generateRandomId } from '../../../utilities/generateRandomId'; @@ -84,7 +85,7 @@ const ActivationKeysList = () => { if (filterValue) { filteredKeys = activationKeys?.body - ?.map((key) => key.name) + ?.flatMap((key) => (key.name ? [key.name] : [])) .filter((keyName: string) => String(keyName).toLowerCase().includes(filterValue.toLowerCase()), ); @@ -127,7 +128,7 @@ const ActivationKeysList = () => { addNotification({ variant: 'danger', title: 'Error creating activation key', - description: error?.data?.error?.message, + description: getErrorMessage(error), }); } }; @@ -165,8 +166,12 @@ const ActivationKeysList = () => { setIsOpen(!isOpen); }; - const handleSelect = (_event: React.MouseEvent, selection: string) => { - setActivationKey(selection); + const handleSelect = ( + _event?: React.MouseEvent, + selection?: string | number, + ) => { + if (selection === undefined) return; + if (typeof selection === 'string') setActivationKey(selection); }; const handleKeyDown = (event: React.KeyboardEvent) => { diff --git a/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx b/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx index 798febf8..49b53ef2 100644 --- a/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx +++ b/src/Components/CreateImageWizard/steps/Repositories/Repositories.tsx @@ -397,7 +397,10 @@ const Repositories = () => { }; const handlePerPageSelect = ( - _: React.MouseEvent, + _: + | MouseEvent + | React.MouseEvent + | React.KeyboardEvent, newPerPage: number, newPage: number, ) => { diff --git a/src/Components/CreateImageWizard/steps/Snapshot/components/Templates.tsx b/src/Components/CreateImageWizard/steps/Snapshot/components/Templates.tsx index 8080b5a9..822da086 100644 --- a/src/Components/CreateImageWizard/steps/Snapshot/components/Templates.tsx +++ b/src/Components/CreateImageWizard/steps/Snapshot/components/Templates.tsx @@ -67,7 +67,10 @@ const Templates = () => { }; const handlePerPageSelect = ( - _: React.MouseEvent, + _: + | MouseEvent + | React.MouseEvent + | React.KeyboardEvent, newPerPage: number, newPage: number, ) => { diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsSourcesSelect.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsSourcesSelect.tsx index a426be62..7b8fbad2 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsSourcesSelect.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Aws/AwsSourcesSelect.tsx @@ -47,7 +47,7 @@ export const AwsSourcesSelect = () => { if (sources && filterValue) { filteredSources = sources - .map((source) => source?.name) + .flatMap((source) => (source?.name ? [source.name] : [])) .filter((source: string) => String(source).toLowerCase().includes(filterValue.toLowerCase()), ); @@ -84,9 +84,10 @@ export const AwsSourcesSelect = () => { }; const handleSelect = ( - _event: React.MouseEvent, - value: string, + _event?: React.MouseEvent, + value?: string | number, ) => { + if (value === undefined) return; const source = sources?.find((source) => source?.name === value); dispatch(changeAwsSourceId(source?.id)); setIsOpen(false); diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureHyperVSelect.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureHyperVSelect.tsx index e5a0d34c..f8622135 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureHyperVSelect.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureHyperVSelect.tsx @@ -20,8 +20,12 @@ export const AzureHyperVSelect = () => { const dispatch = useAppDispatch(); const [isOpen, setIsOpen] = useState(false); - const handleSelect = (_event: React.MouseEvent, selection: 'V1' | 'V2') => { - dispatch(changeAzureHyperVGeneration(selection)); + const handleSelect = ( + _event?: React.MouseEvent, + selection?: string | number, + ) => { + if (selection === undefined) return; + dispatch(changeAzureHyperVGeneration(selection as 'V1' | 'V2')); setIsOpen(false); }; diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureResourceGroups.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureResourceGroups.tsx index 0b1de111..712a6e8a 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureResourceGroups.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureResourceGroups.tsx @@ -85,9 +85,10 @@ export const AzureResourceGroups = () => { }; const setResourceGroup = ( - _event: React.MouseEvent, - selection: string, + _event?: React.MouseEvent, + selection?: string | number, ) => { + if (selection === undefined) return; const resource = resourceGroups.find((resource) => resource === selection) || ''; setIsOpen(false); diff --git a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx index 889edba6..66d6bd14 100644 --- a/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx +++ b/src/Components/CreateImageWizard/steps/TargetEnvironment/Azure/AzureSourcesSelect.tsx @@ -79,7 +79,7 @@ export const AzureSourcesSelect = () => { if (filterValue) { filteredSources = rawSources?.data - ?.map((source) => source?.name) + ?.flatMap((source) => (source?.name ? [source.name] : [])) .filter((source: string) => String(source).toLowerCase().includes(filterValue.toLowerCase()), ); @@ -115,9 +115,10 @@ export const AzureSourcesSelect = () => { }; const handleSelect = ( - _event: React.MouseEvent, - sourceName: string, + _event?: React.MouseEvent, + sourceName?: string | number, ) => { + if (sourceName === undefined) return; const sourceId = rawSources?.data?.find( (source) => source?.name === sourceName, )?.id; diff --git a/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx b/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx index 2f26abda..b7dcd7df 100644 --- a/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx +++ b/src/Components/CreateImageWizard/steps/Timezone/components/TimezoneDropDown.tsx @@ -73,8 +73,8 @@ const TimezoneDropDown = () => { } }; - const onSelect = (_event: React.MouseEvent, value: string) => { - if (value) { + const onSelect = (_event?: React.MouseEvent, value?: string | number) => { + if (value && typeof value === 'string') { setInputValue(value); setFilterValue(''); setErrorText(''); diff --git a/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx b/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx index f25a9f5f..243ad75d 100644 --- a/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx +++ b/src/Components/CreateImageWizard/steps/Users/components/UserInfo.tsx @@ -51,9 +51,11 @@ const UserInfo = () => { const tabComponentRef = React.useRef(); const firstMount = React.useRef(true); - const onSelect = (event: React.MouseEvent, tabIndex: number) => { - setActiveTabKey(tabIndex); - setIndex(tabIndex); + const onSelect = (event?: React.MouseEvent, tabIndex?: string | number) => { + if (tabIndex && typeof tabIndex === 'number') { + setActiveTabKey(tabIndex); + setIndex(tabIndex); + } }; const onAdd = () => { @@ -75,23 +77,25 @@ const UserInfo = () => { } }, [users.length]); - const onClose = (_event: React.MouseEvent, tabIndex: number) => { - if ( - users[tabIndex].name === '' && - users[tabIndex].password === '' && - users[tabIndex].ssh_key === '' - ) { - const nextTabIndex = calculateNewIndex( - tabIndex, - activeTabKey, - users.length, - ); - setActiveTabKey(nextTabIndex); - setIndex(nextTabIndex); - dispatch(removeUser(tabIndex)); - } else { - setShowRemoveUserModal(true); - setIndex(tabIndex); + const onClose = (_event: React.MouseEvent, tabIndex: string | number) => { + if (typeof tabIndex === 'number') { + if ( + users[tabIndex].name === '' && + users[tabIndex].password === '' && + users[tabIndex].ssh_key === '' + ) { + const nextTabIndex = calculateNewIndex( + tabIndex, + activeTabKey, + users.length, + ); + setActiveTabKey(nextTabIndex); + setIndex(nextTabIndex); + dispatch(removeUser(tabIndex)); + } else { + setShowRemoveUserModal(true); + setIndex(tabIndex); + } } }; diff --git a/src/Components/CreateImageWizard/validators.ts b/src/Components/CreateImageWizard/validators.ts index 686f846b..4881d9ac 100644 --- a/src/Components/CreateImageWizard/validators.ts +++ b/src/Components/CreateImageWizard/validators.ts @@ -8,20 +8,33 @@ export const isAwsAccountIdValid = (awsAccountId: string | undefined) => { ); }; -export const isAzureTenantGUIDValid = (azureTenantGUID: string) => { - return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( - azureTenantGUID, +export const isAzureTenantGUIDValid = (azureTenantGUID: string | undefined) => { + return ( + azureTenantGUID !== undefined && + /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( + azureTenantGUID, + ) ); }; -export const isAzureSubscriptionIdValid = (azureSubscriptionId: string) => { - return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( - azureSubscriptionId, +export const isAzureSubscriptionIdValid = ( + azureSubscriptionId: string | undefined, +) => { + return ( + azureSubscriptionId !== undefined && + /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( + azureSubscriptionId, + ) ); }; -export const isAzureResourceGroupValid = (azureResourceGroup: string) => { - return /^[-\w._()]+[-\w_()]$/.test(azureResourceGroup); +export const isAzureResourceGroupValid = ( + azureResourceGroup: string | undefined, +) => { + return ( + azureResourceGroup !== undefined && + /^[-\w._()]+[-\w_()]$/.test(azureResourceGroup) + ); }; export const isGcpEmailValid = (gcpShareWithAccount: string | undefined) => { diff --git a/src/Components/ImagesTable/ImagesTableToolbar.tsx b/src/Components/ImagesTable/ImagesTableToolbar.tsx index 7899e947..a44fd33e 100644 --- a/src/Components/ImagesTable/ImagesTableToolbar.tsx +++ b/src/Components/ImagesTable/ImagesTableToolbar.tsx @@ -42,7 +42,13 @@ interface imagesTableToolbarProps { perPage: number; page: number; setPage: (page: number) => void; - onPerPageSelect: (event: React.MouseEvent, perPage: number) => void; + onPerPageSelect: ( + event: + | MouseEvent + | React.MouseEvent + | React.KeyboardEvent, + perPage: number, + ) => void; } const ImagesTableToolbar: React.FC = ({ diff --git a/src/Hooks/MutationNotifications/useMutationWithNotification.tsx b/src/Hooks/MutationNotifications/useMutationWithNotification.tsx index bf285ffa..f713b3ce 100644 --- a/src/Hooks/MutationNotifications/useMutationWithNotification.tsx +++ b/src/Hooks/MutationNotifications/useMutationWithNotification.tsx @@ -77,7 +77,7 @@ export function useMutationWithNotification< description, }); } - return err; + throw err; } }; diff --git a/src/Utilities/getErrorMessage.ts b/src/Utilities/getErrorMessage.ts new file mode 100644 index 00000000..cdd50d0e --- /dev/null +++ b/src/Utilities/getErrorMessage.ts @@ -0,0 +1,18 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +export const getErrorMessage = (error: unknown) => { + if ( + typeof error === 'object' && + error !== null && + 'data' in error && + typeof (error as any).data === 'object' && + (error as any).data !== null && + 'error' in (error as any).data && + typeof (error as any).data.error === 'object' && + (error as any).data.error !== null && + 'message' in (error as any).data.error && + typeof (error as any).data.error.message === 'string' + ) { + return (error as any).data.error.message; + } + return 'Unknown error'; +}; diff --git a/src/Utilities/useOnPremOpenSCAP.tsx b/src/Utilities/useOnPremOpenSCAP.tsx index d1b369cf..045cad27 100644 --- a/src/Utilities/useOnPremOpenSCAP.tsx +++ b/src/Utilities/useOnPremOpenSCAP.tsx @@ -12,12 +12,14 @@ export const useOnPremOpenSCAPAvailable = () => { const checkPackages = () => { cockpit .spawn(['rpm', '-qa', 'openscap-scanner', 'scap-security-guide'], {}) - .then((res: string) => { - setPackagesAvailable( - res.includes('openscap-scanner') && - res.includes('scap-security-guide'), - ); - setIsLoading(false); + .then((res: string | Uint8Array) => { + if (typeof res === 'string') { + setPackagesAvailable( + res.includes('openscap-scanner') && + res.includes('scap-security-guide'), + ); + setIsLoading(false); + } }) .catch(() => { setPackagesAvailable(false); diff --git a/src/test/setup.ts b/src/test/setup.ts index e15d20b7..ba1f1567 100644 --- a/src/test/setup.ts +++ b/src/test/setup.ts @@ -74,8 +74,8 @@ vi.mock('@unleash/proxy-client-react', () => ({ // remove DOM dump from the testing-library output configure({ - getElementError: (message: string) => { - const error = new Error(message); + getElementError: (message: string | null, _container: Element) => { + const error = new Error(message ?? ''); error.name = 'TestingLibraryElementError'; error.stack = ''; return error;