|
'use client' |
|
import type { FC } from 'react' |
|
import React, { useEffect, useState } from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import { addDefaultValue, toolCredentialToFormSchemas } from '../../utils/to-form-schema' |
|
import type { Collection } from '../../types' |
|
import cn from '@/utils/classnames' |
|
import Drawer from '@/app/components/base/drawer-plus' |
|
import Button from '@/app/components/base/button' |
|
import Toast from '@/app/components/base/toast' |
|
import { fetchBuiltInToolCredential, fetchBuiltInToolCredentialSchema } from '@/service/tools' |
|
import Loading from '@/app/components/base/loading' |
|
import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form' |
|
import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general' |
|
import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks' |
|
|
|
type Props = { |
|
collection: Collection |
|
onCancel: () => void |
|
onSaved: (value: Record<string, any>) => void |
|
isHideRemoveBtn?: boolean |
|
onRemove?: () => void |
|
} |
|
|
|
const ConfigCredential: FC<Props> = ({ |
|
collection, |
|
onCancel, |
|
onSaved, |
|
isHideRemoveBtn, |
|
onRemove = () => { }, |
|
}) => { |
|
const { t } = useTranslation() |
|
const language = useLanguage() |
|
const [credentialSchema, setCredentialSchema] = useState<any>(null) |
|
const { name: collectionName } = collection |
|
const [tempCredential, setTempCredential] = React.useState<any>({}) |
|
useEffect(() => { |
|
fetchBuiltInToolCredentialSchema(collectionName).then(async (res) => { |
|
const toolCredentialSchemas = toolCredentialToFormSchemas(res) |
|
const credentialValue = await fetchBuiltInToolCredential(collectionName) |
|
setTempCredential(credentialValue) |
|
const defaultCredentials = addDefaultValue(credentialValue, toolCredentialSchemas) |
|
setCredentialSchema(toolCredentialSchemas) |
|
setTempCredential(defaultCredentials) |
|
}) |
|
}, []) |
|
|
|
const handleSave = () => { |
|
for (const field of credentialSchema) { |
|
if (field.required && !tempCredential[field.name]) { |
|
Toast.notify({ type: 'error', message: t('common.errorMsg.fieldRequired', { field: field.label[language] || field.label.en_US }) }) |
|
return |
|
} |
|
} |
|
onSaved(tempCredential) |
|
} |
|
|
|
return ( |
|
<Drawer |
|
isShow |
|
onHide={onCancel} |
|
title={t('tools.auth.setupModalTitle') as string} |
|
titleDescription={t('tools.auth.setupModalTitleDescription') as string} |
|
panelClassName='mt-2 !w-[405px]' |
|
maxWidthClassName='!max-w-[405px]' |
|
height='calc(100vh - 16px)' |
|
contentClassName='!bg-gray-100' |
|
headerClassName='!border-b-black/5' |
|
body={ |
|
|
|
<div className='px-6 py-3 h-full'> |
|
{!credentialSchema |
|
? <Loading type='app' /> |
|
: ( |
|
<> |
|
<Form |
|
value={tempCredential} |
|
onChange={(v) => { |
|
setTempCredential(v) |
|
}} |
|
formSchemas={credentialSchema} |
|
isEditMode={true} |
|
showOnVariableMap={{}} |
|
validating={false} |
|
inputClassName='!bg-gray-50' |
|
fieldMoreInfo={item => item.url |
|
? (<a |
|
href={item.url} |
|
target='_blank' rel='noopener noreferrer' |
|
className='inline-flex items-center text-xs text-primary-600' |
|
> |
|
{t('tools.howToGet')} |
|
<LinkExternal02 className='ml-1 w-3 h-3' /> |
|
</a>) |
|
: null} |
|
/> |
|
<div className={cn((collection.is_team_authorization && !isHideRemoveBtn) ? 'justify-between' : 'justify-end', 'mt-2 flex ')} > |
|
{ |
|
(collection.is_team_authorization && !isHideRemoveBtn) && ( |
|
<Button onClick={onRemove}>{t('common.operation.remove')}</Button> |
|
) |
|
} |
|
< div className='flex space-x-2'> |
|
<Button onClick={onCancel}>{t('common.operation.cancel')}</Button> |
|
<Button variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button> |
|
</div> |
|
</div> |
|
</> |
|
) |
|
} |
|
|
|
</div > |
|
} |
|
isShowMask={true} |
|
clickOutsideNotOpen={false} |
|
/> |
|
) |
|
} |
|
export default React.memo(ConfigCredential) |
|
|