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={(
)}
/>
))}
>
)
}