package widgets import ( "ArinDash/apis/calendar" "ArinDash/util" "context" "fmt" "time" "github.com/mum4k/termdash/cell" "github.com/mum4k/termdash/terminal/terminalapi" "github.com/mum4k/termdash/widgetapi" "github.com/mum4k/termdash/widgets/text" ) type CalendarEventsOptions struct { } func CalendarEvents() CalendarEventsOptions { widgetOptions["CalendarEventsOptions"] = createCalendarEventsOptions return CalendarEventsOptions{} } func createCalendarEventsOptions(ctx context.Context, _ terminalapi.Terminal, _ interface{}) widgetapi.Widget { widget := util.PanicOnErrorWithResult(text.New(text.WrapAtWords())) go util.Periodic(ctx, 1*time.Hour, func() error { widget.Reset() calendarEvents := calendar.FetchEvents() for _, event := range calendarEvents { var color cell.Color onlySummary := false if isToday(event.Start) { color = cell.ColorGreen } else if event.Start.After(time.Now().AddDate(0, 0, 7)) { color = cell.ColorGray onlySummary = true } else { color = cell.ColorWhite } summary := event.Summary if onlySummary { summary = fmt.Sprintf("%s %s", event.Start.Format(time.DateOnly), event.Summary) } if err := widget.Write(fmt.Sprintf("%s %s\n", event.Icon, summary), text.WriteCellOpts(cell.FgColor(color), cell.Bold())); err != nil { return err } if !onlySummary { var date string if event.Start == event.End { date = formatDate(event.Start) } else { date = fmt.Sprintf("%s - %s", formatDate(event.Start), formatDate(event.End)) } if err := widget.Write(fmt.Sprintf("%s\n", date), text.WriteCellOpts(cell.FgColor(color), cell.Dim())); err != nil { return err } if err := widget.Write(fmt.Sprintf("%s\n", event.Description), text.WriteCellOpts(cell.FgColor(color))); err != nil { return err } if err := widget.Write(fmt.Sprintf("%s\n\n", event.Location), text.WriteCellOpts(cell.FgColor(color))); err != nil { return err } } } return nil }) return widget } func isToday(date time.Time) bool { year, month, day := date.Date() return year == time.Now().Year() && month == time.Now().Month() && day == time.Now().Day() } func isTomorrow(date time.Time) bool { year, month, day := date.Date() return year == time.Now().Year() && month == time.Now().Month() && day == time.Now().AddDate(0, 0, 1).Day() } func formatDate(date time.Time) string { if isToday(date) { return fmt.Sprintf("Today at %s", date.Format(time.TimeOnly)) } else if isTomorrow(date) { return fmt.Sprintf("Tomorrow at %s", date.Format(time.TimeOnly)) } return date.Format(time.DateTime) }