diff --git a/src/utils/components/PolicyForm/PolicyWizard/utils/hooks/useNodeInterfaces/utils/utils.ts b/src/utils/components/PolicyForm/PolicyWizard/utils/hooks/useNodeInterfaces/utils/utils.ts index 061567f1..c462378e 100644 --- a/src/utils/components/PolicyForm/PolicyWizard/utils/hooks/useNodeInterfaces/utils/utils.ts +++ b/src/utils/components/PolicyForm/PolicyWizard/utils/hooks/useNodeInterfaces/utils/utils.ts @@ -23,7 +23,7 @@ const getUsedPortNamesForNode = (nns: V1beta1NodeNetworkState) => { const interfaces = getInterfaces(nns); return interfaces.reduce((acc, iface) => { if (bridgeTypes.includes(iface?.type)) { - const ports = iface?.bridge?.port?.map((port) => port?.name); + const ports = iface?.bridge?.port?.map((port) => port?.name) || []; acc = [...acc, ...ports]; } diff --git a/src/utils/resources/enactments/utils.ts b/src/utils/resources/enactments/utils.ts index c29509d2..7ecc4d43 100644 --- a/src/utils/resources/enactments/utils.ts +++ b/src/utils/resources/enactments/utils.ts @@ -1,7 +1,7 @@ import { V1beta1NodeNetworkConfigurationEnactment } from '@kubevirt-ui/kubevirt-api/nmstate'; export const getEnactmentStatus = (enactment: V1beta1NodeNetworkConfigurationEnactment): string => - enactment?.status?.conditions?.find((condition) => condition.status === 'True').type; + enactment?.status?.conditions?.find((condition) => condition.status === 'True')?.type; export const categorizeEnactments = (enactments: V1beta1NodeNetworkConfigurationEnactment[]) => { return (enactments || []).reduce( diff --git a/src/utils/resources/policies/utils.ts b/src/utils/resources/policies/utils.ts index e87507e7..27f8dda4 100644 --- a/src/utils/resources/policies/utils.ts +++ b/src/utils/resources/policies/utils.ts @@ -43,7 +43,7 @@ export const isPolicyAppliedInNode = ( export const filterPolicyAppliedNodes = ( nodes: IoK8sApiCoreV1Node[], policy: V1NodeNetworkConfigurationPolicy, -) => nodes.filter((node) => isPolicyAppliedInNode(policy, node)); +) => (nodes || []).filter((node) => isPolicyAppliedInNode(policy, node)); export const getPolicyInterfaces = ( policy: V1NodeNetworkConfigurationPolicy, diff --git a/src/views/nodenetworkconfiguration/Topology.tsx b/src/views/nodenetworkconfiguration/Topology.tsx index 26e9b960..9c84468c 100644 --- a/src/views/nodenetworkconfiguration/Topology.tsx +++ b/src/views/nodenetworkconfiguration/Topology.tsx @@ -1,5 +1,5 @@ import React, { FC, useEffect, useMemo, useState } from 'react'; -import { useHistory } from 'react-router'; +import { useNavigate } from 'react-router-dom-v5-compat'; import { NodeModelGroupVersionKind } from 'src/console-models/NodeModel'; import './components/TopologySidebar/TopologySidebar.scss'; import { IoK8sApiCoreV1Node } from '@kubevirt-ui/kubevirt-api/kubernetes/models'; @@ -51,7 +51,7 @@ const Topology: FC = () => { const { t } = useNMStateTranslation(); const [visualization, setVisualization] = useState(null); const [selectedNodeFilters, setSelectedNodeFilters] = useState([]); - const history = useHistory(); + const navigate = useNavigate(); const queryParams = useQueryParams(); @@ -83,7 +83,9 @@ const Topology: FC = () => { [states], ); - useSignalEffect(() => (creatingPolicySignal.value = null)); + useSignalEffect(() => { + creatingPolicySignal.value = null; + }); useEffect(() => { if (!statesLoaded || statesError || isEmpty(states)) return; @@ -107,7 +109,7 @@ const Topology: FC = () => { newVisualization.addEventListener(SELECTION_EVENT, (id) => { const newParams = new URLSearchParams({ [SELECTED_ID_QUERY_PARAM]: id }); - history.push({ search: newParams.toString() }); + navigate({ search: newParams.toString() }); }); newVisualization.addEventListener(NODE_POSITIONING_EVENT, () => diff --git a/src/views/nodenetworkconfiguration/components/TopologySidebar/CreatePolicyDrawer.tsx b/src/views/nodenetworkconfiguration/components/TopologySidebar/CreatePolicyDrawer.tsx index 43d31ac1..9c998b79 100644 --- a/src/views/nodenetworkconfiguration/components/TopologySidebar/CreatePolicyDrawer.tsx +++ b/src/views/nodenetworkconfiguration/components/TopologySidebar/CreatePolicyDrawer.tsx @@ -1,5 +1,5 @@ import React, { FC, useEffect, useRef, useState } from 'react'; -import { useHistory } from 'react-router'; +import { useNavigate } from 'react-router-dom-v5-compat'; import NodeNetworkConfigurationPolicyModel from 'src/console-models/NodeNetworkConfigurationPolicyModel'; import { useImmer } from 'use-immer'; @@ -39,7 +39,7 @@ const CreatePolicyDrawer: FC = ({ const [createAnotherPolicy] = createAnotherPolicyState; const completed = useRef(false); const currentStepId = useRef('policy-wizard-basicinfo'); - const history = useHistory(); + const navigate = useNavigate(); creatingPolicySignal.value = policy; @@ -75,7 +75,7 @@ const CreatePolicyDrawer: FC = ({ if (createAnotherPolicy) resetPolicyWizard(); - history.push( + navigate( createAnotherPolicy ? `node-network-configuration?createPolicy=true&physicalNetworkName=${networkName}` : getResourceUrl({ model: NodeNetworkConfigurationPolicyModel, resource: createdPolicy }), diff --git a/src/views/nodenetworkconfiguration/components/TopologySidebar/InterfaceDrawer/TopologyDrawer.tsx b/src/views/nodenetworkconfiguration/components/TopologySidebar/InterfaceDrawer/TopologyDrawer.tsx index c7565112..244f321e 100644 --- a/src/views/nodenetworkconfiguration/components/TopologySidebar/InterfaceDrawer/TopologyDrawer.tsx +++ b/src/views/nodenetworkconfiguration/components/TopologySidebar/InterfaceDrawer/TopologyDrawer.tsx @@ -1,6 +1,6 @@ import React, { FC, ReactNode, useState } from 'react'; import { useNMStateTranslation } from 'src/utils/hooks/useNMStateTranslation'; -import { useHistory } from 'react-router'; +import { useNavigate } from 'react-router-dom-v5-compat'; import { Drawer, DrawerContent, @@ -25,7 +25,7 @@ type Props = { const TopologyDrawer: FC = ({ states, children }) => { const { t } = useNMStateTranslation(); const location = useLocation(); - const history = useHistory(); + const navigate = useNavigate(); const queryParams = new URLSearchParams(location.search); const [successMessage, setSuccessMessage] = useState(''); @@ -33,7 +33,7 @@ const TopologyDrawer: FC = ({ states, children }) => { const closeDrawer = () => { const updatedParams = new URLSearchParams(location.search); updatedParams.delete(CREATE_POLICY_QUERY_PARAM); - history.push({ search: updatedParams.toString() }); + navigate({ search: updatedParams.toString() }); }; const isDrawerOpen = queryParams.get(CREATE_POLICY_QUERY_PARAM) === 'true'; diff --git a/src/views/nodenetworkconfiguration/components/TopologyToolbar/TopologyToolbar.tsx b/src/views/nodenetworkconfiguration/components/TopologyToolbar/TopologyToolbar.tsx index 7aa668cf..ecea5f87 100644 --- a/src/views/nodenetworkconfiguration/components/TopologyToolbar/TopologyToolbar.tsx +++ b/src/views/nodenetworkconfiguration/components/TopologyToolbar/TopologyToolbar.tsx @@ -1,5 +1,4 @@ import React, { Dispatch, FC, SetStateAction } from 'react'; -import { useHistory } from 'react-router'; import { useNavigate } from 'react-router-dom-v5-compat'; import NodeNetworkConfigurationPolicyModel from 'src/console-models/NodeNetworkConfigurationPolicyModel'; import { NodeNetworkConfigurationPolicyModelRef, NodeNetworkStateModelRef } from '@models'; @@ -32,7 +31,6 @@ const TopologyToolbar: FC = ({ }) => { const { t } = useNMStateTranslation(); const navigate = useNavigate(); - const history = useHistory(); const createItems = { form: t('From Form'), yaml: t('With YAML'), @@ -46,8 +44,8 @@ const TopologyToolbar: FC = ({ const newParams = new URLSearchParams({ [CREATE_POLICY_QUERY_PARAM]: 'true' }); return type === 'form' - ? history.push({ search: newParams.toString() }) - : history.push(`${baseURL}~new`); + ? navigate({ search: newParams.toString() }) + : navigate(`${baseURL}~new`); }; return ( diff --git a/src/views/nodenetworkconfiguration/utils/utils.ts b/src/views/nodenetworkconfiguration/utils/utils.ts index 1ad3a96a..f933d67d 100644 --- a/src/views/nodenetworkconfiguration/utils/utils.ts +++ b/src/views/nodenetworkconfiguration/utils/utils.ts @@ -186,7 +186,7 @@ export const transformDataToTopologyModel = ( const childNodes = createNodes( nnsName, - [...nodeState.status.currentState.interfaces, ...creatingPolicyToAdd], + [...(nodeState.status?.currentState?.interfaces || []), ...creatingPolicyToAdd], nnceConfigredInterfaces, ); @@ -221,8 +221,8 @@ const getCorrelatedEnactment = ( availableEnhancments: V1beta1NodeNetworkConfigurationEnactment[], nnsName: string, ): V1beta1NodeNetworkConfigurationEnactment => { - return availableEnhancments.find((nnce) => - nnce.metadata.ownerReferences.some((ref) => ref.name === nnsName), + return availableEnhancments?.find((nnce) => + nnce.metadata?.ownerReferences?.some((ref) => ref.name === nnsName), ); }; diff --git a/src/views/physical-networks/components/PhysicalNetworksEmptyState.tsx b/src/views/physical-networks/components/PhysicalNetworksEmptyState.tsx index c9f93226..3ae8013c 100644 --- a/src/views/physical-networks/components/PhysicalNetworksEmptyState.tsx +++ b/src/views/physical-networks/components/PhysicalNetworksEmptyState.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom-v5-compat'; import { useNMStateTranslation } from '@utils/hooks/useNMStateTranslation'; import { @@ -16,7 +16,7 @@ import { NODE_NETWORK_CONFIGURATION_WIZARD_PATH } from '../utils/constants'; const PhysicalNetworksEmptyState: FC = () => { const { t } = useNMStateTranslation(); - const history = useHistory(); + const navigate = useNavigate(); return ( { - diff --git a/src/views/physical-networks/components/PhysicalNetworksPageHeader.tsx b/src/views/physical-networks/components/PhysicalNetworksPageHeader.tsx index 40c083fc..1ede0896 100644 --- a/src/views/physical-networks/components/PhysicalNetworksPageHeader.tsx +++ b/src/views/physical-networks/components/PhysicalNetworksPageHeader.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom-v5-compat'; import PaneHeading from '@utils/components/PaneHeading/PaneHeading'; import { useNMStateTranslation } from '@utils/hooks/useNMStateTranslation'; @@ -13,7 +13,7 @@ type PhysicalNetworksPageHeaderProps = { const PhysicalNetworksPageHeader: FC = ({ showCreateButton }) => { const { t } = useNMStateTranslation(); - const history = useHistory(); + const navigate = useNavigate(); return ( @@ -22,7 +22,7 @@ const PhysicalNetworksPageHeader: FC = ({ showC {showCreateButton && ( - + {!isEmpty(network.nncps) ? ( diff --git a/src/views/physical-networks/components/PhysicalNetworksTable/components/PhysicalNetworkRow/utils/utils.tsx b/src/views/physical-networks/components/PhysicalNetworksTable/components/PhysicalNetworkRow/utils/utils.tsx index 3444d907..22666485 100644 --- a/src/views/physical-networks/components/PhysicalNetworksTable/components/PhysicalNetworkRow/utils/utils.tsx +++ b/src/views/physical-networks/components/PhysicalNetworksTable/components/PhysicalNetworkRow/utils/utils.tsx @@ -8,12 +8,12 @@ import { PhysicalNetworksRowActions } from './types'; export const getRowActions = ( t: TFunction, - history, + navigate: (path: string) => void, networkName: string, ): PhysicalNetworksRowActions => [ { onClick: () => - history.push( + navigate( `${NODE_NETWORK_CONFIGURATION_WIZARD_PATH}&${PHYSICAL_NETWORK_NAME_PARAM_KEY}=${encodeURIComponent( networkName, )}`, @@ -29,7 +29,7 @@ export const getRowActions = ( }, { onClick: () => - history.push( + navigate( `k8s/cluster/virtualmachine-networks/~new?${PHYSICAL_NETWORK_NAME_PARAM_KEY}=${encodeURIComponent( networkName, )}`, diff --git a/src/views/policies/actions/PolicyActions.tsx b/src/views/policies/actions/PolicyActions.tsx index c10399b3..5baf6889 100644 --- a/src/views/policies/actions/PolicyActions.tsx +++ b/src/views/policies/actions/PolicyActions.tsx @@ -1,5 +1,5 @@ import React, { FC, useState } from 'react'; -import { useHistory } from 'react-router'; +import { useNavigate } from 'react-router-dom-v5-compat'; import NodeNetworkConfigurationPolicyModel from 'src/console-models/NodeNetworkConfigurationPolicyModel'; import { asAccessReview, getResourceUrl } from 'src/utils/helpers'; import { useNMStateTranslation } from 'src/utils/hooks/useNMStateTranslation'; @@ -22,7 +22,7 @@ type PolicyActionsProps = { }; const PolicyActions: FC = ({ policy, isKebabToggle }) => { - const history = useHistory(); + const navigate = useNavigate(); const formSupported = isPolicySupported(policy); const { t } = useNMStateTranslation(); const [isEditModalOpen, setIsEditModalOpen] = useState(false); @@ -46,7 +46,7 @@ const PolicyActions: FC = ({ policy, isKebabToggle }) => { resource: policy, }); - history.push(`${policyDetailPage}/yaml`); + navigate(`${policyDetailPage}/yaml`); }; const onDeleteModalToggle = () => { diff --git a/src/views/policies/components/DeleteModal.tsx b/src/views/policies/components/DeleteModal.tsx index 37623588..f784a4b4 100644 --- a/src/views/policies/components/DeleteModal.tsx +++ b/src/views/policies/components/DeleteModal.tsx @@ -1,6 +1,6 @@ import React, { FC, MouseEventHandler, useState } from 'react'; import { Trans } from 'react-i18next'; -import { useHistory } from 'react-router'; +import { useNavigate } from 'react-router-dom-v5-compat'; import NodeNetworkConfigurationPolicyModel from 'src/console-models/NodeNetworkConfigurationPolicyModel'; import { useNMStateTranslation } from 'src/utils/hooks/useNMStateTranslation'; @@ -32,7 +32,7 @@ type DeleteModalProps = { const DeleteModal: FC = ({ closeModal, isOpen, policy }) => { const { t } = useNMStateTranslation(); - const history = useHistory(); + const navigate = useNavigate(); const [error, setError] = useState(undefined); const [loading, setLoading] = useState(false); const [inputValue, setInputValue] = useState(''); @@ -47,7 +47,7 @@ const DeleteModal: FC = ({ closeModal, isOpen, policy }) => { ns: policy?.metadata?.namespace, name: policy?.metadata?.name, }) - .then(() => history.push(getResourceUrl({ model: NodeNetworkConfigurationPolicyModel }))) + .then(() => navigate(getResourceUrl({ model: NodeNetworkConfigurationPolicyModel }))) .catch(setError) .finally(() => { setError(undefined); diff --git a/src/views/policies/list/components/CreatePolicyButtons.tsx b/src/views/policies/list/components/CreatePolicyButtons.tsx index 440ce09b..52eee1c2 100644 --- a/src/views/policies/list/components/CreatePolicyButtons.tsx +++ b/src/views/policies/list/components/CreatePolicyButtons.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom-v5-compat'; import NodeNetworkConfigurationPolicyModel, { NodeNetworkConfigurationPolicyModelRef, } from 'src/console-models/NodeNetworkConfigurationPolicyModel'; @@ -12,7 +12,7 @@ import { logNMStateEvent } from '@utils/telemetry/telemetry'; const CreatePolicyButtons: FC = ({ children }) => { const { t } = useNMStateTranslation(); - const history = useHistory(); + const navigate = useNavigate(); const createItems = { form: t('From Form'), @@ -29,8 +29,8 @@ const CreatePolicyButtons: FC = ({ children }) => { } return type === 'form' - ? history.push('/node-network-configuration?createPolicy=true') - : history.push(`${baseURL}~new`); + ? navigate('/node-network-configuration?createPolicy=true') + : navigate(`${baseURL}~new`); }; return ( diff --git a/src/views/policies/new/NewPolicy.tsx b/src/views/policies/new/NewPolicy.tsx index 850f6227..dd0aba91 100644 --- a/src/views/policies/new/NewPolicy.tsx +++ b/src/views/policies/new/NewPolicy.tsx @@ -1,5 +1,5 @@ import React, { FC, MouseEventHandler, useState } from 'react'; -import { useHistory } from 'react-router'; +import { useNavigate } from 'react-router-dom-v5-compat'; import NodeNetworkConfigurationPolicyModel from 'src/console-models/NodeNetworkConfigurationPolicyModel'; import { getResourceUrl } from 'src/utils/helpers'; import { useNMStateTranslation } from 'src/utils/hooks/useNMStateTranslation'; @@ -58,7 +58,7 @@ const NewPolicy: FC = () => { const [policy, setPolicy] = useImmer(initialPolicy); const [loading, setLoading] = useState(false); const [error, setError] = useState(undefined); - const history = useHistory(); + const navigate = useNavigate(); const onFormSubmit: MouseEventHandler = (event) => { event.preventDefault(); @@ -72,7 +72,7 @@ const NewPolicy: FC = () => { data: policy, }) .then(() => - history.push( + navigate( getResourceUrl({ model: NodeNetworkConfigurationPolicyModel, resource: policy }), ), ) @@ -82,7 +82,7 @@ const NewPolicy: FC = () => { const goToYAMLEditor = () => { const baseUrl = getResourceUrl({ model: NodeNetworkConfigurationPolicyModel }); - history.push(`${baseUrl}~new`); + navigate(`${baseUrl}~new`); }; return ( @@ -124,7 +124,7 @@ const NewPolicy: FC = () => { {t('Create')} - diff --git a/src/views/states/list/hooks/useDrawerInterface.ts b/src/views/states/list/hooks/useDrawerInterface.ts index b34ca4a6..608dfcce 100644 --- a/src/views/states/list/hooks/useDrawerInterface.ts +++ b/src/views/states/list/hooks/useDrawerInterface.ts @@ -1,4 +1,4 @@ -import { useHistory, useLocation } from 'react-router'; +import { useLocation, useNavigate } from 'react-router-dom-v5-compat'; import { NodeNetworkConfigurationInterface, @@ -8,7 +8,7 @@ import { import { baseListUrl } from '../constants'; const useDrawerInterface = () => { - const history = useHistory(); + const navigate = useNavigate(); const { search } = useLocation(); const params = new URLSearchParams(search); @@ -25,7 +25,7 @@ const useDrawerInterface = () => { nodeNetworkState?: V1beta1NodeNetworkState, nodeNetworkInterface?: NodeNetworkConfigurationInterface, ) => { - if (!nodeNetworkInterface) return history.push(baseListUrl); + if (!nodeNetworkInterface) return navigate(baseListUrl); const query = new URLSearchParams({ selectedInterface: nodeNetworkInterface.name, @@ -33,7 +33,7 @@ const useDrawerInterface = () => { selectedState: nodeNetworkState?.metadata?.name, }); - history.push(`${baseListUrl}?${query.toString()}`); + navigate(`${baseListUrl}?${query.toString()}`); }, }; };