Lots of changes
This commit is contained in:
parent
e7510aef68
commit
955c7d9066
@ -20,20 +20,25 @@ struct MainView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack {
|
||||||
SearchBarView(text: $searchText, vm: vm)
|
SearchBarView(text: $searchText, vm: vm)
|
||||||
CurrentDateView()
|
|
||||||
if (vm.isFirstStartOffApp) {
|
if (vm.isFirstStartOffApp) {
|
||||||
FirstLaunchScheduleView()
|
FirstLaunchScheduleView()
|
||||||
}
|
}
|
||||||
else {
|
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
|
currentDate = vm.selectedDay
|
||||||
vm.updateSelectedDayIndex(currentDate)
|
vm.updateSelectedDayIndex(currentDate)
|
||||||
if weekSlider.isEmpty {
|
if weekSlider.isEmpty {
|
||||||
let currentWeek = Date().fetchWeek()
|
let currentWeek = Date().fetchWeek(vm.selectedDay)
|
||||||
|
|
||||||
if let firstDate = currentWeek.first?.date {
|
if let firstDate = currentWeek.first?.date {
|
||||||
weekSlider.append(firstDate.createPrevioustWeek())
|
weekSlider.append(firstDate.createPrevioustWeek())
|
||||||
@ -163,21 +168,37 @@ 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 {
|
||||||
vm.fetchWeekSchedule("new week", -1)
|
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) {
|
||||||
vm.fetchWeekSchedule("new week", 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,16 +43,17 @@ struct ScheduleView: View {
|
|||||||
.frame(maxWidth: UIScreen.main.bounds.width - 40, maxHeight: 230)
|
.frame(maxWidth: UIScreen.main.bounds.width - 40, maxHeight: 230)
|
||||||
.background(Color.white)
|
.background(Color.white)
|
||||||
.cornerRadius(20)
|
.cornerRadius(20)
|
||||||
|
.shadow(color: .black.opacity(0.25), radius: 4, x: 4, y: 4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.frame(width: UIScreen.main.bounds.width)
|
||||||
.padding(.bottom, 100)
|
.padding(.bottom, 100)
|
||||||
.padding(.top, 10)
|
.padding(.top, 10)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//ктбо2-6
|
|
||||||
|
|
||||||
func convertTimeString(_ input: String) -> [String] {
|
func convertTimeString(_ input: String) -> [String] {
|
||||||
let parts = input.split(separator: "-")
|
let parts = input.split(separator: "-")
|
||||||
|
@ -22,14 +22,14 @@ struct SearchBarView: View {
|
|||||||
TextField("Поиск группы", text: $text)
|
TextField("Поиск группы", text: $text)
|
||||||
.disableAutocorrection(true)
|
.disableAutocorrection(true)
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
isEditing = true
|
self.isEditing = true
|
||||||
}
|
}
|
||||||
.onSubmit {
|
.onSubmit {
|
||||||
isEditing = false
|
self.isEditing = false
|
||||||
if (!text.isEmpty) {
|
if (!text.isEmpty) {
|
||||||
vm.isFirstStartOffApp = false
|
|
||||||
vm.fetchWeekSchedule(text)
|
vm.fetchWeekSchedule(text)
|
||||||
}
|
}
|
||||||
|
self.text = ""
|
||||||
}
|
}
|
||||||
.submitLabel(.search)
|
.submitLabel(.search)
|
||||||
if isEditing {
|
if isEditing {
|
||||||
@ -53,19 +53,20 @@ struct SearchBarView: View {
|
|||||||
RoundedRectangle(cornerRadius: 10)
|
RoundedRectangle(cornerRadius: 10)
|
||||||
.fill(.white)
|
.fill(.white)
|
||||||
)
|
)
|
||||||
Button {
|
if (!vm.isFirstStartOffApp && !vm.isShowingAlertForIncorrectGroup) {
|
||||||
|
Button {
|
||||||
} label: {
|
} label: {
|
||||||
ZStack {
|
ZStack {
|
||||||
Rectangle()
|
Rectangle()
|
||||||
.frame(width: 40, height: 40)
|
.frame(width: 40, height: 40)
|
||||||
.foregroundStyle(Color("blueColor"))
|
.foregroundStyle(Color("blueColor"))
|
||||||
.cornerRadius(15)
|
.cornerRadius(15)
|
||||||
Image(systemName: "plus")
|
Image(systemName: "plus")
|
||||||
.resizable()
|
.resizable()
|
||||||
.foregroundStyle(.white)
|
.foregroundStyle(.white)
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: 16)
|
.frame(width: 16)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,35 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
enum NetworkError: String, Error {
|
enum NetworkError: String, Error, LocalizedError {
|
||||||
case invalidUrl = "Invalid URL"
|
case invalidUrl
|
||||||
case invalidResponse = "Invalid response form the server"
|
case invalidResponse
|
||||||
case invalidData = "Data received from the server is invalid"
|
case invalidData
|
||||||
|
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:
|
||||||
|
"Проверьте подключение к интернету и попробуйте заново"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ final class NetworkManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func makeUrlForWeek(_ numOfWeek: Int, _ htmlNameOfGroup: String) -> String {
|
func makeUrlForWeek(_ numOfWeek: Int, _ htmlNameOfGroup: String) -> String {
|
||||||
return urlForWeek + htmlNameOfGroup + "&" + String(numOfWeek)
|
return urlForWeek + htmlNameOfGroup + "&week=" + String(numOfWeek)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSchedule(_ group: String) async throws -> Schedule {
|
func getSchedule(_ group: String) async throws -> Schedule {
|
||||||
@ -42,8 +42,10 @@ final class NetworkManager {
|
|||||||
throw NetworkError.invalidData
|
throw NetworkError.invalidData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getScheduleForOtherWeek(_ numOfWeek: Int, _ htmlNameOfGroup: String) async throws -> Schedule {
|
func getScheduleForOtherWeek(_ numOfWeek: Int, _ htmlNameOfGroup: String) async throws -> Schedule {
|
||||||
let newUrlForWeek = makeUrlForWeek(numOfWeek, htmlNameOfGroup)
|
let newUrlForWeek = makeUrlForWeek(numOfWeek, htmlNameOfGroup)
|
||||||
|
print(newUrlForWeek)
|
||||||
guard let url = URL(string: newUrlForWeek) else {throw NetworkError.invalidUrl}
|
guard let url = URL(string: newUrlForWeek) 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}
|
||||||
|
@ -24,14 +24,17 @@ final class ViewModel: ObservableObject {
|
|||||||
@Published var week: Int = 0
|
@Published var week: Int = 0
|
||||||
@Published var numOfGroup: String = ""
|
@Published var numOfGroup: String = ""
|
||||||
@Published var isFirstStartOffApp = true
|
@Published var isFirstStartOffApp = true
|
||||||
|
@Published var isShowingAlertForIncorrectGroup: Bool = false
|
||||||
|
@Published var errorInNetwork: NetworkError?
|
||||||
|
|
||||||
//MARK: Methods
|
//MARK: Methods
|
||||||
func fetchWeekSchedule(_ group: String = "new week", _ num: Int = 0) {
|
func fetchWeekSchedule(_ group: String, _ num: Int = 0) {
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
let schedule: Schedule
|
var schedule: Schedule
|
||||||
if (group == "new week") {
|
if (num != 0) {
|
||||||
schedule = try await NetworkManager.shared.getScheduleForOtherWeek(week + num, numOfGroup)
|
week += num
|
||||||
|
schedule = try await NetworkManager.shared.getScheduleForOtherWeek(week, numOfGroup)
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
schedule = try await NetworkManager.shared.getSchedule(group)
|
schedule = try await NetworkManager.shared.getSchedule(group)
|
||||||
@ -39,12 +42,21 @@ final class ViewModel: ObservableObject {
|
|||||||
weekSchedule = schedule.table
|
weekSchedule = schedule.table
|
||||||
week = weekSchedule.week
|
week = weekSchedule.week
|
||||||
numOfGroup = weekSchedule.group
|
numOfGroup = weekSchedule.group
|
||||||
print(week)
|
|
||||||
print(numOfGroup)
|
|
||||||
classes = weekSchedule.table
|
classes = weekSchedule.table
|
||||||
|
self.isFirstStartOffApp = false
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user