To make our lives a lot easier, we can decode our Firebase objects directly using the Codable protocol. This allows us to avoid manually setting up properties through strings and dictionaries, which is always very error-prone.
import Foundationimport FirebaseFirestoreSwiftstruct ChatMessage: Codable, Identifiable { @DocumentID var id: String? let fromId, toId, text: String let timestamp: Date}
import Foundationimport FirebaseFirestoreSwiftstruct RecentMessage: Codable, Identifiable { @DocumentID var id: String? let text, email: String let fromId, toId: String let profileImageUrl: String let timestamp: Date var username: String { email.components(separatedBy: "@").first ?? email } var timeAgo: String { let formatter = RelativeDateTimeFormatter() formatter.unitsStyle = .abbreviated return formatter.localizedString(for: timestamp, relativeTo: Date()) }}