import { useMemo, useState } from 'react'; import { useFormContext, useWatch } from 'react-hook-form'; import { Label, Input, Checkbox, SecretInput, Radio, useToastContext } from '@librechat/client'; import { Copy, CopyCheck } from 'lucide-react'; import { useLocalize, useCopyToClipboard } from '~/hooks'; import { cn } from '~/utils'; import { AuthTypeEnum, AuthorizationTypeEnum } from '../hooks/useMCPServerForm'; import type { MCPServerFormData } from '../hooks/useMCPServerForm'; interface AuthSectionProps { isEditMode: boolean; serverName?: string; } export default function AuthSection({ isEditMode, serverName }: AuthSectionProps) { const localize = useLocalize(); const { showToast } = useToastContext(); const { register, setValue, formState: { errors }, } = useFormContext(); const [isCopying, setIsCopying] = useState(false); const authType = useWatch({ name: 'auth.auth_type', }) as AuthTypeEnum; const apiKeySource = useWatch({ name: 'auth.api_key_source', }) as 'admin' | 'user'; const authorizationType = useWatch({ name: 'auth.api_key_authorization_type', }) as AuthorizationTypeEnum; const redirectUri = serverName ? `${window.location.origin}/api/mcp/${serverName}/oauth/callback` : ''; const copyLink = useCopyToClipboard({ text: redirectUri }); const authTypeOptions = useMemo( () => [ { value: AuthTypeEnum.None, label: localize('com_ui_no_auth') }, { value: AuthTypeEnum.ServiceHttp, label: localize('com_ui_api_key') }, { value: AuthTypeEnum.OAuth, label: 'OAuth' }, ], [localize], ); const headerFormatOptions = useMemo( () => [ { value: AuthorizationTypeEnum.Bearer, label: localize('com_ui_bearer') }, { value: AuthorizationTypeEnum.Basic, label: localize('com_ui_basic') }, { value: AuthorizationTypeEnum.Custom, label: localize('com_ui_custom') }, ], [localize], ); return (
{/* Auth Type Radio */}
setValue('auth.auth_type', val as AuthTypeEnum)} fullWidth />
{/* API Key Fields */} {authType === AuthTypeEnum.ServiceHttp && (
{/* User provides own key checkbox */}
setValue('auth.api_key_source', checked ? 'user' : 'admin') } aria-label={localize('com_ui_user_provides_key')} />
{/* API Key input - only when admin provides */} {apiKeySource !== 'user' && (
)} {/* Header Format Radio */}
setValue('auth.api_key_authorization_type', val as AuthorizationTypeEnum) } fullWidth />
{/* Custom header name */} {authorizationType === AuthorizationTypeEnum.Custom && (
)}
)} {/* OAuth Fields */} {authType === AuthTypeEnum.OAuth && (
{/* Client ID & Secret in a grid */}
{/* Auth URL & Token URL in a grid */}
{/* Scope */}
{/* Redirect URI */} {isEditMode && redirectUri && (
)}
)}
); }