Skip to content

Commit 5cabe1f

Browse files
authored
Only trigger new fetch if the relevant count changes (#2657)
1 parent ebc1366 commit 5cabe1f

File tree

2 files changed

+52
-9
lines changed

2 files changed

+52
-9
lines changed

Library/ViewModels/BackerDashboardProjectsViewModel.swift

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,24 @@ public final class BackerDashboardProjectsViewModel: BackerDashboardProjectsView
5252
let projectsTypeAndSort = self.configureWithProjectsTypeAndSortProperty.signal.skipNil()
5353
let projectsType = projectsTypeAndSort.map(first)
5454

55-
let userUpdatedProjectsCount = Signal.merge(
55+
let userUpdated = Signal.merge(
5656
self.viewDidAppearProperty.signal.ignoreValues(),
5757
self.currentUserUpdatedProperty.signal
5858
)
59-
.map { _ -> (Int, Int) in
60-
(
61-
AppEnvironment.current.currentUser?.stats.backedProjectsCount ?? 0,
62-
AppEnvironment.current.currentUser?.stats.starredProjectsCount ?? 0
63-
)
64-
}
65-
.skipRepeats { $0 == $1 }
59+
60+
let userUpdatedProjectCount = projectsType.takeWhen(userUpdated)
61+
.map { type -> Int in
62+
switch type {
63+
case .backed: return AppEnvironment.current.currentUser?.stats.backedProjectsCount ?? 0
64+
case .saved: return AppEnvironment.current.currentUser?.stats.starredProjectsCount ?? 0
65+
}
66+
}
67+
.skipRepeats { $0 == $1 }
6668

6769
let requestFirstPageWith = projectsType
6870
.takeWhen(
6971
Signal.merge(
70-
userUpdatedProjectsCount.ignoreValues(),
72+
userUpdatedProjectCount.ignoreValues(),
7173
self.refreshProperty.signal
7274
)
7375
)

Library/ViewModels/BackerDashboardProjectsViewModelTests.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,45 @@ internal final class BackerDashboardProjectsViewModelTests: TestCase {
171171
)
172172
}
173173
}
174+
175+
func testRefresh() {
176+
let projects = (1...3).map { .template |> Project.lens.id .~ $0 }
177+
let env = FetchProjectsEnvelope(type: .backed, projects: projects, hasNextPage: true, totalCount: 5)
178+
let user = User.template
179+
180+
withEnvironment(apiService: MockService(fetchBackerBackedProjectsResponse: env), currentUser: user) {
181+
self.vm.inputs.configureWith(projectsType: .backed, sort: .endingSoon)
182+
self.vm.inputs.viewDidAppear(false)
183+
self.vm.inputs.currentUserUpdated()
184+
185+
self.isRefreshing.assertLastValue(true)
186+
187+
// Load all projects to end refreshing.
188+
self.scheduler.advance()
189+
self.isRefreshing.assertLastValue(false)
190+
191+
// Test that updating the saved projects count doesn't trigger re-fetching backed projects.
192+
let userSavedCountChanged = user |> \.stats.starredProjectsCount .~ 3
193+
withEnvironment(
194+
apiService: MockService(fetchBackerBackedProjectsResponse: env),
195+
currentUser: userSavedCountChanged
196+
) {
197+
self.vm.inputs.viewDidAppear(true)
198+
self.isRefreshing.assertLastValue(false)
199+
}
200+
201+
// Test that updating the backed projects count triggers re-fetching backed projects.
202+
let userBackedCountChanged = userSavedCountChanged |> \.stats.backedProjectsCount .~ 1
203+
withEnvironment(
204+
apiService: MockService(fetchBackerBackedProjectsResponse: env),
205+
currentUser: userBackedCountChanged
206+
) {
207+
self.vm.inputs.viewDidAppear(true)
208+
self.isRefreshing.assertLastValue(true)
209+
210+
self.scheduler.advance()
211+
self.isRefreshing.assertLastValue(false)
212+
}
213+
}
214+
}
174215
}

0 commit comments

Comments
 (0)