'use client' import type { FC } from 'react' import type { TriggerDefaultValue, TriggerWithProvider } from '@/app/components/workflow/block-selector/types' import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react' import * as React from 'react' import { useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { CollectionType } from '@/app/components/tools/types' import BlockIcon from '@/app/components/workflow/block-icon' import { BlockEnum } from '@/app/components/workflow/types' import { useGetLanguage } from '@/context/i18n' import useTheme from '@/hooks/use-theme' import { Theme } from '@/types/app' import { cn } from '@/utils/classnames' import { basePath } from '@/utils/var' import TriggerPluginActionItem from './action-item' const normalizeProviderIcon = (icon?: TriggerWithProvider['icon']) => { if (!icon) return icon if (typeof icon === 'string' && basePath && icon.startsWith('/') && !icon.startsWith(`${basePath}/`)) return `${basePath}${icon}` return icon } type Props = { className?: string payload: TriggerWithProvider hasSearchText: boolean onSelect: (type: BlockEnum, trigger?: TriggerDefaultValue) => void } const TriggerPluginItem: FC = ({ className, payload, hasSearchText, onSelect, }) => { const { t } = useTranslation() const language = useGetLanguage() const { theme } = useTheme() const notShowProvider = payload.type === CollectionType.workflow const actions = payload.events const hasAction = !notShowProvider const [isFold, setFold] = React.useState(true) const ref = useRef(null) useEffect(() => { if (hasSearchText && isFold) { setFold(false) return } if (!hasSearchText && !isFold) setFold(true) }, [hasSearchText]) const FoldIcon = isFold ? RiArrowRightSLine : RiArrowDownSLine const groupName = useMemo(() => { if (payload.type === CollectionType.builtIn) return payload.author if (payload.type === CollectionType.custom) return t('tabs.customTool', { ns: 'workflow' }) if (payload.type === CollectionType.workflow) return t('tabs.workflowTool', { ns: 'workflow' }) return payload.author || '' }, [payload.author, payload.type, t]) const normalizedIcon = useMemo(() => { return normalizeProviderIcon(payload.icon) ?? payload.icon }, [payload.icon]) const normalizedIconDark = useMemo(() => { if (!payload.icon_dark) return undefined return normalizeProviderIcon(payload.icon_dark) ?? payload.icon_dark }, [payload.icon_dark]) const providerIcon = useMemo(() => { if (theme === Theme.dark && normalizedIconDark) return normalizedIconDark return normalizedIcon }, [normalizedIcon, normalizedIconDark, theme]) const providerWithResolvedIcon = useMemo(() => ({ ...payload, icon: providerIcon, }), [payload, providerIcon]) return (
{ if (hasAction) { setFold(!isFold) return } const event = actions[0] const params: Record = {} if (event.parameters) { event.parameters.forEach((item: any) => { params[item.name] = '' }) } onSelect(BlockEnum.TriggerPlugin, { plugin_id: payload.plugin_id, provider_id: payload.name, provider_type: payload.type, provider_name: payload.name, event_name: event.name, event_label: event.label[language], event_description: event.description[language], title: event.label[language], plugin_unique_identifier: payload.plugin_unique_identifier, is_team_authorization: payload.is_team_authorization, output_schema: event.output_schema || {}, paramSchemas: event.parameters, params, }) }} >
{notShowProvider ? actions[0]?.label[language] : payload.label[language]} {groupName}
{hasAction && ( )}
{!notShowProvider && hasAction && !isFold && ( actions.map(action => ( )) )}
) } export default React.memo(TriggerPluginItem)