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