From f9990c711a02659cd448e62a355a7f2b167bf55f Mon Sep 17 00:00:00 2001 From: "kuangyaqin.kyq" Date: Mon, 1 Dec 2025 16:45:58 +0800 Subject: [PATCH] =?UTF-8?q?Sender=20=E7=BB=84=E4=BB=B6=E6=8F=92=E6=A7=BD?= =?UTF-8?q?=E6=A8=A1=E5=BC=8Ftag=E6=A0=87=E7=AD=BE=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=8F=AF=E5=85=B3=E9=97=AD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/x/components/sender/SlotTextArea.tsx | 27 ++++++++++++++++++- packages/x/components/sender/demo/agent.tsx | 17 ++++++++++++ packages/x/components/sender/interface.ts | 7 +++-- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/packages/x/components/sender/SlotTextArea.tsx b/packages/x/components/sender/SlotTextArea.tsx index 95a723d41..0b73d0fbc 100644 --- a/packages/x/components/sender/SlotTextArea.tsx +++ b/packages/x/components/sender/SlotTextArea.tsx @@ -140,6 +140,7 @@ const SlotTextArea = React.forwardRef((_, ref) => { const renderSlot = (node: SlotConfigType, slotSpan: HTMLSpanElement) => { if (!node.key) return null; const value = getSlotValues()[node.key]; + console.log(node, 'nodeqqqqq'); const renderContent = () => { switch (node.type) { case 'input': @@ -195,7 +196,31 @@ const SlotTextArea = React.forwardRef((_, ref) => { ); case 'tag': - return
{node.props?.label || ''}
; + return ( +
+ {node.props?.label || ''} + {node.allowClose && ( + { + e.stopPropagation(); + // 从配置中移除 + slotConfigRef.current = slotConfigRef.current.filter( + (item) => item.key !== node.key, + ); + // 从DOM中移除 + const slotDom = getSlotDom(node.key as string); + slotDom?.parentNode?.removeChild(slotDom); + // 更新状态 + const newValue = getEditorValue(); + onChange?.(newValue.value, undefined, newValue.config); + }} + > + × + + )} +
+ ); case 'custom': return node.customRender?.( value, diff --git a/packages/x/components/sender/demo/agent.tsx b/packages/x/components/sender/demo/agent.tsx index 066c804a5..91adf2fb1 100644 --- a/packages/x/components/sender/demo/agent.tsx +++ b/packages/x/components/sender/demo/agent.tsx @@ -36,6 +36,14 @@ const AgentInfo: { }, }, { type: 'text', value: ' and summarize it into a list.' }, + { + type: 'tag', + key: 'tag_type', + props: { + value: 'tag1', + label: 'tag 1', + }, + }, ], }, ai_code: { @@ -52,6 +60,15 @@ const AgentInfo: { }, }, { type: 'text', value: ' to write a mini game.' }, + { + type: 'tag', + key: 'tag_type', + allowClose: true, + props: { + value: 'tag2', + label: 'tag 2', + }, + }, ], }, ai_writing: { diff --git a/packages/x/components/sender/interface.ts b/packages/x/components/sender/interface.ts index 69a0bb072..5eac60543 100644 --- a/packages/x/components/sender/interface.ts +++ b/packages/x/components/sender/interface.ts @@ -63,6 +63,7 @@ interface SlotConfigSelectType extends SlotConfigBaseType { interface SlotConfigTagType extends SlotConfigBaseType { type: 'tag'; key: string; + allowClose?: boolean; props?: { label: React.ReactNode; value?: string; @@ -97,8 +98,10 @@ export type SlotConfigType = export type EventType = | React.FormEvent | React.ChangeEvent; -export interface SenderProps - extends Pick { +export interface SenderProps extends Pick< + TextareaProps, + 'placeholder' | 'onKeyUp' | 'onFocus' | 'onBlur' +> { prefixCls?: string; defaultValue?: string; value?: string;