import { useTranslate } from '@/hooks/common-hooks'; import { CloseOutlined } from '@ant-design/icons'; import { Button, Card, Form, FormListFieldData, Input, Select } from 'antd'; import { FormInstance } from 'antd/lib'; import { humanId } from 'human-id'; import trim from 'lodash/trim'; import { ChangeEventHandler, FocusEventHandler, useCallback, useEffect, useState, } from 'react'; import { useUpdateNodeInternals } from 'reactflow'; import { Operator } from '../constant'; import { useBuildFormSelectOptions } from '../form-hooks'; interface IProps { nodeId?: string; } interface INameInputProps { value?: string; onChange?: (value: string) => void; otherNames?: string[]; validate(errors: string[]): void; } const getOtherFieldValues = ( form: FormInstance, field: FormListFieldData, latestField: string, ) => (form.getFieldValue(['items']) ?? []) .map((x: any) => x[latestField]) .filter( (x: string) => x !== form.getFieldValue(['items', field.name, latestField]), ); const NameInput = ({ value, onChange, otherNames, validate, }: INameInputProps) => { const [name, setName] = useState(); const { t } = useTranslate('flow'); const handleNameChange: ChangeEventHandler = useCallback( (e) => { const val = e.target.value; // trigger validation if (otherNames?.some((x) => x === val)) { validate([t('nameRepeatedMsg')]); } else if (trim(val) === '') { validate([t('nameRequiredMsg')]); } else { validate([]); } setName(val); }, [otherNames, validate, t], ); const handleNameBlur: FocusEventHandler = useCallback( (e) => { const val = e.target.value; if (otherNames?.every((x) => x !== val) && trim(val) !== '') { onChange?.(val); } }, [onChange, otherNames], ); useEffect(() => { setName(value); }, [value]); return ( ); }; const DynamicCategorize = ({ nodeId }: IProps) => { const updateNodeInternals = useUpdateNodeInternals(); const form = Form.useFormInstance(); const buildCategorizeToOptions = useBuildFormSelectOptions( Operator.Categorize, nodeId, ); const { t } = useTranslate('flow'); return ( <> {(fields, { add, remove }) => { const handleAdd = () => { add({ name: humanId() }); if (nodeId) updateNodeInternals(nodeId); }; return (
{fields.map((field) => ( { remove(field.name); }} /> } > form.setFields([ { name: ['items', field.name, 'name'], errors, }, ]) } >