'use client'; import React, { useState, useEffect } from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, Box, Typography, Switch, FormControlLabel, TextField, Select, MenuItem, FormControl, InputLabel, Button, Divider, Alert, Card, CardContent, Chip, IconButton, Checkbox, FormGroup, Grid, Accordion, AccordionSummary, AccordionDetails, } from '@mui/material'; import { Email, Schedule, Close, NotificationImportant, Settings, Save, ExpandMore, Alarm, Today, CalendarMonth, AccessTime, } from '@mui/icons-material'; import { motion } from 'framer-motion'; import { useTheme } from '@/providers/ThemeProvider'; import { useAuth } from '@/providers/AuthProvider'; import { notificationsApi } from '@/lib/api'; import { toast } from 'react-hot-toast'; interface EnhancedEmailNotificationSettingsProps { open: boolean; onClose: () => void; } interface NotificationSettings { // 基本設定 emailEnabled: boolean; emailAddress: string; // 到期提醒設定 - 支援多個天數 reminderDays: number[]; // 每日摘要 dailyDigestEnabled: boolean; dailyDigestTime: string; // 週報摘要 weeklyDigestEnabled: boolean; weeklyDigestTime: string; weeklyDigestDay: number; // 0=週日, 1=週一... // 月報摘要 monthlyDigestEnabled: boolean; monthlyDigestTime: string; monthlyDigestDay: number; // 每月第幾日 // 其他通知 assignmentNotifications: boolean; completionNotifications: boolean; } const EnhancedEmailNotificationSettings: React.FC = ({ open, onClose, }) => { const { actualTheme } = useTheme(); const { user } = useAuth(); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const [testEmailLoading, setTestEmailLoading] = useState(false); const [settings, setSettings] = useState({ emailEnabled: false, emailAddress: user?.email || '', reminderDays: [1, 3], // 預設前1天、前3天 dailyDigestEnabled: false, dailyDigestTime: '09:00', weeklyDigestEnabled: true, weeklyDigestTime: '09:00', weeklyDigestDay: 1, // 週一 monthlyDigestEnabled: false, monthlyDigestTime: '09:00', monthlyDigestDay: 1, // 每月1日 assignmentNotifications: true, completionNotifications: false, }); // 可選的提醒天數選項 const reminderDayOptions = [1, 2, 3, 5, 7, 14]; // 週幾選項 const weekDayOptions = [ { value: 0, label: '週日' }, { value: 1, label: '週一' }, { value: 2, label: '週二' }, { value: 3, label: '週三' }, { value: 4, label: '週四' }, { value: 5, label: '週五' }, { value: 6, label: '週六' }, ]; // 時間選項 const timeOptions = Array.from({ length: 24 }, (_, i) => { const hour = i.toString().padStart(2, '0'); return `${hour}:00`; }); // 載入用戶的通知設定 useEffect(() => { if (open && user) { loadSettings(); } }, [open, user]); const loadSettings = async () => { try { setLoading(true); const data = await notificationsApi.getSettings(); setSettings(prev => ({ ...prev, emailEnabled: data.email_reminder_enabled || false, reminderDays: data.reminder_days_before || [1, 3], dailyDigestEnabled: false, // 暫時沒有每日摘要 weeklyDigestEnabled: data.weekly_summary_enabled || false, weeklyDigestTime: data.weekly_summary_time || '09:00', weeklyDigestDay: data.weekly_summary_day || 1, monthlyDigestEnabled: data.monthly_summary_enabled || false, monthlyDigestTime: data.monthly_summary_time || '09:00', monthlyDigestDay: data.monthly_summary_day || 1, assignmentNotifications: data.notification_enabled || true, emailAddress: user?.email || data.email || '', })); } catch (error) { console.error('Failed to load notification settings:', error); } finally { setLoading(false); } }; const handleSave = async () => { try { setSaving(true); const payload = { email_reminder_enabled: settings.emailEnabled, notification_enabled: settings.assignmentNotifications, weekly_summary_enabled: settings.weeklyDigestEnabled, monthly_summary_enabled: settings.monthlyDigestEnabled, reminder_days_before: settings.reminderDays, weekly_summary_time: settings.weeklyDigestTime, weekly_summary_day: settings.weeklyDigestDay, monthly_summary_time: settings.monthlyDigestTime, monthly_summary_day: settings.monthlyDigestDay, }; await notificationsApi.updateSettings(payload); toast.success('通知設定已儲存'); onClose(); } catch (error) { console.error('Failed to save notification settings:', error); toast.error('儲存通知設定失敗,請檢查網路連線'); } finally { setSaving(false); } }; const handleTestEmail = async () => { try { setTestEmailLoading(true); await notificationsApi.sendTestEmail(settings.emailAddress); toast.success(`測試郵件已發送至 ${settings.emailAddress}!請檢查您的信箱`); } catch (error) { console.error('Failed to send test email:', error); toast.error('發送測試郵件失敗,請檢查網路連線'); } finally { setTestEmailLoading(false); } }; const handleReminderDayToggle = (day: number) => { setSettings(prev => ({ ...prev, reminderDays: prev.reminderDays.includes(day) ? prev.reminderDays.filter(d => d !== day) : [...prev.reminderDays, day].sort((a, b) => a - b) })); }; if (loading) { return ( 載入中... ); } return ( 增強郵件提醒設定 {/* 總開關 */} 啟用郵件通知 接收待辦事項相關的郵件提醒通知 setSettings(prev => ({ ...prev, emailEnabled: e.target.checked }))} size="medium" /> {settings.emailEnabled && ( {/* 基本設定 */} }> 基本設定 setSettings(prev => ({ ...prev, emailAddress: e.target.value }))} helperText="通知將發送至此郵件地址" sx={{ mb: 2 }} disabled /> {/* 到期提醒設定 */} }> 到期提醒設定 選擇在到期日前幾天發送提醒郵件(可多選) {reminderDayOptions.map(day => ( handleReminderDayToggle(day)} size="small" /> } label={`前 ${day} 天`} /> ))} {settings.reminderDays.length > 0 && ( 已選擇: {settings.reminderDays.sort((a, b) => a - b).map(day => ( ))} )} {/* 摘要郵件設定 */} }> 摘要郵件設定 {/* 週報設定 */} 週報摘要 setSettings(prev => ({ ...prev, weeklyDigestEnabled: e.target.checked }))} /> } label="啟用週報" sx={{ mb: 2 }} /> {settings.weeklyDigestEnabled && ( 發送時間 發送日期 )} {/* 月報設定 */} 月報摘要 setSettings(prev => ({ ...prev, monthlyDigestEnabled: e.target.checked }))} /> } label="啟用月報" sx={{ mb: 2 }} /> {settings.monthlyDigestEnabled && ( 發送時間 setSettings(prev => ({ ...prev, monthlyDigestDay: Math.max(1, Math.min(28, parseInt(e.target.value) || 1)) }))} inputProps={{ min: 1, max: 28 }} helperText="1-28日" /> )} {/* 其他通知設定 */} }> 其他通知 setSettings(prev => ({ ...prev, assignmentNotifications: e.target.checked }))} /> } label={ 指派通知 有新的待辦事項指派給您時發送通知 } sx={{ mb: 2, alignItems: 'flex-start', ml: 0 }} /> setSettings(prev => ({ ...prev, completionNotifications: e.target.checked }))} /> } label={ 完成通知 您指派的待辦事項被完成時發送通知 } sx={{ alignItems: 'flex-start', ml: 0 }} /> {/* 設定預覽 */} 當前設定預覽: {settings.reminderDays.length > 0 && ( )} {settings.weeklyDigestEnabled && ( d.value === settings.weeklyDigestDay)?.label} ${settings.weeklyDigestTime}`} /> )} {settings.monthlyDigestEnabled && ( )} {settings.assignmentNotifications && ( )} {settings.completionNotifications && ( )} )} ); }; export default EnhancedEmailNotificationSettings;