'use client' import type { FC } from 'react' import type { Dependency, Plugin, PluginDeclaration } from '../../../types' import { Button } from '@langgenius/dify-ui/button' import * as React from 'react' import { useTranslation } from 'react-i18next' import { uploadFile } from '@/service/plugins' import Card from '../../../card' const i18nPrefix = 'installModal' type PackageUploadResponse = { unique_identifier: string manifest: PluginDeclaration } type UploadFailureResponse = { message?: string } function isObject(value: unknown): value is Record { return typeof value === 'object' && value !== null } function isPackageUploadResponse(value: unknown): value is PackageUploadResponse { if (!isObject(value)) return false return typeof value.unique_identifier === 'string' && isObject(value.manifest) } function getRejectedResponse(error: unknown): unknown { if (!isObject(error) || !('response' in error)) return undefined return error.response } function getUploadFailureMessage(response: unknown): string | undefined { if (!isObject(response)) return undefined return (response as UploadFailureResponse).message } type Props = { isBundle: boolean file: File onCancel: () => void onPackageUploaded: (result: { uniqueIdentifier: string manifest: PluginDeclaration }) => void onBundleUploaded: (result: Dependency[]) => void onFailed: (errorMsg: string) => void } const Uploading: FC = ({ isBundle, file, onCancel, onPackageUploaded, onBundleUploaded, onFailed, }) => { const { t } = useTranslation() const fileName = file.name const handleUploadedResponse = React.useCallback((response: unknown) => { if (isBundle) { if (Array.isArray(response)) { onBundleUploaded(response as Dependency[]) return } onFailed(t(`${i18nPrefix}.uploadFailed`, { ns: 'plugin' })) return } if (!isPackageUploadResponse(response)) { onFailed(t(`${i18nPrefix}.uploadFailed`, { ns: 'plugin' })) return } onPackageUploaded({ uniqueIdentifier: response.unique_identifier, manifest: response.manifest, }) }, [isBundle, onBundleUploaded, onFailed, onPackageUploaded, t]) const handleUpload = React.useCallback(async () => { try { handleUploadedResponse(await uploadFile(file, isBundle)) } catch (error: unknown) { const response = getRejectedResponse(error) const message = getUploadFailureMessage(response) if (message) { onFailed(message) return } handleUploadedResponse(response) } }, [file, handleUploadedResponse, isBundle, onFailed]) React.useEffect(() => { handleUpload() }, [handleUpload]) return ( <>
{t(`${i18nPrefix}.uploadingPackage`, { ns: 'plugin', packageName: fileName, })}
{/* Action Buttons */}
) } export default React.memo(Uploading)