import type { FormikProps } from 'formik'; import { Form } from 'formik'; import React, { useState } from 'react'; import { Button, Modal } from 'react-bootstrap'; import type { Application, IModalComponentProps, IModalProps } from '@spinnaker/core'; import { ManifestWriter, ModalClose, robotToHuman, SpinFormik, SubmitButton, TaskMonitorWrapper, TaskReason, UserVerification, useTaskMonitor, } from '@spinnaker/core'; import { ScaleSettingsForm } from './ScaleSettingsForm'; import type { IAnyKubernetesResource } from '../../interfaces'; import type { IScaleCommand } from './scale.controller'; export interface IKubernetesScaleModalProps extends Pick, Pick { application: Application; resource: IAnyKubernetesResource; currentReplicas: number; } export interface IKubernetesScaleValues { reason?: string; replicas: number; } export function ScaleModal({ application, resource, currentReplicas, isOpen, dismissModal, }: IKubernetesScaleModalProps) { const initialValues: IKubernetesScaleValues = { replicas: currentReplicas, }; const [verified, setVerified] = useState(false); const taskMonitor = useTaskMonitor( { application, title: `Scaling ${resource.name} in ${resource.namespace}`, onTaskComplete: () => application.serverGroups.refresh(true), }, dismissModal, ); const submit = (values: IKubernetesScaleValues): void => { const payload = { cloudProvider: 'kubernetes', manifestName: resource.name, location: resource.namespace, account: resource.account, reason: values.reason, replicas: values.replicas, }; return taskMonitor.submit(() => ManifestWriter.scaleManifest(payload, application)); }; const onOptionChange = (formik: FormikProps, values: IScaleCommand): void => { formik.setFieldValue('replicas', values.replicas); }; return ( initialValues={initialValues} onSubmit={submit} render={(formik) => ( <> Scale {robotToHuman(resource.name)} in {resource.namespace}
onOptionChange(formik, options)} options={ ({ replicas: formik.values.replicas, } as unknown) as IScaleCommand } /> formik.setFieldValue('reason', val)} />
submit(formik.values)} isDisabled={!formik.isValid || formik.isSubmitting || !verified} isFormSubmit={true} submitting={formik.isSubmitting} label={`Scale ${resource.name}`} /> )} />
); }