function Storage()

in frontend/src/pages/Configure/Storage.js [565:624]


function Storage() {
  const storages = useState(storagePath);
  const editing = useState(['app', 'wizard', 'editing']);
  const storageType = useState(['app', 'wizard', 'storage', 'type']);

  const storageMaxes = {"FsxLustre": 1, "Efs": 1, "Ebs": 5}

  const storageTypesSource = [
    ["FsxLustre", "Amazon FSx for Lustre (FSX)", "/img/fsx.svg"],
    ["Efs", "Amazon Elastic File System (EFS)", "/img/efs.svg"],
    ["Ebs", "Amazon Elastic Block Store (EBS)", "/img/ebs.svg"],
  ];

  const defaultCounts = {"FsxLustre": 0, "Efs": 0, "Ebs": 0}

  const storageReducer = (eax, item) => {
    let ret = {...eax}
    ret[item.StorageType] += 1
    return ret;
  }
  const storageCounts = storages ? storages.reduce(storageReducer, defaultCounts) : defaultCounts;

  const storageTypes = storageTypesSource.reduce((newStorages, storageType) => {
    const st = storageType[0];
    return storageCounts[st] >= storageMaxes[st] ? newStorages : [...newStorages, storageType];
  }, [])

  const addStorage = () => {
    const newIndex = storages ? storages.length : 0;
    if(!storages)
      setState(storagePath, [{Name: `${storageType}${newIndex}`, StorageType: storageType, MountDir: '/shared'}]);
    else
      setState([...storagePath, newIndex], {Name: `${storageType}${newIndex}`, StorageType: storageType, MountDir: '/shared'});
    clearState(['app', 'wizard', 'storage', 'type']);
  }

  const setStorageType = (newStorageType) => {
    setState(['app', 'wizard', 'storage', 'type'], newStorageType);
  }

  return (
    <div style={{display: "flex", flexDirection: "column", gap: "20px"}}>
      {storages ? storages.map((_, i) => <StorageInstance key={i} index={i} />)
      : <div>No shared storage options selected.</div>}

      {!editing && storageTypes.length > 0 &&
        <div style={{display: "flex", flexDirection: "row", justifyContent: "flex-end"}}>
          <div style={{display: "flex", flexDirection: "row", gap: "16px", alignItems: "center", marginTop: "10px"}}>
            Storage Type:
            <Select
              disabled={editing}
              placeholder="Please Select a Filesystem Type"
              selectedOption={storageType && itemToDisplayIconOption(findFirst(storageTypes, s => {return s[0] === storageType}))}
              onChange={({detail}) => {setStorageType(detail.selectedOption.value)}}
              options={storageTypes.map(itemToIconOption)}
            />
            <Button onClick={addStorage} disabled={!storageType || (storages && storages.length >= 5)} iconName={"add-plus"}>Add Storage</Button>
          </div>
        </div>
      }