'use client' import type { FC } from 'react' import React, { useCallback, useEffect, useMemo, useState } from 'react' import { RiInformation2Line } from '@remixicon/react' import { useTranslation } from 'react-i18next' import Card from '@/app/components/plugins/card' import Modal from '@/app/components/base/modal' import Button from '@/app/components/base/button' import Badge, { BadgeState } from '@/app/components/base/badge/index' import type { UpdateFromMarketPlacePayload } from '../types' import { pluginManifestToCardPluginProps } from '@/app/components/plugins/install-plugin/utils' import useGetIcon from '../install-plugin/base/use-get-icon' import { updateFromMarketPlace } from '@/service/plugins' import checkTaskStatus from '@/app/components/plugins/install-plugin/base/check-task-status' import { usePluginTasksStore } from '@/app/components/plugins/plugin-page/store' const i18nPrefix = 'plugin.upgrade' type Props = { payload: UpdateFromMarketPlacePayload onSave: () => void onCancel: () => void } enum UploadStep { notStarted = 'notStarted', upgrading = 'upgrading', installed = 'installed', } const UpdatePluginModal: FC = ({ payload, onSave, onCancel, }) => { const { originalPackageInfo, targetPackageInfo, } = payload const { t } = useTranslation() const { getIconUrl } = useGetIcon() const [icon, setIcon] = useState(originalPackageInfo.payload.icon) useEffect(() => { (async () => { const icon = await getIconUrl(originalPackageInfo.payload.icon) setIcon(icon) })() }, [originalPackageInfo, getIconUrl]) const { check, stop, } = checkTaskStatus() const handleCancel = () => { stop() onCancel() } const [uploadStep, setUploadStep] = useState(UploadStep.notStarted) const setPluginTasksWithPolling = usePluginTasksStore(s => s.setPluginTasksWithPolling) const configBtnText = useMemo(() => { return ({ [UploadStep.notStarted]: t(`${i18nPrefix}.upgrade`), [UploadStep.upgrading]: t(`${i18nPrefix}.upgrading`), [UploadStep.installed]: t(`${i18nPrefix}.close`), })[uploadStep] }, [t, uploadStep]) const handleConfirm = useCallback(async () => { if (uploadStep === UploadStep.notStarted) { setUploadStep(UploadStep.upgrading) const { all_installed: isInstalled, task_id: taskId, } = await updateFromMarketPlace({ original_plugin_unique_identifier: originalPackageInfo.id, new_plugin_unique_identifier: targetPackageInfo.id, }) if (isInstalled) { onSave() return } setPluginTasksWithPolling() await check({ taskId, pluginUniqueIdentifier: targetPackageInfo.id, }) onSave() } if (uploadStep === UploadStep.installed) { onSave() onCancel() } }, [onCancel, onSave, uploadStep, check, originalPackageInfo.id, setPluginTasksWithPolling, targetPackageInfo.id]) const usedInAppInfo = useMemo(() => { return (
{t(`${i18nPrefix}.usedInApps`, { num: 3 })}
{/* show the used apps */}
) }, [t]) return (
{t(`${i18nPrefix}.description`)}
{`${originalPackageInfo.payload.version} -> ${targetPackageInfo.version}`} {false && usedInAppInfo} } />
{uploadStep === UploadStep.notStarted && ( )}
) } export default React.memo(UpdatePluginModal)