import { useState } from 'react' import cn from 'classnames' import s from './index.module.css' import { useContext } from 'use-context-selector' import Indicator from '../../../indicator' import { useTranslation } from 'react-i18next' import type { Provider, ProviderAzureToken } from '@/models/common' import { ProviderName } from '@/models/common' import OpenaiProvider from '../openai-provider' import AzureProvider from '../azure-provider' import { ValidatedStatus, ValidatedStatusState } from '../provider-input/useValidateToken' import { updateProviderAIKey } from '@/service/common' import { ToastContext } from '@/app/components/base/toast' interface IProviderItemProps { icon: string name: string provider: Provider activeId: string onActive: (v: string) => void onSave: () => void } const ProviderItem = ({ activeId, icon, name, provider, onActive, onSave }: IProviderItemProps) => { const { t } = useTranslation() const [validatedStatus, setValidatedStatus] = useState() const [loading, setLoading] = useState(false) const { notify } = useContext(ToastContext) const [token, setToken] = useState( provider.provider_name === 'azure_openai' ? { openai_api_base: '', openai_api_key: '' } : '' ) const id = `${provider.provider_name}-${provider.provider_type}` const isOpen = id === activeId const comingSoon = false const isValid = provider.is_valid const providerTokenHasSetted = () => { if (provider.provider_name === ProviderName.AZURE_OPENAI) { return provider.token && provider.token.openai_api_base && provider.token.openai_api_key ? { openai_api_base: provider.token.openai_api_base, openai_api_key: provider.token.openai_api_key }: undefined } if (provider.provider_name === ProviderName.OPENAI) { return provider.token } } const handleUpdateToken = async () => { if (loading) return if (validatedStatus?.status === ValidatedStatus.Success) { try { setLoading(true) await updateProviderAIKey({ url: `/workspaces/current/providers/${provider.provider_name}/token`, body: { token } }) notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) onActive('') } catch (e) { notify({ type: 'error', message: t('common.provider.saveFailed') }) } finally { setLoading(false) onSave() } } } return (
{name}
{ providerTokenHasSetted() && !comingSoon && !isOpen && (
{!isValid &&
{t('common.provider.invalidApiKey')}
}
) } { !comingSoon && !isOpen && (
onActive(id)}> {providerTokenHasSetted() ? t('common.provider.editKey') : t('common.provider.addKey')}
) } { comingSoon && !isOpen && (
{t('common.provider.comingSoon')}
) } { isOpen && (
onActive('')} > {t('common.operation.cancel')}
{t('common.operation.save')}
) }
{ provider.provider_name === ProviderName.OPENAI && isOpen && ( setValidatedStatus(v)} onTokenChange={v => setToken(v)} /> ) } { provider.provider_name === ProviderName.AZURE_OPENAI && isOpen && ( setValidatedStatus(v)} onTokenChange={v => setToken(v)} /> ) }
) } export default ProviderItem