Move (almost) all chatroom delegate management into changeDisplayedChatRoom

This commit is contained in:
QuentinArguillere 2024-10-03 12:19:16 +02:00
parent bbce741911
commit be09800b5a
7 changed files with 58 additions and 118 deletions

View file

@ -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!)
}
}
}

View file

@ -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")

View file

@ -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!)
}
}
}

View file

@ -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
}
}
}

View file

@ -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) {

View file

@ -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
}

View file

@ -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 {
}
}
}