Add a temporary meeting list

This commit is contained in:
Benoit Martins 2024-04-22 13:48:42 +02:00
parent 2b574cd896
commit f106f54021
8 changed files with 117 additions and 35 deletions

View file

@ -79,6 +79,7 @@ struct LinphoneApp: App {
@State private var meetingWaitingRoomViewModel: MeetingWaitingRoomViewModel?
@State private var conversationsListViewModel: ConversationsListViewModel?
@State private var conversationViewModel: ConversationViewModel?
@State private var meetingsListViewModel: MeetingsListViewModel?
@State private var scheduleMeetingViewModel: ScheduleMeetingViewModel?
var body: some Scene {
@ -103,7 +104,9 @@ struct LinphoneApp: App {
&& callViewModel != nil
&& meetingWaitingRoomViewModel != nil
&& conversationsListViewModel != nil
&& conversationViewModel != nil {
&& conversationViewModel != nil
&& meetingsListViewModel != nil
&& scheduleMeetingViewModel != nil {
ContentView(
contactViewModel: contactViewModel!,
editContactViewModel: editContactViewModel!,
@ -114,6 +117,7 @@ struct LinphoneApp: App {
meetingWaitingRoomViewModel: meetingWaitingRoomViewModel!,
conversationsListViewModel: conversationsListViewModel!,
conversationViewModel: conversationViewModel!,
meetingsListViewModel: meetingsListViewModel!,
scheduleMeetingViewModel: scheduleMeetingViewModel!
)
} else {
@ -131,6 +135,7 @@ struct LinphoneApp: App {
meetingWaitingRoomViewModel = MeetingWaitingRoomViewModel()
conversationsListViewModel = ConversationsListViewModel()
conversationViewModel = ConversationViewModel()
meetingsListViewModel = MeetingsListViewModel()
scheduleMeetingViewModel = ScheduleMeetingViewModel()
}
}

View file

@ -387,9 +387,6 @@
},
"Headphones" : {
},
"Hello meetings list" : {
},
"History has been deleted" : {
@ -509,6 +506,9 @@
},
"No conversation for the moment..." : {
},
"No meeting for the moment..." : {
},
"Not account yet?" : {

View file

@ -43,6 +43,7 @@ struct ContentView: View {
@ObservedObject var meetingWaitingRoomViewModel: MeetingWaitingRoomViewModel
@ObservedObject var conversationsListViewModel: ConversationsListViewModel
@ObservedObject var conversationViewModel: ConversationViewModel
@ObservedObject var meetingsListViewModel: MeetingsListViewModel
@ObservedObject var scheduleMeetingViewModel: ScheduleMeetingViewModel
@State var index = 0
@ -461,6 +462,7 @@ struct ContentView: View {
ConversationsView(conversationViewModel: conversationViewModel, conversationsListViewModel: conversationsListViewModel)
} else if self.index == 3 {
MeetingsView(
meetingsListViewModel: meetingsListViewModel,
scheduleMeetingViewModel: scheduleMeetingViewModel,
isShowScheduleMeetingFragment: $isShowScheduleMeetingFragment
)
@ -967,6 +969,7 @@ struct ContentView: View {
meetingWaitingRoomViewModel: MeetingWaitingRoomViewModel(),
conversationsListViewModel: ConversationsListViewModel(),
conversationViewModel: ConversationViewModel(),
meetingsListViewModel: MeetingsListViewModel(),
scheduleMeetingViewModel: ScheduleMeetingViewModel()
)
}

View file

@ -72,17 +72,27 @@ struct HistoryListFragment: View {
.frame(width: 45, height: 45)
.clipShape(Circle())
} else {
} else if historyListViewModel.callLogs[index].toAddress!.username != nil {
Image(uiImage: contactsManager.textToImage(
firstName: historyListViewModel.callLogs[index].toAddress!.username ?? "Username Error",
firstName: historyListViewModel.callLogs[index].toAddress!.username!,
lastName: historyListViewModel.callLogs[index].toAddress!.username!.components(separatedBy: " ").count > 1
? historyListViewModel.callLogs[index].toAddress!.username!.components(separatedBy: " ")[1]
: ""))
.resizable()
.frame(width: 45, height: 45)
.clipShape(Circle())
} else {
VStack {
Image("users-three-square")
.renderingMode(.template)
.resizable()
.frame(width: 28, height: 28)
.foregroundStyle(Color.grayMain2c600)
}
.frame(width: 45, height: 45)
.background(Color.grayMain2c200)
.clipShape(Circle())
}
} else if historyListViewModel.callLogs[index].fromAddress != nil {
if historyListViewModel.callLogs[index].fromAddress!.displayName != nil {
Image(uiImage: contactsManager.textToImage(
@ -93,15 +103,26 @@ struct HistoryListFragment: View {
.resizable()
.frame(width: 45, height: 45)
.clipShape(Circle())
} else {
} else if historyListViewModel.callLogs[index].fromAddress!.username != nil {
Image(uiImage: contactsManager.textToImage(
firstName: historyListViewModel.callLogs[index].fromAddress!.username ?? "Username Error",
firstName: historyListViewModel.callLogs[index].fromAddress!.username!,
lastName: historyListViewModel.callLogs[index].fromAddress!.username!.components(separatedBy: " ").count > 1
? historyListViewModel.callLogs[index].fromAddress!.username!.components(separatedBy: " ")[1]
: ""))
.resizable()
.frame(width: 45, height: 45)
.clipShape(Circle())
} else {
VStack {
Image("users-three-square")
.renderingMode(.template)
.resizable()
.frame(width: 28, height: 28)
.foregroundStyle(Color.grayMain2c600)
}
.frame(width: 45, height: 45)
.background(Color.grayMain2c200)
.clipShape(Circle())
}
} else {
Image("profil-picture-default")
@ -139,14 +160,14 @@ struct HistoryListFragment: View {
if historyListViewModel.callLogs[index].dir == .Outgoing && historyListViewModel.callLogs[index].toAddress != nil {
Text(historyListViewModel.callLogs[index].toAddress!.displayName != nil
? historyListViewModel.callLogs[index].toAddress!.displayName!
: historyListViewModel.callLogs[index].toAddress!.username!)
: historyListViewModel.callLogs[index].toAddress!.username ?? "")
.default_text_style(styleSize: 14)
.frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(1)
} else if historyListViewModel.callLogs[index].fromAddress != nil {
Text(historyListViewModel.callLogs[index].fromAddress!.displayName != nil
? historyListViewModel.callLogs[index].fromAddress!.displayName!
: historyListViewModel.callLogs[index].fromAddress!.username!)
: historyListViewModel.callLogs[index].fromAddress!.username ?? "")
.default_text_style(styleSize: 14)
.frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(1)

View file

@ -6,9 +6,11 @@
//
import SwiftUI
import linphonesw
struct MeetingsFragment: View {
@ObservedObject var meetingsListViewModel: MeetingsListViewModel
@ObservedObject var scheduleMeetingViewModel: ScheduleMeetingViewModel
private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom }
@ -17,32 +19,72 @@ struct MeetingsFragment: View {
var body: some View {
VStack {
Spacer()
Text("Hello meetings list")
Spacer()
/*
if #available(iOS 16.0, *), idiom != .pad {
MeetingsListFragment(conversationViewModel: conversationViewModel, conversationsListViewModel: conversationsListViewModel, showingSheet: $showingSheet)
.sheet(isPresented: $showingSheet) {
ConversationsListBottomSheet(
conversationsListViewModel: conversationsListViewModel,
showingSheet: $showingSheet
)
.presentationDetents([.fraction(0.4)])
List {
ForEach(0..<meetingsListViewModel.meetingsList.count, id: \.self) { index in
HStack {
HStack {
Image("users-three-square")
.renderingMode(.template)
.resizable()
.frame(width: 28, height: 28)
.foregroundStyle(Color.grayMain2c600)
VStack(spacing: 0) {
Text(meetingsListViewModel.meetingsList[index].model?.subject ?? "")
.default_text_style_500(styleSize: 16)
.frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(1)
}
}
.frame(height: 40)
}
} else {
ConversationsListFragment(conversationViewModel: conversationViewModel, conversationsListViewModel: conversationsListViewModel, showingSheet: $showingSheet)
.halfSheet(showSheet: $showingSheet) {
ConversationsListBottomSheet(
conversationsListViewModel: conversationsListViewModel,
showingSheet: $showingSheet
)
} onDismiss: {}
} */
.buttonStyle(.borderless)
.listRowInsets(EdgeInsets(top: 5, leading: 20, bottom: 5, trailing: 20))
.listRowSeparator(.hidden)
.background(.white)
.onTapGesture {
withAnimation {
joinMeetingWaitingRoom(index: index)
}
}
.onLongPressGesture(minimumDuration: 0.2) {
//showingSheet.toggle()
}
}
}
.listStyle(.plain)
.overlay(
VStack {
if meetingsListViewModel.meetingsList.isEmpty {
Spacer()
Image("illus-belledonne")
.resizable()
.scaledToFit()
.clipped()
.padding(.all)
Text("No meeting for the moment...")
.default_text_style_800(styleSize: 16)
Spacer()
Spacer()
}
}
.padding(.all)
)
}
.navigationTitle("")
.navigationBarHidden(true)
}
func joinMeetingWaitingRoom(index: Int) {
do {
let meetingAddress = try Factory.Instance.createAddress(addr: meetingsListViewModel.meetingsList[index].model?.address ?? "")
TelecomManager.shared.meetingWaitingRoomDisplayed = true
TelecomManager.shared.meetingWaitingRoomSelected = meetingAddress
} catch {}
}
}
#Preview {
MeetingsFragment(scheduleMeetingViewModel: ScheduleMeetingViewModel())
MeetingsFragment(meetingsListViewModel: MeetingsListViewModel(), scheduleMeetingViewModel: ScheduleMeetingViewModel())
}

View file

@ -9,6 +9,7 @@ import SwiftUI
struct MeetingsView: View {
@ObservedObject var meetingsListViewModel: MeetingsListViewModel
@ObservedObject var scheduleMeetingViewModel: ScheduleMeetingViewModel
@Binding var isShowScheduleMeetingFragment: Bool
@ -16,7 +17,7 @@ struct MeetingsView: View {
var body: some View {
NavigationView {
ZStack(alignment: .bottomTrailing) {
MeetingsFragment(scheduleMeetingViewModel: scheduleMeetingViewModel)
MeetingsFragment(meetingsListViewModel: meetingsListViewModel, scheduleMeetingViewModel: scheduleMeetingViewModel)
Button {
withAnimation {
@ -42,6 +43,7 @@ struct MeetingsView: View {
#Preview {
MeetingsView(
meetingsListViewModel: MeetingsListViewModel(),
scheduleMeetingViewModel: ScheduleMeetingViewModel(),
isShowScheduleMeetingFragment: .constant(false)
)

View file

@ -24,6 +24,7 @@ class MeetingModel: ObservableObject {
@Published var isBroadcast: Bool
@Published var subject: String
@Published var address: String
@Published var firstMeetingOfTheDay: Bool = false
init(conferenceInfo: ConferenceInfo) {
@ -53,5 +54,7 @@ class MeetingModel: ObservableObject {
isBroadcast = confInfo.participantInfos.firstIndex(where: {$0.role == Participant.Role.Listener}) != nil
subject = confInfo.subject ?? ""
address = confInfo.uri?.asStringUriOnly() ?? ""
}
}

View file

@ -74,16 +74,20 @@ class MeetingsListViewModel: ObservableObject {
model.firstMeetingOfTheDay = firstMeetingOfTheDay
// Insert "Today" fake model before the first one of today
/*
if firstMeetingOfTheDay && model.isToday {
meetingsListTmp.append(MeetingsListItemModel(meetingModel: nil))
meetingForTodayFound = true
}
*/
// If no meeting was found for today, insert "Today" fake model before the next meeting to come
if !meetingForTodayFound && model.isAfterToday {
/*
if !meetingForTodayFound && model.isAfterToday {
meetingsListTmp.append(MeetingsListItemModel(meetingModel: nil))
meetingForTodayFound = true
}
*/
meetingsListTmp.append(MeetingsListItemModel(meetingModel: model))
previousModel = model
@ -91,9 +95,11 @@ class MeetingsListViewModel: ObservableObject {
}
// If no meeting was found after today, insert "Today" fake model at the end
/*
if !meetingForTodayFound {
meetingsListTmp.append(MeetingsListItemModel(meetingModel: nil))
}
*/
self.meetingsList = meetingsListTmp
}