import type { DataSourceAuth, DataSourceCredential } from './types' import type { PluginDetail } from '@/app/components/plugins/types' import { AlertDialog, AlertDialogActions, AlertDialogCancelButton, AlertDialogConfirmButton, AlertDialogContent, AlertDialogTitle, } from '@langgenius/dify-ui/alert-dialog' import { memo, useCallback, useRef } from 'react' import { useTranslation } from 'react-i18next' import Badge from '@/app/components/base/badge' import { ApiKeyModal, usePluginAuthAction } from '@/app/components/plugins/plugin-auth' import { AuthCategory } from '@/app/components/plugins/plugin-auth/types' import { CollectionType } from '@/app/components/tools/types' import { useCredentialPermissions } from '@/hooks/use-credential-permissions' import { useRenderI18nObject } from '@/hooks/use-i18n' import { openOAuthPopup } from '@/hooks/use-oauth' import { useGetDataSourceOAuthUrl } from '@/service/use-datasource' import Configure from './configure' import { useDataSourceAuthUpdate } from './hooks' import Item from './item' import DataSourcePluginActions from './plugin-actions' const getPluginVersion = (uniqueIdentifier?: string) => { return uniqueIdentifier?.match(/:([^:@]+)@/)?.[1] } type CardProps = { item: DataSourceAuth disabled?: boolean pluginDetail?: PluginDetail onPluginUpdate?: (isDelete?: boolean) => void } const Card = ({ item, disabled, pluginDetail, onPluginUpdate }: CardProps) => { const { t } = useTranslation() const { canUseCredential, canCreateCredential, canManageCredential } = useCredentialPermissions() const renderI18nObject = useRenderI18nObject() const { icon, label, credentials_list, credential_schema } = item const providerLabel = renderI18nObject(label) const fallbackPluginVersion = getPluginVersion(item.plugin_unique_identifier) const pluginPayload = { category: AuthCategory.datasource, provider: `${item.plugin_id}/${item.name}`, providerType: CollectionType.datasource, } const { handleAuthUpdate } = useDataSourceAuthUpdate({ pluginId: item.plugin_id, provider: item.name, }) const { deleteCredentialId, doingAction, handleConfirm, handleEdit, handleRemove, handleRename, handleSetDefault, editValues, setEditValues, openConfirm, closeConfirm, pendingOperationCredentialId, } = usePluginAuthAction(pluginPayload, handleAuthUpdate) const changeCredentialIdRef = useRef(undefined) const { mutateAsync: getPluginOAuthUrl } = useGetDataSourceOAuthUrl(pluginPayload.provider) const handleOAuth = useCallback(async () => { const { authorization_url } = await getPluginOAuthUrl(changeCredentialIdRef.current) if (authorization_url) { openOAuthPopup(authorization_url, handleAuthUpdate) } }, [getPluginOAuthUrl, handleAuthUpdate]) const handleAction = useCallback( ( action: string, credentialItem: DataSourceCredential, renamePayload?: { credential_id: string; name: string }, ) => { if (action === 'edit') { handleEdit(credentialItem.id, { ...credentialItem.credential, __name__: credentialItem.name, __credential_id__: credentialItem.id, }) } if (action === 'delete') openConfirm(credentialItem.id) if (action === 'setDefault') handleSetDefault(credentialItem.id) if (action === 'rename' && renamePayload) handleRename(renamePayload) if (action === 'change') { changeCredentialIdRef.current = credentialItem.id handleOAuth() } }, [openConfirm, handleEdit, handleSetDefault, handleRename, handleOAuth], ) return (
{providerLabel}
{providerLabel}
{pluginDetail ? ( ) : ( !!fallbackPluginVersion && (
{fallbackPluginVersion}
} uppercase={false} /> ) )}
e.stopPropagation()}>
{t(($) => $['auth.connectedWorkspace'], { ns: 'plugin' })}
{!!credentials_list.length && (
e.stopPropagation()}> {credentials_list.map((credentialItem) => ( ))}
)} {!credentials_list.length && (
{t(($) => $['auth.emptyAuth'], { ns: 'plugin' })}
)} !open && closeConfirm()}>
{t(($) => $['list.delete.title'], { ns: 'datasetDocuments' })}
{t(($) => $['operation.cancel'], { ns: 'common' })} {t(($) => $['operation.confirm'], { ns: 'common' })}
{!!editValues && ( { setEditValues(null) pendingOperationCredentialId.current = null }} onUpdate={handleAuthUpdate} formSchemas={credential_schema} editValues={editValues} onRemove={handleRemove} disabled={disabled || doingAction || !canManageCredential} /> )}
) } export default memo(Card)