'use client'; import { useEffect, useState } from 'react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { Loader2 } from 'lucide-react'; import { toast } from 'sonner'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { apiFetch } from '@/lib/api/client'; import { toastError } from '@/lib/api/toast-error'; interface ReminderPrefs { delivery: 'immediate' | 'daily' | 'weekly' | 'off'; digestTime?: string; digestDayOfWeek?: number; timezone?: string; } interface UserPrefsResponse { reminders?: ReminderPrefs; timezone?: string; } const DAYS = [ { value: '0', label: 'Sunday' }, { value: '1', label: 'Monday' }, { value: '2', label: 'Tuesday' }, { value: '3', label: 'Wednesday' }, { value: '4', label: 'Thursday' }, { value: '5', label: 'Friday' }, { value: '6', label: 'Saturday' }, ]; export function ReminderDigestForm() { const qc = useQueryClient(); const { data, isLoading } = useQuery({ queryKey: ['user', 'preferences'], queryFn: () => apiFetch<{ data: UserPrefsResponse }>('/api/v1/users/me/preferences').then((r) => r.data), }); const [delivery, setDelivery] = useState('immediate'); const [digestTime, setDigestTime] = useState('09:00'); const [digestDay, setDigestDay] = useState('1'); const [timezone, setTimezone] = useState('Europe/Warsaw'); useEffect(() => { const r = data?.reminders; if (r) { setDelivery(r.delivery ?? 'immediate'); setDigestTime(r.digestTime ?? '09:00'); setDigestDay(String(r.digestDayOfWeek ?? 1)); setTimezone(r.timezone ?? data?.timezone ?? 'Europe/Warsaw'); } else if (data?.timezone) { setTimezone(data.timezone); } }, [data]); const mutation = useMutation({ mutationFn: () => apiFetch('/api/v1/users/me/preferences', { method: 'PATCH', body: { reminders: { delivery, ...(delivery !== 'immediate' && delivery !== 'off' ? { digestTime, timezone } : {}), ...(delivery === 'weekly' ? { digestDayOfWeek: Number(digestDay) } : {}), }, }, }), onSuccess: () => { toast.success('Reminder preferences saved'); qc.invalidateQueries({ queryKey: ['user', 'preferences'] }); }, onError: (err) => toastError(err), }); if (isLoading) { return ( Loading… ); } return ( Reminder digest Choose how reminder notifications are delivered to you. Immediate fires as soon as a reminder triggers; daily/weekly batch them into a digest at the time you pick.
{(delivery === 'daily' || delivery === 'weekly') && (
setDigestTime(e.target.value)} placeholder="09:00" />
{delivery === 'weekly' && (
)}
setTimezone(e.target.value)} placeholder="Europe/Warsaw" />
)}
); }