import React from 'react'; import { useForm, Controller } from 'react-hook-form'; import { RouteParamsClusterTopic } from 'lib/paths'; import { Button } from 'components/common/Button/Button'; import Editor from 'components/common/Editor/Editor'; import Select, { SelectOption } from 'components/common/Select/Select'; import Switch from 'components/common/Switch/Switch'; import useAppParams from 'lib/hooks/useAppParams'; import { showAlert } from 'lib/errorHandling'; import { useSendMessage, useTopicDetails } from 'lib/hooks/api/topics'; import { InputLabel } from 'components/common/Input/InputLabel.styled'; import { useSerdes } from 'lib/hooks/api/topicMessages'; import { SerdeUsage } from 'generated-sources'; import * as S from './SendMessage.styled'; import { getDefaultValues, getPartitionOptions, getSerdeOptions, validateBySchema, } from './utils'; interface FormType { key: string; content: string; headers: string; partition: number; keySerde: string; valueSerde: string; keepContents: boolean; } const SendMessage: React.FC<{ closeSidebar: () => void }> = ({ closeSidebar, }) => { const { clusterName, topicName } = useAppParams(); const { data: topic } = useTopicDetails({ clusterName, topicName }); const { data: serdes = {} } = useSerdes({ clusterName, topicName, use: SerdeUsage.SERIALIZE, }); const sendMessage = useSendMessage({ clusterName, topicName }); const defaultValues = React.useMemo(() => getDefaultValues(serdes), [serdes]); const partitionOptions: SelectOption[] = React.useMemo( () => getPartitionOptions(topic?.partitions || []), [topic] ); const { handleSubmit, formState: { isSubmitting }, control, setValue, } = useForm({ mode: 'onChange', defaultValues: { ...defaultValues, partition: Number(partitionOptions[0].value), keepContents: false, }, }); const submit = async ({ keySerde, valueSerde, key, content, headers, partition, keepContents, }: FormType) => { let errors: string[] = []; if (keySerde) { const selectedKeySerde = serdes.key?.find((k) => k.name === keySerde); errors = validateBySchema(key, selectedKeySerde?.schema, 'key'); } if (valueSerde) { const selectedValue = serdes.value?.find((v) => v.name === valueSerde); errors = [ ...errors, ...validateBySchema(content, selectedValue?.schema, 'content'), ]; } let parsedHeaders; if (headers) { try { parsedHeaders = JSON.parse(headers); } catch (error) { errors.push('Wrong header format'); } } if (errors.length > 0) { showAlert('error', { id: `${clusterName}-${topicName}-createTopicMessageError`, title: 'Validation Error', message: ( ), }); return; } try { await sendMessage.mutateAsync({ key: key || null, content: content || null, headers: parsedHeaders, partition: partition || 0, keySerde, valueSerde, }); if (!keepContents) { setValue('key', ''); setValue('content', ''); closeSidebar(); } } catch (e) { // do nothing } }; return (
Partition ( )} /> Value Serde (