11import CloudKit
22import SQLiteData
33import SwiftUI
4- import SwiftUINavigation
54
65struct CountersListView : View {
7- @FetchAll var counters : [ Counter ]
6+ @FetchAll (
7+ Counter
8+ . leftJoin ( SyncMetadata . all) { $0. syncMetadataID. eq ( $1. id) }
9+ . select {
10+ Row . Columns ( counter: $0, isShared: $1. isShared. ifnull ( false ) )
11+ }
12+ ) var rows
813 @Dependency ( \. defaultDatabase) var database
14+ @Dependency ( \. defaultSyncEngine) var syncEngine
15+
16+ @Selection struct Row {
17+ let counter : Counter
18+ let isShared : Bool
19+ }
920
1021 var body : some View {
1122 List {
12- if !counters . isEmpty {
23+ if !rows . isEmpty {
1324 Section {
14- ForEach ( counters ) { counter in
15- CounterRow ( counter : counter )
25+ ForEach ( rows , id : \ . counter . id ) { row in
26+ CounterRow ( row : row )
1627 . buttonStyle ( . borderless)
1728 }
1829 . onDelete { indexSet in
@@ -25,10 +36,14 @@ struct CountersListView: View {
2536 . toolbar {
2637 ToolbarItem ( placement: . primaryAction) {
2738 Button ( " Add " ) {
28- withErrorReporting {
29- try database. write { db in
30- try Counter . insert { Counter . Draft ( ) }
39+ Task {
40+ withErrorReporting {
41+ try database. write { db in
42+ try Counter . insert {
43+ Counter . Draft ( )
44+ }
3145 . execute ( db)
46+ }
3247 }
3348 }
3449 }
@@ -40,7 +55,7 @@ struct CountersListView: View {
4055 withErrorReporting {
4156 try database. write { db in
4257 for index in indexSet {
43- try Counter . find ( counters [ index] . id) . delete ( )
58+ try Counter . find ( rows [ index] . counter . id) . delete ( )
4459 . execute ( db)
4560 }
4661 }
@@ -49,15 +64,18 @@ struct CountersListView: View {
4964}
5065
5166struct CounterRow : View {
52- let counter : Counter
67+ let row : CountersListView . Row
5368 @State var sharedRecord : SharedRecord ?
5469 @Dependency ( \. defaultDatabase) var database
5570 @Dependency ( \. defaultSyncEngine) var syncEngine
5671
5772 var body : some View {
5873 VStack {
5974 HStack {
60- Text ( " \( counter. count) " )
75+ if row. isShared {
76+ Image ( systemName: " network " )
77+ }
78+ Text ( " \( row. counter. count) " )
6179 Button ( " - " ) {
6280 decrementButtonTapped ( )
6381 }
@@ -79,7 +97,7 @@ struct CounterRow: View {
7997
8098 func shareButtonTapped( ) {
8199 Task {
82- sharedRecord = try await syncEngine. share ( record: counter) { share in
100+ sharedRecord = try await syncEngine. share ( record: row . counter) { share in
83101 share [ CKShare . SystemFieldKey. title] = " Join my counter! "
84102 }
85103 }
@@ -88,7 +106,7 @@ struct CounterRow: View {
88106 func decrementButtonTapped( ) {
89107 withErrorReporting {
90108 try database. write { db in
91- try Counter . find ( counter. id) . update {
109+ try Counter . find ( row . counter. id) . update {
92110 $0. count -= 1
93111 }
94112 . execute ( db)
@@ -99,11 +117,21 @@ struct CounterRow: View {
99117 func incrementButtonTapped( ) {
100118 withErrorReporting {
101119 try database. write { db in
102- try Counter . find ( counter. id) . update {
120+ try Counter . find ( row . counter. id) . update {
103121 $0. count += 1
104122 }
105123 . execute ( db)
106124 }
107125 }
108126 }
109127}
128+
129+ #Preview {
130+ let _ = try ! prepareDependencies {
131+ try $0. bootstrapDatabase ( )
132+ try ? $0. defaultDatabase. seedSampleData ( )
133+ }
134+ NavigationStack {
135+ CountersListView ( )
136+ }
137+ }
0 commit comments