clone

a terminal ui for alamo drafthouse showtimes, as movie cards or a timeline of every screen

main
showings / internal / state / dates.go
dates.go 2.1K
1package state23import (4 "sort"5 "time"67 "github.com/dami/showings/internal/models"8)910func (m *Model) computeAvailableDates() {11 dateSet := make(map[string]bool)12 for _, session := range m.data.Sessions {13 if session.Status == "ONSALE" {14 dateSet[session.BusinessDateClt] = true15 }16 }1718 m.availableDates = make([]time.Time, 0, len(dateSet))19 for dateStr := range dateSet {20 if len(dateStr) >= 10 {21 t, err := time.Parse("2006-01-02", dateStr[:10])22 if err == nil {23 m.availableDates = append(m.availableDates, t)24 }25 }26 }2728 sort.Slice(m.availableDates, func(i, j int) bool {29 return m.availableDates[i].Before(m.availableDates[j])30 })31}3233func (m *Model) setTodayFilter() {34 today := time.Now().Truncate(24 * time.Hour)35 m.selectedDate = &today36}3738func (m *Model) shiftDate(delta int) {39 if len(m.availableDates) == 0 {40 return41 }4243 if m.selectedDate == nil {44 if delta > 0 {45 m.selectedDate = &m.availableDates[0]46 } else {47 m.selectedDate = &m.availableDates[len(m.availableDates)-1]48 }49 return50 }5152 currentIdx := -153 for i, d := range m.availableDates {54 if d.Equal(*m.selectedDate) {55 currentIdx = i56 break57 }58 }5960 if currentIdx == -1 {61 // Find nearest date62 for i, d := range m.availableDates {63 if !d.Before(*m.selectedDate) {64 if delta > 0 {65 currentIdx = i66 } else if i > 0 {67 currentIdx = i - 168 } else {69 currentIdx = 070 }71 break72 }73 }74 if currentIdx == -1 {75 currentIdx = len(m.availableDates) - 176 }77 } else {78 currentIdx += delta79 }8081 if currentIdx < 0 {82 currentIdx = 083 }84 if currentIdx >= len(m.availableDates) {85 currentIdx = len(m.availableDates) - 186 }8788 m.selectedDate = &m.availableDates[currentIdx]89}9091func (m *Model) filterSessionsByDate(sessions []models.Session) []models.Session {92 if m.selectedDate == nil {93 return sessions94 }9596 var filtered []models.Session97 for _, s := range sessions {98 if len(s.BusinessDateClt) >= 10 {99 sessionDate, err := time.Parse("2006-01-02", s.BusinessDateClt[:10])100 if err == nil && sessionDate.Equal(*m.selectedDate) {101 filtered = append(filtered, s)102 }103 }104 }105 return filtered106}