import { useState, useMemo } from 'react'; import { Plus, Bell, BellOff, AlertCircle, Search } from 'lucide-react'; import { useQuery } from '@tanstack/react-query'; import { isPast, isToday, parseISO } from 'date-fns'; import api from '@/lib/api'; import type { Reminder } from '@/types'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card, CardContent } from '@/components/ui/card'; import { ListSkeleton } from '@/components/ui/skeleton'; import ReminderList from './ReminderList'; import ReminderForm from './ReminderForm'; const statusFilters = [ { value: 'active', label: 'Active' }, { value: 'dismissed', label: 'Dismissed' }, { value: 'all', label: 'All' }, ] as const; type StatusFilter = (typeof statusFilters)[number]['value']; export default function RemindersPage() { const [showForm, setShowForm] = useState(false); const [editingReminder, setEditingReminder] = useState(null); const [filter, setFilter] = useState('active'); const [search, setSearch] = useState(''); const { data: reminders = [], isLoading } = useQuery({ queryKey: ['reminders'], queryFn: async () => { const { data } = await api.get('/reminders'); return data; }, }); const filteredReminders = useMemo( () => reminders.filter((r) => { if (filter === 'active' && r.is_dismissed) return false; if (filter === 'dismissed' && !r.is_dismissed) return false; if (search && !r.title.toLowerCase().includes(search.toLowerCase())) return false; return true; }), [reminders, filter, search] ); const activeCount = reminders.filter((r) => !r.is_dismissed).length; const overdueCount = reminders.filter( (r) => !r.is_dismissed && r.remind_at && isPast(parseISO(r.remind_at)) && !isToday(parseISO(r.remind_at)) ).length; const dismissedCount = reminders.filter((r) => r.is_dismissed).length; const handleEdit = (reminder: Reminder) => { setEditingReminder(reminder); setShowForm(true); }; const handleCloseForm = () => { setShowForm(false); setEditingReminder(null); }; return (
{/* Header */}

Reminders

{statusFilters.map((sf) => ( ))}
setSearch(e.target.value)} className="w-52 h-8 pl-8 text-sm" />
{/* Summary stats */} {!isLoading && reminders.length > 0 && (

Active

{activeCount}

Overdue

{overdueCount}

Dismissed

{dismissedCount}

)} {isLoading ? ( ) : ( setShowForm(true)} /> )}
{showForm && }
); }