import type { ReactNode } from 'react' import type { PluginStatus } from '@/app/components/plugins/types' import { RiCheckboxCircleFill, RiErrorWarningFill, RiLoaderLine, } from '@remixicon/react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import CardIcon from '@/app/components/plugins/card/base/card-icon' import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon' import { useGetLanguage } from '@/context/i18n' // Plugin item base component type PluginTaskItemProps = { plugin: PluginStatus statusIcon: ReactNode statusText: string statusClassName?: string action?: ReactNode } const PluginTaskItem = ({ plugin, statusIcon, statusText, statusClassName = 'text-text-tertiary', action, }: PluginTaskItemProps) => { const language = useGetLanguage() const { getIconUrl } = useGetIcon() return (
{statusIcon}
{plugin.labels[language]}
{statusText}
{action}
) } // Section header component type SectionHeaderProps = { title: string count: number action?: ReactNode } const SectionHeader = ({ title, count, action }: SectionHeaderProps) => (
{title} {' '} ( {count} ) {action}
) // Running plugins section type RunningPluginsSectionProps = { plugins: PluginStatus[] } export const RunningPluginsSection = ({ plugins }: RunningPluginsSectionProps) => { const { t } = useTranslation() if (plugins.length === 0) return null return ( <>
{plugins.map(plugin => ( } statusText={t('plugin.task.installing')} /> ))}
) } // Success plugins section type SuccessPluginsSectionProps = { plugins: PluginStatus[] onClearAll: () => void } export const SuccessPluginsSection = ({ plugins, onClearAll }: SuccessPluginsSectionProps) => { const { t } = useTranslation() if (plugins.length === 0) return null return ( <> {t('plugin.task.clearAll')} )} />
{plugins.map(plugin => ( } statusText={plugin.message || t('plugin.task.installed')} statusClassName="text-text-success" /> ))}
) } // Error plugins section type ErrorPluginsSectionProps = { plugins: PluginStatus[] onClearAll: () => void onClearSingle: (taskId: string, pluginId: string) => void } export const ErrorPluginsSection = ({ plugins, onClearAll, onClearSingle }: ErrorPluginsSectionProps) => { const { t } = useTranslation() if (plugins.length === 0) return null return ( <> {t('plugin.task.clearAll')} )} />
{plugins.map(plugin => ( } statusText={plugin.message} statusClassName="break-all text-text-destructive" action={( )} /> ))}
) }