From 15fbe5895cde45665581a40d957dcc841ec89a47 Mon Sep 17 00:00:00 2001 From: Vladimir Dubovik Date: Thu, 13 Mar 2025 09:24:50 +0300 Subject: [PATCH] Commit --- Schedule ICTIS/ContentView.swift | 18 +- Schedule ICTIS/Main/Views/ScheduleView.swift | 79 +------ Schedule ICTIS/Main/Views/SearchBarView.swift | 2 +- Schedule ICTIS/Model/ScheduleModel.swift | 7 + .../grayForNameGroup.colorset/Contents.json | 38 +++ Schedule ICTIS/Settings/FavGroupsView.swift | 95 ++++++++ .../Settings/ScheduleGroupSettings.swift | 10 +- .../Settings/SelectingGroupView.swift | 218 +++++++++--------- .../Settings/SelectingVPKView.swift | 11 +- Schedule ICTIS/Settings/TestingView.swift | 28 +++ .../Extensions/View+Extensions.swift | 14 +- .../ViewModel/ScheduleViewModel.swift | 165 ++++++++----- .../ViewModel/SearchGroupsViewModel.swift | 36 +++ 13 files changed, 456 insertions(+), 265 deletions(-) create mode 100644 Schedule ICTIS/Preview Content/Assets.xcassets/grayForNameGroup.colorset/Contents.json create mode 100644 Schedule ICTIS/Settings/FavGroupsView.swift create mode 100644 Schedule ICTIS/Settings/TestingView.swift create mode 100644 Schedule ICTIS/ViewModel/SearchGroupsViewModel.swift diff --git a/Schedule ICTIS/ContentView.swift b/Schedule ICTIS/ContentView.swift index 62e047c..78f6829 100644 --- a/Schedule ICTIS/ContentView.swift +++ b/Schedule ICTIS/ContentView.swift @@ -36,15 +36,23 @@ struct ContentView: View { } .accentColor(Color("blueColor")) .onAppear { - let group = UserDefaults.standard.string(forKey: "group") - if let nameGroup = group { - vm.group = nameGroup - vm.fetchWeekSchedule(group: nameGroup) + let group1 = UserDefaults.standard.string(forKey: "group") + let group2 = UserDefaults.standard.string(forKey: "group2") + let group3 = UserDefaults.standard.string(forKey: "group3") + if let nameGroup1 = group1, nameGroup1 != "" { + vm.nameGroups.append(nameGroup1) } + if let nameGroup2 = group2, nameGroup2 != "" { + vm.nameGroups.append(nameGroup2) + } + if let nameGroup3 = group3, nameGroup3 != "" { + vm.nameGroups.append(nameGroup3) + } + print("\(group1) - \(group2) - \(group3)") + vm.fetchWeekSchedule() if let vpkStr = UserDefaults.standard.string(forKey: "vpk") { vm.fetchWeekVPK(vpk: vpkStr) } - print(vm.vpks) } } } diff --git a/Schedule ICTIS/Main/Views/ScheduleView.swift b/Schedule ICTIS/Main/Views/ScheduleView.swift index c2a6bac..f918e5e 100644 --- a/Schedule ICTIS/Main/Views/ScheduleView.swift +++ b/Schedule ICTIS/Main/Views/ScheduleView.swift @@ -16,10 +16,6 @@ struct ScheduleView: View { @State private var isShowingMyPairs = false @Binding var isScrolling: Bool var provider = ClassProvider.shared - var hasLessons: Bool { - return vm.classes.indices.contains(vm.selectedIndex) && - vm.classes[vm.selectedIndex].dropFirst().contains { !$0.isEmpty } - } var hasVPK: Bool { return vm.vpks.indices.contains(vm.selectedIndex) && vm.vpks[vm.selectedIndex].dropFirst().contains { !$0.isEmpty } } @@ -32,23 +28,20 @@ struct ScheduleView: View { ZStack (alignment: .top) { ScrollView(.vertical, showsIndicators: false) { VStack (spacing: 30) { - VStack (alignment: .leading, spacing: 20 ) { - if hasLessons { - Text("Учебное расписание") - .font(.custom("Montserrat-Bold", fixedSize: 20)) - } - ForEach(vm.classes.indices, id: \.self) { index in - if index != 0 && index != 1 && index == vm.selectedIndex { - let daySchedule = vm.classes[index] // Это массив строк для дня - ForEach(daySchedule.indices.dropFirst(), id: \.self) { lessonIndex in - let lesson = daySchedule[lessonIndex] // Это строка с расписанием одной пары - if !lesson.isEmpty { + VStack (alignment: .leading, spacing: 10) { + ForEach(0.. 0 { // Пропускаем первый столбец (день и дату) + let time = table[1][timeIndex] // Время берем из второй строки + let classInfo = ClassInfo(subject: subject, group: nameOfGroup, time: time) + updatedClassesGroups[dayIndex].append(classInfo) + } + } + } + } + } else { + for groupName in nameGroups { + let schedule = try await NetworkManager.shared.getSchedule(groupName) + let numberHTML = schedule.table.group + self.numbersNTMLGroups.append(numberHTML) + let table = schedule.table.table + let nameOfGroup = schedule.table.name + self.week = schedule.table.week + + // Преобразуем данные в формат ClassInfo + for (dayIndex, day) in table[2...].enumerated() { // Пропускаем первые две строки (заголовки) + for (timeIndex, subject) in day.enumerated() { + if !subject.isEmpty && timeIndex > 0 { // Пропускаем первый столбец (день и дату) + let time = table[1][timeIndex] // Время берем из второй строки + let classInfo = ClassInfo(subject: subject, group: groupName, time: time) + updatedClassesGroups[dayIndex].append(classInfo) + } + } + } + } } - // В 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.classesGroups = updatedClassesGroups self.isFirstStartOffApp = false self.isShowingAlertForIncorrectGroup = false self.isLoading = false self.errorInNetwork = .noError - print("Отладка 4") - } - catch { + + // Сортируем по времени + self.sortClassesByTime() + } catch { if let error = error as? NetworkError { - switch (error) { + switch error { case .invalidResponse: errorInNetwork = .invalidResponse case .invalidData: @@ -135,46 +164,68 @@ final class ScheduleViewModel: ObservableObject { } } - 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 + selectedIndex = 0 case "Вт": - selectedIndex = 3 + selectedIndex = 1 case "Ср": - selectedIndex = 4 + selectedIndex = 2 case "Чт": - selectedIndex = 5 + selectedIndex = 3 case "Пт": - selectedIndex = 6 + selectedIndex = 4 case "Сб": - selectedIndex = 7 + selectedIndex = 5 default: - selectedIndex = 8 + selectedIndex = 6 } } + private func parseTime(_ timeString: String) -> Int { + // Разделяем строку по дефису и берем первую часть (время начала) + let startTimeString = timeString.components(separatedBy: "-").first ?? "" + + // Разделяем время на часы и минуты + let components = startTimeString.components(separatedBy: ":") + guard components.count == 2, + let hours = Int(components[0]), + let minutes = Int(components[1]) else { + return 0 // В случае ошибки возвращаем 0 + } + + // Преобразуем время в минуты с начала дня + return hours * 60 + minutes + } + + // Method for sorting classes by time + private func sortClassesByTime() { + // Проходим по каждому дню (подмассиву) в classesGroups + for dayIndex in 0..