import React, { useEffect, useMemo } from 'react'; import { Button, Wizard, WizardFooterWrapper, WizardStep, WizardStepType, useWizardContext, } from '@patternfly/react-core'; import { useNavigate, useSearchParams } from 'react-router-dom'; import DetailsStep from './steps/Details'; import FileSystemStep from './steps/FileSystem'; import { FileSystemStepFooter } from './steps/FileSystem/FileSystemConfiguration'; import ImageOutputStep from './steps/ImageOutput'; import OscapStep from './steps/Oscap'; import PackagesStep from './steps/Packages'; import RegistrationStep from './steps/Registration'; import RepositoriesStep from './steps/Repositories'; import ReviewStep from './steps/Review'; import ReviewWizardFooter from './steps/Review/Footer/Footer'; import SnapshotStep from './steps/Snapshot'; import Aws from './steps/TargetEnvironment/Aws'; import Azure from './steps/TargetEnvironment/Azure'; import Gcp from './steps/TargetEnvironment/Gcp'; import { isAwsAccountIdValid, isAzureTenantGUIDValid, isAzureSubscriptionIdValid, isAzureResourceGroupValid, isGcpEmailValid, } from './validators'; import { RHEL_8, AARCH64 } from '../../constants'; import { useListFeaturesQuery } from '../../store/contentSourcesApi'; import { useAppDispatch, useAppSelector } from '../../store/hooks'; import './CreateImageWizard.scss'; import { changeDistribution, changeArchitecture, initializeWizard, selectActivationKey, selectAwsAccountId, selectAwsShareMethod, selectAwsSourceId, selectAzureResourceGroup, selectAzureShareMethod, selectAzureSource, selectAzureSubscriptionId, selectAzureTenantId, selectGcpEmail, selectGcpShareMethod, selectImageTypes, selectRegistrationType, selectStepValidation, addImageType, selectSnapshotDate, selectUseLatest, } from '../../store/wizardSlice'; import { resolveRelPath } from '../../Utilities/path'; import { ImageBuilderHeader } from '../sharedComponents/ImageBuilderHeader'; type CustomWizardFooterPropType = { disableBack?: boolean; disableNext: boolean; }; export const CustomWizardFooter = ({ disableBack: disableBack, disableNext: disableNext, }: CustomWizardFooterPropType) => { const { goToNextStep, goToPrevStep, close } = useWizardContext(); return ( ); }; type CreateImageWizardProps = { isEdit?: boolean; }; const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { const navigate = useNavigate(); const dispatch = useAppDispatch(); const [searchParams] = useSearchParams(); // Remove this and all fallthrough logic when snapshotting is enabled in Prod-stable // =========================TO REMOVE======================= const { data, isSuccess, isFetching, isError } = useListFeaturesQuery(undefined); const snapshottingEnabled = useMemo( () => !( !isError && !isFetching && isSuccess && data?.snapshots?.accessible === false && data?.snapshots?.enabled === false ), [data, isSuccess, isFetching, isError] ); // =========================TO REMOVE======================= // IMPORTANT: Ensure the wizard starts with a fresh initial state useEffect(() => { dispatch(initializeWizard()); searchParams.get('release') === 'rhel8' && dispatch(changeDistribution(RHEL_8)); searchParams.get('arch') === AARCH64 && dispatch(changeArchitecture(AARCH64)); searchParams.get('target') === 'iso' && dispatch(addImageType('image-installer')); searchParams.get('target') === 'qcow2' && dispatch(addImageType('guest-image')); // This useEffect hook should run *only* on mount and therefore has an empty // dependency array. eslint's exhaustive-deps rule does not support this use. // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /* * * Selectors * * */ // Image Output const targetEnvironments = useAppSelector(selectImageTypes); // AWS const awsShareMethod = useAppSelector(selectAwsShareMethod); const awsAccountId = useAppSelector(selectAwsAccountId); const awsSourceId = useAppSelector(selectAwsSourceId); // GCP const gcpShareMethod = useAppSelector(selectGcpShareMethod); const gcpEmail = useAppSelector(selectGcpEmail); // AZURE const azureShareMethod = useAppSelector(selectAzureShareMethod); const azureTenantId = useAppSelector(selectAzureTenantId); const azureSubscriptionId = useAppSelector(selectAzureSubscriptionId); const azureResourceGroup = useAppSelector(selectAzureResourceGroup); const azureSource = useAppSelector(selectAzureSource); const registrationType = useAppSelector(selectRegistrationType); const activationKey = useAppSelector(selectActivationKey); const snapshotDate = useAppSelector(selectSnapshotDate); const useLatest = useAppSelector(selectUseLatest); const snapshotStepRequiresChoice = !useLatest && !snapshotDate; const [currentStep, setCurrentStep] = React.useState(); const onStepChange = ( _event: React.MouseEvent, currentStep: WizardStepType ) => setCurrentStep(currentStep); const detailsValidation = useAppSelector(selectStepValidation('details')); return ( <>
navigate(resolveRelPath(''))} onStepChange={onStepChange} isVisitRequired > } > target === 'aws' || target === 'gcp' || target === 'azure' ) } steps={[ } isHidden={!targetEnvironments.includes('aws')} > , } isHidden={!targetEnvironments.includes('gcp')} > , } isHidden={!targetEnvironments.includes('azure')} > , ]} /> } > } > } > } > , ] : []), } > , } > , ]} /> } > } > {/* Intentional prop drilling for simplicity - To be removed */}
); }; export default CreateImageWizard;