'use client' import type { ComponentProps, FC } from 'react' import type { ToolWithProvider } from '../../types' import type { ToolDefaultValue } from '../types' import type { Tool } from '@/app/components/tools/types' import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { PreviewCardTrigger } from '@langgenius/dify-ui/preview-card' import * as React from 'react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { trackEvent } from '@/app/components/base/amplitude' import { useGetLanguage } from '@/context/i18n' import useTheme from '@/hooks/use-theme' import { Theme } from '@/types/app' import { basePath } from '@/utils/var' import BlockIcon from '../../block-icon' import { BlockEnum } from '../../types' import { BlockSelectorPreviewCardContent } from '../preview-card' const normalizeProviderIcon = (icon?: ToolWithProvider['icon']) => { if (!icon) return icon if ( typeof icon === 'string' && basePath && icon.startsWith('/') && !icon.startsWith(`${basePath}/`) ) return `${basePath}${icon}` return icon } type Props = Readonly<{ provider: ToolWithProvider payload: Tool previewCardHandle: PreviewCardHandle disabled?: boolean isAdded?: boolean onSelect: (type: BlockEnum, tool: ToolDefaultValue) => void }> export type ToolActionPreviewPayload = { providerIcon: ToolWithProvider['icon'] payload: Tool language: ReturnType } type PreviewCardHandle = NonNullable['handle']> export type ToolActionPreviewCardHandle = PreviewCardHandle const ToolItem: FC = ({ provider, payload, previewCardHandle, onSelect, disabled, isAdded, }) => { const { t } = useTranslation() const language = useGetLanguage() const previewDescriptionId = React.useId() const previewDescription = payload.description[language] const { theme } = useTheme() const normalizedIcon = useMemo(() => { return normalizeProviderIcon(provider.icon) ?? provider.icon }, [provider.icon]) const normalizedIconDark = useMemo(() => { if (!provider.icon_dark) return undefined return normalizeProviderIcon(provider.icon_dark) ?? provider.icon_dark }, [provider.icon_dark]) const providerIcon = useMemo(() => { if (theme === Theme.dark && normalizedIconDark) return normalizedIconDark return normalizedIcon }, [theme, normalizedIcon, normalizedIconDark]) const row = ( ) return ( <> {previewDescription && ( {previewDescription} )} ) } type ToolActionPreviewCardProps = { payload?: ToolActionPreviewPayload } export function ToolActionPreviewCard({ payload }: ToolActionPreviewCardProps) { if (!payload) return null return (
{payload.payload.label[payload.language]}
{payload.payload.description[payload.language]}
) } export default React.memo(ToolItem)