Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
105a55f
wip
stephencelis Jan 9, 2026
3969174
wip
stephencelis Jan 9, 2026
03a6ff3
wip
stephencelis Jan 9, 2026
bef7064
wip
stephencelis Jan 9, 2026
a6cc565
wip
stephencelis Jan 9, 2026
c8ce17d
Better support for sharing in previews.
mbrandonw Jan 9, 2026
c847dfd
wip
mbrandonw Jan 9, 2026
2b2deaf
wip
mbrandonw Jan 9, 2026
f3c7375
wip
mbrandonw Jan 9, 2026
3d15e5e
clean up
mbrandonw Jan 9, 2026
3b686f1
wip
mbrandonw Jan 9, 2026
7ae4728
clean up
mbrandonw Jan 9, 2026
0066e5d
Trying out database pool for previews.
mbrandonw Jan 9, 2026
e673c67
wip
mbrandonw Jan 10, 2026
82f0724
Merge remote-tracking branch 'origin/main' into better-preview-sharing
mbrandonw Jan 10, 2026
c04f60f
wip
mbrandonw Jan 10, 2026
253d3ae
clean up
mbrandonw Jan 10, 2026
044368f
clean up
mbrandonw Jan 10, 2026
1165fb8
reformat
mbrandonw Jan 10, 2026
9d49470
cancel timer when stopping sync engine
mbrandonw Jan 10, 2026
8ed34cd
clean up
mbrandonw Jan 10, 2026
8f556ee
wip
mbrandonw Jan 10, 2026
ca01d18
wip
mbrandonw Jan 10, 2026
eae64d1
wip
mbrandonw Jan 11, 2026
ba92711
clean up
mbrandonw Jan 11, 2026
22b98c7
wip
mbrandonw Jan 11, 2026
5df94bb
fixes
mbrandonw Jan 11, 2026
090dd74
fix
mbrandonw Jan 11, 2026
43727d5
wip
mbrandonw Jan 11, 2026
6d5e42b
wip
mbrandonw Jan 11, 2026
48b8f42
Revert "fix"
mbrandonw Jan 11, 2026
89941f7
Revert "wip"
mbrandonw Jan 11, 2026
84a476d
Revert "wip"
mbrandonw Jan 11, 2026
87a7876
modernize previews
mbrandonw Jan 12, 2026
4478fbf
wip
stephencelis Jan 12, 2026
226b2ca
lock isolated
mbrandonw Jan 12, 2026
175d3ca
wip
mbrandonw Jan 12, 2026
8cacfbe
wiup
mbrandonw Jan 12, 2026
2a81955
clean up
mbrandonw Jan 13, 2026
640a8fa
Merge remote-tracking branch 'origin/main' into better-preview-sharing
mbrandonw Jan 13, 2026
9a567a4
Fix merge conflicts.
mbrandonw Jan 13, 2026
22d4400
Merge remote-tracking branch 'origin/main' into better-preview-sharing
stephencelis Jan 13, 2026
5616370
wip
stephencelis Jan 13, 2026
9a6a61e
format
stephencelis Jan 13, 2026
8be0439
wip
mbrandonw Jan 13, 2026
93d5124
wip
stephencelis Jan 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
name: macOS
strategy:
matrix:
xcode: ['26.1']
xcode: ['26.2']
config: ['debug', 'release']
runs-on: macos-26
steps:
Expand All @@ -28,7 +28,7 @@ jobs:
name: Examples
strategy:
matrix:
xcode: ['26.1']
xcode: ['26.2']
config: ['debug']
scheme: ['Reminders', 'CaseStudies', 'SyncUps']
runs-on: macos-26
Expand Down
46 changes: 33 additions & 13 deletions Examples/CloudKitDemo/CountersListFeature.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,27 @@ import SQLiteData
import SwiftUI

struct CountersListView: View {
@FetchAll var counters: [Counter]
@FetchAll(
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the CloudKitDemo to show an icon next to counters that are shared. We can now explore that functionality in previews thanks to the changes in this PR.

Counter
.leftJoin(SyncMetadata.all) { $0.syncMetadataID.eq($1.id) }
.select {
Row.Columns(counter: $0, isShared: $1.isShared.ifnull(false))
}
) var rows
@Dependency(\.defaultDatabase) var database
@Dependency(\.defaultSyncEngine) var syncEngine

@Selection struct Row {
let counter: Counter
let isShared: Bool
}

var body: some View {
List {
if !counters.isEmpty {
if !rows.isEmpty {
Section {
ForEach(counters) { counter in
CounterRow(counter: counter)
ForEach(rows, id: \.counter.id) { row in
CounterRow(row: row)
.buttonStyle(.borderless)
}
.onDelete { indexSet in
Expand All @@ -24,10 +36,14 @@ struct CountersListView: View {
.toolbar {
ToolbarItem(placement: .primaryAction) {
Button("Add") {
withErrorReporting {
try database.write { db in
try Counter.insert { Counter.Draft() }
Task {
withErrorReporting {
try database.write { db in
try Counter.insert {
Counter.Draft()
}
.execute(db)
}
}
}
}
Expand All @@ -39,7 +55,7 @@ struct CountersListView: View {
withErrorReporting {
try database.write { db in
for index in indexSet {
try Counter.find(counters[index].id).delete()
try Counter.find(rows[index].counter.id).delete()
.execute(db)
}
}
Expand All @@ -48,15 +64,18 @@ struct CountersListView: View {
}

struct CounterRow: View {
let counter: Counter
let row: CountersListView.Row
@State var sharedRecord: SharedRecord?
@Dependency(\.defaultDatabase) var database
@Dependency(\.defaultSyncEngine) var syncEngine

var body: some View {
VStack {
HStack {
Text("\(counter.count)")
if row.isShared {
Image(systemName: "network")
}
Text("\(row.counter.count)")
Button("-") {
decrementButtonTapped()
}
Expand All @@ -78,7 +97,7 @@ struct CounterRow: View {

func shareButtonTapped() {
Task {
sharedRecord = try await syncEngine.share(record: counter) { share in
sharedRecord = try await syncEngine.share(record: row.counter) { share in
share[CKShare.SystemFieldKey.title] = "Join my counter!"
}
}
Expand All @@ -87,7 +106,7 @@ struct CounterRow: View {
func decrementButtonTapped() {
withErrorReporting {
try database.write { db in
try Counter.find(counter.id).update {
try Counter.find(row.counter.id).update {
$0.count -= 1
}
.execute(db)
Expand All @@ -98,7 +117,7 @@ struct CounterRow: View {
func incrementButtonTapped() {
withErrorReporting {
try database.write { db in
try Counter.find(counter.id).update {
try Counter.find(row.counter.id).update {
$0.count += 1
}
.execute(db)
Expand All @@ -110,6 +129,7 @@ struct CounterRow: View {
#Preview {
let _ = try! prepareDependencies {
try $0.bootstrapDatabase()
try? $0.defaultDatabase.seedSampleData()
}
NavigationStack {
CountersListView()
Expand Down
13 changes: 13 additions & 0 deletions Examples/CloudKitDemo/Schema.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,16 @@ extension DependencyValues {
}

private let logger = Logger(subsystem: "CloudKitDemo", category: "Database")

#if DEBUG
extension DatabaseWriter {
func seedSampleData() throws {
try write { db in
try db.seed {
Counter.Draft(count: 24)
Counter.Draft(count: 1729)
}
}
}
}
#endif

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Examples/Reminders/RemindersDetail.swift
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class RemindersDetailModel: HashableObject {

private func updateQuery() async {
await withErrorReporting {
try await $reminderRows.load(remindersQuery, animation: .default)
_ = try await $reminderRows.load(remindersQuery, animation: .default)
}
}

Expand Down
7 changes: 3 additions & 4 deletions Examples/Reminders/RemindersLists.swift
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,7 @@ class RemindersListsModel {
#if DEBUG
func seedDatabaseButtonTapped() {
withErrorReporting {
try database.write { db in
try db.seedSampleData()
}
try database.seedSampleData()
}
}
#endif
Expand Down Expand Up @@ -437,7 +435,8 @@ private struct ReminderGridCell: View {

#Preview {
let _ = try! prepareDependencies {
$0.defaultDatabase = try Reminders.appDatabase()
try $0.bootstrapDatabase()
try? $0.defaultDatabase.seedSampleData()
}
NavigationStack {
RemindersListsView(model: RemindersListsModel())
Expand Down
Loading