import React from 'react'; import { AccountService, ChecklistInput } from '@spinnaker/core'; export interface IAvailabilityZoneSelectorProps { region: string; credentials: string; onChange: (zones: string[]) => void; allZones: string[]; usePreferredZones?: boolean; selectedZones: string[]; } export interface IAvailabilityZoneSelectorState { defaultZones: string[]; usePreferredZones: boolean; } export class AvailabilityZoneSelector extends React.Component< IAvailabilityZoneSelectorProps, IAvailabilityZoneSelectorState > { constructor(props: IAvailabilityZoneSelectorProps) { super(props); this.state = { defaultZones: [], usePreferredZones: props.usePreferredZones || !props.selectedZones || props.selectedZones.length === 0, }; this.setDefaultZones(this.state.usePreferredZones, props); } public componentWillReceiveProps(nextProps: IAvailabilityZoneSelectorProps): void { if (nextProps.region !== this.props.region || nextProps.credentials !== this.props.credentials) { this.setDefaultZones(this.state.usePreferredZones, nextProps); } } private setDefaultZones(usePreferredZones: boolean, props: IAvailabilityZoneSelectorProps) { const { credentials, region } = props; AccountService.getAvailabilityZonesForAccountAndRegion('aws', credentials, region).then((preferredZones) => { this.setState({ defaultZones: preferredZones }); if (usePreferredZones && preferredZones) { props.onChange(preferredZones.slice()); } }); } private handleUsePreferredZonesChanged = (event: React.ChangeEvent): void => { const usePreferredZones = event.target.value === 'true'; this.setState({ usePreferredZones }); if (usePreferredZones) { this.setDefaultZones(usePreferredZones, this.props); } }; private handleSelectedZonesChanged = (zones: Set): void => { this.props.onChange([...zones]); }; public render(): React.ReactElement { const { region, allZones, selectedZones } = this.props; const { defaultZones, usePreferredZones } = this.state; return (
Availability Zones
{region && (

Automatic Availability Zone Balancing:


{usePreferredZones && (

Server group will be available in:

    {defaultZones.map((zone) => (
  • {zone}
  • ))}
)} {!usePreferredZones && (
Restrict server group instances to: ) => this.handleSelectedZonesChanged(e.target.value)} />
)}
)}
); } }