From 1fd242122f594ba0812763fe2f9cfc12055f20b3 Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Thu, 30 Mar 2023 18:08:18 +0200 Subject: [PATCH] Add checkbox for delete messages --- .../ChatConversationTableViewModel.swift | 18 ++++- .../ChatConversationTableViewSwift.swift | 25 +++++-- .../Views/ChatConversationViewSwift.swift | 5 +- .../Chat/Views/MultilineMessageCell.swift | 68 +++++++++++++++---- 4 files changed, 94 insertions(+), 22 deletions(-) diff --git a/Classes/Swift/Chat/ViewModels/ChatConversationTableViewModel.swift b/Classes/Swift/Chat/ViewModels/ChatConversationTableViewModel.swift index 2b5cc5ace..cd9a0de5f 100644 --- a/Classes/Swift/Chat/ViewModels/ChatConversationTableViewModel.swift +++ b/Classes/Swift/Chat/ViewModels/ChatConversationTableViewModel.swift @@ -13,8 +13,6 @@ import linphonesw class ChatConversationTableViewModel: ControlsViewModel { static let sharedModel = ChatConversationTableViewModel() - - var messageListHistory : [ChatMessage] = [] var chatRoom: ChatRoom? = nil @@ -26,6 +24,8 @@ class ChatConversationTableViewModel: ControlsViewModel { var editModeOn = MutableLiveData(false) + var messageListSelected = MutableLiveData<[Bool]>([]) + override init() { super.init() } @@ -87,4 +87,18 @@ class ChatConversationTableViewModel: ControlsViewModel { func changeEditMode(editMode :Bool){ editModeOn.value = editMode } + + func selectAllMessages(){ + for i in 0...messageListSelected.value!.count { + messageListSelected.value![i] = true + } + refreshIndexPath.value! += 1 + } + + func unSelectAllMessages(){ + for i in 0...messageListSelected.value!.count { + messageListSelected.value![i] = false + } + refreshIndexPath.value! += 1 + } } diff --git a/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift index 81e732c72..850c1ec23 100644 --- a/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift +++ b/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift @@ -58,7 +58,7 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour } ChatConversationTableViewModel.sharedModel.editModeOn.observe { mode in - self.changeEditMode(editModeOn: mode!) + self.collectionView.reloadData() } @@ -150,6 +150,9 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour self.scrollToBottom() } } + if ChatConversationTableViewModel.sharedModel.editModeOn.value! { + ChatConversationTableViewModel.sharedModel.messageListSelected.value!.insert(false, at: 0) + } } func refreshData(){ @@ -170,6 +173,9 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour scrollBadge!.isHidden = false scrollBadge!.text = "\(ChatConversationViewModel.sharedModel.chatRoom?.unreadMessagesCount ?? 0)" } + if ChatConversationTableViewModel.sharedModel.editModeOn.value! { + ChatConversationTableViewModel.sharedModel.messageListSelected.value!.insert(false, at: 0) + } } func scrollViewDidScroll(_ scrollView: UIScrollView) { @@ -193,7 +199,14 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MultilineMessageCell.reuseId, for: indexPath) as! MultilineMessageCell if let event = ChatConversationTableViewModel.sharedModel.getMessage(index: indexPath.row){ - cell.configure(event: event, selfIndexPathConfigure: indexPath) + + if(ChatConversationTableViewModel.sharedModel.editModeOn.value! && indexPath.row >= ChatConversationTableViewModel.sharedModel.messageListSelected.value!.count){ + for _ in ChatConversationTableViewModel.sharedModel.messageListSelected.value!.count...indexPath.row { + ChatConversationTableViewModel.sharedModel.messageListSelected.value!.append(false) + } + } + + cell.configure(event: event, selfIndexPathConfigure: indexPath, editMode: ChatConversationTableViewModel.sharedModel.editModeOn.value!, selected: ChatConversationTableViewModel.sharedModel.editModeOn.value! ? ChatConversationTableViewModel.sharedModel.messageListSelected.value![indexPath.row] : false) if (event.chatMessage != nil){ cell.onLongClickOneClick { @@ -416,6 +429,10 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour } func deleteMessage(message: ChatMessage){ + if ChatConversationTableViewModel.sharedModel.editModeOn.value! { + let indexDeletedMessage = ChatConversationTableViewModel.sharedModel.getIndexMessage(message: message) + ChatConversationTableViewModel.sharedModel.messageListSelected.value!.remove(at: indexDeletedMessage) + } message.chatRoom?.deleteMessage(message: message) collectionView.reloadData() } @@ -499,8 +516,4 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour } } } - - func changeEditMode(editModeOn: Bool){ - - } } diff --git a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift index d0ed86d91..eb2977cb1 100644 --- a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift +++ b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift @@ -605,12 +605,13 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll override func editModeOn(){ super.editModeOn() - //tableController.setEditing(true, animated: false) + ChatConversationTableViewModel.sharedModel.changeEditMode(editMode: true) } override func editModeOff(){ super.editModeOff() - //tableController.setEditing(false, animated: false) + ChatConversationTableViewModel.sharedModel.messageListSelected.value?.removeAll() + ChatConversationTableViewModel.sharedModel.changeEditMode(editMode: false) } override func selectDeselectAll(){ diff --git a/Classes/Swift/Chat/Views/MultilineMessageCell.swift b/Classes/Swift/Chat/Views/MultilineMessageCell.swift index 4371d5784..83b4ef6bd 100644 --- a/Classes/Swift/Chat/Views/MultilineMessageCell.swift +++ b/Classes/Swift/Chat/Views/MultilineMessageCell.swift @@ -134,16 +134,21 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI var selfIndexMessage: Int = -1 + var deleteItemCheckBox = StyledCheckBox() + override init(frame: CGRect) { super.init(frame: frame) + //CheckBox for select item to delete + contentView.addSubview(deleteItemCheckBox) + //Event Message contentView.addSubview(eventMessageView) constraintEventMesssage = [ eventMessageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0), eventMessageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0), eventMessageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 0), - eventMessageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: 0) + eventMessageView.trailingAnchor.constraint(equalTo: deleteItemCheckBox.leadingAnchor, constant: 0) ] eventMessageView.height(40).done() @@ -166,17 +171,17 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI eventMessageView.isHidden = true + //Message contentView.addSubview(contactDateLabel) constraintDateBubble = contactDateLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 4) constraintDateBubbleHidden = contactDateLabel.topAnchor.constraint(equalTo: contentView.topAnchor) constraintDateLeadingBubble = contactDateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 40) - constraintDateTrailingBubble = contactDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -22) + constraintDateTrailingBubble = contactDateLabel.trailingAnchor.constraint(equalTo: deleteItemCheckBox.leadingAnchor, constant: -22) constraintDateBubble!.isActive = true contactDateLabel.isHidden = true - contentView.addSubview(contentBubble) contentBubble.translatesAutoresizingMaskIntoConstraints = false constraintBubble = [ @@ -184,7 +189,7 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI contentBubble.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0) ] constraintLeadingBubble = contentBubble.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 40) - constraintTrailingBubble = contentBubble.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -22) + constraintTrailingBubble = contentBubble.trailingAnchor.constraint(equalTo: deleteItemCheckBox.leadingAnchor, constant: -22) NSLayoutConstraint.activate(constraintBubble) constraintLeadingBubble!.isActive = true @@ -205,7 +210,7 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI contentBubble.addSubview(chatRead) chatRead.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -2).isActive = true - chatRead.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -8).isActive = true + chatRead.trailingAnchor.constraint(equalTo: deleteItemCheckBox.leadingAnchor, constant: -8).isActive = true chatRead.size(w: 10, h: 10).done() chatRead.isHidden = true @@ -562,10 +567,11 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI super.prepareForReuse() } - func configure(event: EventLog, selfIndexPathConfigure: IndexPath) { + func configure(event: EventLog, selfIndexPathConfigure: IndexPath, editMode: Bool, selected: Bool) { selfIndexMessage = selfIndexPathConfigure.row chatMessage = event.chatMessage addMessageDelegate() + if event.chatMessage != nil { contentBubble.isHidden = false eventMessageView.isHidden = true @@ -573,14 +579,25 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI NSLayoutConstraint.deactivate(constraintEventMesssage) NSLayoutConstraint.deactivate(constraintEventMesssageLabel) if !event.chatMessage!.isOutgoing { - constraintLeadingBubble?.isActive = true - constraintTrailingBubble?.isActive = false + if editMode { + constraintLeadingBubble?.isActive = false + constraintTrailingBubble?.isActive = true + }else{ + constraintLeadingBubble?.isActive = true + constraintTrailingBubble?.isActive = false + } + imageUser.isHidden = false if isFirstIndexInTableView(indexPath: selfIndexPathConfigure, chat: event.chatMessage!) { imageUser.fillFromAddress(address: (event.chatMessage?.fromAddress)!) contactDateLabel.text = contactDateForChat(message: event.chatMessage!) contactDateLabel.isHidden = false - constraintDateLeadingBubble?.isActive = true + if editMode { + constraintDateTrailingBubble?.isActive = true + contactDateLabel.textAlignment = .right + }else{ + constraintDateLeadingBubble?.isActive = true + } contactDateLabel.size(w: 200, h: 20).done() }else{ constraintDateBubble?.isActive = false @@ -895,6 +912,29 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI eventMessageLabel.textColor = UIColor("D").withAlphaComponent(0.6) } } + + if (editMode) { + deleteItemCheckBox.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -18).isActive = true + deleteItemCheckBox.isSelected = selected + if (event.chatMessage != nil){ + deleteItemCheckBox.matchCenterYOf(view: contentBubble).done() + }else{ + deleteItemCheckBox.matchCenterYOf(view: contentView).done() + } + imageUser.isHidden = true + contentView.onClick { + self.deleteItemCheckBox.isSelected = !self.deleteItemCheckBox.isSelected + ChatConversationTableViewModel.sharedModel.messageListSelected.value![self.selfIndexMessage] = self.deleteItemCheckBox.isSelected + } + deleteItemCheckBox.onClick { + self.deleteItemCheckBox.isSelected = !self.deleteItemCheckBox.isSelected + ChatConversationTableViewModel.sharedModel.messageListSelected.value![self.selfIndexMessage] = self.deleteItemCheckBox.isSelected + } + }else{ + deleteItemCheckBox.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: 0).isActive = true + deleteItemCheckBox.isHidden = true + deleteItemCheckBox.width(0).done() + } } @@ -1332,17 +1372,21 @@ class MultilineMessageCell: UICollectionViewCell, UICollectionViewDataSource, UI break } } - if((chatMessage?.contents.count)! > 1){ + if((chatMessage?.contents.count)! > 1 && indexUploadTransferProgress > -1){ uploadContentCollection[indexUploadTransferProgress]!.circularProgressBarView.isHidden = false } } if((chatMessage?.contents.count)! > 1){ DispatchQueue.main.async(execute: { [self] in if (offset == total) { - uploadContentCollection[indexUploadTransferProgress]!.circularProgressBarView.isHidden = true + if(indexUploadTransferProgress > -1){ + uploadContentCollection[indexUploadTransferProgress]!.circularProgressBarView.isHidden = true + } indexUploadTransferProgress = -1 } else { - uploadContentCollection[indexUploadTransferProgress]!.setUpCircularProgressBarView(toValue: p) + if(indexUploadTransferProgress > -1){ + uploadContentCollection[indexUploadTransferProgress]!.setUpCircularProgressBarView(toValue: p) + } } }) }