From 22a3e49379d217ef79e5557e6938c1b002592b86 Mon Sep 17 00:00:00 2001 From: Renaud Jenny Date: Sat, 31 Oct 2020 16:16:50 +0000 Subject: [PATCH] fix(Today Birthdays): handle when there is no birthday this day * Fix #334 --- .../viewModels/VillagersViewModel.swift | 16 +++++++++++----- .../todayDashboard/TodayBirthdaysSection.swift | 10 ++++++++-- .../views/villagers/VillagersListView.swift | 5 +++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/ACHNBrowserUI/ACHNBrowserUI/viewModels/VillagersViewModel.swift b/ACHNBrowserUI/ACHNBrowserUI/viewModels/VillagersViewModel.swift index 5db8ea6c..444f960e 100644 --- a/ACHNBrowserUI/ACHNBrowserUI/viewModels/VillagersViewModel.swift +++ b/ACHNBrowserUI/ACHNBrowserUI/viewModels/VillagersViewModel.swift @@ -21,6 +21,7 @@ class VillagersViewModel: ObservableObject { @Published var searchText = "" @Published var todayBirthdays: [Villager] = [] @Published var sortedVillagers: [Villager] = [] + @Published var isLoading = false // MARK: - Private properties @@ -34,25 +35,28 @@ class VillagersViewModel: ObservableObject { } private let collection: UserCollection + private let currentDate: Date private var villagersCancellable: AnyCancellable? private var today: String { let formatter = DateFormatter() formatter.dateFormat = "d/M" - return formatter.string(from: Date()) + return formatter.string(from: currentDate) } // MARK: - Life cycle - init(collection: UserCollection = .shared) { + init(collection: UserCollection = .shared, currentDate: Date) { self.collection = collection + self.currentDate = currentDate self.villagersCancellable = Publishers.CombineLatest(collection.$villagers, collection.$residents) .sink { [weak self] (villagers, residents) in self?.residents = residents self?.liked = villagers } - + + isLoading = false searchCancellable = $searchText .debounce(for: .milliseconds(300), scheduler: DispatchQueue.main) .removeDuplicates() @@ -69,8 +73,10 @@ class VillagersViewModel: ObservableObject { .map{ $0.map{ $0.1}.sorted(by: { $0.id > $1.id }) } .receive(on: DispatchQueue.main) .sink(receiveValue: { [weak self] in - self?.villagers = $0 - self?.todayBirthdays = $0.filter( { $0.birthday == self?.today }) + guard let self = self else { return } + self.villagers = $0 + self.todayBirthdays = $0.filter( { $0.birthday == self.today }) + self.isLoading = false }) } diff --git a/ACHNBrowserUI/ACHNBrowserUI/views/todayDashboard/TodayBirthdaysSection.swift b/ACHNBrowserUI/ACHNBrowserUI/views/todayDashboard/TodayBirthdaysSection.swift index b5540767..6942d0c8 100644 --- a/ACHNBrowserUI/ACHNBrowserUI/views/todayDashboard/TodayBirthdaysSection.swift +++ b/ACHNBrowserUI/ACHNBrowserUI/views/todayDashboard/TodayBirthdaysSection.swift @@ -11,7 +11,8 @@ import Backend import UI struct TodayBirthdaysSection: View { - @StateObject private var viewModel = VillagersViewModel() + @Environment(\.currentDate) private static var currentDate + @StateObject private var viewModel = VillagersViewModel(currentDate: Self.currentDate) var headerText: String { viewModel.todayBirthdays.count > 1 ? "Today's Birthdays" : "Today's Birthday" @@ -19,8 +20,13 @@ struct TodayBirthdaysSection: View { var body: some View { Group { - if viewModel.todayBirthdays.isEmpty { + if viewModel.isLoading { RowLoadingView() + } else if viewModel.todayBirthdays.isEmpty { + Text("No Birthday today...") + .font(.system(.caption, design: .rounded)) + .fontWeight(.bold) + .foregroundColor(.acText) } else { ForEach(viewModel.todayBirthdays, id: \.id) { villager in NavigationLink(destination: LazyView(VillagerDetailView(villager: villager))) { diff --git a/ACHNBrowserUI/ACHNBrowserUI/views/villagers/VillagersListView.swift b/ACHNBrowserUI/ACHNBrowserUI/views/villagers/VillagersListView.swift index 29c3e028..7618acd0 100644 --- a/ACHNBrowserUI/ACHNBrowserUI/views/villagers/VillagersListView.swift +++ b/ACHNBrowserUI/ACHNBrowserUI/views/villagers/VillagersListView.swift @@ -14,8 +14,9 @@ struct VillagersListView: View { private enum Filter: String, CaseIterable { case all, liked, residents } - - @StateObject var viewModel = VillagersViewModel() + + @Environment(\.currentDate) private static var currentDate + @StateObject var viewModel = VillagersViewModel(currentDate: Self.currentDate) @State private var currentFilter = Filter.all var currentVillagers: [Villager] {