-
diff --git a/src/components/content/order/create/SelectServiceForm.tsx b/src/components/content/order/create/SelectServiceForm.tsx
index e47d79195..02d3a4fa5 100644
--- a/src/components/content/order/create/SelectServiceForm.tsx
+++ b/src/components/content/order/create/SelectServiceForm.tsx
@@ -4,7 +4,7 @@
*/
import { To, useLocation, useSearchParams } from 'react-router-dom';
-import React, { useMemo, useState } from 'react';
+import React, { useEffect, useMemo, useState } from 'react';
import {
AvailabilityZoneConfig,
Billing,
@@ -34,9 +34,9 @@ import { BillingInfo } from '../common/BillingInfo';
import GoToSubmit from './GoToSubmit';
import { servicesSubPageRoute } from '../../../utils/constants';
import { OrderSubmitProps } from '../common/utils/OrderSubmitProps';
-import { getAvailabilityZoneConfigs } from '../formDataHelpers/getAvailabilityZoneConfigs';
-import { AvailabilityZoneInfo } from '../common/AvailabilityZoneInfo';
-import useAvailabilityZonesVariableQuery from '../common/utils/useAvailabilityZonesVariableQuery';
+import useGetAvailabilityZonesForRegionQuery from '../common/utils/useGetAvailabilityZonesForRegionQuery';
+import { getAvailabilityZoneRequirementsForAService } from '../formDataHelpers/getAvailabilityZoneRequirementsForAService';
+import { AvailabilityZoneFormItem } from '../common/availabilityzone/AvailabilityZoneFormItem';
export function SelectServiceForm({ services }: { services: UserOrderableServiceVo[] }): React.JSX.Element {
const [urlParams] = useSearchParams();
@@ -69,14 +69,18 @@ export function SelectServiceForm({ services }: { services: UserOrderableService
const versionList: { value: string; label: string }[] = getSortedVersionList(versionToServicesMap);
const [selectVersion, setSelectVersion] = useState
(serviceInfo ? serviceInfo.version : latestVersion);
let cspList: UserOrderableServiceVo.csp[] = getCspListForVersion(selectVersion, versionToServicesMap);
- const [selectCsp, setSelectCsp] = useState(serviceInfo ? serviceInfo.csp : cspList[0]);
+ const [selectCsp, setSelectCsp] = useState(
+ serviceInfo ? (serviceInfo.csp as UserOrderableServiceVo.csp) : cspList[0]
+ );
let serviceHostTypes: UserOrderableServiceVo.serviceHostingType[] = getAvailableServiceHostingTypes(
selectCsp,
versionToServicesMap.get(selectVersion)
);
const [selectServiceHostType, setSelectServiceHostType] = useState(
- serviceInfo ? serviceInfo.serviceHostingType : serviceHostTypes[0]
+ serviceInfo
+ ? (serviceInfo.serviceHostingType as UserOrderableServiceVo.serviceHostingType)
+ : serviceHostTypes[0]
);
let areaList: Tab[] = convertAreasToTabs(selectCsp, selectServiceHostType, versionToServicesMap.get(selectVersion));
const [selectArea, setSelectArea] = useState(serviceInfo ? serviceInfo.area : areaList[0].key);
@@ -87,35 +91,9 @@ export function SelectServiceForm({ services }: { services: UserOrderableService
versionToServicesMap.get(selectVersion)
);
const [selectRegion, setSelectRegion] = useState(serviceInfo ? serviceInfo.region : regionList[0].value);
-
- const availabilityZonesVariableRequest = useAvailabilityZonesVariableQuery(selectCsp, selectRegion);
- const availabilityZoneConfigs: AvailabilityZoneConfig[] | undefined = getAvailabilityZoneConfigs(
- selectCsp,
- versionToServicesMap.get(selectVersion)
- );
const [selectAvailabilityZones, setSelectAvailabilityZones] = useState>(
serviceInfo?.availabilityZones ?? {}
);
- const availabilityZones = useMemo(() => {
- if (availabilityZoneConfigs && availabilityZonesVariableRequest.isSuccess) {
- availabilityZoneConfigs.forEach((availabilityZone) => {
- setSelectAvailabilityZones((prevState: Record) => ({
- ...prevState,
- [availabilityZone.varName]: availabilityZone.mandatory
- ? availabilityZonesVariableRequest.data[0]
- : '',
- }));
- });
- return availabilityZonesVariableRequest.data;
- } else {
- return [];
- }
- }, [
- availabilityZoneConfigs,
- availabilityZonesVariableRequest.isSuccess,
- availabilityZonesVariableRequest.data,
- setSelectAvailabilityZones,
- ]);
let flavorList: Flavor[] = getFlavorList(selectCsp, selectServiceHostType, versionToServicesMap.get(selectVersion));
const [selectFlavor, setSelectFlavor] = useState(serviceInfo ? serviceInfo.flavor : flavorList[0].value);
@@ -125,6 +103,31 @@ export function SelectServiceForm({ services }: { services: UserOrderableService
getContactServiceDetailsOfServiceByCsp(selectCsp, versionToServicesMap.get(selectVersion));
let currentBilling: Billing = getBilling(selectCsp, selectServiceHostType, versionToServicesMap.get(selectVersion));
+ const getAvailabilityZonesForRegionQuery = useGetAvailabilityZonesForRegionQuery(selectCsp, selectRegion);
+ const availabilityZoneConfigs: AvailabilityZoneConfig[] = getAvailabilityZoneRequirementsForAService(
+ selectCsp,
+ services
+ );
+
+ // Side effect needed to update initial state when data from backend is available.
+ useEffect(() => {
+ if (!serviceInfo?.availabilityZones) {
+ if (getAvailabilityZonesForRegionQuery.isSuccess && getAvailabilityZonesForRegionQuery.data.length > 0) {
+ if (availabilityZoneConfigs.length > 0) {
+ const defaultSelection: Record = {};
+ availabilityZoneConfigs.forEach((availabilityZoneConfig) => {
+ if (availabilityZoneConfig.mandatory) {
+ defaultSelection[availabilityZoneConfig.varName] =
+ getAvailabilityZonesForRegionQuery.data[0];
+ }
+ });
+ setSelectAvailabilityZones(defaultSelection);
+ }
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [getAvailabilityZonesForRegionQuery.isSuccess, getAvailabilityZonesForRegionQuery.data]);
+
const onChangeServiceHostingType = (serviceHostingType: UserOrderableServiceVo.serviceHostingType) => {
location.state = undefined;
setSelectServiceHostType(serviceHostingType);
@@ -204,6 +207,24 @@ export function SelectServiceForm({ services }: { services: UserOrderableService
setSelectServiceHostType(serviceHostTypes[0]);
};
+ function onAvailabilityZoneChange(varName: string, availabilityZone: string | undefined) {
+ if (availabilityZone !== undefined) {
+ setSelectAvailabilityZones((prevState: Record) => ({
+ ...prevState,
+ [varName]: availabilityZone,
+ }));
+ } else {
+ const newAvailabilityZone = selectAvailabilityZones;
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ delete newAvailabilityZone[varName];
+ setSelectAvailabilityZones({ ...newAvailabilityZone });
+ }
+ }
+
+ function isAvailabilityZoneRequired(): boolean {
+ return availabilityZoneConfigs.filter((availabilityZoneConfig) => availabilityZoneConfig.mandatory).length > 0;
+ }
+
return (
<>