ExpandableDatePicker.swift 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //
  2. // ExpandableDatePicker.swift
  3. // LoopKitUI
  4. //
  5. // Created by Anna Quinlan on 8/12/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. public struct ExpandableDatePicker: View {
  10. @State var dateShouldExpand = false
  11. @Binding var date: Date
  12. let placeholderText: String
  13. let pickerRange: ClosedRange<Date>
  14. @State var userDidTap: Bool = false
  15. public init (
  16. with date: Binding<Date>,
  17. pickerRange: ClosedRange<Date>? = nil,
  18. placeholderText: String = ""
  19. ) {
  20. _date = date
  21. self.placeholderText = placeholderText
  22. let today = Date()
  23. self.pickerRange = pickerRange ?? today.addingTimeInterval(-.hours(24))...today
  24. }
  25. public var body: some View {
  26. VStack(spacing: 0) {
  27. HStack {
  28. dateFieldText
  29. Spacer()
  30. }
  31. .padding()
  32. .frame(minWidth: 0, maxWidth: .infinity).onTapGesture {
  33. self.userDidTap = true
  34. // Hack to refresh binding
  35. self.date = Date(timeInterval: 0, since: self.date)
  36. self.dateShouldExpand.toggle()
  37. }
  38. if dateShouldExpand {
  39. DatePicker("", selection: $date, in: pickerRange, displayedComponents: .date)
  40. .labelsHidden()
  41. }
  42. }
  43. }
  44. private var dateFieldText: some View {
  45. if userDidTap {
  46. return Text(dateFormatter.string(from: date))
  47. // Show the placeholder text if user hasn't interacted with picker
  48. } else {
  49. return Text(placeholderText).foregroundColor(Color(UIColor.lightGray))
  50. }
  51. }
  52. private var dateFormatter: DateFormatter {
  53. let formatter = DateFormatter()
  54. formatter.dateStyle = .medium
  55. formatter.timeZone = TimeZone.current
  56. return formatter
  57. }
  58. }