'use client' import type { FC } from 'react' import React, { useCallback } from 'react' import type { MetaData } from '../types' import { RiDeleteBinLine, RiInformation2Line, RiLoopLeftLine } from '@remixicon/react' import { useBoolean } from 'ahooks' import { useTranslation } from 'react-i18next' import PluginInfo from '../plugin-page/plugin-info' import ActionButton from '../../base/action-button' import Tooltip from '../../base/tooltip' import Confirm from '../../base/confirm' import { uninstallPlugin } from '@/service/plugins' import { useGitHubReleases } from '../install-plugin/hooks' import { compareVersion, getLatestVersion } from '@/utils/semver' import Toast from '@/app/components/base/toast' const i18nPrefix = 'plugin.action' type Props = { author: string installationId: string pluginName: string version: string usedInApps: number isShowFetchNewVersion: boolean isShowInfo: boolean isShowDelete: boolean onDelete: () => void meta?: MetaData } const Action: FC = ({ author, installationId, pluginName, version, isShowFetchNewVersion, isShowInfo, isShowDelete, onDelete, meta, }) => { const { t } = useTranslation() const [isShowPluginInfo, { setTrue: showPluginInfo, setFalse: hidePluginInfo, }] = useBoolean(false) const [deleting, { setTrue: showDeleting, setFalse: hideDeleting, }] = useBoolean(false) const { fetchReleases } = useGitHubReleases() const handleFetchNewVersion = async () => { try { const fetchedReleases = await fetchReleases(author, pluginName) const versions = fetchedReleases.map(release => release.tag_name) const latestVersion = getLatestVersion(versions) if (compareVersion(latestVersion, version) === 1) { // todo: open plugin updating modal console.log('New version available:', latestVersion) } else { Toast.notify({ type: 'info', message: 'No new version available', }) } } catch { Toast.notify({ type: 'error', message: 'Failed to compare versions', }) } } const [isShowDeleteConfirm, { setTrue: showDeleteConfirm, setFalse: hideDeleteConfirm, }] = useBoolean(false) const handleDelete = useCallback(async () => { showDeleting() const res = await uninstallPlugin(installationId) hideDeleting() if (res.success) { hideDeleteConfirm() onDelete() } }, [installationId]) return (
{/* Only plugin installed from GitHub need to check if it's the new version */} {isShowFetchNewVersion && ( ) } { isShowInfo && ( ) } { isShowDelete && ( ) } {isShowPluginInfo && ( )} {t(`${i18nPrefix}.deleteContentLeft`)}{pluginName}{t(`${i18nPrefix}.deleteContentRight`)}
{/* // todo: add usedInApps */} {/* {usedInApps > 0 && t(`${i18nPrefix}.usedInApps`, { num: usedInApps })} */}
} onCancel={hideDeleteConfirm} onConfirm={handleDelete} isLoading={deleting} isDisabled={deleting} /> ) } export default React.memo(Action)