import { useIntl } from '@umijs/max'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; import Inner from './inner'; interface LabelSelectorProps { labels: Record; label?: string; btnText?: string; description?: React.ReactNode; disabled?: boolean; isAutoComplete?: boolean; onChange?: (labels: Record) => void; onBlur?: (e: any, type: string, index: number) => void; onDelete?: (index: number) => void; } const LabelSelector: React.FC = ({ labels, onChange, onBlur, onDelete, disabled, label, btnText, description, isAutoComplete }) => { const intl = useIntl(); const [labelsData, setLabelsData] = useState({}); const [labelList, setLabelList] = useState<{ key: string; value: string }[]>( [] ); useEffect(() => { if (!_.isEqual(labels, labelsData)) { setLabelsData(labels || {}); const list = _.map(_.keys(labels), (key: string) => { return { key, value: labels[key] }; }); setLabelList(list); } }, [labels]); const handleLabelListChange = (list: { key: string; value: string }[]) => { setLabelList(list); }; const handleLabelsChange = (data: Record) => { console.log('handleLabelsChange', data); setLabelsData(data); onChange?.(data); }; const updateLabels = (list: { key: string; value: string }[]) => { const newLabels = _.reduce( list, (result: any, item: any) => { if (item.key) { result[item.key] = item.value; } return result; }, {} ); onChange?.(newLabels); }; const handleOnPaste = ( e: React.ClipboardEvent, index: number ) => { const clipboardText = e.clipboardData.getData('text'); if (!clipboardText || clipboardText.indexOf('=') === -1) return; e.preventDefault(); const lines = clipboardText .split(/\r?\n/) .map((line) => line.trim()) .filter((line) => line && line.includes('=')); const parsedData = lines.map((line) => { const [key, value] = line.split('=').map((part) => part.trim()); return { key, value }; }); const newPairs = [...labelList]; newPairs.splice(index, 1, ...parsedData); updateLabels(newPairs); setLabelList(newPairs); }; return ( ); }; export default LabelSelector;