From 7828e19501b3ca8b2e86ca7297f580c659e5c9b8 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Fri, 23 Jan 2026 16:10:52 -1000 Subject: Fix bugs #24-27: calendar dedup, uncomplete tasks, planning view Bug fixes: - #24: Deduplicate calendar events across multiple calendars using summary + start time as key - #25: Change event icon from calendar to clock to avoid confusion with date display - #26: Add task uncomplete functionality via ReopenTask API for Todoist and closed=false for Trello - #27: Restructure planning view with sections for Scheduled (timed events/tasks), Today (unscheduled), Quick Add, and Upcoming (3 days) Co-Authored-By: Claude Opus 4.5 --- internal/api/google_calendar.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'internal/api/google_calendar.go') diff --git a/internal/api/google_calendar.go b/internal/api/google_calendar.go index 8dd48f0..2154351 100644 --- a/internal/api/google_calendar.go +++ b/internal/api/google_calendar.go @@ -76,15 +76,27 @@ func (c *GoogleCalendarClient) GetUpcomingEvents(ctx context.Context, maxResults } } + // Deduplicate events (same event may appear in multiple calendars) + seen := make(map[string]bool) + var uniqueEvents []models.CalendarEvent + for _, event := range allEvents { + // Use summary + start time as dedup key + key := event.Summary + event.Start.Format(time.RFC3339) + if !seen[key] { + seen[key] = true + uniqueEvents = append(uniqueEvents, event) + } + } + // Sort all events by start time - sort.Slice(allEvents, func(i, j int) bool { - return allEvents[i].Start.Before(allEvents[j].Start) + sort.Slice(uniqueEvents, func(i, j int) bool { + return uniqueEvents[i].Start.Before(uniqueEvents[j].Start) }) // Limit to maxResults - if len(allEvents) > maxResults { - allEvents = allEvents[:maxResults] + if len(uniqueEvents) > maxResults { + uniqueEvents = uniqueEvents[:maxResults] } - return allEvents, nil + return uniqueEvents, nil } -- cgit v1.2.3