import type { FormikProps } from 'formik'; import React from 'react'; import type { Option } from 'react-select'; import { BuildServiceType, IgorService } from '../../../../ci'; import { ConcourseService } from './concourse.service'; import type { IConcourseTrigger } from '../../../../domain'; import { FormikFormField, ReactSelectInput, useData } from '../../../../presentation'; export interface IConcourseTriggerConfigProps { trigger: IConcourseTrigger; formik: FormikProps; } export function ConcourseTrigger({ formik, trigger }: IConcourseTriggerConfigProps) { const { team, project, master } = trigger; const pipeline = project && project.split('/').pop(); const onTeamChanged = () => { formik.setFieldValue('job', ''); formik.setFieldValue('jobName', ''); formik.setFieldValue('project', ''); }; const onProjectChanged = () => { formik.setFieldValue('job', ''); formik.setFieldValue('jobName', ''); }; const onJobChanged = (job: string) => { const jobName = job && job.split('/').pop(); formik.setFieldValue('jobName', jobName); }; const fetchMasters = useData(() => IgorService.listMasters(BuildServiceType.Concourse), [], []); const fetchTeams = useData(() => ConcourseService.listTeamsForMaster(master), [], [master]); const fetchPipelines = useData(() => ConcourseService.listPipelinesForTeam(master, team), [], [master, team]); const fetchJobs = useData( () => ConcourseService.listJobsForPipeline(master, team, pipeline).then((jobs) => jobs.map((job) => `${team}/${pipeline}/${job}`), ), [], [master, team, pipeline], ); const lastSegmentOptionRenderer = (option: Option) => <>{option.value.split('/').pop()}; return ( <> ( )} /> ( )} /> ( )} /> ( )} /> ); }