181 lines
6.8 KiB
Swift
181 lines
6.8 KiB
Swift
//
|
||
// ViewModel.swift
|
||
// Schedule ICTIS
|
||
//
|
||
// Created by Mironov Egor on 18.11.2024.
|
||
//
|
||
|
||
import Foundation
|
||
|
||
@MainActor
|
||
final class ScheduleViewModel: ObservableObject {
|
||
//MARK: Properties
|
||
//Schedule
|
||
@Published var weekScheduleGroup: Table = Table(
|
||
type: "",
|
||
name: "",
|
||
week: 0,
|
||
group: "",
|
||
table: [[]],
|
||
link: ""
|
||
)
|
||
@Published var selectedDay: Date = .init()
|
||
@Published var selectedIndex: Int = 1
|
||
@Published var classes: [[String]] = []
|
||
@Published var week: Int = 0
|
||
@Published var numOfGroup: String = ""
|
||
@Published var isFirstStartOffApp = true
|
||
@Published var isShowingAlertForIncorrectGroup: Bool = false
|
||
@Published var errorInNetwork: NetworkError?
|
||
@Published var isLoading: Bool = false
|
||
@Published var group: String = ""
|
||
@Published var isNewGroup: Bool = false
|
||
|
||
//Groups
|
||
@Published var groups: [Choice] = []
|
||
//VPK
|
||
@Published var vpks: [[String]] = []
|
||
@Published var vpkHTML: String = ""
|
||
@Published var vpk: String = ""
|
||
@Published var weekScheduleVPK: Table = Table(
|
||
type: "",
|
||
name: "",
|
||
week: 0,
|
||
group: "",
|
||
table: [[]],
|
||
link: ""
|
||
)
|
||
|
||
|
||
//MARK: Methods
|
||
func fetchWeekSchedule(group: String = "default", isOtherWeek: Bool = false) {
|
||
isLoading = true
|
||
Task {
|
||
do {
|
||
var schedule: Schedule
|
||
// В этот if мы заходим только если пользователь перелистывает недели и нам ИЗВЕСТНЫ номер группы(в html формате) и номер недели, которая показывается пользователю
|
||
if (isOtherWeek || !isFirstStartOffApp) && (group == "default") {
|
||
schedule = try await NetworkManager.shared.getScheduleForOtherWeek(self.week, self.numOfGroup)
|
||
}
|
||
// В else мы заходим в том случае, если НЕ знаем номер недели, которую нужно отобразить и номер группы(в html формате)
|
||
else {
|
||
print("Отладка 1")
|
||
schedule = try await NetworkManager.shared.getSchedule(group)
|
||
print("Отладка 2")
|
||
self.group = group
|
||
self.isNewGroup = true
|
||
self.selectedDay = .init()
|
||
}
|
||
self.weekScheduleGroup = schedule.table
|
||
self.week = weekScheduleGroup.week
|
||
self.numOfGroup = weekScheduleGroup.group
|
||
self.classes = weekScheduleGroup.table
|
||
self.isFirstStartOffApp = false
|
||
self.isShowingAlertForIncorrectGroup = false
|
||
self.isLoading = false
|
||
self.errorInNetwork = .noError
|
||
print("Отладка 4")
|
||
}
|
||
catch {
|
||
if let error = error as? NetworkError {
|
||
switch (error) {
|
||
case .invalidResponse:
|
||
errorInNetwork = .invalidResponse
|
||
case .invalidData:
|
||
errorInNetwork = .invalidData
|
||
self.isShowingAlertForIncorrectGroup = true
|
||
default:
|
||
print("Неизвестная ошибка: \(error)")
|
||
}
|
||
isLoading = false
|
||
print("Есть ошибка: \(error)")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
func fetchWeekVPK(isOtherWeek: Bool = false, vpk: String? = "default") {
|
||
isLoading = true
|
||
Task {
|
||
do {
|
||
var tempVPKS: Schedule
|
||
// В этот if мы заходим только если пользователь перелистывает недели и нам известы номер ВПК(в html формате) и номер недели, которая показывается пользователю
|
||
if isOtherWeek && vpk != nil {
|
||
tempVPKS = try await NetworkManager.shared.getScheduleForOtherWeek(self.week, self.vpkHTML)
|
||
}
|
||
// В else мы заходим в том случае, если не знаем номер недели, которую нужно отобразить и номер группы(в html формате)
|
||
else {
|
||
tempVPKS = try await NetworkManager.shared.getSchedule(vpk!)
|
||
self.vpk = vpk!
|
||
self.selectedDay = .init()
|
||
}
|
||
self.weekScheduleVPK = tempVPKS.table
|
||
self.vpkHTML = weekScheduleVPK.group
|
||
self.vpks = weekScheduleVPK.table
|
||
print(self.vpk)
|
||
self.isShowingAlertForIncorrectGroup = false
|
||
self.isLoading = false
|
||
self.errorInNetwork = .noError
|
||
}
|
||
catch {
|
||
if let error = error as? NetworkError {
|
||
switch (error) {
|
||
case .invalidResponse:
|
||
errorInNetwork = .invalidResponse
|
||
case .invalidData:
|
||
errorInNetwork = .invalidData
|
||
self.isShowingAlertForIncorrectGroup = true
|
||
default:
|
||
print("Неизвестная ошибка: \(error)")
|
||
}
|
||
isLoading = false
|
||
print("Есть ошибка: \(error)")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
func fetchGroups(group: String) {
|
||
Task {
|
||
do {
|
||
var groups: Welcome
|
||
groups = try await NetworkManager.shared.getGroups(group: group)
|
||
self.groups = groups.choices
|
||
|
||
}
|
||
catch {
|
||
if let error = error as? NetworkError {
|
||
switch (error) {
|
||
case .invalidData:
|
||
self.groups.removeAll()
|
||
default:
|
||
self.groups.removeAll()
|
||
print("Неизвестная ошибка: \(error)")
|
||
}
|
||
print("Есть ошибка: \(error)")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
func updateSelectedDayIndex() {
|
||
switch selectedDay.format("E") {
|
||
case "Пн":
|
||
selectedIndex = 2
|
||
case "Вт":
|
||
selectedIndex = 3
|
||
case "Ср":
|
||
selectedIndex = 4
|
||
case "Чт":
|
||
selectedIndex = 5
|
||
case "Пт":
|
||
selectedIndex = 6
|
||
case "Сб":
|
||
selectedIndex = 7
|
||
default:
|
||
selectedIndex = 8
|
||
}
|
||
}
|
||
|
||
}
|