'use client' import type { FC } from 'react' import type { PluginCategoryEnum } from '../../types' import { Button } from '@langgenius/dify-ui/button' import { RiAddLine } from '@remixicon/react' import { useBoolean } from 'ahooks' import * as React from 'react' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useInstalledPluginList } from '@/service/use-plugins' import NoPluginSelected from './no-plugin-selected' import PluginsSelected from './plugins-selected' import ToolPicker from './tool-picker' import { AUTO_UPDATE_MODE } from './types' const i18nPrefix = 'autoUpdate' type Props = Readonly<{ updateMode: AUTO_UPDATE_MODE value: string[] // plugin ids onChange: (value: string[]) => void integrationCategory?: PluginCategoryEnum }> const PluginsPicker: FC = ({ updateMode, value, onChange, integrationCategory, }) => { const { t } = useTranslation() const { data } = useInstalledPluginList() const pluginCategoryById = useMemo(() => { return new Map(data?.plugins.map(plugin => [plugin.plugin_id, plugin.declaration.category])) }, [data?.plugins]) const isCurrentCategoryPlugin = useCallback((pluginId: string) => { if (!integrationCategory) return true return pluginCategoryById.get(pluginId) === integrationCategory }, [integrationCategory, pluginCategoryById]) const visiblePlugins = useMemo(() => { return value.filter(isCurrentCategoryPlugin) }, [isCurrentCategoryPlugin, value]) const hiddenPlugins = useMemo(() => { if (!integrationCategory) return [] return value.filter(plugin => !isCurrentCategoryPlugin(plugin)) }, [integrationCategory, isCurrentCategoryPlugin, value]) const hasSelected = visiblePlugins.length > 0 const isExcludeMode = updateMode === AUTO_UPDATE_MODE.exclude const handleClear = () => { onChange(hiddenPlugins) } const handleVisiblePluginsChange = useCallback((newVisiblePlugins: string[]) => { onChange(integrationCategory ? [...hiddenPlugins, ...newVisiblePlugins.filter(plugin => !hiddenPlugins.includes(plugin))] : newVisiblePlugins) }, [hiddenPlugins, integrationCategory, onChange]) const [isShowToolPicker, { set: setToolPicker, }] = useBoolean(false) return (
{hasSelected ? (
{t(`${i18nPrefix}.${isExcludeMode ? 'excludeUpdate' : 'partialUPdate'}`, { ns: 'plugin', count: visiblePlugins.length, num: visiblePlugins.length, })}
) : ( )} {hasSelected && ( )} {t(`${i18nPrefix}.operation.select`, { ns: 'plugin' })} )} value={visiblePlugins} onChange={handleVisiblePluginsChange} isShow={isShowToolPicker} onShowChange={setToolPicker} integrationCategory={integrationCategory} />
) } export default React.memo(PluginsPicker)