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 => (
))}
{/* 行程卡片 (絕對定位模擬) */}
{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) => (
{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 簡報。
>
)}
{/* 右側:AI 對話面板 */}
{/* Chat Header */}
{/* Messages */}
{chatHistory.map((msg, idx) => (
))}
{/* Input */}
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 (
)
}