'use client'; import { 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; portReminderDigestEnabled?: boolean; } 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), }); // Key-based remount: the body is keyed on the loaded payload signature // so the useState initializers re-run when the server data first lands // or genuinely changes. Replaces the prior useEffect(setState) sync. if (isLoading || !data) { return ; } const r = data.reminders ?? null; const signature = `${r?.delivery ?? ''}|${r?.digestTime ?? ''}|${r?.digestDayOfWeek ?? ''}|${r?.timezone ?? data.timezone ?? ''}`; return ; } function ReminderDigestFormBody({ data, isLoading, qc, }: { data: UserPrefsResponse | undefined; isLoading: boolean; qc: ReturnType; }) { const r = data?.reminders; const [delivery, setDelivery] = useState(r?.delivery ?? 'immediate'); const [digestTime, setDigestTime] = useState(r?.digestTime ?? '09:00'); const [digestDay, setDigestDay] = useState(String(r?.digestDayOfWeek ?? 1)); const [timezone, setTimezone] = useState(r?.timezone ?? data?.timezone ?? 'Europe/Warsaw'); 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… ); } if (!data?.portReminderDigestEnabled) { return null; } 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" />
)}
); }