From f961830836e9a2b8a773ef7e8f365ad9bf2c66b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Fri, 20 Feb 2026 23:36:45 +0800 Subject: [PATCH] Inline plugin icon helper into PluginCard Move getPluginIconUrl from utils/plugin_icon.ts into plugin_card.tsx and remove the now-unused util file. The function behavior is unchanged: it reads webui_token from localStorage and appends it as a query parameter to plugin icon URLs so authenticated icon endpoints can be used as img src. --- .../components/display_card/plugin_card.tsx | 15 +++++++++++++- .../src/utils/plugin_icon.ts | 20 ------------------- 2 files changed, 14 insertions(+), 21 deletions(-) delete mode 100644 packages/napcat-webui-frontend/src/utils/plugin_icon.ts diff --git a/packages/napcat-webui-frontend/src/components/display_card/plugin_card.tsx b/packages/napcat-webui-frontend/src/components/display_card/plugin_card.tsx index 75f2ce58..cd267767 100644 --- a/packages/napcat-webui-frontend/src/components/display_card/plugin_card.tsx +++ b/packages/napcat-webui-frontend/src/components/display_card/plugin_card.tsx @@ -11,7 +11,20 @@ import { useState } from 'react'; import key from '@/const/key'; import { PluginItem } from '@/controllers/plugin_manager'; -import { getPluginIconUrl } from '@/utils/plugin_icon'; + +function getPluginIconUrl (iconPath?: string): string | undefined { + if (!iconPath) return undefined; + try { + const raw = localStorage.getItem(key.token); + if (!raw) return iconPath; + const token = JSON.parse(raw); + const url = new URL(iconPath, window.location.origin); + url.searchParams.set('webui_token', token); + return url.pathname + url.search; + } catch { + return iconPath; + } +} export interface PluginDisplayCardProps { data: PluginItem; diff --git a/packages/napcat-webui-frontend/src/utils/plugin_icon.ts b/packages/napcat-webui-frontend/src/utils/plugin_icon.ts deleted file mode 100644 index 3bfeccad..00000000 --- a/packages/napcat-webui-frontend/src/utils/plugin_icon.ts +++ /dev/null @@ -1,20 +0,0 @@ -import key from '@/const/key'; - -/** - * 将后端返回的插件 icon 路径拼接上 webui_token 查询参数 - * 后端 /api/Plugin/Icon/:pluginId 需要鉴权,img src 无法携带 Authorization header, - * 所以通过 query 参数传递 token - */ -export function getPluginIconUrl (iconPath?: string): string | undefined { - if (!iconPath) return undefined; - try { - const raw = localStorage.getItem(key.token); - if (!raw) return iconPath; - const token = JSON.parse(raw); - const url = new URL(iconPath, window.location.origin); - url.searchParams.set('webui_token', token); - return url.pathname + url.search; - } catch { - return iconPath; - } -}