fix(create): 素材参考 - 允许选择未缓存的远端素材

This commit is contained in:
MasterChiefCN
2026-10-12 09:56:11 +08:00
parent 27c8066e6d
commit ec504e031c
5 changed files with 145 additions and 36 deletions

View File

@@ -54,6 +54,8 @@ type Props = {
allowCharacters?: boolean;
/** 调用方能处理 onConfirm 的 pickedItems 时设为 true:远端分页里不在本地缓存的素材也可选。 */
acceptRemoteItems?: boolean;
/** 远端条目不依赖本地缓存,仍需按调用方当前能力校验。 */
remoteItemDisabledReason?: (asset: Asset) => string | undefined;
/** 左侧「媒体类型」筛选项;只有一种类型或已由 remoteKind 固定时不展示该分组。 */
mediaKinds?: AssetPickerMediaKind[];
open: boolean;
@@ -95,6 +97,7 @@ export function AssetLibraryPickerModal({
remoteKind,
allowCharacters = false,
acceptRemoteItems = false,
remoteItemDisabledReason,
mediaKinds = DEFAULT_MEDIA_KINDS,
open,
items,
@@ -166,20 +169,8 @@ export function AssetLibraryPickerModal({
() =>
(remoteQuery.data?.assets || [])
.filter((asset) => asset.kind !== "model" && (asset.kind !== "entity" || allowCharacters))
.map((asset) => {
const known = items.find((item) => item.id === asset.id);
return {
id: asset.id,
title: asset.title,
category: asset.category || "other",
archived: asset.status === "archived",
kindLabel: asset.kind === "image" ? "图片" : asset.kind === "video" ? "视频" : asset.kind === "audio" ? "音频" : asset.kind === "entity" ? "角色" : "文本",
searchText: (asset.tags ?? []).join(" "),
...(known || (acceptRemoteItems ? {} : { disabledReason: "此素材不适用于当前操作" })),
asset,
};
}),
[acceptRemoteItems, allowCharacters, remoteQuery.data, items],
.map((asset) => remoteAssetToPickerItem(asset, items.find((item) => item.id === asset.id), acceptRemoteItems, remoteItemDisabledReason?.(asset))),
[acceptRemoteItems, allowCharacters, remoteItemDisabledReason, remoteQuery.data, items],
);
const uploadInputRef = useRef<HTMLInputElement>(null);
const pickedRemoteRef = useRef(new Map<string, AssetLibraryPickerItem>());
@@ -648,6 +639,20 @@ export function AssetLibraryPickerModal({
);
}
export function remoteAssetToPickerItem(asset: Asset, known: AssetLibraryPickerItem | undefined, acceptRemoteItems: boolean, disabledReason?: string): AssetLibraryPickerItem {
return {
id: asset.id,
title: asset.title,
category: asset.category || "other",
archived: asset.status === "archived",
kindLabel: asset.kind === "image" ? "图片" : asset.kind === "video" ? "视频" : asset.kind === "audio" ? "音频" : asset.kind === "entity" ? "角色" : "文本",
searchText: (asset.tags ?? []).join(" "),
...known,
disabledReason: known?.disabledReason || (!known && !acceptRemoteItems ? "此素材不适用于当前操作" : disabledReason),
asset,
};
}
// 角色卡、3D 模型等非媒体条目没有媒体类型,媒体筛选生效时不参与匹配。
export function pickerItemMediaKind(item: AssetLibraryPickerItem): AssetPickerMediaKind | undefined {
if (item.mediaKind) return item.mediaKind;