Files
Genarrative/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceChip.tsx
T
k88936 c1482012c6 整理引用芯片标题分支
提取资源、Skill 与运行区域标题计算 helper

移除 ResourceReferenceChip 的嵌套三元表达式
2026-09-18 14:26:50 +08:00

60 lines
1.8 KiB
TypeScript

import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
import { $getNodeByKey, type NodeKey } from 'lexical';
import { X } from 'lucide-react';
import type { ChatReference } from './resourceReferences';
function chipTitle(reference: ChatReference) {
if (reference.type === 'resource') {
return `${reference.label} · ${reference.kind}`;
}
if (reference.type === 'skill') {
return `${reference.name} · Skill`;
}
return `${reference.label} · 运行区域`;
}
export function ResourceReferenceChip({
reference,
nodeKey,
}: {
reference: ChatReference;
nodeKey: NodeKey;
}) {
const [editor] = useLexicalComposerContext();
return (
<span
className="resource-reference-chip"
data-resource-reference-id={
reference.type === 'resource' ? reference.resourceId : undefined
}
data-runtime-region-reference={
reference.type === 'runtime-region' ? 'true' : undefined
}
data-skill-reference-name={
reference.type === 'skill' ? reference.name : undefined
}
contentEditable={false}
title={chipTitle(reference)}
>
<span aria-hidden="true">{reference.type === 'skill' ? '$' : '@'}</span>
<span className="resource-reference-chip-label">
{reference.type === 'skill' ? reference.name : reference.label}
</span>
<button
type="button"
aria-label={`移除引用 ${reference.type === 'skill' ? reference.name : reference.label}`}
onMouseDown={(event) => event.preventDefault()}
onClick={() => {
editor.update(() => {
const node = $getNodeByKey(nodeKey);
node?.remove();
});
}}
>
<X size={11} aria-hidden="true" />
</button>
</span>
);
}