When Users have a conversation, I want the conversations to be displayed in a tableViewController. For example, if User1 sends 10 messages to User2, then I should have one cell in my TableView that displays the last message sent in User1 - User2 conversation. Again, if User1 sends User3 4 messages then User1 should have two tableView cells and User2 and User3 should only have 1 message. My database looks like this:
messages
hx1DXeMFRU
-KkVUFuhv7xsYVhnjldV
ReceiverId: "hx1DX1hW5JZMSmDjwQRUYo3i5Yt2"
senderId: "eMFRUhfmckTq9cRWNnwIc9mqxxv1"
text:"hey"
convoId: hx1DXeMFRU
timestamp: 1495193736.860723
-KkVUJG8VPOijCvzMKRf
ReceiverId: "eMFRUhfmckTq9cRWNnwIc9mqxxv1"
senderId: "hx1DX1hW5JZMSmDjwQRUYo3i5Yt2"
text:"Hey how are you?"
convoId: hx1DXeMFRU
timestamp: 1495193699.448048
I am using the below function to retrieve all messages and view them in a messagesViewController. However, when I try to append the conversation between two unique users, it instead appends all of the messages into one cell. So in my specific example, I should have two cells, one for User1 communicating with User2 and User1 communicating with User3.
import UIKit
import Firebase
import FirebaseStorage
import FirebaseAuth
import FBSDKCoreKit
import FBSDKLoginKit
import FirebaseDatabase
import JSQMessagesViewController
class MessagesTableViewController: UITableViewController {
var databaseRef = FIRDatabase.database().reference()
var loggedInUser = FIRAuth.auth()?.currentUser
var loggedInUserUid = FIRAuth.auth()?.currentUser?.uid
var dictDetails: [String:AnyObject]?
var messages = NSMutableArray()
var messagesArray = [String]()
var convoId: String?
var receiverData: AnyObject?
let storage = FIRStorage.storage()
var senderId = FIRAuth.auth()?.currentUser?.uid
@IBOutlet var MessageTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.barTintColor = UIColor(red:0.23, green:0.73, blue:1.00, alpha:1.0)
self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
self.navigationItem.title = "Messages"
self.navigationItem.rightBarButtonItem?.tintColor = UIColor.white
self.navigationItem.leftBarButtonItem?.tintColor = UIColor.white
loadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func loadData()
{
let uidToFind = loggedInUserUid as String!
FIRDatabase.database().reference().child("messages")
.queryOrdered(byChild: "ReceiverId")
.queryEqual(toValue: uidToFind).queryLimited(toLast: 1)
.observe(.childAdded, with: { snapshot in
let msgDict = snapshot.value as! [String: Any]
let msg = msgDict["ReceiverId"] as! String
self.messages = []
self.messages.append(msg)
self.MessageTableView.reloadData()
})
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if messages.count > 0 {
tableView.backgroundView = .none;
tableView.separatorStyle = .singleLine
return self.messages.count
}
else{
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height))
noDataLabel.text = "No Messages"
noDataLabel.textColor = UIColor.lightGray
noDataLabel.textAlignment = .center
tableView.backgroundView = noDataLabel
tableView.separatorStyle = .none
return 0
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageTableViewCell
//Configure the cell
print(messages[indexPath.row])
let message = self.messages[indexPath.row] as! [String: AnyObject]
if let seconds = message["timestamp"] as? Double {
let timeStampDate = NSDate(timeIntervalSince1970: seconds)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
cell.Time.text = dateFormatter.string(from: timeStampDate as Date)
}
cell.Message.text = message["text"] as? String
if let imageName = message["ReceiverId"] as? String {
let ref = FIRDatabase.database().reference().child("posts").child(imageName)
ref.observeSingleEvent(of: .value, with: { (snapshot)
in
if let dictionary = snapshot.value as? [String: AnyObject]{
for post in dictionary {
let messages = post.value as! [String: AnyObject]
for (id, value) in messages {
cell.SellerName.text = messages["username"] as? String
if (messages["uid"] as? String) != nil {
let uidPoster = messages["uid"] as? String
let imageRef = FIRStorage.storage().reference().child((uidPoster)!+"/profile_pic.jpg")
imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
let image = UIImage(data: data!)
cell.UserPic.image = image
cell.UserPic.layer.cornerRadius = 30
cell.UserPic.clipsToBounds = true
}else {
}})}
self.messages.add(value)
}}}})}
return cell
}
}