Upgrade MeetingListsItemModel to have a preformatted month and week string to be displayed in the meetings list view

This commit is contained in:
QuentinArguillere 2024-05-21 15:30:28 +02:00
parent b5d98cc45a
commit 2b441f3557
3 changed files with 64 additions and 4 deletions

View file

@ -20,7 +20,6 @@ class MeetingModel: ObservableObject {
var time: String // "$startTime - $endTime"
var day: String
var dayNumber: String
var month: String
@Published var isBroadcast: Bool
@Published var subject: String
@ -41,7 +40,6 @@ class MeetingModel: ObservableObject {
day = meetingDate.formatted(Date.FormatStyle().weekday(.abbreviated))
dayNumber = meetingDate.formatted(Date.FormatStyle().day(.twoDigits))
month = meetingDate.formatted(Date.FormatStyle().month(.wide)) // February
isToday = Calendar.current.isDateInToday(meetingDate)
if isToday {

View file

@ -6,16 +6,55 @@
//
import Foundation
extension String {
func capitalizingFirstLetter() -> String {
return prefix(1).capitalized + dropFirst()
}
mutating func capitalizeFirstLetter() {
self = self.capitalizingFirstLetter()
}
}
class MeetingsListItemModel {
let model: MeetingModel? // if NIL, consider that we are using the fake TodayModel
var month: String = Date.now.formatted(Date.FormatStyle().month(.wide))
var monthStr: String = ""
var weekStr: String = ""
var isToday = true
init(meetingModel: MeetingModel?) {
model = meetingModel
if let mod = meetingModel {
month = mod.month
monthStr = createMonthString(date: mod.meetingDate)
weekStr = createWeekString(date: mod.meetingDate)
isToday = false
} else {
monthStr = createMonthString(date: Date.now)
weekStr = createWeekString(date: Date.now)
}
}
func createMonthString(date: Date) -> String {
return "\(date.formatted(Date.FormatStyle().month(.wide))) \(date.formatted(Date.FormatStyle().year()))"
}
func createWeekString(date: Date) -> String {
let calendar = Calendar.current
let firstDayOfWeekIdx = calendar.firstWeekday
let dateIndex = calendar.component(.weekday, from: date)
let weekStartDate = calendar.date(byAdding: .day, value: -(dateIndex - firstDayOfWeekIdx % 7), to: date)!
let weekFirstDay = weekStartDate.formatted(Date.FormatStyle().day(.twoDigits))
let firstMonth = weekStartDate.formatted(Date.FormatStyle().month(.wide)).capitalizingFirstLetter()
let weekEndDate = calendar.date(byAdding: .day, value: 6, to: weekStartDate)!
let weekEndDay = weekEndDate.formatted(Date.FormatStyle().day(.twoDigits))
let isDifferentMonth = calendar.component(.month, from: weekStartDate) != calendar.component(.month, from: weekEndDate)
if isDifferentMonth {
let lastMonth = weekEndDate.formatted(Date.FormatStyle().month(.wide)).capitalizingFirstLetter()
return "\(weekFirstDay) \(firstMonth) - \(weekEndDay) \(lastMonth)"
} else {
return "\(weekFirstDay) - \(weekEndDay) \(firstMonth)"
}
}
}

View file

@ -28,6 +28,7 @@ class MeetingsListViewModel: ObservableObject {
private var mCoreSuscriptions = Set<AnyCancellable?>()
var selectedMeeting: ConversationModel?
@Published var sortedMeetingsList: [String: [String: [MeetingsListItemModel]]] = [:]
@Published var meetingsList: [MeetingsListItemModel] = []
@Published var currentFilter = ""
@ -105,7 +106,29 @@ class MeetingsListViewModel: ObservableObject {
DispatchQueue.main.sync {
self.meetingsList = meetingsListTmp
self.sortMeetingsListByWeek()
}
}
}
func sortMeetingsListByWeek() {
var sortedList: [String: [String: [MeetingsListItemModel]]] = [:]
var currentMonthString = ""
var currentWeekString = ""
for meeting in self.meetingsList {
if currentMonthString != meeting.monthStr {
sortedList[currentMonthString] = [:]
currentMonthString = meeting.monthStr
}
if currentWeekString != meeting.weekStr {
sortedList[currentMonthString]?[currentWeekString] = []
currentWeekString = meeting.weekStr
}
sortedList[currentMonthString]?[currentWeekString]?.append(meeting)
}
self.sortedMeetingsList = sortedList
}
}