From 6d55b5ca3976bb14d67b2aac038a2b991fea85b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Ruaudel?= Date: Mon, 17 Feb 2025 21:10:35 +0100 Subject: [PATCH] [Building Sync-ups Tutorial] fixes in "Navigating to sync-up detail" chapter (#3581) * Update CardView to use foregroundStyle instead of deprecated foregroundColor * Update SyncUps tutorial code to use Array with shared collection in ForEach * refactor: update shared SyncUp and path handling to fix compilation errors - Encapsulate `sharedSyncUp` with `Shared`. - Update path manipulation to use case-based access. - Update `syncUps` list with locking mechanism. * Update Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation.tutorial --------- Co-authored-by: Stephen Celis --- .../SyncUpDetailNavigation-03-code-0001-previous.swift | 2 +- .../SyncUpDetailNavigation-03-code-0001.swift | 2 +- .../SyncUpDetailNavigation-03-code-0002.swift | 2 +- .../SyncUpDetailNavigation-03-code-0003.swift | 4 ++-- .../SyncUpDetailNavigation-03-code-0004.swift | 2 +- .../SyncUpDetailNavigation.tutorial | 8 ++++++-- .../TestingNavigation-01-code-0005.swift | 2 +- .../TestingNavigation-01-code-0006.swift | 4 ++-- .../TestingNavigation-01-code-0007.swift | 6 +++--- .../TestingNavigation-01-code-0008.swift | 6 +++--- 10 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0001-previous.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0001-previous.swift index 083dacd56ed5..58942ba8858c 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0001-previous.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0001-previous.swift @@ -66,7 +66,7 @@ struct CardView: View { .font(.caption) } .padding() - .foregroundColor(syncUp.theme.accentColor) + .foregroundStyle(syncUp.theme.accentColor) } } diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0001.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0001.swift index d3eaf4815562..20fa2e71334e 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0001.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0001.swift @@ -66,7 +66,7 @@ struct CardView: View { .font(.caption) } .padding() - .foregroundColor(syncUp.theme.accentColor) + .foregroundStyle(syncUp.theme.accentColor) } } diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0002.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0002.swift index 7bbecd9beb37..e05760e08eed 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0002.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0002.swift @@ -66,7 +66,7 @@ struct CardView: View { .font(.caption) } .padding() - .foregroundColor(syncUp.theme.accentColor) + .foregroundStyle(syncUp.theme.accentColor) } } diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0003.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0003.swift index c9230fd31cfd..bb5138979990 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0003.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0003.swift @@ -11,7 +11,7 @@ struct SyncUpsListView: View { var body: some View { List { - ForEach(store.$syncUps) { $syncUp in + ForEach(Array(store.$syncUps)) { $syncUp in NavigationLink( state: AppFeature.Path.State.detail(SyncUpDetail.State(syncUp: <#Shared#>)) ) { @@ -66,7 +66,7 @@ struct CardView: View { .font(.caption) } .padding() - .foregroundColor(syncUp.theme.accentColor) + .foregroundStyle(syncUp.theme.accentColor) } } diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0004.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0004.swift index cf897f2f41a6..ed8d64d70405 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0004.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation-03-code-0004.swift @@ -66,7 +66,7 @@ struct CardView: View { .font(.caption) } .padding() - .foregroundColor(syncUp.theme.accentColor) + .foregroundStyle(syncUp.theme.accentColor) } } diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation.tutorial b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation.tutorial index 96a5b757017b..3adf6fe801c8 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation.tutorial +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/SyncUpDetailNavigation.tutorial @@ -238,8 +238,12 @@ element in the collection. @Step { - Pass the shared collection to the `ForEach` to derive a `Shared` for each element in - the `Shared>`. + Convert the shared collection of sync-ups into a collection of shared sync-ups and pass it + along to `ForEach`. + + > Tip: While we use an `Array` initializer to do this conversion, it is possible to use any range + > replaceable collection. + @Code(name: "SyncUpsList.swift", file: SyncUpDetailNavigation-03-code-0003.swift) } diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0005.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0005.swift index cc56ffcf996a..cdec5c99cf64 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0005.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0005.swift @@ -14,7 +14,7 @@ struct AppFeatureTests { AppFeature() } - let sharedSyncUp = try #require($syncUps[id: syncUp.id]) + let sharedSyncUp = try #require(Shared($syncUps[id: syncUp.id])) await store.send(\.path.push, (id: 0, .detail(SyncUpDetail.State(syncUp: sharedSyncUp)))) { $0.path[id: 0] = .detail(SyncUpDetail.State(syncUp: sharedSyncUp)) diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0006.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0006.swift index 10b7a6d749b2..9ae1af7fcbd5 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0006.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0006.swift @@ -14,14 +14,14 @@ struct AppFeatureTests { AppFeature() } - let sharedSyncUp = try #require($syncUps[id: syncUp.id]) + let sharedSyncUp = try #require(Shared($syncUps[id: syncUp.id])) await store.send(\.path.push, (id: 0, .detail(SyncUpDetail.State(syncUp: sharedSyncUp)))) { $0.path[id: 0] = .detail(SyncUpDetail.State(syncUp: sharedSyncUp)) } await store.send(\.path[id:0].detail.deleteButtonTapped) { - $0.path[id: 0]?.detail?.destination = .alert(.deleteSyncUp) + $0.path[id: 0, case: \.detail]?.destination = .alert(.deleteSyncUp) } } } diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0007.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0007.swift index 4a9b75c4d61d..44b07a7f70b0 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0007.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0007.swift @@ -14,19 +14,19 @@ struct AppFeatureTests { AppFeature() } - let sharedSyncUp = try #require($syncUps[id: syncUp.id]) + let sharedSyncUp = try #require(Shared($syncUps[id: syncUp.id])) await store.send(\.path.push, (id: 0, .detail(SyncUpDetail.State(syncUp: sharedSyncUp)))) { $0.path[id: 0] = .detail(SyncUpDetail.State(syncUp: sharedSyncUp)) } await store.send(\.path[id:0].detail.deleteButtonTapped) { - $0.path[id: 0]?.detail?.destination = .alert(.deleteSyncUp) + $0.path[id: 0, case: \.detail]?.destination = .alert(.deleteSyncUp) } await store.send(\.path[id:0].detail.destination.alert.confirmButtonTapped) { $0.path[id: 0, case: \.detail]?.destination = nil - $0.syncUpsList.syncUps = [] + $0.syncUpsList.$syncUps.withLock { $0 = [] } } } } diff --git a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0008.swift b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0008.swift index b3c53765f33c..13f6e6311436 100644 --- a/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0008.swift +++ b/Sources/ComposableArchitecture/Documentation.docc/Tutorials/BuildingSyncUps/07-SyncUpDetailNavigation/TestingNavigation-01-code-0008.swift @@ -14,19 +14,19 @@ struct AppFeatureTests { AppFeature() } - let sharedSyncUp = try #require($syncUps[id: syncUp.id]) + let sharedSyncUp = try #require(Shared($syncUps[id: syncUp.id])) await store.send(\.path.push, (id: 0, .detail(SyncUpDetail.State(syncUp: sharedSyncUp)))) { $0.path[id: 0] = .detail(SyncUpDetail.State(syncUp: sharedSyncUp)) } await store.send(\.path[id:0].detail.deleteButtonTapped) { - $0.path[id: 0]?.detail?.destination = .alert(.deleteSyncUp) + $0.path[id: 0, case: \.detail]?.destination = .alert(.deleteSyncUp) } await store.send(\.path[id:0].detail.destination.alert.confirmButtonTapped) { $0.path[id: 0, case: \.detail]?.destination = nil - $0.syncUpsList.syncUps = [] + $0.syncUpsList.$syncUps.withLock { $0 = [] } } await store.receive(\.path.popFrom) {