From 935189f3f7936eafad5f93aa456eac824bf36199 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?George=C2=B7Dong?=
<98630204+GeorgeDong32@users.noreply.github.com>
Date: Thu, 4 Sep 2025 23:59:54 +0800
Subject: [PATCH] =?UTF-8?q?refactor(miniapp):=20=E9=80=82=E9=85=8D?=
=?UTF-8?q?=E9=A1=B6=E9=83=A8=E7=8A=B6=E6=80=81=E6=A0=8F=20(#9695)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat(minapp): add top-navbar fixed toolbar and layout adjustments
* refactor(minapps): optimize toolbar
* fix(minapps): hide redundant components
* feat(minapp): improve webview load handling and popup visibility
* feat(minapps): improve WebView load handling and clean up launchpad
* feat(minapp): 实现活跃小程序数量限制与关闭缓存清理
* fix(minapp): 修复WebView高度不正确的问题
* fix(minapp): show popup only for left navbar mode
* feat(minapps): add full-screen loading mask for webview
* fix: lint error
* feat(minapp): fix drawer sizing and layout when side navbar present
* refactor(minapp): 移除固定工具栏组件,优化弹窗容器布局
* feat(minapps): memoize app lookup to avoid unnecessary recompute
* chore(minapps): optimize comments
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix(renderer): remove stray blank line in MinAppFullPageView
* refactor(minapps): remove top navbar opened minapps component
* refactor(tab): remove unused TopNavbarOpenedMinappTabs import
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
src/renderer/src/Router.tsx | 2 +
src/renderer/src/components/MinApp/MinApp.tsx | 10 +-
.../MinApp/MinappPopupContainer.tsx | 89 ++++---
.../MinApp/TopViewMinappContainer.tsx | 5 +-
.../components/MinApp/WebviewContainer.tsx | 42 +++-
.../src/components/Tab/TabContainer.tsx | 36 ++-
.../src/components/app/PinnedMinapps.tsx | 145 +-----------
src/renderer/src/hooks/useMinappPopup.ts | 19 +-
.../src/pages/launchpad/LaunchpadPage.tsx | 3 +-
src/renderer/src/pages/minapps/MinAppPage.tsx | 102 ++++++++
.../minapps/components/MinAppFullPageView.tsx | 166 +++++++++++++
.../minapps/components/MinimalToolbar.tsx | 218 ++++++++++++++++++
src/renderer/src/services/TabsService.ts | 46 ++++
src/renderer/src/utils/webviewStateManager.ts | 55 +++++
14 files changed, 749 insertions(+), 189 deletions(-)
create mode 100644 src/renderer/src/pages/minapps/MinAppPage.tsx
create mode 100644 src/renderer/src/pages/minapps/components/MinAppFullPageView.tsx
create mode 100644 src/renderer/src/pages/minapps/components/MinimalToolbar.tsx
create mode 100644 src/renderer/src/utils/webviewStateManager.ts
diff --git a/src/renderer/src/Router.tsx b/src/renderer/src/Router.tsx
index 8985a1a41d..505b81dcb8 100644
--- a/src/renderer/src/Router.tsx
+++ b/src/renderer/src/Router.tsx
@@ -14,6 +14,7 @@ import FilesPage from './pages/files/FilesPage'
import HomePage from './pages/home/HomePage'
import KnowledgePage from './pages/knowledge/KnowledgePage'
import LaunchpadPage from './pages/launchpad/LaunchpadPage'
+import MinAppPage from './pages/minapps/MinAppPage'
import MinAppsPage from './pages/minapps/MinAppsPage'
import NotesPage from './pages/notes/NotesPage'
import PaintingsRoutePage from './pages/paintings/PaintingsRoutePage'
@@ -34,6 +35,7 @@ const Router: FC = () => {
} />
} />
} />
+ } />
} />
} />
} />
diff --git a/src/renderer/src/components/MinApp/MinApp.tsx b/src/renderer/src/components/MinApp/MinApp.tsx
index c9b6a5b55b..c14346de2f 100644
--- a/src/renderer/src/components/MinApp/MinApp.tsx
+++ b/src/renderer/src/components/MinApp/MinApp.tsx
@@ -13,6 +13,7 @@ import { Dropdown } from 'antd'
import { FC } from 'react'
import { useTranslation } from 'react-i18next'
import { useDispatch } from 'react-redux'
+import { useNavigate } from 'react-router-dom'
import styled from 'styled-components'
interface Props {
@@ -30,6 +31,7 @@ const MinApp: FC = ({ app, onClick, size = 60, isLast }) => {
const { minapps, pinned, disabled, updateMinapps, updateDisabledMinapps, updatePinnedMinapps } = useMinapps()
const { openedKeepAliveMinapps, currentMinappId, minappShow } = useRuntime()
const dispatch = useDispatch()
+ const navigate = useNavigate()
const isPinned = pinned.some((p) => p.id === app.id)
const isVisible = minapps.some((m) => m.id === app.id)
const isActive = minappShow && currentMinappId === app.id
@@ -37,7 +39,13 @@ const MinApp: FC = ({ app, onClick, size = 60, isLast }) => {
const { isTopNavbar } = useNavbarPosition()
const handleClick = () => {
- openMinappKeepAlive(app)
+ if (isTopNavbar) {
+ // 顶部导航栏:导航到小程序页面
+ navigate(`/apps/${app.id}`)
+ } else {
+ // 侧边导航栏:保持原有弹窗行为
+ openMinappKeepAlive(app)
+ }
onClick?.()
}
diff --git a/src/renderer/src/components/MinApp/MinappPopupContainer.tsx b/src/renderer/src/components/MinApp/MinappPopupContainer.tsx
index 226598dc57..2a99f2b560 100644
--- a/src/renderer/src/components/MinApp/MinappPopupContainer.tsx
+++ b/src/renderer/src/components/MinApp/MinappPopupContainer.tsx
@@ -24,6 +24,7 @@ import { useAppDispatch } from '@renderer/store'
import { setMinappsOpenLinkExternal } from '@renderer/store/settings'
import { MinAppType } from '@renderer/types'
import { delay } from '@renderer/utils'
+import { clearWebviewState, getWebviewLoaded, setWebviewLoaded } from '@renderer/utils/webviewStateManager'
import { Alert, Avatar, Button, Drawer, Tooltip } from 'antd'
import { WebviewTag } from 'electron'
import { useEffect, useMemo, useRef, useState } from 'react'
@@ -162,8 +163,7 @@ const MinappPopupContainer: React.FC = () => {
/** store the webview refs, one of the key to make them keepalive */
const webviewRefs = useRef