TeachMate/TeachMate/Preview Content/PreviewData.swift

292 lines
11 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// PreviewData.swift
// TeachMate
//
// Created by Hongli on 2025/3/18.
//
import SwiftUI
import SwiftData
///
@MainActor
enum PreviewData {
// MARK: -
/// 2025
static let currentSemesterStartDate = Calendar.current.date(from: DateComponents(year: 2025, month: 2, day: 24))!
///
static let currentSemesterEndDate = Calendar.current.date(byAdding: .day, value: 18 * 7, to: currentSemesterStartDate)!
/// 2024
static let previousSemesterStartDate = Calendar.current.date(from: DateComponents(year: 2024, month: 9, day: 1))!
///
static let previousSemesterEndDate = Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 15))!
// MARK: -
///
static let courseColors = [
"#D6EAF8", //
"#FADBD8", //
"#D5F5E3", // 绿
"#FCF3CF", //
"#F5EEF8", //
"#EAEDED", //
"#FDEBD0" //
]
// MARK: -
///
static let courseNames = [
"高等数学", "线性代数", "程序设计", "数据结构",
"计算机网络", "操作系统", "软件工程", "数据库原理",
"计算机组成原理", "编译原理", "人工智能", "机器学习",
"离散数学", "概率论与数理统计", "算法设计与分析"
]
///
static let locations = [
"教学楼A-101", "教学楼A-102", "教学楼A-201", "教学楼A-202",
"教学楼B-101", "教学楼B-102", "教学楼B-201", "教学楼B-202",
"实验楼C-301", "实验楼C-302", "实验楼C-303", "实验楼C-304",
"图书馆-多媒体教室", "综合楼-报告厅", "科技楼-机房"
]
///
static let classes = [
"云计算G23-1", "软件G22-3", "软件G22-4", "软件工程2班",
"网络工程1班", "人工智能1班", "数据科学1班", "信息安全1班"
]
// MARK: -
/// ModelContainer
static func createContainer() -> ModelContainer {
let container = try! ModelContainer(for: Semester.self, CourseModel.self, ClassSession.self,
configurations: ModelConfiguration(isStoredInMemoryOnly: true))
//
let currentSemester = Semester(
title: "2024-2025-2",
startDate: currentSemesterStartDate,
endDate: currentSemesterEndDate,
weeksCount: 18,
isCurrent: true
)
let previousSemester = Semester(
title: "2024-2025-1",
startDate: previousSemesterStartDate,
endDate: previousSemesterEndDate,
weeksCount: 18
)
container.mainContext.insert(currentSemester)
container.mainContext.insert(previousSemester)
//
let course1 = CourseModel(name: courseNames[0], colorHex: courseColors[0])
course1.semester = currentSemester
course1.addSession(weekday: 1, timeSlot: 1, location: locations[0], schoolClass: classes[0])
course1.addSession(weekday: 3, timeSlot: 2, location: locations[0], schoolClass: classes[0])
let course2 = CourseModel(name: courseNames[1], colorHex: courseColors[1])
course2.semester = currentSemester
course2.addSession(weekday: 2, timeSlot: 3, location: locations[4], schoolClass: classes[0])
let course3 = CourseModel(name: courseNames[2], colorHex: courseColors[2], isNew: true)
course3.semester = currentSemester
course3.addSession(weekday: 4, timeSlot: 4, location: locations[8], schoolClass: classes[0])
course3.addSession(weekday: 5, timeSlot: 5, location: locations[8], schoolClass: classes[0])
let course4 = CourseModel(name: courseNames[3], colorHex: courseColors[3])
course4.semester = previousSemester
course4.addSession(weekday: 1, timeSlot: 2, location: locations[1], schoolClass: classes[0])
//
let course5 = CourseModel(name: courseNames[4], colorHex: courseColors[4])
course5.semester = currentSemester
course5.addSession(weekday: 2, timeSlot: 1, location: locations[5], schoolClass: classes[1])
let course6 = CourseModel(name: courseNames[5], colorHex: courseColors[5])
course6.semester = currentSemester
course6.addSession(weekday: 3, timeSlot: 3, location: locations[9], schoolClass: classes[1])
course6.addSession(weekday: 5, timeSlot: 4, location: locations[9], schoolClass: classes[1])
container.mainContext.insert(course1)
container.mainContext.insert(course2)
container.mainContext.insert(course3)
container.mainContext.insert(course4)
container.mainContext.insert(course5)
container.mainContext.insert(course6)
return container
}
///
static func createEmptyContainer() -> ModelContainer {
return try! ModelContainer(for: Semester.self, CourseModel.self, ClassSession.self,
configurations: ModelConfiguration(isStoredInMemoryOnly: true))
}
///
static func createLargeDataContainer() -> ModelContainer {
let container = try! ModelContainer(for: Semester.self, CourseModel.self, ClassSession.self,
configurations: ModelConfiguration(isStoredInMemoryOnly: true))
//
let oldStartDate1 = Calendar.current.date(byAdding: .year, value: -2, to: currentSemesterStartDate)!
let oldEndDate1 = Calendar.current.date(byAdding: .day, value: 18 * 7, to: oldStartDate1)!
let oldStartDate2 = Calendar.current.date(byAdding: .year, value: -1, to: currentSemesterStartDate)!
let oldEndDate2 = Calendar.current.date(byAdding: .day, value: 18 * 7, to: oldStartDate2)!
let prevEndDate = Calendar.current.date(byAdding: .day, value: 18 * 7, to: previousSemesterStartDate)!
let semesters = [
Semester(title: "2023-2024-1", startDate: oldStartDate1, endDate: oldEndDate1, weeksCount: 18),
Semester(title: "2023-2024-2", startDate: oldStartDate2, endDate: oldEndDate2, weeksCount: 18),
Semester(title: "2024-2025-1", startDate: previousSemesterStartDate, endDate: prevEndDate, weeksCount: 18),
Semester(title: "2024-2025-2", startDate: currentSemesterStartDate, endDate: currentSemesterEndDate, weeksCount: 18, isCurrent: true)
]
for semester in semesters {
container.mainContext.insert(semester)
}
//
for semester in semesters {
for i in 0..<10 {
let courseIndex = i % courseNames.count
let colorIndex = i % courseColors.count
let course = CourseModel(name: courseNames[courseIndex], colorHex: courseColors[colorIndex])
course.semester = semester
// 1-3
let sessionCount = (i % 3) + 1
for j in 0..<sessionCount {
let weekday = (j % 5) + 1
let timeSlot = (j % 5) + 1
let locationIndex = (i + j) % locations.count
let classIndex = i % classes.count
course.addSession(
weekday: weekday,
timeSlot: timeSlot,
location: locations[locationIndex],
schoolClass: classes[classIndex]
)
}
container.mainContext.insert(course)
}
}
return container
}
// MARK: -
/// ContentView
static func createSemesterContainer() -> ModelContainer {
let config = ModelConfiguration(isStoredInMemoryOnly: true)
let container = try! ModelContainer(for: Semester.self, configurations: config)
//
let currentSemester = Semester(
title: "2024-2025-2",
startDate: currentSemesterStartDate,
endDate: currentSemesterEndDate,
weeksCount: 18,
isCurrent: true
)
let previousSemester = Semester(
title: "2024-2025-1",
startDate: previousSemesterStartDate,
endDate: previousSemesterEndDate,
weeksCount: 18,
isCurrent: false
)
container.mainContext.insert(currentSemester)
container.mainContext.insert(previousSemester)
return container
}
// MARK: -
///
static func createSampleSemester() -> Semester {
return Semester(
title: "2024-2025-2",
startDate: currentSemesterStartDate,
endDate: currentSemesterEndDate,
weeksCount: 18,
isCurrent: true
)
}
///
static func createSampleCourse() -> CourseModel {
let course = CourseModel(name: courseNames[0], colorHex: courseColors[0])
course.addSession(weekday: 1, timeSlot: 1, location: locations[0], schoolClass: classes[0])
course.addSession(weekday: 3, timeSlot: 2, location: locations[0], schoolClass: classes[0])
return course
}
///
static func createSampleSession() -> ClassSession {
let session = ClassSession(
weekday: 1,
timeSlot: 1,
location: locations[0],
schoolClass: classes[0]
)
//
let course = createSampleCourse()
session.course = course
return session
}
// MARK: -
///
static func randomCourseColor() -> String {
return courseColors.randomElement() ?? courseColors[0]
}
///
static func randomCourseName() -> String {
return courseNames.randomElement() ?? courseNames[0]
}
///
static func randomLocation() -> String {
return locations.randomElement() ?? locations[0]
}
///
static func randomClass() -> String {
return classes.randomElement() ?? classes[0]
}
// MARK: -
///
static func standardPreviewStyle<Content: View>(_ content: Content) -> some View {
content
.padding()
.background(Color.white) // 使
}
}