123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- import React from 'react';
- import {
- ClusterName,
- TopicFormDataRaw,
- TopicName,
- TopicConfigByName,
- TopicWithDetailedInfo,
- } from 'redux/interfaces';
- import { TopicConfig } from 'generated-sources';
- import { useForm, FormProvider } from 'react-hook-form';
- import { camelCase } from 'lodash';
- import TopicForm from 'components/Topics/shared/Form/TopicForm';
- import { clusterTopicPath } from 'lib/paths';
- import { useHistory } from 'react-router';
- import DangerZoneContainer from './DangerZoneContainer';
- interface Props {
- clusterName: ClusterName;
- topicName: TopicName;
- topic?: TopicWithDetailedInfo;
- isFetched: boolean;
- isTopicUpdated: boolean;
- fetchTopicConfig: (clusterName: ClusterName, topicName: TopicName) => void;
- updateTopic: (
- clusterName: ClusterName,
- topicName: TopicName,
- form: TopicFormDataRaw
- ) => void;
- updateTopicPartitionsCount: (
- clusterName: string,
- topicname: string,
- partitions: number
- ) => void;
- }
- const DEFAULTS = {
- partitions: 1,
- replicationFactor: 1,
- minInSyncReplicas: 1,
- cleanupPolicy: 'delete',
- retentionBytes: -1,
- maxMessageBytes: 1000012,
- };
- const topicParams = (topic: TopicWithDetailedInfo | undefined) => {
- if (!topic) {
- return DEFAULTS;
- }
- const { name, replicationFactor } = topic;
- const configs = topic.config?.reduce(
- (result: { [key: string]: TopicConfig['value'] }, param) => ({
- ...result,
- [camelCase(param.name)]: param.value || param.defaultValue,
- }),
- {}
- );
- return {
- ...DEFAULTS,
- name,
- partitions: topic.partitionCount || DEFAULTS.partitions,
- replicationFactor,
- ...configs,
- };
- };
- let formInit = false;
- const Edit: React.FC<Props> = ({
- clusterName,
- topicName,
- topic,
- isFetched,
- isTopicUpdated,
- fetchTopicConfig,
- updateTopic,
- }) => {
- const defaultValues = topicParams(topic);
- const methods = useForm<TopicFormDataRaw>({ defaultValues });
- const [isSubmitting, setIsSubmitting] = React.useState<boolean>(false);
- const history = useHistory();
- React.useEffect(() => {
- fetchTopicConfig(clusterName, topicName);
- }, [fetchTopicConfig, clusterName, topicName]);
- React.useEffect(() => {
- if (isSubmitting && isTopicUpdated) {
- const { name } = methods.getValues();
- history.push(clusterTopicPath(clusterName, name));
- }
- }, [isSubmitting, isTopicUpdated, clusterTopicPath, clusterName, methods]);
- if (!isFetched || !topic || !topic.config) {
- return null;
- }
- if (!formInit) {
- methods.reset(defaultValues);
- formInit = true;
- }
- const config: TopicConfigByName = {
- byName: {},
- };
- topic.config.forEach((param) => {
- config.byName[param.name] = param;
- });
- const onSubmit = async (data: TopicFormDataRaw) => {
- updateTopic(clusterName, topicName, data);
- setIsSubmitting(true); // Keep this action after updateTopic to prevent redirect before update.
- };
- return (
- <div>
- <div className="box">
- <FormProvider {...methods}>
- <TopicForm
- topicName={topicName}
- config={config}
- isSubmitting={isSubmitting}
- isEditing
- onSubmit={methods.handleSubmit(onSubmit)}
- />
- </FormProvider>
- </div>
- {topic && (
- <DangerZoneContainer
- defaultPartitions={defaultValues.partitions}
- defaultReplicationFactor={
- defaultValues.replicationFactor || DEFAULTS.replicationFactor
- }
- />
- )}
- </div>
- );
- };
- export default Edit;
|