Fix: invited members now see shared tasks immediately on join

Product bug: when a user joined a shared residence, the residence appeared but
its tasks (created by the owner) did not show in the Tasks tab until a manual
refresh. Root cause was client-side — APILayer.joinWithCode updated the
residence cache (addResidence) but never refreshed the tasks cache, and the
optimistic addResidence suppressed getMyResidences' count-based task
invalidation, so allTasks stayed a stale pre-join snapshot. The backend was
correct (task list query already joins residence_residence_users).

- APILayer.joinWithCode: call getTasks(forceRefresh = true) on success
  (mirrors bulkCreateTasks) so the joined residence's tasks load immediately.
- ResidenceViewModel: corrected an inaccurate comment about join-time refresh.
- SharingUITests.test03: un-quarantined — now passes (verified against live stack).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Trey T
2026-06-06 09:17:20 -05:00
parent a3b684744b
commit 73a60c886d
3 changed files with 8 additions and 15 deletions
@@ -154,19 +154,7 @@ final class SharingUITests: AuthenticatedUITestCase {
// MARK: - Test 03: Shared Tasks Visible in UI
/// Known issue: After joining a shared residence, the Tasks tab doesn't show
/// the shared tasks. The AllTasksView's residenceViewModel uses cached (empty)
/// data, which disables the refresh button and prevents task loading.
/// Fix: AllTasksView.onAppear should detect residence list changes or use
/// DataManager's already-refreshed cache.
func test03_sharedTasksVisibleInTasksTab() throws {
// Known issue: after a user joins a shared residence, that residence's
// tasks (created by the owner) do not appear in the joining user's Tasks
// tab even after force-refresh the residence itself shows, but its
// tasks aren't fetched for the joined member. Pre-existing app gap;
// skip until the shared-task fetch on join is fixed.
throw XCTSkip("App gap: joined member doesn't see the shared residence's tasks in the Tasks tab (residence shows, tasks don't).")
// Join via UI this lands on Residences tab which triggers forceRefresh
joinResidenceViaUI()