diff --git a/apps/web/src/components/dashboard/live-dashboard.tsx b/apps/web/src/components/dashboard/live-dashboard.tsx
index 64236a40..b0519257 100644
--- a/apps/web/src/components/dashboard/live-dashboard.tsx
+++ b/apps/web/src/components/dashboard/live-dashboard.tsx
@@ -61,7 +61,8 @@ export function LiveDashboard({ locale }: LiveDashboardProps) {
const tBrand = useTranslations('brand')
const tHost = useTranslations('host')
- const { connect, disconnect } = useDashboardStore()
+ // Phase 19 修復: SSE 連接已移至 AppLayout 全局管理
+ // const { connect, disconnect } = useDashboardStore()
const hosts = useHosts()
const overallStatus = useOverallStatus()
const alerts = useAlerts()
@@ -110,16 +111,12 @@ export function LiveDashboard({ locale }: LiveDashboardProps) {
},
}
- useEffect(() => {
- const apiBaseUrl = getApiBaseUrl()
- console.log('[Dashboard] Connecting to SSE...', apiBaseUrl)
- connect(apiBaseUrl)
-
- return () => {
- console.log('[Dashboard] Disconnecting SSE...')
- disconnect()
- }
- }, [connect, disconnect])
+ // Phase 19 修復: SSE 連接已移至 AppLayout 全局管理
+ // useEffect(() => {
+ // const apiBaseUrl = getApiBaseUrl()
+ // connect(apiBaseUrl)
+ // return () => disconnect()
+ // }, [connect, disconnect])
return (
diff --git a/apps/web/src/components/layout/app-layout.tsx b/apps/web/src/components/layout/app-layout.tsx
index 05f78188..1e44e787 100644
--- a/apps/web/src/components/layout/app-layout.tsx
+++ b/apps/web/src/components/layout/app-layout.tsx
@@ -9,6 +9,9 @@
* - 響應式側邊欄折疊
* - 主內容區域自動適應
* - 持久化折疊狀態 (localStorage)
+ * - **Phase 19 修復**: 全局 SSE 連接 (所有頁面共享連線狀態)
+ *
+ * @updated 2026-03-28 - 修復 Header「已斷線」狀態問題
*/
import { useState, useEffect } from 'react'
@@ -16,6 +19,7 @@ import { Sidebar } from './sidebar'
import { Header } from './header'
import { DotMatrixBg } from '@/components/ui/dot-matrix-bg'
import { cn } from '@/lib/utils'
+import { useDashboardStore } from '@/stores/dashboard.store'
// =============================================================================
// Types
@@ -45,6 +49,9 @@ export function AppLayout({
const [collapsed, setCollapsed] = useState(false)
const [mounted, setMounted] = useState(false)
+ // Phase 19 修復: 全局 SSE 連接
+ const { connect, disconnect } = useDashboardStore()
+
// Load collapsed state from localStorage
useEffect(() => {
setMounted(true)
@@ -54,6 +61,20 @@ export function AppLayout({
}
}, [])
+ // Phase 19 修復: 全局啟動 SSE 連接 (所有頁面共享)
+ useEffect(() => {
+ const apiBaseUrl = process.env.NEXT_PUBLIC_API_URL || ''
+ if (apiBaseUrl) {
+ console.log('[AppLayout] 全局 SSE 連接啟動...', apiBaseUrl)
+ connect(apiBaseUrl)
+ }
+
+ return () => {
+ console.log('[AppLayout] SSE 連接關閉')
+ disconnect()
+ }
+ }, [connect, disconnect])
+
// Save collapsed state to localStorage
const handleToggle = () => {
const newState = !collapsed