mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-17 11:08:06 +00:00
Move (almost) all chatroom delegate management into changeDisplayedChatRoom
This commit is contained in:
parent
bbce741911
commit
be09800b5a
7 changed files with 58 additions and 118 deletions
|
|
@ -205,7 +205,7 @@ struct CallView: View {
|
|||
.zIndex(4)
|
||||
.transition(.move(edge: .bottom))
|
||||
.onDisappear {
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.displayedConversation = nil
|
||||
isShowConversationFragment = false
|
||||
}
|
||||
}
|
||||
|
|
@ -2198,21 +2198,7 @@ struct CallView: View {
|
|||
.frame(width: 32, height: 32, alignment: .center)
|
||||
.onDisappear {
|
||||
if callViewModel.isOneOneCall && callViewModel.displayedConversation != nil {
|
||||
if conversationViewModel.displayedConversation != nil {
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.resetMessage()
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!)
|
||||
|
||||
conversationViewModel.getMessages()
|
||||
withAnimation {
|
||||
isShowConversationFragment = true
|
||||
}
|
||||
} else {
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!)
|
||||
withAnimation {
|
||||
isShowConversationFragment = true
|
||||
}
|
||||
}
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2581,21 +2567,7 @@ struct CallView: View {
|
|||
.frame(width: 32, height: 32, alignment: .center)
|
||||
.onDisappear {
|
||||
if callViewModel.isOneOneCall && callViewModel.displayedConversation != nil {
|
||||
if conversationViewModel.displayedConversation != nil {
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.resetMessage()
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!)
|
||||
|
||||
conversationViewModel.getMessages()
|
||||
withAnimation {
|
||||
isShowConversationFragment = true
|
||||
}
|
||||
} else {
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!)
|
||||
withAnimation {
|
||||
isShowConversationFragment = true
|
||||
}
|
||||
}
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: callViewModel.displayedConversation!)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ struct ContentView: View {
|
|||
Button(action: {
|
||||
self.index = 0
|
||||
historyViewModel.displayedCall = nil
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.displayedConversation = nil
|
||||
meetingViewModel.displayedMeeting = nil
|
||||
}, label: {
|
||||
VStack {
|
||||
|
|
@ -174,7 +174,7 @@ struct ContentView: View {
|
|||
Button(action: {
|
||||
self.index = 1
|
||||
contactViewModel.indexDisplayedFriend = nil
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.displayedConversation = nil
|
||||
meetingViewModel.displayedMeeting = nil
|
||||
if historyListViewModel.missedCallsCount > 0 {
|
||||
historyListViewModel.resetMissedCallsCount()
|
||||
|
|
@ -250,7 +250,7 @@ struct ContentView: View {
|
|||
self.index = 3
|
||||
contactViewModel.indexDisplayedFriend = nil
|
||||
historyViewModel.displayedCall = nil
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.displayedConversation = nil
|
||||
}, label: {
|
||||
VStack {
|
||||
Image("video-conference")
|
||||
|
|
@ -658,7 +658,7 @@ struct ContentView: View {
|
|||
Button(action: {
|
||||
self.index = 0
|
||||
historyViewModel.displayedCall = nil
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.displayedConversation = nil
|
||||
meetingViewModel.displayedMeeting = nil
|
||||
}, label: {
|
||||
VStack {
|
||||
|
|
@ -705,7 +705,7 @@ struct ContentView: View {
|
|||
Button(action: {
|
||||
self.index = 1
|
||||
contactViewModel.indexDisplayedFriend = nil
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.displayedConversation = nil
|
||||
meetingViewModel.displayedMeeting = nil
|
||||
if historyListViewModel.missedCallsCount > 0 {
|
||||
historyListViewModel.resetMissedCallsCount()
|
||||
|
|
@ -784,7 +784,7 @@ struct ContentView: View {
|
|||
self.index = 3
|
||||
contactViewModel.indexDisplayedFriend = nil
|
||||
historyViewModel.displayedCall = nil
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.displayedConversation = nil
|
||||
}, label: {
|
||||
VStack {
|
||||
Image("video-conference")
|
||||
|
|
|
|||
|
|
@ -211,20 +211,11 @@ struct ConversationForwardMessageFragment: View {
|
|||
|
||||
if conversationForwardMessageViewModel.displayedConversation != nil {
|
||||
if conversationViewModel.displayedConversation != nil {
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||
conversationViewModel.selectedMessage = nil
|
||||
conversationViewModel.resetMessage()
|
||||
withAnimation {
|
||||
self.conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationForwardMessageViewModel.displayedConversation!)
|
||||
}
|
||||
conversationViewModel.getMessages()
|
||||
}
|
||||
} else {
|
||||
conversationViewModel.selectedMessage = nil
|
||||
withAnimation {
|
||||
self.conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationForwardMessageViewModel.displayedConversation!)
|
||||
}
|
||||
} else {
|
||||
self.conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationForwardMessageViewModel.displayedConversation!)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,9 +68,6 @@ struct ConversationFragment: View {
|
|||
.onRotate { newOrientation in
|
||||
orientation = newOrientation
|
||||
}
|
||||
.onAppear {
|
||||
conversationViewModel.addConversationDelegate()
|
||||
}
|
||||
.onDisappear {
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
}
|
||||
|
|
@ -111,9 +108,6 @@ struct ConversationFragment: View {
|
|||
.onRotate { newOrientation in
|
||||
orientation = newOrientation
|
||||
}
|
||||
.onAppear {
|
||||
conversationViewModel.addConversationDelegate()
|
||||
}
|
||||
.onDisappear {
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
}
|
||||
|
|
@ -178,7 +172,7 @@ struct ConversationFragment: View {
|
|||
if isShowConversationFragment {
|
||||
isShowConversationFragment = false
|
||||
}
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
conversationViewModel.displayedConversation = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,29 +152,15 @@ struct ConversationsListFragment: View {
|
|||
|
||||
enteredForeground = false
|
||||
|
||||
if navigationManager.peerAddr != nil && conversationsListViewModel.conversationsList[index].remoteSipUri.contains(navigationManager.peerAddr!) {
|
||||
if navigationManager.peerAddr != nil
|
||||
&& conversationsListViewModel.conversationsList[index].remoteSipUri.contains(navigationManager.peerAddr!) {
|
||||
conversationViewModel.getChatRoomWithStringAddress(conversationsList: conversationsListViewModel.conversationsList, stringAddr: navigationManager.peerAddr!)
|
||||
navigationManager.peerAddr = nil
|
||||
}
|
||||
}
|
||||
.onTapGesture {
|
||||
if index < conversationsListViewModel.conversationsList.count {
|
||||
if conversationViewModel.displayedConversation != nil {
|
||||
conversationViewModel.removeConversationDelegate()
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||
conversationViewModel.selectedMessage = nil
|
||||
conversationViewModel.resetMessage()
|
||||
withAnimation {
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationsListViewModel.conversationsList[index])
|
||||
}
|
||||
conversationViewModel.getMessages()
|
||||
}
|
||||
} else {
|
||||
conversationViewModel.selectedMessage = nil
|
||||
withAnimation {
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationsListViewModel.conversationsList[index])
|
||||
}
|
||||
}
|
||||
conversationViewModel.changeDisplayedChatRoom(conversationModel: conversationsListViewModel.conversationsList[index])
|
||||
}
|
||||
}
|
||||
.onLongPressGesture(minimumDuration: 0.2) {
|
||||
|
|
|
|||
|
|
@ -238,17 +238,7 @@ struct StartConversationFragment: View {
|
|||
isShowStartConversationFragment = false
|
||||
|
||||
if startConversationViewModel.displayedConversation != nil {
|
||||
if self.conversationViewModel.displayedConversation != nil {
|
||||
self.conversationViewModel.removeConversationDelegate()
|
||||
self.conversationViewModel.resetMessage()
|
||||
self.conversationViewModel.changeDisplayedChatRoom(conversationModel: startConversationViewModel.displayedConversation!)
|
||||
|
||||
self.conversationViewModel.getMessages()
|
||||
} else {
|
||||
withAnimation {
|
||||
self.conversationViewModel.changeDisplayedChatRoom(conversationModel: startConversationViewModel.displayedConversation!)
|
||||
}
|
||||
}
|
||||
self.conversationViewModel.changeDisplayedChatRoom(conversationModel: startConversationViewModel.displayedConversation!)
|
||||
|
||||
startConversationViewModel.displayedConversation = nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,22 +37,34 @@ class ConversationViewModel: ObservableObject {
|
|||
@Published var messageText: String = ""
|
||||
@Published var composingLabel: String = ""
|
||||
|
||||
private var chatRoomDelegate: ChatRoomDelegate?
|
||||
// Used to keep track of a ChatRoom callback without having to worry about life cycle
|
||||
// Init will add the delegate, deinit will remove it
|
||||
class ChatRoomDelegateHolder {
|
||||
var chatRoom: ChatRoom
|
||||
var chatRoomDelegate: ChatRoomDelegate
|
||||
init (chatroom: ChatRoom, delegate: ChatRoomDelegate) {
|
||||
chatroom.addDelegate(delegate: delegate)
|
||||
self.chatRoom = chatroom
|
||||
self.chatRoomDelegate = delegate
|
||||
}
|
||||
deinit {
|
||||
self.chatRoom.removeDelegate(delegate: chatRoomDelegate)
|
||||
}
|
||||
}
|
||||
private var chatRoomDelegateHolder: ChatRoomDelegateHolder?
|
||||
|
||||
// Used to keep track of a ChatMessage callback without having to worry about life cycle
|
||||
// Init will add the delegate, deinit will remove it
|
||||
class ChatMessageDelegateHolder {
|
||||
var chatMessage: ChatMessage
|
||||
var chatMessageDelegate: ChatMessageDelegate
|
||||
|
||||
init (message: ChatMessage, delegate: ChatMessageDelegate) {
|
||||
message.addDelegate(delegate: delegate)
|
||||
chatMessage = message
|
||||
chatMessageDelegate = delegate
|
||||
self.chatMessage = message
|
||||
self.chatMessageDelegate = delegate
|
||||
}
|
||||
|
||||
deinit {
|
||||
chatMessage.removeDelegate(delegate: chatMessageDelegate)
|
||||
self.chatMessage.removeDelegate(delegate: chatMessageDelegate)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -95,15 +107,15 @@ class ConversationViewModel: ObservableObject {
|
|||
|
||||
func addConversationDelegate() {
|
||||
coreContext.doOnCoreQueue { _ in
|
||||
if self.displayedConversation != nil {
|
||||
self.chatRoomDelegate = ChatRoomDelegateStub( onIsComposingReceived: { (_: ChatRoom, _: Address, _: Bool) in
|
||||
if let chatroom = self.displayedConversation?.chatRoom {
|
||||
let chatRoomDelegate = ChatRoomDelegateStub( onIsComposingReceived: { (_: ChatRoom, _: Address, _: Bool) in
|
||||
self.computeComposingLabel()
|
||||
}, onChatMessagesReceived: { (_: ChatRoom, eventLogs: [EventLog]) in
|
||||
self.getNewMessages(eventLogs: eventLogs)
|
||||
}, onChatMessageSending: { (_: ChatRoom, eventLog: EventLog) in
|
||||
self.getNewMessages(eventLogs: [eventLog])
|
||||
})
|
||||
self.displayedConversation?.chatRoom.addDelegate(delegate: self.chatRoomDelegate!)
|
||||
self.chatRoomDelegateHolder = ChatRoomDelegateHolder(chatroom: chatroom, delegate: chatRoomDelegate)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -198,14 +210,10 @@ class ConversationViewModel: ObservableObject {
|
|||
}
|
||||
|
||||
func removeConversationDelegate() {
|
||||
if let crDelegate = self.chatRoomDelegate {
|
||||
if self.displayedConversation != nil {
|
||||
self.displayedConversation!.chatRoom.removeDelegate(delegate: crDelegate)
|
||||
}
|
||||
coreContext.doOnCoreQueue { _ in
|
||||
self.chatRoomDelegateHolder = nil
|
||||
self.chatMessageDelegateHolders.removeAll()
|
||||
}
|
||||
self.chatRoomDelegate = nil
|
||||
self.chatMessageDelegateHolders.removeAll()
|
||||
self.displayedConversation = nil
|
||||
}
|
||||
|
||||
func getHistorySize() {
|
||||
|
|
@ -283,7 +291,7 @@ class ConversationViewModel: ObservableObject {
|
|||
}
|
||||
}
|
||||
|
||||
func getMessages() {
|
||||
func getMessages() {
|
||||
self.getHistorySize()
|
||||
self.getUnreadMessagesCount()
|
||||
self.getParticipantConversationModel()
|
||||
|
|
@ -1376,7 +1384,14 @@ class ConversationViewModel: ObservableObject {
|
|||
}
|
||||
|
||||
func changeDisplayedChatRoom(conversationModel: ConversationModel) {
|
||||
self.displayedConversation = conversationModel
|
||||
self.selectedMessage = nil
|
||||
self.resetMessage()
|
||||
self.removeConversationDelegate()
|
||||
withAnimation {
|
||||
self.displayedConversation = conversationModel
|
||||
}
|
||||
self.addConversationDelegate()
|
||||
self.getMessages()
|
||||
}
|
||||
|
||||
func resetDisplayedChatRoom(conversationsList: [ConversationModel]) {
|
||||
|
|
@ -1792,28 +1807,20 @@ class ConversationViewModel: ObservableObject {
|
|||
do {
|
||||
let stringAddrCleaned = stringAddr.components(separatedBy: ";gr=")
|
||||
let address = try Factory.Instance.createAddress(addr: stringAddrCleaned[0])
|
||||
if let dispChatRoom = conversationsList.first(where: {$0.chatRoom.peerAddress != nil && $0.chatRoom.peerAddress!.equal(address2: address)}) {
|
||||
if self.displayedConversation != nil {
|
||||
if dispChatRoom.id != self.displayedConversation!.id {
|
||||
DispatchQueue.main.async {
|
||||
self.removeConversationDelegate()
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||
self.selectedMessage = nil
|
||||
self.resetMessage()
|
||||
self.changeDisplayedChatRoom(conversationModel: dispChatRoom)
|
||||
self.getMessages()
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
DispatchQueue.main.async {
|
||||
self.selectedMessage = nil
|
||||
if let dispChatRoom = conversationsList.first(where: {$0.chatRoom.peerAddress != nil && $0.chatRoom.peerAddress!.equal(address2: address)}) {
|
||||
if self.displayedConversation != nil {
|
||||
if dispChatRoom.id != self.displayedConversation!.id {
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||
self.changeDisplayedChatRoom(conversationModel: dispChatRoom)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
DispatchQueue.main.async {
|
||||
self.changeDisplayedChatRoom(conversationModel: dispChatRoom)
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue