This commit is contained in:
Vladimir Dubovik 2025-03-13 10:44:28 +03:00
parent 15fbe5895c
commit 9bfd85ec3d
8 changed files with 244 additions and 188 deletions

View File

@ -50,9 +50,6 @@ struct ContentView: View {
} }
print("\(group1) - \(group2) - \(group3)") print("\(group1) - \(group2) - \(group3)")
vm.fetchWeekSchedule() vm.fetchWeekSchedule()
if let vpkStr = UserDefaults.standard.string(forKey: "vpk") {
vm.fetchWeekVPK(vpk: vpkStr)
}
} }
} }
} }

View File

@ -13,7 +13,7 @@ struct FavGroupsView: View {
var secondFavGroup = (UserDefaults.standard.string(forKey: "group2") ?? "") var secondFavGroup = (UserDefaults.standard.string(forKey: "group2") ?? "")
var thirdFavGroup = (UserDefaults.standard.string(forKey: "group3") ?? "") var thirdFavGroup = (UserDefaults.standard.string(forKey: "group3") ?? "")
var body: some View { var body: some View {
VStack { VStack (spacing: 0) {
List { List {
if firstFavGroup != "" { if firstFavGroup != "" {
HStack { HStack {
@ -70,20 +70,27 @@ struct FavGroupsView: View {
} }
} }
} }
if firstFavGroup == "" || secondFavGroup == "" || thirdFavGroup == "" { .frame(maxHeight: 400)
NavigationLink(destination: SelectingGroupView(vm: vm, firstFavGroup: firstFavGroup, secondFavGroup: secondFavGroup, thirdFavGroup: thirdFavGroup)) {
HStack { Spacer()
Image(systemName: "plus")
.foregroundColor(.white) HStack {
.font(.system(size: 22)) Spacer()
.padding(EdgeInsets(top: 15, leading: 130, bottom: 15, trailing: 130)) if firstFavGroup == "" || secondFavGroup == "" || thirdFavGroup == "" {
} NavigationLink(destination: SelectingGroupView(vm: vm, firstFavGroup: firstFavGroup, secondFavGroup: secondFavGroup, thirdFavGroup: thirdFavGroup)) {
.padding(.horizontal) HStack {
.background(Color("blueColor")) Image(systemName: "plus")
.cornerRadius(10) .foregroundColor(.white)
.padding(.bottom, 40) .font(.system(size: 22))
.padding(EdgeInsets(top: 12, leading: 12, bottom: 12, trailing: 12))
}
.background(Color("blueColor"))
.cornerRadius(10)
.padding(.trailing, 20)
}
} }
} }
.padding(.bottom, 50)
} }
.background(Color("background")) .background(Color("background"))
} }

View File

@ -0,0 +1,102 @@
//
// FavGroupsView.swift
// Schedule ICTIS
//
// Created by G412 on 05.03.2025.
//
import SwiftUI
struct FavVPKView: View {
@ObservedObject var vm: ScheduleViewModel
var firstFavVPK = (UserDefaults.standard.string(forKey: "vpk1") ?? "")
var secondFavVPK = (UserDefaults.standard.string(forKey: "vpk2") ?? "")
var thirdFavVPK = (UserDefaults.standard.string(forKey: "vpk3") ?? "")
var body: some View {
VStack (spacing: 0) {
List {
if firstFavVPK != "" {
HStack {
Text(firstFavVPK)
.font(.custom("Montserrat-Medium", fixedSize: 17))
Spacer()
}
.background(Color.white)
.cornerRadius(10)
.swipeActions(edge: .trailing) {
Button(role: .destructive) {
UserDefaults.standard.set("", forKey: "vpk1")
vm.updateArrayOfGroups()
vm.fetchWeekSchedule()
} label: {
Label("Удалить", systemImage: "trash")
}
}
}
if secondFavVPK != "" {
HStack {
Text(secondFavVPK)
.font(.custom("Montserrat-Medium", fixedSize: 17))
Spacer()
}
.background(Color.white)
.cornerRadius(10)
.swipeActions(edge: .trailing) {
Button(role: .destructive) {
UserDefaults.standard.set("", forKey: "vpk2")
vm.updateArrayOfGroups()
vm.fetchWeekSchedule()
} label: {
Label("Удалить", systemImage: "trash")
}
}
}
if thirdFavVPK != "" {
HStack {
Text(thirdFavVPK)
.font(.custom("Montserrat-Medium", fixedSize: 17))
Spacer()
}
.background(Color.white)
.cornerRadius(10)
.swipeActions(edge: .trailing) {
Button(role: .destructive) {
UserDefaults.standard.set("", forKey: "vpk3")
vm.updateArrayOfGroups()
vm.fetchWeekSchedule()
} label: {
Label("Удалить", systemImage: "trash")
}
}
}
}
.frame(maxHeight: 400)
Spacer()
HStack {
Spacer()
if firstFavVPK == "" || secondFavVPK == "" || thirdFavVPK == "" {
NavigationLink(destination: SelectingVPKView(vm: vm, firstFavVPK: firstFavVPK, secondFavVPK: secondFavVPK, thirdFavVPK: thirdFavVPK)) {
HStack {
Image(systemName: "plus")
.foregroundColor(.white)
.font(.system(size: 22))
.padding(EdgeInsets(top: 12, leading: 12, bottom: 12, trailing: 12))
}
.background(Color("blueColor"))
.cornerRadius(10)
.padding(.trailing, 20)
}
}
}
.padding(.bottom, 50)
}
.background(Color("background"))
}
}
#Preview {
@Previewable @StateObject var vm = ScheduleViewModel()
FavVPKView(vm: vm)
}

View File

@ -27,7 +27,7 @@ struct ScheduleGroupSettings: View {
.foregroundColor(Color("customGray1")) .foregroundColor(Color("customGray1"))
.frame(height: 1) .frame(height: 1)
.padding(.horizontal) .padding(.horizontal)
NavigationLink(destination: SelectingVPKView(vm: vm)) { NavigationLink(destination: FavVPKView(vm: vm)) {
HStack { HStack {
Text("ВПК") Text("ВПК")
.font(.custom("Montserrat-Medium", fixedSize: 17)) .font(.custom("Montserrat-Medium", fixedSize: 17))

View File

@ -47,10 +47,8 @@ struct SelectingGroupView: View {
vm.fetchWeekSchedule(isOtherWeek: false) vm.fetchWeekSchedule(isOtherWeek: false)
self.isLoading = true self.isLoading = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.isLoading = false
if vm.errorInNetwork == .noError { if vm.errorInNetwork == .noError {
vm.errorInNetwork = nil vm.errorInNetwork = nil
print("Зашел")
if firstFavGroup == "" { if firstFavGroup == "" {
UserDefaults.standard.set(text, forKey: "group") UserDefaults.standard.set(text, forKey: "group")
} else if secondFavGroup == "" { } else if secondFavGroup == "" {
@ -58,7 +56,9 @@ struct SelectingGroupView: View {
} else { } else {
UserDefaults.standard.set(text, forKey: "group3") UserDefaults.standard.set(text, forKey: "group3")
} }
vm.nameGroups.append(text) vm.updateArrayOfGroups()
vm.fetchWeekSchedule()
self.isLoading = false
self.text = "" self.text = ""
dismiss() dismiss()
} }

View File

@ -1,5 +1,5 @@
// //
// SelectedVPKView.swift // SelectedGroupView.swift
// Schedule ICTIS // Schedule ICTIS
// //
// Created by Mironov Egor on 30.01.2025. // Created by Mironov Egor on 30.01.2025.
@ -15,143 +15,132 @@ struct SelectingVPKView: View {
@State private var isLoading = false @State private var isLoading = false
@State private var searchTask: DispatchWorkItem? @State private var searchTask: DispatchWorkItem?
@StateObject private var serchGroupsVM = SearchGroupsViewModel() @StateObject private var serchGroupsVM = SearchGroupsViewModel()
@AppStorage("vpk") private var favVPK = "" var firstFavVPK: String
var secondFavVPK: String
var thirdFavVPK: String
var body: some View { var body: some View {
NavigationView { VStack {
VStack { HStack (spacing: 0) {
HStack (spacing: 0) { Image(systemName: "magnifyingglass")
Image(systemName: "magnifyingglass") .foregroundColor(Color.gray)
.foregroundColor(Color.gray) .padding(.leading, 12)
.padding(.leading, 12) .padding(.trailing, 7)
.padding(.trailing, 7) TextField("Поиск ВПК", text: $text)
TextField("Поиск ВПК", text: $text) .disableAutocorrection(true)
.disableAutocorrection(true) .focused($isFocused)
.focused($isFocused) .onChange(of: text) { oldValue, newValue in
.onChange(of: text) { oldValue, newValue in searchTask?.cancel()
searchTask?.cancel() let task = DispatchWorkItem {
let task = DispatchWorkItem { if !text.isEmpty {
if !text.isEmpty { serchGroupsVM.fetchGroups(group: text)
serchGroupsVM.fetchGroups(group: text) }
else {
serchGroupsVM.fetchGroups(group: "ВПК")
}
}
searchTask = task
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: task)
}
.onSubmit {
self.isFocused = false
if (!text.isEmpty) {
vm.fetchWeekSchedule(isOtherWeek: false)
self.isLoading = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
if vm.errorInNetwork == .noError {
vm.errorInNetwork = nil
if firstFavVPK == "" {
UserDefaults.standard.set(text, forKey: "vpk1")
} else if secondFavVPK == "" {
UserDefaults.standard.set(text, forKey: "vpk2")
} else {
UserDefaults.standard.set(text, forKey: "vpk3")
}
vm.updateArrayOfGroups()
vm.fetchWeekSchedule()
self.isLoading = false
self.text = ""
print("✅ - Избранный ВПК был установлен")
dismiss()
} }
else { else {
serchGroupsVM.fetchGroups(group: "впк") vm.isShowingAlertForIncorrectGroup = true
} vm.errorInNetwork = .invalidResponse
}
searchTask = task
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: task)
}
.onSubmit {
self.isFocused = false
if (!text.isEmpty) {
vm.fetchWeekVPK(vpk: UserDefaults.standard.string(forKey: "vpk"))
self.isLoading = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.isLoading = false
if vm.errorInNetwork == .noError {
vm.errorInNetwork = nil
print("Зашел")
UserDefaults.standard.set(text, forKey: "vpk")
//vm.group = text
self.text = ""
dismiss()
}
else {
vm.isShowingAlertForIncorrectGroup = true
vm.errorInNetwork = .invalidResponse
}
} }
} }
} }
.submitLabel(.done)
if isFocused {
Button {
self.text = ""
self.isFocused = false
} label: {
Image(systemName: "xmark.circle.fill")
.padding(.trailing, 20)
.offset(x: 10)
.foregroundColor(.gray)
.background(
)
}
} }
} .submitLabel(.done)
.frame(height: 40)
.background(
RoundedRectangle(cornerRadius: 15)
.fill(.white)
)
Spacer()
if isLoading {
LoadingView(isLoading: $isLoading)
}
if isFocused { if isFocused {
ScrollView(.vertical, showsIndicators: true) { Button {
ForEach(serchGroupsVM.groups) { item in self.text = ""
if item.name.starts(with: "ВП") || item.name.starts(with: "мВ") { self.isFocused = false
VStack { } label: {
Rectangle() Image(systemName: "xmark.circle.fill")
.frame(height: 1) .padding(.trailing, 20)
.foregroundColor(Color("customGray1")) .offset(x: 10)
.padding(.horizontal, 10) .foregroundColor(.gray)
HStack { .background(
Text(item.name) )
.foregroundColor(.black) }
.font(.custom("Montserrat-SemiBold", fixedSize: 15)) }
Spacer() }
} .frame(height: 40)
.background(
RoundedRectangle(cornerRadius: 15)
.fill(.white)
)
Spacer()
if isLoading {
LoadingView(isLoading: $isLoading)
}
if isFocused {
ScrollView(.vertical, showsIndicators: true) {
ForEach(serchGroupsVM.groups) { item in
if item.name.starts(with: "ВПК") {
VStack {
Rectangle()
.frame(height: 1)
.foregroundColor(Color("customGray1"))
.padding(.horizontal, 10) .padding(.horizontal, 10)
.padding(.top, 2) HStack {
.padding(.bottom, 2) Text(item.name)
.frame(width: UIScreen.main.bounds.width, height: 30) .foregroundColor(.black)
.background(Color("background")) .font(.custom("Montserrat-SemiBold", fixedSize: 15))
.onTapGesture { Spacer()
UserDefaults.standard.set(item.name, forKey: "vpk") }
vm.vpk = item.name .padding(.horizontal, 10)
vm.fetchWeekVPK(vpk: item.name) .padding(.top, 2)
dismiss() .padding(.bottom, 2)
.frame(width: UIScreen.main.bounds.width, height: 30)
.background(Color("background"))
.onTapGesture {
if firstFavVPK == "" {
UserDefaults.standard.set(item.name, forKey: "vpk1")
} else if secondFavVPK == "" {
UserDefaults.standard.set(item.name, forKey: "vpk2")
} else {
UserDefaults.standard.set(item.name, forKey: "vpk3")
} }
vm.updateArrayOfGroups()
vm.fetchWeekSchedule()
dismiss()
} }
} }
} }
} }
} }
if !isFocused {
if favVPK != "" {
Button {
UserDefaults.standard.removeObject(forKey: "vpk")
vm.vpks.removeAll()
vm.vpk = ""
vm.vpkHTML = ""
dismiss()
} label: {
HStack {
Spacer()
Image(systemName: "trash")
Text("Удалить ВПК")
.font(.custom("Montserrat-Medium", fixedSize: 17))
Spacer()
}
.frame(height: 40)
.background(Color.white)
.foregroundColor(Color.red)
.cornerRadius(10)
.padding(.bottom, 50)
}
}
}
} }
.padding(.horizontal, 10)
.background(Color("background"))
} }
.padding(.horizontal, 10)
.background(Color("background"))
.onAppear { .onAppear {
serchGroupsVM.fetchGroups(group: "впк") serchGroupsVM.fetchGroups(group: "ВПК")
} }
} }
} }
#Preview { #Preview {
@Previewable @StateObject var vm = ScheduleViewModel() @Previewable @StateObject var vm = ScheduleViewModel()
SelectingVPKView(vm: vm) SelectingVPKView(vm: vm, firstFavVPK: "", secondFavVPK: "", thirdFavVPK: "")
} }

View File

@ -206,9 +206,6 @@ extension WeekViewForWeek {
if !vm.nameGroups.isEmpty { if !vm.nameGroups.isEmpty {
vm.fetchWeekSchedule(isOtherWeek: true) vm.fetchWeekSchedule(isOtherWeek: true)
} }
if UserDefaults.standard.string(forKey: "vpk") != nil {
vm.fetchWeekVPK(isOtherWeek: true, vpk: UserDefaults.standard.string(forKey: "vpk"))
}
weekSlider.append(lastDate.createNextWeek()) weekSlider.append(lastDate.createNextWeek())
weekSlider.removeFirst() weekSlider.removeFirst()
currentWeekIndex = weekSlider.count - 2 currentWeekIndex = weekSlider.count - 2
@ -296,9 +293,6 @@ extension MonthTabView {
if !vm.nameGroups.isEmpty { if !vm.nameGroups.isEmpty {
vm.fetchWeekSchedule(isOtherWeek: true) vm.fetchWeekSchedule(isOtherWeek: true)
} }
if let vpkStr = UserDefaults.standard.string(forKey: "vpk") {
vm.fetchWeekVPK(vpk: vpkStr)
}
} }
if let lastDate = monthSlider[currentMonthIndex].last?.week[6].date, if let lastDate = monthSlider[currentMonthIndex].last?.week[6].date,
@ -312,9 +306,6 @@ extension MonthTabView {
if !vm.nameGroups.isEmpty { if !vm.nameGroups.isEmpty {
vm.fetchWeekSchedule(isOtherWeek: true) vm.fetchWeekSchedule(isOtherWeek: true)
} }
if let vpkStr = UserDefaults.standard.string(forKey: "vpk") {
vm.fetchWeekVPK(vpk: vpkStr)
}
} }
} }
} }

View File

@ -80,7 +80,6 @@ final class ScheduleViewModel: ObservableObject {
let numberHTML = schedule.table.group let numberHTML = schedule.table.group
self.numbersNTMLGroups.append(numberHTML) self.numbersNTMLGroups.append(numberHTML)
let table = schedule.table.table let table = schedule.table.table
let nameOfGroup = schedule.table.name
self.week = schedule.table.week self.week = schedule.table.week
// Преобразуем данные в формат ClassInfo // Преобразуем данные в формат ClassInfo
@ -123,47 +122,6 @@ final class ScheduleViewModel: ObservableObject {
} }
} }
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 updateSelectedDayIndex() { func updateSelectedDayIndex() {
switch selectedDay.format("E") { switch selectedDay.format("E") {
case "Пн": case "Пн":
@ -218,6 +176,9 @@ final class ScheduleViewModel: ObservableObject {
let group1 = UserDefaults.standard.string(forKey: "group") let group1 = UserDefaults.standard.string(forKey: "group")
let group2 = UserDefaults.standard.string(forKey: "group2") let group2 = UserDefaults.standard.string(forKey: "group2")
let group3 = UserDefaults.standard.string(forKey: "group3") let group3 = UserDefaults.standard.string(forKey: "group3")
let vpk1 = UserDefaults.standard.string(forKey: "vpk1")
let vpk2 = UserDefaults.standard.string(forKey: "vpk2")
let vpk3 = UserDefaults.standard.string(forKey: "vpk3")
if let nameGroup1 = group1, nameGroup1 != "" { if let nameGroup1 = group1, nameGroup1 != "" {
self.nameGroups.append(nameGroup1) self.nameGroups.append(nameGroup1)
} }
@ -227,5 +188,14 @@ final class ScheduleViewModel: ObservableObject {
if let nameGroup3 = group3, nameGroup3 != "" { if let nameGroup3 = group3, nameGroup3 != "" {
self.nameGroups.append(nameGroup3) self.nameGroups.append(nameGroup3)
} }
if let nameVPK1 = vpk1, nameVPK1 != "" {
self.nameGroups.append(nameVPK1)
}
if let nameVPK2 = vpk2, nameVPK2 != "" {
self.nameGroups.append(nameVPK2)
}
if let nameVPK3 = vpk3, nameVPK3 != "" {
self.nameGroups.append(nameVPK3)
}
} }
} }