diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index aa99d61b6e..81a9be71bd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -97,6 +97,9 @@ importers:
'@phosphor-icons/react':
specifier: ^2.1.10
version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ lucide-react:
+ specifier: ^0.541.0
+ version: 0.541.0(react@18.3.1)
react:
specifier: ^18.3.1
version: 18.3.1
diff --git a/src/apps/desktop/src/api/miniapp_market_api.rs b/src/apps/desktop/src/api/miniapp_market_api.rs
index 3ca47dd606..304cb4726b 100644
--- a/src/apps/desktop/src/api/miniapp_market_api.rs
+++ b/src/apps/desktop/src/api/miniapp_market_api.rs
@@ -5,6 +5,8 @@
//! update transaction against the desktop MiniApp manager.
use crate::api::app_state::AppState;
+use bitfun_core::infrastructure::events::{emit_global_event, BackendEvent};
+use bitfun_core::miniapp::lifecycle::miniapp_runtime_event_payload;
use bitfun_core::miniapp::{
MiniApp, MiniAppCustomizationMetadata, MiniAppPermissionDiff, MiniAppPermissions, MiniAppSource,
};
@@ -344,6 +346,16 @@ pub async fn miniapp_market_install(
.map_err(|error| error.to_string())?;
(app, false, diff)
};
+ let (event_name, reason) = if updated {
+ ("miniapp-updated", "market-update")
+ } else {
+ ("miniapp-created", "market-install")
+ };
+ let _ = emit_global_event(BackendEvent::Custom {
+ event_name: event_name.to_string(),
+ payload: miniapp_runtime_event_payload(&app, reason),
+ })
+ .await;
Ok(MarketInstallResult {
app,
origin,
diff --git a/src/miniapp-market-web/README.md b/src/miniapp-market-web/README.md
index 713ac609d3..670f7ba9b2 100644
--- a/src/miniapp-market-web/README.md
+++ b/src/miniapp-market-web/README.md
@@ -35,6 +35,7 @@
| `src/App.tsx` | 目录、详情、受开关控制的投稿、只读“我的投稿”和管理员审核页面 |
| `src/api.ts` | `/miniapp/api/v1` 客户端、CSRF、登录和下载 URL |
| `src/types.ts` | 网页使用的 API DTO |
+| `src/MiniAppIcon.tsx` | 将 MiniApp 元数据中的 Lucide 图标名安全解析为图标组件 |
| `src/i18n.ts` | `zh-CN`、`zh-TW`、`en-US` 文案与 fallback |
| `src/format.ts` | 市场页面的日期和数字格式化 |
| `src/styles.css` | 响应式布局与视觉样式 |
diff --git a/src/miniapp-market-web/package.json b/src/miniapp-market-web/package.json
index 78a304c819..bc5ba59b08 100644
--- a/src/miniapp-market-web/package.json
+++ b/src/miniapp-market-web/package.json
@@ -12,6 +12,7 @@
},
"dependencies": {
"@phosphor-icons/react": "^2.1.10",
+ "lucide-react": "^0.541.0",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
diff --git a/src/miniapp-market-web/src/App.tsx b/src/miniapp-market-web/src/App.tsx
index 53bc6f3701..2b39085116 100644
--- a/src/miniapp-market-web/src/App.tsx
+++ b/src/miniapp-market-web/src/App.tsx
@@ -33,6 +33,7 @@ import {
import { downloadUrl, loginUrl, marketApi, MarketApiError } from './api';
import { formatCompactNumber, formatMarketDate } from './format';
import { useLocale, type Locale, type MessageKey } from './i18n';
+import { MiniAppIcon } from './MiniAppIcon';
import { useTheme, type Theme } from './theme';
import type {
AdminSubmissionDetail,
@@ -598,7 +599,7 @@ function AppCard({
) : (
- {app.icon || }
+