From 38bce21ac34ff1f8c0d343061b034536aaf1662c Mon Sep 17 00:00:00 2001 From: Kyle Pope Date: Tue, 24 Feb 2026 03:24:40 +0800 Subject: [PATCH] Polish toast actions and extend delete confirm timeout - Toast: snooze/dismiss buttons side-by-side on the right, dismiss uses X icon, snooze shows clock icon + 'Snooze' label - SnoozeDropdown trigger now shows text label alongside icon - Delete confirm 'Sure?' lingers 4 seconds instead of 2 Co-Authored-By: Claude Opus 4.6 --- .../src/components/reminders/ReminderItem.tsx | 2 +- .../components/reminders/SnoozeDropdown.tsx | 3 +- frontend/src/components/todos/TodoItem.tsx | 2 +- frontend/src/hooks/useAlerts.tsx | 32 +++++++++---------- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/frontend/src/components/reminders/ReminderItem.tsx b/frontend/src/components/reminders/ReminderItem.tsx index dac840f..960bd06 100644 --- a/frontend/src/components/reminders/ReminderItem.tsx +++ b/frontend/src/components/reminders/ReminderItem.tsx @@ -70,7 +70,7 @@ export default function ReminderItem({ reminder, onEdit }: ReminderItemProps) { const handleDelete = () => { if (!confirmingDelete) { setConfirmingDelete(true); - setTimeout(() => setConfirmingDelete(false), 2000); + setTimeout(() => setConfirmingDelete(false), 4000); return; } deleteMutation.mutate(); diff --git a/frontend/src/components/reminders/SnoozeDropdown.tsx b/frontend/src/components/reminders/SnoozeDropdown.tsx index 7817a56..abe470d 100644 --- a/frontend/src/components/reminders/SnoozeDropdown.tsx +++ b/frontend/src/components/reminders/SnoozeDropdown.tsx @@ -32,9 +32,10 @@ export default function SnoozeDropdown({ onSnooze, label }: SnoozeDropdownProps) {open && (
diff --git a/frontend/src/components/todos/TodoItem.tsx b/frontend/src/components/todos/TodoItem.tsx index bccdcf8..ff5a635 100644 --- a/frontend/src/components/todos/TodoItem.tsx +++ b/frontend/src/components/todos/TodoItem.tsx @@ -77,7 +77,7 @@ export default function TodoItem({ todo, onEdit }: TodoItemProps) { if (!confirmingDelete) { setConfirmingDelete(true); // Auto-reset after 2 seconds if not confirmed - setTimeout(() => setConfirmingDelete(false), 2000); + setTimeout(() => setConfirmingDelete(false), 4000); return; } deleteMutation.mutate(); diff --git a/frontend/src/hooks/useAlerts.tsx b/frontend/src/hooks/useAlerts.tsx index a2d0b40..b98262e 100644 --- a/frontend/src/hooks/useAlerts.tsx +++ b/frontend/src/hooks/useAlerts.tsx @@ -2,7 +2,7 @@ import { createContext, useContext, useRef, useEffect, useCallback, type ReactNo import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useLocation } from 'react-router-dom'; import { toast } from 'sonner'; -import { Bell } from 'lucide-react'; +import { Bell, X } from 'lucide-react'; import api from '@/lib/api'; import { getRelativeTime, toLocalDatetime } from '@/lib/date-utils'; import SnoozeDropdown from '@/components/reminders/SnoozeDropdown'; @@ -98,26 +98,26 @@ export function AlertsProvider({ children }: { children: ReactNode }) { function renderToast(_t: string | number, reminder: Reminder) { const timeAgo = reminder.remind_at ? getRelativeTime(reminder.remind_at) : ''; return ( -
-
+
+

{reminder.title}

{timeAgo}

-
- snoozeRef.current(reminder.id, m)} - label={reminder.title} - /> - -
+
+
+ snoozeRef.current(reminder.id, m)} + label={reminder.title} + /> +
);