import React from 'react'; import { useNavigate } from 'react-router-dom'; import useAppParams from 'lib/hooks/useAppParams'; import { Controller, FormProvider, useForm } from 'react-hook-form'; import { ErrorMessage } from '@hookform/error-message'; import { yupResolver } from '@hookform/resolvers/yup'; import { clusterConnectConnectorPath, clusterConnectorsPath, ClusterNameRoute, } from 'lib/paths'; import yup from 'lib/yupExtended'; import Editor from 'components/common/Editor/Editor'; import Select from 'components/common/Select/Select'; import { FormError } from 'components/common/Input/Input.styled'; import Input from 'components/common/Input/Input'; import { Button } from 'components/common/Button/Button'; import PageHeading from 'components/common/PageHeading/PageHeading'; import Heading from 'components/common/heading/Heading.styled'; import { useConnects, useCreateConnector } from 'lib/hooks/api/kafkaConnect'; import get from 'lodash/get'; import { Connect } from 'generated-sources'; import * as S from './New.styled'; const validationSchema = yup.object().shape({ name: yup.string().required(), config: yup.string().required().isJsonObject(), }); interface FormValues { connectName: Connect['name']; name: string; config: string; } const New: React.FC = () => { const { clusterName } = useAppParams(); const navigate = useNavigate(); const { data: connects } = useConnects(clusterName); const mutation = useCreateConnector(clusterName); const methods = useForm({ mode: 'all', resolver: yupResolver(validationSchema), defaultValues: { connectName: get(connects, '0.name', ''), name: '', config: '', }, }); const { handleSubmit, control, formState: { isDirty, isSubmitting, isValid, errors }, getValues, setValue, } = methods; React.useEffect(() => { if (connects && connects.length > 0 && !getValues().connectName) { setValue('connectName', connects[0].name); } }, [connects, getValues, setValue]); const onSubmit = async (values: FormValues) => { const connector = await mutation.mutateAsync({ connectName: values.connectName, newConnector: { name: values.name, config: JSON.parse(values.config.trim()), }, }); if (connector) { navigate( clusterConnectConnectorPath( clusterName, connector.connect, connector.name ) ); } }; if (!connects || connects.length === 0) { return null; } const connectOptions = connects.map(({ name: connectName }) => ({ value: connectName, label: connectName, })); return ( Connect * (
Config ( )} />
); }; export default New;