Compare commits
No commits in common. "955c7d90660aac0a8729991b972fe5c0699acdb5" and "0f8dcea0a60e37e5991e36d8216a9149cdc8eabb" have entirely different histories.
955c7d9066
...
0f8dcea0a6
@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
"colors" : [
|
|
||||||
{
|
|
||||||
"color" : {
|
|
||||||
"color-space" : "srgb",
|
|
||||||
"components" : {
|
|
||||||
"alpha" : "1.000",
|
|
||||||
"blue" : "0xFF",
|
|
||||||
"green" : "0x7A",
|
|
||||||
"red" : "0x00"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"idiom" : "universal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"appearances" : [
|
|
||||||
{
|
|
||||||
"appearance" : "luminosity",
|
|
||||||
"value" : "dark"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"color" : {
|
|
||||||
"color-space" : "srgb",
|
|
||||||
"components" : {
|
|
||||||
"alpha" : "1.000",
|
|
||||||
"blue" : "0xFF",
|
|
||||||
"green" : "0xFF",
|
|
||||||
"red" : "0xFF"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
"colors" : [
|
|
||||||
{
|
|
||||||
"color" : {
|
|
||||||
"color-space" : "srgb",
|
|
||||||
"components" : {
|
|
||||||
"alpha" : "1.000",
|
|
||||||
"blue" : "0x0A",
|
|
||||||
"green" : "0x97",
|
|
||||||
"red" : "0x00"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"idiom" : "universal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"appearances" : [
|
|
||||||
{
|
|
||||||
"appearance" : "luminosity",
|
|
||||||
"value" : "dark"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"color" : {
|
|
||||||
"color-space" : "srgb",
|
|
||||||
"components" : {
|
|
||||||
"alpha" : "1.000",
|
|
||||||
"blue" : "0xFF",
|
|
||||||
"green" : "0xFF",
|
|
||||||
"red" : "0xFF"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,12 +9,11 @@ import SwiftUI
|
|||||||
|
|
||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
@State private var selectedTab: TabBarModel = .schedule
|
@State private var selectedTab: TabBarModel = .schedule
|
||||||
@StateObject var vm = ViewModel()
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack {
|
ZStack {
|
||||||
switch selectedTab {
|
switch selectedTab {
|
||||||
case .schedule:
|
case .schedule:
|
||||||
MainView(vm: vm)
|
MainView()
|
||||||
case .tasks:
|
case .tasks:
|
||||||
Text("Tasks")
|
Text("Tasks")
|
||||||
case .settings:
|
case .settings:
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
//
|
|
||||||
// FirstLaunchScheduleView.swift
|
|
||||||
// Schedule ICTIS
|
|
||||||
//
|
|
||||||
// Created by G412 on 06.12.2024.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
struct FirstLaunchScheduleView: View {
|
|
||||||
var body: some View {
|
|
||||||
VStack (alignment: .center) {
|
|
||||||
Spacer()
|
|
||||||
HStack {
|
|
||||||
Image(systemName: "pencil")
|
|
||||||
.font(.title)
|
|
||||||
Text("Введите свою группу")
|
|
||||||
.font(.system(size: 20, weight: .bold, design: .default))
|
|
||||||
}
|
|
||||||
.foregroundColor(Color("blueColor"))
|
|
||||||
Spacer()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#Preview {
|
|
||||||
FirstLaunchScheduleView()
|
|
||||||
}
|
|
@ -9,36 +9,23 @@ import SwiftUI
|
|||||||
|
|
||||||
struct MainView: View {
|
struct MainView: View {
|
||||||
@State private var searchText: String = ""
|
@State private var searchText: String = ""
|
||||||
@State private var currentDate: Date = Date()
|
@State private var currentDate: Date = .init()
|
||||||
@State private var weekSlider: [[Date.WeekDay]] = []
|
@State private var weekSlider: [[Date.WeekDay]] = []
|
||||||
@State private var currentWeekIndex: Int = 1
|
@State private var currentWeekIndex: Int = 1
|
||||||
@State private var createWeek: Bool = false
|
@State private var createWeek: Bool = false
|
||||||
@State private var isShowingMonthSlider: Bool = false
|
@State private var isShowingMonthSlider: Bool = false
|
||||||
@State private var isFirstAppearence = true
|
@StateObject var vm = ViewModel()
|
||||||
@ObservedObject var vm: ViewModel
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack {
|
||||||
SearchBarView(text: $searchText, vm: vm)
|
SearchBarView(text: $searchText, vm: vm)
|
||||||
if (vm.isFirstStartOffApp) {
|
HeaderView()
|
||||||
FirstLaunchScheduleView()
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
CurrentDateView()
|
|
||||||
ScheduleView(vm: vm)
|
ScheduleView(vm: vm)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
.alert(isPresented: $vm.isShowingAlertForIncorrectGroup, error: vm.errorInNetwork) { error in
|
|
||||||
|
|
||||||
} message: { error in
|
|
||||||
Text(error.failureReason)
|
|
||||||
}
|
|
||||||
.background(Color("background"))
|
.background(Color("background"))
|
||||||
.onAppear(perform: {
|
.onAppear(perform: {
|
||||||
currentDate = vm.selectedDay
|
|
||||||
vm.updateSelectedDayIndex(currentDate)
|
|
||||||
if weekSlider.isEmpty {
|
if weekSlider.isEmpty {
|
||||||
let currentWeek = Date().fetchWeek(vm.selectedDay)
|
let currentWeek = Date().fetchWeek()
|
||||||
|
|
||||||
if let firstDate = currentWeek.first?.date {
|
if let firstDate = currentWeek.first?.date {
|
||||||
weekSlider.append(firstDate.createPrevioustWeek())
|
weekSlider.append(firstDate.createPrevioustWeek())
|
||||||
@ -50,11 +37,12 @@ struct MainView: View {
|
|||||||
weekSlider.append(lastDate.createNextWeek())
|
weekSlider.append(lastDate.createNextWeek())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
vm.updateSelectedDayIndex(currentDate)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
func CurrentDateView() -> some View {
|
func HeaderView() -> some View {
|
||||||
VStack (alignment: .leading, spacing: 6) {
|
VStack (alignment: .leading, spacing: 6) {
|
||||||
HStack {
|
HStack {
|
||||||
VStack (alignment: .leading, spacing: 0) {
|
VStack (alignment: .leading, spacing: 0) {
|
||||||
@ -159,7 +147,6 @@ struct MainView: View {
|
|||||||
.onPreferenceChange(OffsetKey.self) { value in
|
.onPreferenceChange(OffsetKey.self) { value in
|
||||||
if value.rounded() == 15 && createWeek {
|
if value.rounded() == 15 && createWeek {
|
||||||
paginateWeek()
|
paginateWeek()
|
||||||
|
|
||||||
createWeek = false
|
createWeek = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -168,42 +155,24 @@ struct MainView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func paginateWeek() {
|
func paginateWeek() {
|
||||||
let calendar = Calendar.current
|
|
||||||
if weekSlider.indices.contains(currentWeekIndex) {
|
if weekSlider.indices.contains(currentWeekIndex) {
|
||||||
if let firstDate = weekSlider[currentWeekIndex].first?.date,
|
if let firstDate = weekSlider[currentWeekIndex].first?.date,
|
||||||
currentWeekIndex == 0 {
|
currentWeekIndex == 0 {
|
||||||
switch (vm.numOfGroup) {
|
|
||||||
case "":
|
|
||||||
vm.week -= 1
|
|
||||||
default:
|
|
||||||
vm.fetchWeekSchedule("new week", -1)
|
|
||||||
}
|
|
||||||
weekSlider.insert(firstDate.createPrevioustWeek(), at: 0)
|
weekSlider.insert(firstDate.createPrevioustWeek(), at: 0)
|
||||||
weekSlider.removeLast()
|
weekSlider.removeLast()
|
||||||
currentWeekIndex = 1
|
currentWeekIndex = 1
|
||||||
vm.selectedDay = calendar.date(byAdding: .weekOfYear, value: -1, to: vm.selectedDay) ?? Date.init()
|
|
||||||
currentDate = vm.selectedDay
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let lastDate = weekSlider[currentWeekIndex].last?.date,
|
if let lastDate = weekSlider[currentWeekIndex].last?.date,
|
||||||
currentWeekIndex == (weekSlider.count - 1) {
|
currentWeekIndex == (weekSlider.count - 1) {
|
||||||
switch (vm.numOfGroup) {
|
|
||||||
case "":
|
|
||||||
vm.week += 1
|
|
||||||
default:
|
|
||||||
vm.fetchWeekSchedule("new week", 1)
|
|
||||||
}
|
|
||||||
weekSlider.append(lastDate.createNextWeek())
|
weekSlider.append(lastDate.createNextWeek())
|
||||||
weekSlider.removeFirst()
|
weekSlider.removeFirst()
|
||||||
currentWeekIndex = weekSlider.count - 2
|
currentWeekIndex = weekSlider.count - 2
|
||||||
vm.selectedDay = calendar.date(byAdding: .weekOfYear, value: 1, to: vm.selectedDay) ?? Date.init()
|
|
||||||
currentDate = vm.selectedDay
|
|
||||||
print(currentDate)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
ContentView()
|
MainView()
|
||||||
}
|
}
|
||||||
|
@ -11,47 +11,32 @@ struct ScheduleView: View {
|
|||||||
@ObservedObject var vm: ViewModel
|
@ObservedObject var vm: ViewModel
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView(.vertical, showsIndicators: false) {
|
ScrollView(.vertical, showsIndicators: false) {
|
||||||
VStack (spacing: 20) {
|
VStack (spacing: 12) {
|
||||||
ForEach(vm.classes.indices, id: \.self) { index in
|
ForEach(vm.classes.indices, id: \.self) { index in
|
||||||
if index != 0 && index != 1 && index == vm.selectedIndex {
|
if index != 0 && index != 1 && index == vm.selectedIndex {
|
||||||
let daySchedule = vm.classes[index] // Это массив строк для дня
|
let daySchedule = vm.classes[index] // Это массив строк для дня
|
||||||
ForEach(daySchedule.indices.dropFirst(), id: \.self) { lessonIndex in
|
ForEach(daySchedule.indices.dropFirst(), id: \.self) { lessonIndex in
|
||||||
let lesson = daySchedule[lessonIndex] // Это строка с расписанием одной пары
|
let lesson = daySchedule[lessonIndex] // Это строка с расписанием одной пары
|
||||||
if !lesson.isEmpty {
|
if !lesson.isEmpty {
|
||||||
HStack(spacing: 10) {
|
HStack(spacing: 6) {
|
||||||
VStack {
|
VStack {
|
||||||
Text(convertTimeString(vm.classes[1][lessonIndex])[0])
|
Text(convertTimeString(vm.classes[1][lessonIndex])[0])
|
||||||
.font(.system(size: 15, weight: .regular))
|
.font(.system(size: 15, weight: .light))
|
||||||
Text(convertTimeString(vm.classes[1][lessonIndex])[1])
|
Text(convertTimeString(vm.classes[1][lessonIndex])[1])
|
||||||
.font(.system(size: 15, weight: .regular))
|
.font(.system(size: 15, weight: .light))
|
||||||
}
|
}
|
||||||
.padding(.top, 7)
|
|
||||||
.padding(.bottom, 7)
|
|
||||||
.padding(.leading, 10)
|
|
||||||
Rectangle()
|
Rectangle()
|
||||||
.frame(width: 2)
|
.frame(width: 2)
|
||||||
.frame(maxHeight: UIScreen.main.bounds.height - 18)
|
.frame(maxHeight: 100)
|
||||||
.padding(.top, 7)
|
|
||||||
.padding(.bottom, 7)
|
|
||||||
.foregroundColor(onlineOrOffline(lesson) ? Color("greenForOffline") : Color("blueForOnline"))
|
|
||||||
Text(lesson)
|
Text(lesson)
|
||||||
.font(.system(size: 18, weight: .regular))
|
|
||||||
.padding(.top, 7)
|
|
||||||
.padding(.bottom, 7)
|
|
||||||
Spacer()
|
|
||||||
}
|
}
|
||||||
.frame(maxWidth: UIScreen.main.bounds.width - 40, maxHeight: 230)
|
|
||||||
.background(Color.white)
|
.background(Color.white)
|
||||||
.cornerRadius(20)
|
.padding(.horizontal)
|
||||||
.shadow(color: .black.opacity(0.25), radius: 4, x: 4, y: 4)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(width: UIScreen.main.bounds.width)
|
|
||||||
.padding(.bottom, 100)
|
|
||||||
.padding(.top, 10)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,17 +48,8 @@ struct ScheduleView: View {
|
|||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func onlineOrOffline(_ str: String) -> Bool {
|
|
||||||
if (MockData.onlineClasses.contains(str)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
ContentView()
|
MainView()
|
||||||
}
|
}
|
||||||
|
@ -22,14 +22,13 @@ struct SearchBarView: View {
|
|||||||
TextField("Поиск группы", text: $text)
|
TextField("Поиск группы", text: $text)
|
||||||
.disableAutocorrection(true)
|
.disableAutocorrection(true)
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
self.isEditing = true
|
isEditing = true
|
||||||
}
|
}
|
||||||
.onSubmit {
|
.onSubmit {
|
||||||
self.isEditing = false
|
isEditing = false
|
||||||
if (!text.isEmpty) {
|
if (!text.isEmpty) {
|
||||||
vm.fetchWeekSchedule(text)
|
vm.fetchWeekSchedule(text)
|
||||||
}
|
}
|
||||||
self.text = ""
|
|
||||||
}
|
}
|
||||||
.submitLabel(.search)
|
.submitLabel(.search)
|
||||||
if isEditing {
|
if isEditing {
|
||||||
@ -53,8 +52,8 @@ struct SearchBarView: View {
|
|||||||
RoundedRectangle(cornerRadius: 10)
|
RoundedRectangle(cornerRadius: 10)
|
||||||
.fill(.white)
|
.fill(.white)
|
||||||
)
|
)
|
||||||
if (!vm.isFirstStartOffApp && !vm.isShowingAlertForIncorrectGroup) {
|
|
||||||
Button {
|
Button {
|
||||||
|
|
||||||
} label: {
|
} label: {
|
||||||
ZStack {
|
ZStack {
|
||||||
Rectangle()
|
Rectangle()
|
||||||
@ -69,7 +68,6 @@ struct SearchBarView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
.padding(.top, 5)
|
.padding(.top, 5)
|
||||||
.frame(height: 40)
|
.frame(height: 40)
|
||||||
@ -78,5 +76,5 @@ struct SearchBarView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
ContentView()
|
MainView()
|
||||||
}
|
}
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
//
|
|
||||||
// MockData.swift
|
|
||||||
// Schedule ICTIS
|
|
||||||
//
|
|
||||||
// Created by G412 on 06.12.2024.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
|
|
||||||
struct MockData {
|
|
||||||
static let onlineClasses: [String] = [
|
|
||||||
"пр.Академический курс иностранного языка Янкаускас Е. С. LMS",
|
|
||||||
"пр.Академический курс иностранного языка Янкаускас Е. С. LMS-3",
|
|
||||||
"пр.Введение в инженерную деятельность 1 п/г Михайлова В. Д. LMS 2 п/г Романенко К. С. 3 п/г Козловский А. В. 4 п/г Компаниец В. С. 5 п/г Олейников К. А. 6 п/г Прудников В. А. 7 п/г Петров Д. А. 8 п/г Григорян К. С.",
|
|
||||||
"пр.Иностранный язык Иностранный язык LMS",
|
|
||||||
"лек.Операционные системы 1 п/г Шкурко А. Н. Г-309 АКТРУ 2 п/г Дроздов С. Н. Г-333 3 п/г Нужнов Е. В. Г-301 Operating systems(Операционные системы) 4 п/г Самойлов А. Н. LMS",
|
|
||||||
"пр.Введение в инженерную деятельность 1 п/г Плёнкин А. П. LMS-1 2 п/г Кучеров С. А. 3 п/г Шкурко А. Н. 4 п/г Механцев Б. Е.",
|
|
||||||
"лек.Операционные системы 1 п/г Шкурко А. Н. Г-309 АКТРУ 2 п/г Дроздов С. Н. Г-333 3 п/г Нужнов Е. В. Г-301 Operating systems(Операционные системы) 4 п/г Самойлов А. Н. LMS"
|
|
||||||
]
|
|
||||||
}
|
|
@ -7,35 +7,8 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
enum NetworkError: String, Error, LocalizedError {
|
enum NetworkError: String, Error {
|
||||||
case invalidUrl
|
case invalidUrl = "Invalid URL"
|
||||||
case invalidResponse
|
case invalidResponse = "Invalid response form the server"
|
||||||
case invalidData
|
case invalidData = "Data received from the server is invalid"
|
||||||
case noNetwork
|
|
||||||
|
|
||||||
var errorDescription: String? {
|
|
||||||
switch self {
|
|
||||||
case .invalidUrl:
|
|
||||||
"InvalidUrl"
|
|
||||||
case .invalidResponse:
|
|
||||||
"InvalidResponse"
|
|
||||||
case .invalidData:
|
|
||||||
"Проверьте номер группы"
|
|
||||||
case .noNetwork:
|
|
||||||
"No network connection"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var failureReason: String {
|
|
||||||
switch self {
|
|
||||||
case .invalidUrl:
|
|
||||||
"Похоже не удалось составить ссылку для api"
|
|
||||||
case .invalidResponse:
|
|
||||||
"Для этой недели расписания еще нет"
|
|
||||||
case .invalidData:
|
|
||||||
"Похоже такой группы не существует"
|
|
||||||
case .noNetwork:
|
|
||||||
"Проверьте подключение к интернету и попробуйте заново"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,15 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
final class NetworkManager {
|
final class NetworkManager {
|
||||||
//"https://webictis.sfedu.ru/schedule-api/?group=51.html&week=15"
|
|
||||||
//MARK: Properties
|
//MARK: Properties
|
||||||
static let shared = NetworkManager()
|
static let shared = NetworkManager()
|
||||||
private let decoder = JSONDecoder()
|
private let decoder = JSONDecoder()
|
||||||
private let urlForGroup = "https://webictis.sfedu.ru/schedule-api/?query="
|
private let urlForGroup = "https://webictis.sfedu.ru/schedule-api/?query="
|
||||||
private let urlForWeek = "https://webictis.sfedu.ru/schedule-api/?group="
|
private let urlForWeek = "https://webictis.sfedu.ru/schedule-api/?group=51.html&week=15"
|
||||||
|
private var groupString: String = ""
|
||||||
|
private var numOfGroup: String = ""
|
||||||
|
private var numOfWeek: String = ""
|
||||||
|
|
||||||
//MARK: Initializer
|
//MARK: Initializer
|
||||||
private init() {
|
private init() {
|
||||||
@ -21,16 +24,12 @@ final class NetworkManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//MARK: Methods
|
//MARK: Methods
|
||||||
func makeUrlForGroup(_ group: String) -> String {
|
func makeURL(_ group: String) -> String {
|
||||||
return urlForGroup + group
|
return urlForGroup + group
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeUrlForWeek(_ numOfWeek: Int, _ htmlNameOfGroup: String) -> String {
|
|
||||||
return urlForWeek + htmlNameOfGroup + "&week=" + String(numOfWeek)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSchedule(_ group: String) async throws -> Schedule {
|
func getSchedule(_ group: String) async throws -> Schedule {
|
||||||
let newUrlForGroup = makeUrlForGroup(group)
|
let newUrlForGroup = makeURL(group)
|
||||||
guard let url = URL(string: newUrlForGroup) else {throw NetworkError.invalidUrl}
|
guard let url = URL(string: newUrlForGroup) else {throw NetworkError.invalidUrl}
|
||||||
let (data, response) = try await URLSession.shared.data(from: url)
|
let (data, response) = try await URLSession.shared.data(from: url)
|
||||||
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {throw NetworkError.invalidResponse}
|
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {throw NetworkError.invalidResponse}
|
||||||
@ -42,19 +41,4 @@ final class NetworkManager {
|
|||||||
throw NetworkError.invalidData
|
throw NetworkError.invalidData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getScheduleForOtherWeek(_ numOfWeek: Int, _ htmlNameOfGroup: String) async throws -> Schedule {
|
|
||||||
let newUrlForWeek = makeUrlForWeek(numOfWeek, htmlNameOfGroup)
|
|
||||||
print(newUrlForWeek)
|
|
||||||
guard let url = URL(string: newUrlForWeek) else {throw NetworkError.invalidUrl}
|
|
||||||
let (data, response) = try await URLSession.shared.data(from: url)
|
|
||||||
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {throw NetworkError.invalidResponse}
|
|
||||||
|
|
||||||
do {
|
|
||||||
return try decoder.decode(Schedule.self, from: data)
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
throw NetworkError.invalidData
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -18,45 +18,26 @@ final class ViewModel: ObservableObject {
|
|||||||
table: [[]],
|
table: [[]],
|
||||||
link: ""
|
link: ""
|
||||||
)
|
)
|
||||||
@Published var selectedDay: Date = .init()
|
@Published var selectedDay: Date = Date()
|
||||||
@Published var selectedIndex: Int = 1
|
@Published var selectedIndex: Int = 1
|
||||||
@Published var classes: [[String]] = []
|
@Published var classes: [[String]] = []
|
||||||
@Published var week: Int = 0
|
|
||||||
@Published var numOfGroup: String = ""
|
init() {
|
||||||
@Published var isFirstStartOffApp = true
|
|
||||||
@Published var isShowingAlertForIncorrectGroup: Bool = false
|
}
|
||||||
@Published var errorInNetwork: NetworkError?
|
|
||||||
|
|
||||||
//MARK: Methods
|
//MARK: Methods
|
||||||
func fetchWeekSchedule(_ group: String, _ num: Int = 0) {
|
func fetchWeekSchedule(_ group: String) {
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
var schedule: Schedule
|
let schedule = try await NetworkManager.shared.getSchedule(group)
|
||||||
if (num != 0) {
|
|
||||||
week += num
|
|
||||||
schedule = try await NetworkManager.shared.getScheduleForOtherWeek(week, numOfGroup)
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
schedule = try await NetworkManager.shared.getSchedule(group)
|
|
||||||
}
|
|
||||||
weekSchedule = schedule.table
|
weekSchedule = schedule.table
|
||||||
week = weekSchedule.week
|
|
||||||
numOfGroup = weekSchedule.group
|
|
||||||
classes = weekSchedule.table
|
classes = weekSchedule.table
|
||||||
self.isFirstStartOffApp = false
|
print(weekSchedule.week)
|
||||||
self.isShowingAlertForIncorrectGroup = false
|
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
if let error = error as? NetworkError {
|
if let error = error as? NetworkError {
|
||||||
switch (error) {
|
|
||||||
case .invalidResponse:
|
|
||||||
print(4)
|
|
||||||
case .invalidData:
|
|
||||||
errorInNetwork = .invalidData
|
|
||||||
self.isShowingAlertForIncorrectGroup = true
|
|
||||||
default:
|
|
||||||
print(2)
|
|
||||||
}
|
|
||||||
print(error)
|
print(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,7 +45,6 @@ final class ViewModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func updateSelectedDayIndex(_ date: Date) {
|
func updateSelectedDayIndex(_ date: Date) {
|
||||||
selectedDay = date
|
|
||||||
switch date.format("E") {
|
switch date.format("E") {
|
||||||
case "Пн":
|
case "Пн":
|
||||||
selectedIndex = 2
|
selectedIndex = 2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user