11import Foundation
22import SwiftUI
33
4+ /// Defines a decoupled way to format selected dates
5+ ///
6+ protocol RangedDateTextFormatter {
7+ func format( start: Date , end: Date ) -> String
8+ }
9+
410/// View to select a custom date range.
511/// Consists of two date pickers laid out vertically.
612///
@@ -20,11 +26,19 @@ struct RangedDatePicker: View {
2026 ///
2127 @State private var endDate : Date
2228
29+ /// Type to format the subtitle range.
30+ ///
31+ private let datesFormatter : RangedDateTextFormatter
32+
2333 /// Custom `init` to provide intial start and end dates.
2434 ///
25- init ( startDate: Date ? = nil , endDate: Date ? = nil , datesSelected: ( ( _ start: Date , _ end: Date ) -> Void ) ? = nil ) {
35+ init ( startDate: Date ? = nil ,
36+ endDate: Date ? = nil ,
37+ datesFormatter: RangedDateTextFormatter ,
38+ datesSelected: ( ( _ start: Date , _ end: Date ) -> Void ) ? = nil ) {
2639 self . _startDate = State ( initialValue: startDate ?? Date ( ) )
2740 self . _endDate = State ( initialValue: endDate ?? Date ( ) )
41+ self . datesFormatter = datesFormatter
2842 self . datesSelected = datesSelected
2943 }
3044
@@ -65,8 +79,7 @@ struct RangedDatePicker: View {
6579 Text ( Localization . title)
6680 . headlineStyle ( )
6781
68- // TODO: Properly format date ranges outside the view
69- Text ( " \( DateFormatter . monthAndDayFormatter. string ( from: startDate) ) - \( DateFormatter . monthAndDayFormatter. string ( from: endDate) ) " )
82+ Text ( datesFormatter. format ( start: startDate, end: endDate) )
7083 . captionStyle ( )
7184 }
7285 }
@@ -109,7 +122,14 @@ private extension RangedDatePicker {
109122// MARK: Previews
110123
111124struct RangedDatePickerPreview : PreviewProvider {
125+
126+ private struct PreviewFormatter : RangedDateTextFormatter {
127+ func format( start: Date , end: Date ) -> String {
128+ " \( start. description) - \( end. description) "
129+ }
130+ }
131+
112132 static var previews : some View {
113- RangedDatePicker ( )
133+ RangedDatePicker ( datesFormatter : PreviewFormatter ( ) )
114134 }
115135}
0 commit comments