import { useState, useEffect } from 'react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Bell, CheckCircle2, Loader2, Mail, Save } from 'lucide-react'; import { api } from '../api/client'; import { useAuth } from '../contexts/AuthContext'; import { useToast } from '../contexts/ToastContext'; import { Button } from '../components/Button'; import { Card, CardContent, CardHeader } from '../components/Card'; export function NotificationsPage() { const { t } = useTranslation(); const { user } = useAuth(); const { showToast } = useToast(); const queryClient = useQueryClient(); const navigate = useNavigate(); const [notifyPrintStart, setNotifyPrintStart] = useState(true); const [notifyPrintComplete, setNotifyPrintComplete] = useState(true); const [notifyPrintFailed, setNotifyPrintFailed] = useState(true); const [notifyPrintStopped, setNotifyPrintStopped] = useState(true); const [isDirty, setIsDirty] = useState(false); // Check advanced auth status - redirect if disabled const { data: advancedAuthStatus, isLoading: isAdvancedAuthLoading } = useQuery({ queryKey: ['advancedAuthStatus'], queryFn: api.getAdvancedAuthStatus, staleTime: 5 * 60 * 1000, // 5 minutes }); const { data: settings, isLoading: isSettingsLoading } = useQuery({ queryKey: ['settings'], queryFn: api.getSettings, staleTime: 5 * 60 * 1000, }); // Fetch current preferences const { data: preferences, isLoading } = useQuery({ queryKey: ['user-email-preferences'], queryFn: () => api.getUserEmailPreferences(), }); // Redirect to settings if Advanced Auth is disabled useEffect(() => { if ((advancedAuthStatus && !advancedAuthStatus.advanced_auth_enabled) || (settings && !settings.user_notifications_enabled)) { navigate('/settings', { replace: true }); } }, [advancedAuthStatus, settings, navigate]); // Populate form when preferences load useEffect(() => { if (preferences) { setNotifyPrintStart(preferences.notify_print_start); setNotifyPrintComplete(preferences.notify_print_complete); setNotifyPrintFailed(preferences.notify_print_failed); setNotifyPrintStopped(preferences.notify_print_stopped); setIsDirty(false); } }, [preferences]); // Save preferences const saveMutation = useMutation({ mutationFn: () => api.updateUserEmailPreferences({ notify_print_start: notifyPrintStart, notify_print_complete: notifyPrintComplete, notify_print_failed: notifyPrintFailed, notify_print_stopped: notifyPrintStopped, }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['user-email-preferences'] }); setIsDirty(false); showToast(t('notifications.userEmail.saveSuccess'), 'success'); }, onError: (err: Error) => { showToast(err.message || t('notifications.userEmail.saveError'), 'error'); }, }); const handleToggle = ( setter: React.Dispatch>, value: boolean ) => { setter(!value); setIsDirty(true); }; if (isLoading || isAdvancedAuthLoading || isSettingsLoading) { return (
); } return (

{t('notifications.userEmail.title')}

{/* Info card */}

{t('notifications.userEmail.emailNotifications')}

{t('notifications.userEmail.emailNotificationsDesc')}

{user?.email ? (

{t('notifications.userEmail.sendingTo')}: {user.email}

) : (

{t('notifications.userEmail.noEmailWarning')}

)}
{/* Preferences card */}

{t('notifications.userEmail.printJobNotifications')}

{t('notifications.userEmail.printJobNotificationsDesc')}

{/* Print Job Starts */}

{t('notifications.userEmail.printJobStarts')}

{t('notifications.userEmail.printJobStartsDesc')}

{/* Print Job Finishes */}

{t('notifications.userEmail.printJobFinishes')}

{t('notifications.userEmail.printJobFinishesDesc')}

{/* Print Errors */}

{t('notifications.userEmail.printErrors')}

{t('notifications.userEmail.printErrorsDesc')}

{/* Print Job Stops */}

{t('notifications.userEmail.printJobStops')}

{t('notifications.userEmail.printJobStopsDesc')}

{/* Save button */}
); }