This commit is contained in:
Vladimir Dubovik
2024-12-12 13:37:07 +03:00
parent 1de531abc8
commit 92b125927d
13 changed files with 45 additions and 6 deletions

View File

@ -0,0 +1,123 @@
//
// Date+Extensions.swift
// Schedule ICTIS
//
// Created by Mironov Egor on 14.11.2024.
//
import SwiftUI
extension Date {
func format(_ format: String, locale: Locale = Locale(identifier: "ru_RU")) -> String {
let formatter = DateFormatter()
formatter.dateFormat = format
formatter.locale = locale
let formattedString = formatter.string(from: self)
if format == "EEEE" {
return formattedString.prefix(1).capitalized + formattedString.dropFirst()
}
return formattedString
}
var isToday: Bool {
return Calendar.current.isDateInToday(self)
}
func fetchWeek(_ date: Date = .init()) -> [WeekDay] {
let calendar = Calendar.current
let startOfDate = calendar.startOfDay(for: date)
var week: [WeekDay] = []
// Создаем дату начала и конца недели
let weekForDate = calendar.dateInterval(of: .weekOfMonth, for: startOfDate)
//print("Start: \(weekForDate?.start)")
//print("End: \(weekForDate?.end)")
guard let startOfWeek = weekForDate?.start else {
return []
}
// Создаем массив дней для недели
(0..<7).forEach { index in
if let weekDay = calendar.date(byAdding: .day, value: index, to: startOfWeek) {
week.append(WeekDay(date: weekDay))
}
}
return week
}
func fetchMonth(_ date: Date = .init()) -> [MonthWeek] {
let calendar = Calendar.current
let startOfDate = calendar.startOfDay(for: date)
let weekForDate = calendar.dateInterval(of: .weekOfMonth, for: startOfDate)
guard let startOfWeek = weekForDate?.start else {
return []
}
var month: [MonthWeek] = []
for weekIndex in 0..<5 {
var week: [WeekDay] = []
for dayIndex in 0..<7 {
if let weekDay = calendar.date(byAdding: .day, value: (weekIndex * 7 + dayIndex), to: startOfWeek) {
week.append(WeekDay(date: weekDay))
}
}
month.append(MonthWeek(week: week))
}
return month
}
func createNextMonth() -> [MonthWeek] {
let calendar = Calendar.current
let startOfLastDate = calendar.startOfDay(for: self)
guard let nextDate = calendar.date(byAdding: .day, value: 1, to: startOfLastDate) else {
return []
}
return fetchMonth(nextDate)
}
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 {
return []
}
return fetchMonth(previousDate)
}
func createNextWeek() -> [WeekDay] {
let calendar = Calendar.current
let startOfLastDate = calendar.startOfDay(for: self)
guard let nextDate = calendar.date(byAdding: .day, value: 1, to: startOfLastDate) else {
return []
}
return fetchWeek(nextDate)
}
func createPrevioustWeek() -> [WeekDay] {
let calendar = Calendar.current
let startOfFirstDate = calendar.startOfDay(for: self)
guard let previousDate = calendar.date(byAdding: .day, value: -1, to: startOfFirstDate) else {
return []
}
return fetchWeek(previousDate)
}
struct WeekDay: Identifiable {
var id: UUID = .init()
var date: Date
}
struct MonthWeek: Identifiable {
var id: UUID = .init()
var week: [WeekDay]
}
}

View File

@ -0,0 +1,15 @@
//
// OffsetKey.swift
// Schedule ICTIS
//
// Created by Mironov Egor on 18.11.2024.
//
import SwiftUI
struct OffsetKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
value = nextValue()
}
}

View File

@ -0,0 +1,73 @@
//
// View+Extensions.swift
// Schedule ICTIS
//
// Created by Mironov Egor on 15.11.2024.
//
import SwiftUI
extension View {
func isSameDate(_ date1: Date, _ date2: Date) -> Bool {
return Calendar.current.isDate(date1, inSameDayAs: date2)
}
func isDateInCurrentMonth(_ date: Date) -> Bool {
let calendar = Calendar.current
let currentDate = Date()
let currentMonth = calendar.component(.month, from: currentDate)
let currentYear = calendar.component(.year, from: currentDate)
let dateMonth = calendar.component(.month, from: date)
let dateYear = calendar.component(.year, from: date)
return currentMonth == dateMonth && currentYear == dateYear
}
func isSameWeek(_ date1: Date, _ date2: Date) -> Bool {
return Calendar.current.compare(date1, to: date2, toGranularity: .weekOfYear) == .orderedSame
}
func weeksBetween(startDate: Date, endDate: Date) -> Int {
let calendar = Calendar.current
let startOfFirstDate = calendar.startOfDay(for: startDate)
let startOfEndDate = calendar.startOfDay(for: endDate)
let weekForDate1 = calendar.dateInterval(of: .weekOfMonth, for: startOfFirstDate)
let weekForDate2 = calendar.dateInterval(of: .weekOfMonth, for: startOfEndDate)
guard let startOfWeek1 = weekForDate1?.start else {
return 0
}
guard let startOfWeek2 = weekForDate2?.start else {
return 0
}
let components = calendar.dateComponents([.day], from: startOfWeek1, to: startOfWeek2)
let daysDifference = components.day ?? 0
return Int(ceil(Double(abs(daysDifference)) / 7.0))
}
func convertTimeString(_ input: String) -> [String] {
let parts = input.split(separator: "-")
if let firstPart = parts.first, let lastPart = parts.last {
return [String(firstPart), String(lastPart)]
} else {
return []
}
}
func getColorForClass(_ str: String) -> Color {
if (str.contains("LMS")) {
return Color("blueForOnline")
}
else if (str.contains("ВПК")) {
return Color("turquoise")
}
else {
return Color("greenForOffline")
}
}
}