This commit is contained in:
Vladimir Dubovik
2025-04-03 11:10:21 +03:00
parent 99f2bd8a74
commit 14c229175c
30 changed files with 674 additions and 227 deletions

View File

@ -87,9 +87,11 @@ extension Date {
func createPreviousMonth() -> [MonthWeek] {
let calendar = Calendar.current
let startOfFirstDate = calendar.startOfDay(for: self)
guard let previousDate = calendar.date(byAdding: .month, value: -1, to: startOfFirstDate) else {
guard let previousDate = calendar.date(byAdding: .weekOfMonth, value: -5, to: startOfFirstDate) else {
return []
}
print("Start of first date \(startOfFirstDate)")
print("Previous date \(previousDate)")
return fetchMonth(previousDate)
}

View File

@ -8,6 +8,36 @@
import SwiftUI
extension View {
func transformStringToFormat(_ input: String) -> String {
var result = input
// Условие 1: начинается с "кт"
if result.lowercased().hasPrefix("кт") {
result = result.lowercased()
let firstTwo = String(result.prefix(2)).uppercased()
let rest = String(result.dropFirst(2))
result = firstTwo + rest
return result
}
// Условие 2: содержит "впк"
if result.lowercased().contains("впк") {
result = result.lowercased()
result = result.replacingOccurrences(of: "впк", with: "ВПК")
return result
}
// Условие 3: содержит "мвпк"
if result.lowercased().contains("мвпк") {
result = result.lowercased()
result = result.replacingOccurrences(of: "впк", with: "ВПК")
return result
}
return result
}
func isSameDate(_ date1: Date, _ date2: Date) -> Bool {
return Calendar.current.isDate(date1, inSameDayAs: date2)
}
@ -270,13 +300,17 @@ extension MonthTabView {
let currentMonth = Date().fetchMonth(vm.selectedDay)
if let firstDate = currentMonth.first?.week[0].date {
monthSlider.append(firstDate.createPreviousMonth())
let temp = firstDate.createPreviousMonth()
print("First date - \(firstDate)")
print(temp)
monthSlider.append(temp)
}
monthSlider.append(currentMonth)
if let lastDate = currentMonth.last?.week[6].date {
monthSlider.append(lastDate.createNextMonth())
let temp = lastDate.createNextMonth()
monthSlider.append(temp)
}
}
}

View File

@ -11,8 +11,8 @@ enum NetworkError: String, Error, LocalizedError {
case invalidUrl
case invalidResponse
case invalidData
case noNetwork
case noError
case timeout
var errorDescription: String? {
switch self {
@ -22,8 +22,8 @@ enum NetworkError: String, Error, LocalizedError {
"InvalidResponse"
case .invalidData:
"Проверьте номер группы"
case .noNetwork:
"No network connection"
case .timeout:
"Ошибка сети"
case .noError:
"Нет ошибки"
}
@ -37,8 +37,8 @@ enum NetworkError: String, Error, LocalizedError {
"Для этой недели расписания еще нет"
case .invalidData:
"Похоже такой группы не существует"
case .noNetwork:
"Проверьте подключение к интернету и попробуйте заново"
case .timeout:
"Проверьте соединение с интернетом"
case .noError:
"Ошибки нет"
}

View File

@ -14,9 +14,14 @@ final class NetworkManager {
private let decoder = JSONDecoder()
private let urlForGroup = "https://webictis.sfedu.ru/schedule-api/?query="
private let urlForWeek = "https://webictis.sfedu.ru/schedule-api/?group="
private let customSession: URLSession // Кастомная сессия для ограничения времени ответа от сервера
//MARK: Initializer
private init() {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 3 // Таймаут запроса 10 секунд
configuration.timeoutIntervalForResource = 3 // Таймаут ресурса 15 секунд
self.customSession = URLSession(configuration: configuration)
decoder.dateDecodingStrategy = .iso8601
}
@ -32,7 +37,7 @@ final class NetworkManager {
func getSchedule(_ group: String) async throws -> Schedule {
let newUrlForGroup = makeUrlForGroup(group)
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 customSession.data(from: url)
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { throw NetworkError.invalidResponse }
do {
@ -47,7 +52,7 @@ final class NetworkManager {
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)
let (data, response) = try await customSession.data(from: url)
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { throw NetworkError.invalidResponse }
do {
@ -61,7 +66,7 @@ final class NetworkManager {
func getGroups(group: String) async throws -> Welcome {
let newUrlForGroups = makeUrlForGroup(group)
guard let url = URL(string: newUrlForGroups) else { throw NetworkError.invalidUrl }
let (data, response) = try await URLSession.shared.data(from: url)
let (data, response) = try await customSession.data(from: url)
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { throw NetworkError.invalidResponse }
do {

View File

@ -0,0 +1,37 @@
//
// NetworkMonitor.swift
// Schedule ICTIS
//
// Created by Mironov Egor on 27.03.2025.
//
import Network
import SwiftUI
class NetworkMonitor: ObservableObject {
@Published var isConnected: Bool = false
private let monitor = NWPathMonitor()
private let queue = DispatchQueue(label: "NetworkMonitorQueue")
init() {
startMonitoring()
}
func startMonitoring() {
monitor.pathUpdateHandler = { [weak self] path in
DispatchQueue.main.async {
self?.isConnected = path.status == .satisfied
print(self?.isConnected == true ? "✅ Интернет подключен!" : "❌ Нет подключения к интернету.")
}
}
monitor.start(queue: queue)
}
func stopMonitoring() {
monitor.cancel()
}
deinit {
stopMonitoring()
}
}