import React, { useState } from 'react'; import { IconButton } from '~/components/ui/IconButton'; import type { IProviderSetting } from '~/types/model'; import { classNames } from '~/utils/classNames'; import { motion, AnimatePresence } from 'framer-motion'; interface HeaderManagerProps { provider: string; settings: IProviderSetting; onUpdateSettings: (settings: IProviderSetting) => void; } interface HeaderFormData { name: string; value: string; } export const HeaderManager: React.FC = ({ provider, settings, onUpdateSettings }) => { const [isAddingHeader, setIsAddingHeader] = useState(false); const [editingHeaderKey, setEditingHeaderKey] = useState(null); const [headerForm, setHeaderForm] = useState({ name: '', value: '', }); const customHeaders = settings.customHeaders || {}; const headerEntries = Object.entries(customHeaders); const handleAddHeader = () => { if (!headerForm.name.trim() || !headerForm.value.trim()) { return; } const updatedHeaders = { ...customHeaders, [headerForm.name.trim()]: headerForm.value.trim(), }; const updatedSettings = { ...settings, customHeaders: updatedHeaders, }; onUpdateSettings(updatedSettings); setHeaderForm({ name: '', value: '' }); setIsAddingHeader(false); }; const handleEditHeader = (key: string) => { setHeaderForm({ name: key, value: customHeaders[key], }); setEditingHeaderKey(key); }; const handleUpdateHeader = () => { if (editingHeaderKey === null || !headerForm.name.trim() || !headerForm.value.trim()) { return; } const updatedHeaders = { ...customHeaders }; // Remove old key if name changed if (editingHeaderKey !== headerForm.name.trim()) { delete updatedHeaders[editingHeaderKey]; } // Add/update with new values updatedHeaders[headerForm.name.trim()] = headerForm.value.trim(); const updatedSettings = { ...settings, customHeaders: updatedHeaders, }; onUpdateSettings(updatedSettings); setHeaderForm({ name: '', value: '' }); setEditingHeaderKey(null); }; const handleDeleteHeader = (key: string) => { const updatedHeaders = { ...customHeaders }; delete updatedHeaders[key]; const updatedSettings = { ...settings, customHeaders: updatedHeaders, }; onUpdateSettings(updatedSettings); }; const handleCancelEdit = () => { setHeaderForm({ name: '', value: '' }); setIsAddingHeader(false); setEditingHeaderKey(null); }; return (

Custom Headers

setIsAddingHeader(true)} title="Add Header" className="bg-green-500/10 hover:bg-green-500/20 text-green-500" disabled={isAddingHeader || editingHeaderKey !== null} >
{/* Header Form */} {(isAddingHeader || editingHeaderKey !== null) && (
setHeaderForm({ ...headerForm, name: e.target.value })} placeholder="e.g., x-api-version" className={classNames( 'w-full px-3 py-2 rounded-lg text-sm', 'bg-bolt-elements-background-depth-2 border border-bolt-elements-borderColor', 'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary', 'focus:outline-none focus:ring-2 focus:ring-purple-500/30', )} />
setHeaderForm({ ...headerForm, value: e.target.value })} placeholder="e.g., v1.0" className={classNames( 'w-full px-3 py-2 rounded-lg text-sm', 'bg-bolt-elements-background-depth-2 border border-bolt-elements-borderColor', 'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary', 'focus:outline-none focus:ring-2 focus:ring-purple-500/30', )} />
)} {/* Headers List */}
{headerEntries.map(([key, value]) => (
{key} {value}

Custom header for {provider}

handleEditHeader(key)} title="Edit Header" className="bg-blue-500/10 hover:bg-blue-500/20 text-blue-500" disabled={isAddingHeader || editingHeaderKey !== null} >
handleDeleteHeader(key)} title="Delete Header" className="bg-red-500/10 hover:bg-red-500/20 text-red-500" disabled={isAddingHeader || editingHeaderKey !== null} >
))} {headerEntries.length === 0 && !isAddingHeader && (

No custom headers configured

Click the + button to add a header

{provider === 'Portkey' &&

Default: x-portkey-debug: false

}
)}
); };