dify/web/app/components/base/prompt-editor/plugins/roster-reference-block/component.tsx
yyh 0923ebaf88
chore(agent-v2): sync daily changes (#38162)
Co-authored-by: yunlu.wen <yunlu.wen@dify.ai>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Yunlu Wen <wylswz@163.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Joel <iamjoel007@gmail.com>
Co-authored-by: Yanli 盐粒 <yanli@dify.ai>
Co-authored-by: 盐粒 Yanli <beautyyuyanli@gmail.com>
Co-authored-by: zyssyz123 <916125788@qq.com>
Co-authored-by: 盐粒 Yanli <mail@yanli.one>
2026-07-01 05:07:23 +00:00

83 lines
2.7 KiB
TypeScript

import { cn } from '@langgenius/dify-ui/cn'
import { FileTreeIcon } from '@langgenius/dify-ui/file-tree'
import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/tooltip'
import { use } from 'react'
import { RosterReferenceBlockContext } from './context'
import {
getRosterReferenceFileIconType,
getRosterReferenceIconClassName,
parseRosterReferenceToken,
} from './utils'
type RosterReferenceBlockComponentProps = {
text: string
}
const RosterReferenceBlockComponent = ({
text,
}: RosterReferenceBlockComponentProps) => {
const rosterReferenceBlock = use(RosterReferenceBlockContext)
const token = parseRosterReferenceToken(text)
if (!token)
return null
const isKnowledge = token.kind === 'knowledge'
const customIcon = rosterReferenceBlock?.renderIcon?.(token)
const warning = rosterReferenceBlock?.getWarning?.(token)
const defaultIcon = token.kind === 'file'
? <FileTreeIcon type={getRosterReferenceFileIconType(token.label)} className="size-4" />
: <span className={cn(isKnowledge ? 'size-3.5' : 'size-3.5 shrink-0', getRosterReferenceIconClassName(token))} />
const tokenBlock = (
<span
contentEditable={false}
data-roster-reference-kind={token.kind}
data-roster-reference-id={token.id}
data-roster-reference-warning={warning ? true : undefined}
title={warning ?? token.label}
className={cn(
'inline-flex min-w-[18px] items-center gap-0.5 overflow-hidden rounded-[5px] border py-px pr-1 pl-px align-middle shadow-xs shadow-shadow-shadow-3',
warning
? 'border-components-badge-status-light-warning-halo bg-state-warning-hover'
: 'border-state-accent-hover-alt bg-state-accent-hover',
)}
>
<span
aria-hidden
className={cn(
'inline-flex size-4 shrink-0 items-center justify-center rounded-[5px] border-[0.5px] border-divider-subtle bg-background-default-dodge',
token.kind === 'cli_tool' && 'border-divider-regular bg-text-tertiary',
isKnowledge && 'border-divider-subtle bg-util-colors-green-green-500 p-[3px] text-text-primary-on-surface shadow-xs shadow-shadow-shadow-3',
)}
>
{customIcon || defaultIcon}
</span>
<span className={cn(
'max-w-48 truncate system-xs-medium',
warning ? 'text-text-warning' : 'text-text-accent',
)}
>
{token.label}
</span>
{warning && (
<span aria-hidden className="i-ri-alert-fill size-3 shrink-0 text-text-warning" />
)}
</span>
)
if (!warning)
return tokenBlock
return (
<Tooltip>
<TooltipTrigger render={tokenBlock} />
<TooltipContent>
{warning}
</TooltipContent>
</Tooltip>
)
}
export default RosterReferenceBlockComponent