Skip to content

Commit 34f08df

Browse files
committed
Add lucide icons and colors for video, audio and multimodal operators.
1 parent 01e1c6c commit 34f08df

File tree

1 file changed

+60
-4
lines changed

1 file changed

+60
-4
lines changed

frontend/src/pages/OperatorMarket/operator.const.tsx

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from "react";
2-
import { Code, FileSliders, Image } from "lucide-react";
2+
import { Atom, Code, FileText, Film, Image, Music } from "lucide-react";
33
import { OperatorI } from "./operator.model";
44
import { formatDateTime } from "@/utils/unit.ts";
55

@@ -11,17 +11,73 @@ const getOperatorVisual = (
1111
const inputs = (op?.inputs || "").toLowerCase();
1212
const outputs = (op?.outputs || "").toLowerCase();
1313

14+
// 后端固定的分类 ID,兼容 categories 传 UUID 的情况
15+
const CATEGORY_IDS = {
16+
text: "d8a5df7a-52a9-42c2-83c4-01062e60f597",
17+
image: "de36b61c-9e8a-4422-8c31-d30585c7100f",
18+
audio: "42dd9392-73e4-458c-81ff-41751ada47b5",
19+
video: "a233d584-73c8-4188-ad5d-8f7c8dda9c27",
20+
} as const;
21+
22+
const hasCategoryId = (key: keyof typeof CATEGORY_IDS) =>
23+
(op?.categories || []).some((c) => c === CATEGORY_IDS[key]);
24+
25+
const isMultimodal =
26+
["multimodal", "multi", "多模态"].some((k) =>
27+
type.includes(k)
28+
) ||
29+
categories.some((c) => c.includes("multimodal") || c.includes("多模态")) ||
30+
inputs.includes("multimodal") ||
31+
outputs.includes("multimodal");
32+
33+
const isVideoOp =
34+
["video", "视频"].includes(type) ||
35+
categories.some((c) => c.includes("video") || c.includes("视频")) ||
36+
inputs.includes("video") ||
37+
outputs.includes("video") ||
38+
hasCategoryId("video");
39+
40+
const isAudioOp =
41+
["audio", "音频"].includes(type) ||
42+
categories.some((c) => c.includes("audio") || c.includes("音频")) ||
43+
inputs.includes("audio") ||
44+
outputs.includes("audio") ||
45+
hasCategoryId("audio");
46+
1447
const isImageOp =
1548
["image", "图像", "图像类"].includes(type) ||
1649
categories.some((c) => c.includes("image") || c.includes("图像")) ||
1750
inputs.includes("image") ||
18-
outputs.includes("image");
51+
outputs.includes("image") ||
52+
hasCategoryId("image");
1953

2054
const isTextOp =
2155
["text", "文本", "文本类"].includes(type) ||
2256
categories.some((c) => c.includes("text") || c.includes("文本")) ||
2357
inputs.includes("text") ||
24-
outputs.includes("text");
58+
outputs.includes("text") ||
59+
hasCategoryId("text");
60+
61+
if (isMultimodal) {
62+
return {
63+
icon: <Atom className="w-full h-full" />,
64+
iconColor: "#F472B6",
65+
};
66+
}
67+
68+
if (isVideoOp) {
69+
return {
70+
icon: <Film className="w-full h-full" />,
71+
iconColor: "#22D3EE",
72+
};
73+
}
74+
75+
if (isAudioOp) {
76+
return {
77+
icon: <Music className="w-full h-full" />,
78+
iconColor: "#F59E0B",
79+
};
80+
}
2581

2682
if (isImageOp) {
2783
return {
@@ -32,7 +88,7 @@ const getOperatorVisual = (
3288

3389
if (isTextOp) {
3490
return {
35-
icon: <FileSliders className="w-full h-full" />,
91+
icon: <FileText className="w-full h-full" />,
3692
iconColor: "#A78BFA", // 文本算子背景色
3793
};
3894
}

0 commit comments

Comments
 (0)