Skip to content

Commit dce06cd

Browse files
[FIX] booked date hide from view if in next and previous month (#18)
1 parent 47579da commit dce06cd

File tree

6 files changed

+140
-33
lines changed

6 files changed

+140
-33
lines changed

Sources/YCalendarPicker/SwiftUI/Views/CalendarView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ extension CalendarView: View {
161161
allDates: allDates,
162162
appearance: appearance,
163163
selectedDate: selectedDate,
164-
locale: locale
164+
locale: locale,
165+
currentDate: currentDate
165166
)
166167
.onChange(of: date) { newValue in
167168
selectedDateDidChange(newValue?.dateOnly)

Sources/YCalendarPicker/SwiftUI/Views/DayView.swift

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,18 @@ struct DayView {
1717
/// horizontal and vertical padding around day view circles
1818
static let padding: CGFloat = 2
1919

20-
let appearance: CalendarPicker.Appearance
20+
let appearance: CalendarPicker.Appearance.Day
2121
let dateItem: CalendarMonthItem
2222
let locale: Locale
2323
@Binding var selectedDate: Date?
2424
}
2525

2626
extension DayView: View {
2727
var body: some View {
28-
let appearance = getDayAppearance()
29-
getDayView(appearance: appearance)
28+
getDayView()
3029
}
3130

32-
func getDayView(appearance: CalendarPicker.Appearance.Day) -> some View {
31+
func getDayView() -> some View {
3332
ZStack {
3433
TextStyleLabel(dateItem.day, typography: appearance.typography, configuration: { label in
3534
label.isUserInteractionEnabled = true
@@ -85,10 +84,6 @@ extension DayView: View {
8584

8685
return CalendarPicker.Strings.dayButtonA11yHint.localized
8786
}
88-
89-
func getDayAppearance() -> CalendarPicker.Appearance.Day {
90-
dateItem.getDayAppearance(from: appearance)
91-
}
9287
}
9388

9489
struct DayView_Previews: PreviewProvider {
@@ -107,13 +102,44 @@ struct DayView_Previews: PreviewProvider {
107102
let item4 = tomorrow.toCalendarItem(isSelected: true)
108103
let item5 = dayAfter.toCalendarItem(isBooked: true)
109104
let item6 = later.toCalendarItem(isEnabled: false)
105+
let appearance = CalendarPicker.Appearance()
110106
HStack {
111-
DayView(appearance: .default, dateItem: item1, locale: locale, selectedDate: .constant(Date()))
112-
DayView(appearance: .default, dateItem: item2, locale: locale, selectedDate: .constant(Date()))
113-
DayView(appearance: .default, dateItem: item3, locale: locale, selectedDate: .constant(Date()))
114-
DayView(appearance: .default, dateItem: item4, locale: locale, selectedDate: .constant(Date()))
115-
DayView(appearance: .default, dateItem: item5, locale: locale, selectedDate: .constant(Date()))
116-
DayView(appearance: .default, dateItem: item6, locale: locale, selectedDate: .constant(Date()))
107+
DayView(
108+
appearance: appearance.grayedDayAppearance,
109+
dateItem: item1,
110+
locale: locale,
111+
selectedDate: .constant(Date())
112+
)
113+
DayView(
114+
appearance: appearance.normalDayAppearance,
115+
dateItem: item2,
116+
locale: locale,
117+
selectedDate: .constant(Date())
118+
)
119+
DayView(
120+
appearance: appearance.todayAppearance,
121+
dateItem: item3,
122+
locale: locale,
123+
selectedDate: .constant(Date())
124+
)
125+
DayView(
126+
appearance: appearance.selectedDayAppearance,
127+
dateItem: item4,
128+
locale: locale,
129+
selectedDate: .constant(Date())
130+
)
131+
DayView(
132+
appearance: appearance.bookedDayAppearance,
133+
dateItem: item5,
134+
locale: locale,
135+
selectedDate: .constant(Date())
136+
)
137+
DayView(
138+
appearance: appearance.disabledDayAppearance,
139+
dateItem: item6,
140+
locale: locale,
141+
selectedDate: .constant(Date())
142+
)
117143
}
118144
.padding(.horizontal, 16)
119145
}

Sources/YCalendarPicker/SwiftUI/Views/DaysView.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ internal struct DaysView {
1414
var appearance: CalendarPicker.Appearance
1515
@Binding var selectedDate: Date?
1616
let locale: Locale
17+
let currentDate: Date
1718
}
1819

1920
extension DaysView: View {
@@ -33,8 +34,12 @@ extension DaysView: View {
3334
func getDay(index: Int) -> some View {
3435
var dateItem = allDates[index]
3536
dateItem.isSelected = dateItem.date == selectedDate
37+
var dayAppearance = dateItem.getDayAppearance(from: appearance)
38+
if dateItem.isBooked && !dateItem.date.isSameMonth(as: currentDate) {
39+
dayAppearance = appearance.grayedDayAppearance
40+
}
3641
let dayView = DayView(
37-
appearance: appearance,
42+
appearance: dayAppearance,
3843
dateItem: dateItem,
3944
locale: locale,
4045
selectedDate: $selectedDate
@@ -49,7 +54,8 @@ struct DaysView_Previews: PreviewProvider {
4954
allDates: Date().getAllDatesForSelectedMonth(firstWeekIndex: 0),
5055
appearance: .default,
5156
selectedDate: .constant(Date()),
52-
locale: Locale(identifier: "de_DE")
57+
locale: Locale(identifier: "de_DE"),
58+
currentDate: Date()
5359
)
5460
.padding(.horizontal, 16)
5561
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//
2+
// CalendarMonthItemAppearance.swift
3+
// YCalendarTest
4+
//
5+
// Created by Sahil Saini on 18/08/23.
6+
// Copyright © 2023 Y Media Labs. All rights reserved.
7+
//
8+
9+
import XCTest
10+
@testable import YCalendarPicker
11+
12+
final class CalendarMonthItemAppearance: XCTestCase {
13+
func testDateTextAppearanceForSelectedDate() {
14+
let sut = makeSUT(isSelected: true)
15+
XCTAssertAppearanceEqual(appearance1: sut, appearance2: .Defaults.selected)
16+
}
17+
18+
func testDateTextAppearanceForToday() {
19+
let sut = makeSUT(isToday: true)
20+
XCTAssertAppearanceEqual(appearance1: sut, appearance2: .Defaults.today)
21+
}
22+
23+
func testDateTextAppearanceForBookedDate() {
24+
let sut = makeSUT(isBooked: true)
25+
XCTAssertAppearanceEqual(appearance1: sut, appearance2: .Defaults.booked)
26+
}
27+
28+
func testDateTextAppearanceForGrayedDate() {
29+
let sut = makeSUT(isGrayedOut: true, dateToTest: Date().previousDate())
30+
XCTAssertAppearanceEqual(appearance1: sut, appearance2: .Defaults.grayed)
31+
}
32+
33+
func testDateTextAppearanceForDisabledGrayedDate() {
34+
let sut = makeSUT(isGrayedOut: true, isEnabled: false, dateToTest: Date().previousDate())
35+
XCTAssertAppearanceEqual(appearance1: sut, appearance2: .Defaults.grayed)
36+
}
37+
38+
func testDateTextAppearanceForDisabledDate() {
39+
let sut = makeSUT(isEnabled: false, dateToTest: Date().previousDate())
40+
XCTAssertAppearanceEqual(appearance1: sut, appearance2: .Defaults.disabled)
41+
}
42+
}
43+
44+
extension CalendarMonthItemAppearance {
45+
func makeSUT(
46+
isToday: Bool = false,
47+
isGrayedOut: Bool = false,
48+
isSelected: Bool = false,
49+
isEnabled: Bool = true,
50+
dateToTest: Date = Date(),
51+
isBooked: Bool = false
52+
) -> CalendarPicker.Appearance.Day {
53+
let dateItem = dateToTest.toCalendarItem(
54+
isGrayedOut: isGrayedOut,
55+
isSelected: isSelected,
56+
isEnabled: isEnabled,
57+
isBooked: isBooked
58+
)
59+
60+
return dateItem.getDayAppearance(from: .default)
61+
}
62+
63+
func XCTAssertAppearanceEqual(
64+
appearance1: CalendarPicker.Appearance.Day,
65+
appearance2: CalendarPicker.Appearance.Day
66+
) {
67+
XCTAssertTypographyEqual(appearance1.typography, appearance2.typography)
68+
XCTAssertEqual(appearance1.borderWidth, appearance2.borderWidth)
69+
XCTAssertEqual(appearance1.borderColor, appearance2.borderColor)
70+
XCTAssertEqual(appearance1.backgroundColor, appearance2.backgroundColor)
71+
XCTAssertEqual(appearance1.foregroundColor, appearance2.foregroundColor)
72+
}
73+
}

Tests/YCalendarPickerTests/SwiftUI/DayViewTests.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,36 @@ final class DayViewTests: XCTestCase {
1818
}
1919

2020
func testDateTextAppearanceForSelectedDate() {
21-
let sut = makeSUT(isSelected: true)
22-
let selectedAppearance = sut.getDayAppearance()
23-
XCTAssertAppearanceEqual(appearance1: selectedAppearance, appearance2: .Defaults.selected)
21+
let sut = makeSUT(isSelected: true, appearance: .Defaults.selected)
22+
XCTAssertAppearanceEqual(appearance1: sut.appearance, appearance2: .Defaults.selected)
2423
}
2524

2625
func testDateTextAppearanceForToday() {
27-
let sut = makeSUT()
28-
XCTAssertAppearanceEqual(appearance1: sut.getDayAppearance(), appearance2: .Defaults.today)
26+
let sut = makeSUT(appearance: .Defaults.today)
27+
XCTAssertAppearanceEqual(appearance1: sut.appearance, appearance2: .Defaults.today)
2928
}
3029

3130
func testDateTextAppearanceForCurrentMonth() {
3231
let previousDate = Date().previousDate()
33-
let sut = makeSUT(dateToTest: previousDate)
34-
XCTAssertAppearanceEqual(appearance1: sut.getDayAppearance(), appearance2: .Defaults.normal)
32+
let sut = makeSUT(dateToTest: previousDate, appearance: .Defaults.normal)
33+
XCTAssertAppearanceEqual(appearance1: sut.appearance, appearance2: .Defaults.normal)
3534
}
3635

3736
func testDateTextAppearanceForGrayOutDate() throws {
3837
let previousMonthDate = try XCTUnwrap(Calendar.current.date(byAdding: .month, value: -1, to: Date()))
39-
let sut = makeSUT(isGrayedOut: true, dateToTest: previousMonthDate)
40-
XCTAssertAppearanceEqual(appearance1: sut.getDayAppearance(), appearance2: .Defaults.grayed)
38+
let sut = makeSUT(isGrayedOut: true, dateToTest: previousMonthDate, appearance: .Defaults.grayed)
39+
XCTAssertAppearanceEqual(appearance1: sut.appearance, appearance2: .Defaults.grayed)
4140
}
4241

4342
func testDateTextAppearanceForNotEnabledDate() throws {
4443
let previousMonthDate = try XCTUnwrap(Calendar.current.date(byAdding: .month, value: -1, to: Date()))
45-
let sut = makeSUT(isEnabled: false, dateToTest: previousMonthDate)
46-
XCTAssertAppearanceEqual(appearance1: sut.getDayAppearance(), appearance2: .Defaults.disabled)
44+
let sut = makeSUT(isEnabled: false, dateToTest: previousMonthDate, appearance: .Defaults.disabled)
45+
XCTAssertAppearanceEqual(appearance1: sut.appearance, appearance2: .Defaults.disabled)
4746
}
4847

4948
func testDateTextAppearanceForBookedDates() {
50-
let sut = makeSUT(isBooked: true)
51-
XCTAssertAppearanceEqual(appearance1: sut.getDayAppearance(), appearance2: .Defaults.booked)
49+
let sut = makeSUT(isBooked: true, appearance: .Defaults.booked)
50+
XCTAssertAppearanceEqual(appearance1: sut.appearance, appearance2: .Defaults.booked)
5251
}
5352

5453
func testDateBodyPreviewisNotNil() {
@@ -93,7 +92,8 @@ private extension DayViewTests {
9392
isEnabled: Bool = true,
9493
dateToTest: Date = Date(),
9594
locale: Locale? = nil,
96-
isBooked: Bool = false
95+
isBooked: Bool = false,
96+
appearance: CalendarPicker.Appearance.Day = .Defaults.normal
9797
) -> DayView {
9898
let dateItem = dateToTest.toCalendarItem(
9999
isGrayedOut: isGrayedOut,
@@ -102,7 +102,7 @@ private extension DayViewTests {
102102
isBooked: isBooked
103103
)
104104
let sut = DayView(
105-
appearance: .default,
105+
appearance: appearance,
106106
dateItem: dateItem,
107107
locale: locale ?? Locale.current,
108108
selectedDate: .constant(Date())

Tests/YCalendarPickerTests/SwiftUI/DaysViewTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ private extension DaysViewTests {
3939
allDates: allDates,
4040
appearance: .default,
4141
selectedDate: .constant(Date()),
42-
locale: Locale.current
42+
locale: Locale.current,
43+
currentDate: Date()
4344
)
4445
XCTAssertNotNil(sut.body)
4546
return sut

0 commit comments

Comments
 (0)