'use client' import { RiAddLine, RiDeleteBinLine } from '@remixicon/react' import * as React from 'react' import { useTranslation } from 'react-i18next' import { v4 as uuid } from 'uuid' import ActionButton from '@/app/components/base/action-button' import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import { cn } from '@/utils/classnames' export type HeaderItem = { id: string key: string value: string } type Props = { headersItems: HeaderItem[] onChange: (headerItems: HeaderItem[]) => void readonly?: boolean isMasked?: boolean } const HeadersInput = ({ headersItems, onChange, readonly = false, isMasked = false, }: Props) => { const { t } = useTranslation() const handleItemChange = (index: number, field: 'key' | 'value', value: string) => { const newItems = [...headersItems] newItems[index] = { ...newItems[index], [field]: value } onChange(newItems) } const handleRemoveItem = (index: number) => { const newItems = headersItems.filter((_, i) => i !== index) onChange(newItems) } const handleAddItem = () => { const newItems = [...headersItems, { id: uuid(), key: '', value: '' }] onChange(newItems) } if (headersItems.length === 0) { return (
{t('mcp.modal.noHeaders', { ns: 'tools' })}
{!readonly && ( )}
) } return (
{isMasked && (
{t('mcp.modal.maskedHeadersTip', { ns: 'tools' })}
)}
{t('mcp.modal.headerKey', { ns: 'tools' })}
{t('mcp.modal.headerValue', { ns: 'tools' })}
{headersItems.map((item, index) => (
handleItemChange(index, 'key', e.target.value)} placeholder={t('mcp.modal.headerKeyPlaceholder', { ns: 'tools' })} className="rounded-none border-0" readOnly={readonly} />
handleItemChange(index, 'value', e.target.value)} placeholder={t('mcp.modal.headerValuePlaceholder', { ns: 'tools' })} className="flex-1 rounded-none border-0" readOnly={readonly} /> {!readonly && !!headersItems.length && ( handleRemoveItem(index)} className="mr-2" > )}
))}
{!readonly && ( )}
) } export default React.memo(HeadersInput)