mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-17 02:58:07 +00:00
Add a temporary meeting list
This commit is contained in:
parent
2b574cd896
commit
f106f54021
8 changed files with 117 additions and 35 deletions
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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?" : {
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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() ?? ""
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue