import React, { useState, useEffect, useRef } from 'react'; import { Mail, Calendar as CalendarIcon, LayoutGrid, User, Send, Clock, Star, Plus, Bot, LogOut, ChevronRight, Sun, Moon, HelpCircle, Info, Check, AlertCircle, Search, Filter } from 'lucide-react'; // --- 模擬資料 (Mock Data) --- const INITIAL_EMAILS = [ { id: 1, from: "林經理 (Kevin)", subject: "Q4 專案進度匯報確認", snippet: "關於下週的簡報內容,我有幾個重點...", date: "09:30", isHuman: true, isImportant: true, read: false }, { id: 3, from: "陳小美 (Mei)", subject: "週末聚餐", snippet: "嘿!這週五晚上有空嗎?...", date: "昨天", isHuman: true, isImportant: true, read: true }, { id: 5, from: "張總監", subject: "緊急:客戶需求變更", snippet: "客戶剛剛來電表示規格需要大改...", date: "10/22", isHuman: true, isImportant: true, read: true }, { id: 7, from: "系統通知", subject: "伺服器維護公告", snippet: "將於今晚進行停機維護...", date: "10:00", isHuman: false, isImportant: true, read: false }, ]; const INITIAL_EVENTS = [ { id: 101, title: "部門週會", time: "10:00", endTime: "11:00", type: "work", day: 25 }, { id: 102, title: "與客戶午餐", time: "12:30", endTime: "14:00", type: "personal", day: 25 }, { id: 103, title: "專案衝刺會議", time: "15:00", endTime: "17:00", type: "work", day: 25 }, { id: 104, title: "健身房", time: "18:30", endTime: "19:30", type: "personal", day: 25 }, { id: 105, title: "產品發布會", time: "14:00", endTime: "16:00", type: "work", day: 26 }, { id: 106, title: "家庭聚餐", time: "18:00", endTime: "20:00", type: "personal", day: 27 }, ]; // --- 元件: 用戶頭像 --- const UserAvatar = () => (
U
); // --- 主程式 --- export default function SmartDashboard() { const [isLoggedIn, setIsLoggedIn] = useState(false); const [isDarkMode, setIsDarkMode] = useState(true); // 預設深色模式 const [emails, setEmails] = useState([]); const [events, setEvents] = useState([]); const [chatInput, setChatInput] = useState(""); const [chatHistory, setChatHistory] = useState([ { role: 'assistant', content: '早安。我是您的智能助理。今日行程與重要信件已準備就緒。' } ]); const [activeTab, setActiveTab] = useState('dashboard'); // dashboard, calendar, mail, help const [calendarView, setCalendarView] = useState('day'); // day, week, month const chatEndRef = useRef(null); // 初始化 const handleLogin = () => { setIsLoggedIn(true); setTimeout(() => { setEmails(INITIAL_EMAILS); setEvents(INITIAL_EVENTS); }, 600); }; useEffect(() => { chatEndRef.current?.scrollIntoView({ behavior: "smooth" }); }, [chatHistory]); // AI 邏輯 const processAICommand = (input) => { const lowerInput = input.toLowerCase(); let response = ""; if (lowerInput.includes("新增") || lowerInput.includes("安排")) { const newEvent = { id: Date.now(), title: input.replace(/(新增|安排|行程|會議)/g, "").trim() || "新事項", time: "09:00", endTime: "10:00", type: "work", day: 25 }; setEvents([...events, newEvent]); response = `已為您新增行程:「${newEvent.title}」。`; } else if (lowerInput.includes("刪除") || lowerInput.includes("取消")) { if (events.length > 0) { const removed = events[events.length - 1]; setEvents(events.slice(0, -1)); response = `已取消「${removed.title}」。`; } else { response = "目前無行程可刪除。"; } } else if (lowerInput.includes("月")) { setCalendarView('month'); response = "已切換至月視圖。"; } else if (lowerInput.includes("週") || lowerInput.includes("周")) { setCalendarView('week'); response = "已切換至週視圖。"; } else if (lowerInput.includes("日")) { setCalendarView('day'); response = "已切換至日視圖。"; } else { response = "收到。我可以幫您新增行程、切換視圖或朗讀信件。如果不確定如何操作,請查看左側的「使用指南」。"; } return response; }; const handleSendMessage = (e) => { e.preventDefault(); if (!chatInput.trim()) return; setChatHistory([...chatHistory, { role: 'user', content: chatInput }]); const currentInput = chatInput; setChatInput(""); setTimeout(() => { setChatHistory(prev => [...prev, { role: 'assistant', content: processAICommand(currentInput) }]); }, 500); }; // --- 主題樣式定義 (Theme Classes) --- const theme = { bg: isDarkMode ? "bg-slate-950" : "bg-gray-50", text: isDarkMode ? "text-slate-300" : "text-slate-600", textHead: isDarkMode ? "text-slate-100" : "text-slate-800", panelBg: isDarkMode ? "bg-slate-900" : "bg-white", panelBorder: isDarkMode ? "border-slate-800" : "border-gray-200", navBg: isDarkMode ? "bg-slate-900" : "bg-white", navBorder: isDarkMode ? "border-slate-800" : "border-gray-200", inputBg: isDarkMode ? "bg-slate-950" : "bg-gray-100", hoverBg: isDarkMode ? "hover:bg-slate-800" : "hover:bg-gray-100", cardHover: isDarkMode ? "hover:bg-slate-800" : "hover:bg-blue-50", divider: isDarkMode ? "border-slate-800" : "border-gray-100", scrollTrack: isDarkMode ? "bg-slate-900" : "bg-gray-100", subText: isDarkMode ? "text-slate-500" : "text-gray-400", }; // --- 登入畫面 --- if (!isLoggedIn) { return (

Smart Workspace

沉浸式工作站
整合 Gmail 與 Calendar 的第二大腦

); } // --- 主介面 --- return (
{/* 側邊導航 */} {/* 主要區域 */}
{/* 內容區塊 (左側大區塊) */}
{/* 頂部資訊列 */}

{activeTab === 'dashboard' ? 'Dashboard' : activeTab === 'mail' ? 'Inbox' : activeTab === 'calendar' ? 'Calendar' : 'Help Center'}

{/* 日期顯示 */}
2023.10.25 Wed
{/* 內容捲動區 */}
{activeTab === 'help' ? ( ) : ( <> {/* 上半部:強化的行事曆區塊 (Dashboard 模式下) */}
setCalendarView('day')} label="日 Day" theme={theme} isDarkMode={isDarkMode} /> setCalendarView('week')} label="週 Week" theme={theme} isDarkMode={isDarkMode} /> setCalendarView('month')} label="月 Month" theme={theme} isDarkMode={isDarkMode} />
{/* 行事曆容器 */}
{/* 模擬不同視圖 */} {calendarView === 'day' && (
{/* 時間軸背景線 */} {[9, 10, 11, 12, 13, 14, 15, 16, 17, 18].map(hour => (
{hour}:00
))} {/* 行程卡片 (絕對定位模擬) */} {events.filter(e => e.day === 25).map((event, idx) => { const startHour = parseInt(event.time.split(':')[0]); const top = (startHour - 9) * 80 + 10; // 簡單計算位置 return (
{event.title} {event.time} - {event.endTime}
{event.type === 'work' ? '工作' : '私人'}
); })}
)} {calendarView === 'week' && (
{['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map((day, i) => (
{day}
{22 + i}
{events.filter(e => (e.day === 22 + i)).map(e => (
))} {i === 3 &&
部門週會
}
))}
)} {calendarView === 'month' && (
{Array.from({length: 35}).map((_, i) => { const day = i - 2; // Offset for month start const isToday = day === 25; return (
{day > 0 && day <= 31 && ( <> {day}
{day === 25 &&
} {day === 25 &&
} {day === 26 &&
}
)}
) })}
)}
{/* 下半部:重要郵件與摘要 */}
{/* 郵件列表 */}

重要信箱 (AI Filtered)

僅顯示真人與緊急
{emails.filter(e => e.isImportant).map(email => (
{email.from} {email.date}
{email.subject}

{email.snippet}

))}
{/* AI 摘要或待辦 */}

AI 每日簡報

今日共有 3 個會議,下午空檔適合處理 Q4 簡報。

發現 1 封來自張總監的緊急郵件,建議優先回覆。

下週二似乎沒有行程,是否要安排專案回顧?

)}
{/* 右側:AI 對話面板 */}
{/* Chat Header */}
Copilot
{/* Messages */}
{chatHistory.map((msg, idx) => (
{msg.content}
))}
{/* Input */}
setChatInput(e.target.value)} placeholder="Ask AI to schedule..." className={`w-full ${theme.inputBg} border ${theme.navBorder} rounded-lg py-2.5 pl-3 pr-10 focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500 transition-all text-xs ${theme.text} placeholder-slate-500`} />
setChatInput("切換到月視圖")} label="月視圖" theme={theme} /> setChatInput("幫我新增下午會議")} label="新增會議" theme={theme} />
); } // --- 文件說明頁面 (New Feature) --- function Documentation({ theme, isDarkMode }) { const sections = [ { title: "智能儀表板總覽", icon: , content: "這是您的第二個大腦。左側導覽列可切換總覽、行事曆與信箱。右側是 AI Copilot,隨時待命協助您新增行程或查詢資料。上方是強化的行事曆視圖,下方則自動為您整理出最重要的信件與每日摘要。" }, { title: "AI 郵件過濾機制", icon: , content: "系統內建「防罐頭」演算法。它會自動分析寄件人與內容:\n• 隱藏:促銷廣告、系統通知、Netflix 等訂閱信。\n• 顯示:來自真實人類的對話、標記為「緊急」或「重要」的郵件。\n• 歷史:自動往前追溯三個月的重要紀錄,讓您不錯過任何脈絡。" }, { title: "行事曆視圖操作", icon: , content: "在儀表板上方,您可以自由切換三種模式:\n• 日 (Day):適合詳細安排當天行程,視覺化時間塊。\n• 週 (Week):適合查看一週的忙碌程度分佈。\n• 月 (Month):適合宏觀規劃,查看整月的行程點狀圖。" }, { title: "Copilot 指令大全", icon: , content: "您可以直接在右側對話框輸入自然語言,例如:\n• 「幫我新增明天下午兩點的會議」\n• 「刪除最近的一個行程」\n• 「切換到月視圖」\n• 「有哪些重要信件?」\n\nAI 會自動解析您的意圖並直接操作介面。" } ]; return (

使用指南 & 功能說明

幫助您快速上手 Smart Workspace 的所有功能

{sections.map((section, idx) => (
{section.icon}

{section.title}

{section.content}

))}

小提示

  • 點擊左下角的 圖示可以切換深色/淺色模式。
  • 點擊行程卡片上的垃圾桶圖示可以直接刪除該行程。
  • AI 每日簡報會根據您的行程變動即時更新。
); } // --- 小元件 (Updated with Theme) --- function NavItem({ icon, active, onClick, tooltip, theme, isDarkMode }) { return ( ); } function ViewToggle({ active, onClick, label, theme, isDarkMode }) { return ( ) } function StatusDot({ color, animate }) { return (
{animate && }
) } function QuickCmd({ onClick, label, theme }) { return ( ) }