Skip to content
17 changes: 10 additions & 7 deletions Examples/Reminders/ReminderForm.swift
Original file line number Diff line number Diff line change
Expand Up @@ -204,17 +204,20 @@ extension Optional {
}

struct ReminderFormPreview: PreviewProvider {
static var previews: some View {
let (remindersList, reminder) = try! prepareDependencies {
private static var reminderDetail: (Reminder, RemindersList) = {
try! prepareDependencies {
$0.defaultDatabase = try Reminders.appDatabase()
return try $0.defaultDatabase.write { db in
try $0.defaultDatabase.seed()
return try $0.defaultDatabase.read { db in
let remindersList = try RemindersList.fetchOne(db)!
return (
remindersList,
try Reminder.where { $0.remindersListID.eq(remindersList.id) }.fetchOne(db)!
)
let reminder = try Reminder.where { $0.remindersListID.eq(remindersList.id) }.fetchOne(db)!
return (reminder, remindersList)
}
}
}()

static var previews: some View {
let (reminder, remindersList) = reminderDetail
NavigationStack {
ReminderFormView(reminder: Reminder.Draft(reminder), remindersList: remindersList)
.navigationTitle("Detail")
Expand Down
19 changes: 11 additions & 8 deletions Examples/Reminders/ReminderRow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -156,17 +156,20 @@ struct ReminderRow: View {
}

struct ReminderRowPreview: PreviewProvider {
static var previews: some View {
var reminder: Reminder!
var remindersList: RemindersList!
let _ = try! prepareDependencies {
private static var reminderDetail: (Reminder, RemindersList) = {
try! prepareDependencies {
$0.defaultDatabase = try Reminders.appDatabase()
try $0.defaultDatabase.read { db in
reminder = try Reminder.fetchOne(db)
remindersList = try RemindersList.fetchOne(db)!
try $0.defaultDatabase.seed()
return try $0.defaultDatabase.read { db in
let reminder = try Reminder.fetchOne(db)!
let remindersList = try RemindersList.where { $0.id.eq(reminder.remindersListID) }.fetchOne(db)!
return (reminder, remindersList)
}
}

}()

static var previews: some View {
let (reminder, remindersList) = reminderDetail
NavigationStack {
List {
ReminderRow(
Expand Down
9 changes: 7 additions & 2 deletions Examples/Reminders/RemindersDetail.swift
Original file line number Diff line number Diff line change
Expand Up @@ -362,21 +362,25 @@ extension RemindersDetailModel.DetailType {
}

struct RemindersDetailPreview: PreviewProvider {
static var previews: some View {
private static var detailTypes: [RemindersDetailModel.DetailType] = {
let (remindersList, tag) = try! prepareDependencies {
$0.defaultDatabase = try Reminders.appDatabase()
try $0.defaultDatabase.seed()
return try $0.defaultDatabase.read { db in
(
try RemindersList.fetchOne(db)!,
try Tag.fetchOne(db)!
)
}
}
let detailTypes: [RemindersDetailModel.DetailType] = [
return [
.all,
.remindersList(remindersList),
.tags([tag]),
]
}()

static var previews: some View {
ForEach(detailTypes, id: \.self) { detailType in
NavigationStack {
RemindersDetailView(model: RemindersDetailModel(detailType: detailType))
Expand All @@ -385,3 +389,4 @@ struct RemindersDetailPreview: PreviewProvider {
}
}
}

16 changes: 13 additions & 3 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.seed()
}
}
#endif
Expand Down Expand Up @@ -438,6 +436,18 @@ private struct ReminderGridCell: View {
#Preview {
let _ = try! prepareDependencies {
$0.defaultDatabase = try Reminders.appDatabase()
// Create a dummy SyncMetadata table to allow the RemindersLists query to work in preview mode
try $0.defaultDatabase.write { db in
try #sql("""
CREATE TABLE IF NOT EXISTS \(SyncMetadata.self) (
"recordPrimaryKey" TEXT,
"recordType" TEXT,
"share" TEXT
) STRICT
"""
)
.execute(db)
}
}
NavigationStack {
RemindersListsView(model: RemindersListsModel())
Expand Down
232 changes: 115 additions & 117 deletions Examples/Reminders/Schema.swift
Original file line number Diff line number Diff line change
Expand Up @@ -363,10 +363,6 @@ func appDatabase() throws -> any DatabaseWriter {
}
)
.execute(db)

if context != .live {
try db.seedSampleData()
}
}

return database
Expand Down Expand Up @@ -410,8 +406,8 @@ nonisolated func createDefaultRemindersList() {
nonisolated private let logger = Logger(subsystem: "Reminders", category: "Database")

#if DEBUG
extension Database {
func seedSampleData() throws {
extension DatabaseWriter {
func seed() throws {
@Dependency(\.date.now) var now
@Dependency(\.uuid) var uuid
var remindersListIDs: [UUID] = []
Expand All @@ -422,122 +418,124 @@ nonisolated private let logger = Logger(subsystem: "Reminders", category: "Datab
for _ in 0...10 {
reminderIDs.append(uuid())
}
try seed {
RemindersList(
id: remindersListIDs[0],
color: Color(red: 0x4a / 255, green: 0x99 / 255, blue: 0xef / 255),
title: "Personal"
)
RemindersList(
id: remindersListIDs[1],
color: Color(red: 0xed / 255, green: 0x89 / 255, blue: 0x35 / 255),
title: "Family"
)
RemindersList(
id: remindersListIDs[2],
color: Color(red: 0xb2 / 255, green: 0x5d / 255, blue: 0xd3 / 255),
title: "Business"
)
Reminder(
id: reminderIDs[0],
notes: "Milk\nEggs\nApples\nOatmeal\nSpinach",
remindersListID: remindersListIDs[0],
title: "Groceries"
)
Reminder(
id: reminderIDs[1],
dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2),
isFlagged: true,
remindersListID: remindersListIDs[0],
title: "Haircut"
)
Reminder(
id: reminderIDs[2],
dueDate: now,
notes: "Ask about diet",
priority: .high,
remindersListID: remindersListIDs[0],
title: "Doctor appointment"
)
Reminder(
id: reminderIDs[3],
dueDate: now.addingTimeInterval(-60 * 60 * 24 * 190),
remindersListID: remindersListIDs[0],
status: .completed,
title: "Take a walk"
)
Reminder(
id: reminderIDs[4],
dueDate: now,
remindersListID: remindersListIDs[0],
title: "Buy concert tickets"
)
Reminder(
id: reminderIDs[5],
dueDate: now.addingTimeInterval(60 * 60 * 24 * 2),
isFlagged: true,
priority: .high,
remindersListID: remindersListIDs[1],
title: "Pick up kids from school"
)
Reminder(
id: reminderIDs[6],
dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2),
priority: .low,
remindersListID: remindersListIDs[1],
status: .completed,
title: "Get laundry"
)
Reminder(
id: reminderIDs[7],
dueDate: now.addingTimeInterval(60 * 60 * 24 * 4),
priority: .high,
remindersListID: remindersListIDs[1],
status: .incomplete,
title: "Take out trash"
)
Reminder(
id: reminderIDs[8],
dueDate: now.addingTimeInterval(60 * 60 * 24 * 2),
notes: """
try write { db in
try db.seed {
RemindersList(
id: remindersListIDs[0],
color: Color(red: 0x4a / 255, green: 0x99 / 255, blue: 0xef / 255),
title: "Personal"
)
RemindersList(
id: remindersListIDs[1],
color: Color(red: 0xed / 255, green: 0x89 / 255, blue: 0x35 / 255),
title: "Family"
)
RemindersList(
id: remindersListIDs[2],
color: Color(red: 0xb2 / 255, green: 0x5d / 255, blue: 0xd3 / 255),
title: "Business"
)
Reminder(
id: reminderIDs[0],
notes: "Milk\nEggs\nApples\nOatmeal\nSpinach",
remindersListID: remindersListIDs[0],
title: "Groceries"
)
Reminder(
id: reminderIDs[1],
dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2),
isFlagged: true,
remindersListID: remindersListIDs[0],
title: "Haircut"
)
Reminder(
id: reminderIDs[2],
dueDate: now,
notes: "Ask about diet",
priority: .high,
remindersListID: remindersListIDs[0],
title: "Doctor appointment"
)
Reminder(
id: reminderIDs[3],
dueDate: now.addingTimeInterval(-60 * 60 * 24 * 190),
remindersListID: remindersListIDs[0],
status: .completed,
title: "Take a walk"
)
Reminder(
id: reminderIDs[4],
dueDate: now,
remindersListID: remindersListIDs[0],
title: "Buy concert tickets"
)
Reminder(
id: reminderIDs[5],
dueDate: now.addingTimeInterval(60 * 60 * 24 * 2),
isFlagged: true,
priority: .high,
remindersListID: remindersListIDs[1],
title: "Pick up kids from school"
)
Reminder(
id: reminderIDs[6],
dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2),
priority: .low,
remindersListID: remindersListIDs[1],
status: .completed,
title: "Get laundry"
)
Reminder(
id: reminderIDs[7],
dueDate: now.addingTimeInterval(60 * 60 * 24 * 4),
priority: .high,
remindersListID: remindersListIDs[1],
status: .incomplete,
title: "Take out trash"
)
Reminder(
id: reminderIDs[8],
dueDate: now.addingTimeInterval(60 * 60 * 24 * 2),
notes: """
Status of tax return
Expenses for next year
Changing payroll company
""",
remindersListID: remindersListIDs[2],
title: "Call accountant"
)
Reminder(
id: reminderIDs[9],
dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2),
priority: .medium,
remindersListID: remindersListIDs[2],
status: .completed,
title: "Send weekly emails"
)
Reminder(
id: reminderIDs[10],
dueDate: now.addingTimeInterval(60 * 60 * 24 * 2),
remindersListID: remindersListIDs[2],
status: .incomplete,
title: "Prepare for WWDC"
)
let tagIDs = ["car", "kids", "someday", "optional", "social", "night", "adulting"]
for tagID in tagIDs {
Tag(title: tagID)
remindersListID: remindersListIDs[2],
title: "Call accountant"
)
Reminder(
id: reminderIDs[9],
dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2),
priority: .medium,
remindersListID: remindersListIDs[2],
status: .completed,
title: "Send weekly emails"
)
Reminder(
id: reminderIDs[10],
dueDate: now.addingTimeInterval(60 * 60 * 24 * 2),
remindersListID: remindersListIDs[2],
status: .incomplete,
title: "Prepare for WWDC"
)
let tagIDs = ["car", "kids", "someday", "optional", "social", "night", "adulting"]
for tagID in tagIDs {
Tag(title: tagID)
}
ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[2])
ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[3])
ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[6])
ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[2])
ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[3])
ReminderTag.Draft(reminderID: reminderIDs[2], tagID: tagIDs[6])
ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[0])
ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[1])
ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[4])
ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[4])
ReminderTag.Draft(reminderID: reminderIDs[10], tagID: tagIDs[4])
ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[5])
}
ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[2])
ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[3])
ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[6])
ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[2])
ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[3])
ReminderTag.Draft(reminderID: reminderIDs[2], tagID: tagIDs[6])
ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[0])
ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[1])
ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[4])
ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[4])
ReminderTag.Draft(reminderID: reminderIDs[10], tagID: tagIDs[4])
ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[5])
}
}
}
Expand Down
1 change: 1 addition & 0 deletions Examples/Reminders/TagsForm.swift
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ private struct TagView: View {
@Previewable @State var tags: [Tag] = []
let _ = try! prepareDependencies {
$0.defaultDatabase = try Reminders.appDatabase()
try $0.defaultDatabase.seed()
}

TagsView(selectedTags: $tags)
Expand Down
1 change: 1 addition & 0 deletions Examples/RemindersTests/Internal.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import Testing
.dependency(\.uuid, .incrementing),
.dependencies {
try $0.bootstrapDatabase()
try $0.defaultDatabase.seed()
try await $0.defaultSyncEngine.sendChanges()
},
.snapshots(record: .failed)
Expand Down