@@ -17,23 +17,10 @@ public struct DaySectionFeature {
1717 case past
1818 case today
1919 case future
20-
21- fileprivate init ( for date: Date , now: Date , calendar: Calendar ) {
22- if calendar. isDate ( date, inSameDayAs: now) {
23- self = . today
24- } else if date < now {
25- self = . past
26- } else {
27- self = . future
28- }
29- }
3020 }
3121
3222 public var id : UUID
3323 var dayDate : DayDate
34- var title : String = " "
35- var subtitle : String ? = nil
36- var relativity : Relativity = . future
3724 var pairRows : IdentifiedArrayOf < PairRowFeature . State >
3825
3926 init (
@@ -61,40 +48,65 @@ public struct DaySectionFeature {
6148
6249 @CasePathable
6350 public enum Action {
64- case onAppear
6551 case pairRows( IdentifiedActionOf < PairRowFeature > )
6652 }
6753
68- @Dependency ( \. date. now) var now
69- @Dependency ( \. calendar) var calendar
70-
7154 public var body : some ReducerOf < Self > {
72- Reduce { state, action in
73- switch action {
74- case . onAppear:
75- switch state. dayDate {
76- case . continuousDate( let date, let weekNumber) :
77- state. title = String ( localized: " screen.schedule.day.title. \( date. formatted ( . scheduleDay) ) . \( weekNumber) " )
78- state. subtitle = Self . relativeFormatter. relativeName ( for: date, now: now)
79- state. relativity = State . Relativity ( for: date, now: now, calendar: calendar)
80- case . weekday( let weekday) :
81- state. title = weekday. localizedName ( in: calendar) . capitalized
82- state. subtitle = nil
83- state. relativity = . future
84- case . examDate( let date) :
85- state. title = date? . formatted ( . examDay) ?? " -/- "
86- state. subtitle = date. flatMap { Self . relativeFormatter. relativeName ( for: $0, now: now) }
87- state. relativity = date. map { State . Relativity ( for: $0, now: now, calendar: calendar) } ?? . future
88- }
89- return . none
90- case . pairRows:
91- return . none
92- }
93- }
55+ EmptyReducer ( )
9456 . forEach ( \. pairRows, action: \. pairRows) {
9557 PairRowFeature ( )
9658 }
9759 }
9860
61+ }
62+
63+ // MARK: - Helpers
64+
65+ extension DaySectionFeature . State . DayDate {
66+ var title : String {
67+ switch self {
68+ case . continuousDate( let date, let weekNumber) :
69+ return String ( localized: " screen.schedule.day.title. \( date. formatted ( . scheduleDay) ) . \( weekNumber) " )
70+ case . weekday( let weekday) :
71+ @Dependency ( \. calendar) var calendar
72+ return weekday. localizedName ( in: calendar) . capitalized
73+ case . examDate( let date) :
74+ return date? . formatted ( . examDay) ?? " -/- "
75+ }
76+ }
77+
78+ func subtitle( for now: Date ) -> String ? {
79+ switch self {
80+ case . continuousDate( let date, _) :
81+ Self . relativeFormatter. relativeName ( for: date, now: now)
82+ case . weekday:
83+ nil
84+ case . examDate( let date) :
85+ date. flatMap { Self . relativeFormatter. relativeName ( for: $0, now: now) }
86+ }
87+ }
88+
89+ func relativity( for now: Date ) -> DaySectionFeature . State . Relativity {
90+ switch self {
91+ case . continuousDate( let date, let weekNumber) :
92+ relativity ( for: date, now: now)
93+ case . weekday( let weekday) :
94+ . future
95+ case . examDate( let date) :
96+ date. map { relativity ( for: $0, now: now) } ?? . future
97+ }
98+ }
99+
100+ private func relativity( for date: Date , now: Date ) -> DaySectionFeature . State . Relativity {
101+ @Dependency ( \. calendar) var calendar
102+ if calendar. isDate ( date, inSameDayAs: now) {
103+ return . today
104+ } else if date < now {
105+ return . past
106+ } else {
107+ return . future
108+ }
109+ }
110+
99111 private static let relativeFormatter = RelativeDateTimeFormatter . relativeNameOnly ( )
100112}
0 commit comments