画布生成面板的引用 provider 按素材内容签名记忆

- ResourceCanvasAssetGenerationPanelView 的 referenceProviders 改依赖 assetsSignature(referenceAssets):referenceAssets 由 .filter() 派生、每次渲染都是新数组,原来的 [referenceAssets] 依赖永远命中不了缓存
- 注释写明「provider 身份一变,输入区就重新注册 Lexical 更新监听」,避免以后又改回数组依赖
This commit is contained in:
2026-09-22 16:55:39 +08:00
parent a6a938d5cc
commit 28bacfc125
@@ -35,6 +35,7 @@ import {
type ResourceReferencePickerHandle,
} from '../project-workspace/ResourceReferencePicker';
import {
assetsSignature,
type ChatComposerDraft,
directCodexContentKey,
directCodexContentToLegacyContentDto,
@@ -262,17 +263,21 @@ export function ResourceCanvasAssetGenerationPanelView({
const referenceAssets = resourceCanvasAssetGenerationReferenceAssets(
assets ?? [],
);
const referenceAssetsSignature = assetsSignature(referenceAssets);
/*
引用来源:画布生成面板只注入资源与两个静默 provider——它把 `@` 引用当参考图用,
而 `$` Skill 候选只有 DirectProject 回合那条路径会被解析成真 Skill,这里不注入。
*/
*/
const referenceProviders = useMemo(
() => [
createResourceReferenceProvider({ assets: referenceAssets }),
attachmentReferenceProvider,
runtimeRegionReferenceProvider,
],
[referenceAssets],
// `referenceAssets` 每次渲染都是新数组(`.filter()` 派生),依赖它等于从不命中缓存:
// provider 身份一变,输入区就会重新注册 Lexical 更新监听。按内容签名取依赖才真的能跳过重建。
// eslint-disable-next-line react-hooks/exhaustive-deps
[referenceAssetsSignature],
);
const promptInputRootRef = useRef<HTMLDivElement | null>(null);
const referencePickerRef = useRef<ResourceReferencePickerHandle | null>(null);