From 2b441f35575ac84a7f86d0458d563c83d1aa32d6 Mon Sep 17 00:00:00 2001 From: QuentinArguillere Date: Tue, 21 May 2024 15:30:28 +0200 Subject: [PATCH] Upgrade MeetingListsItemModel to have a preformatted month and week string to be displayed in the meetings list view --- .../Main/Meetings/Models/MeetingModel.swift | 2 - .../Models/MeetingsListItemModel.swift | 43 ++++++++++++++++++- .../ViewModel/MeetingsListViewModel.swift | 23 ++++++++++ 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/Linphone/UI/Main/Meetings/Models/MeetingModel.swift b/Linphone/UI/Main/Meetings/Models/MeetingModel.swift index 8531d0f1e..fd7abac7a 100644 --- a/Linphone/UI/Main/Meetings/Models/MeetingModel.swift +++ b/Linphone/UI/Main/Meetings/Models/MeetingModel.swift @@ -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 { diff --git a/Linphone/UI/Main/Meetings/Models/MeetingsListItemModel.swift b/Linphone/UI/Main/Meetings/Models/MeetingsListItemModel.swift index b56bc3291..c73e4574a 100644 --- a/Linphone/UI/Main/Meetings/Models/MeetingsListItemModel.swift +++ b/Linphone/UI/Main/Meetings/Models/MeetingsListItemModel.swift @@ -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)" } } } diff --git a/Linphone/UI/Main/Meetings/ViewModel/MeetingsListViewModel.swift b/Linphone/UI/Main/Meetings/ViewModel/MeetingsListViewModel.swift index 9e85634a6..cbf295431 100644 --- a/Linphone/UI/Main/Meetings/ViewModel/MeetingsListViewModel.swift +++ b/Linphone/UI/Main/Meetings/ViewModel/MeetingsListViewModel.swift @@ -28,6 +28,7 @@ class MeetingsListViewModel: ObservableObject { private var mCoreSuscriptions = Set() 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 + } }