Chat framework
โ๏ธ Serverless - Firebase Cloud Firestore
โ๏ธ Realtime
โ๏ธ Customizable
โ๏ธ Type Safe
โ๏ธ Multi Media
- Text
- Image
- Video
- Audio
- Location
- Sticker
- ImageMap
pod 'Muni' add to your Podfile
pod install GoogleService-Info.plist add to your Project
UserProtocol RoomProtocol TranscriptProtocol create document conforming to each protocol.
@objcMembers class User: Object, UserProtocol { var name: String? var thumbnailImage: File? }@objcMembers class Room: Object, RoomProtocol { typealias TranscriptType = Transcript dynamic var name: String? dynamic var thumbnailImage: File? dynamic var viewers: [String] = [] dynamic var members: [String] = [] dynamic var recentTranscript: [String: Any] = [:] dynamic var transcripts: NestedCollection<TranscriptType> = [] dynamic var config: [String: Any] = [:] dynamic var isMessagingEnabled: Bool = true dynamic var isHidden: Bool = false dynamic var lastViewedTimestamps: [String : Timestamp] = [:] }@objcMembers class Transcript: Object, TranscriptProtocol { dynamic var to: Relation<Room> = .init() dynamic var from: Relation<User> = .init() dynamic var text: String? dynamic var image: File? dynamic var video: File? dynamic var audio: File? dynamic var location: GeoPoint? dynamic var sticker: String? dynamic var imageMap: [File] = [] }class MessageViewController: Muni<User, Room, Transcript>.MessagesViewController { var sendBarItem: ToolbarItem! override var senderID: String? { return Auth.auth().currentUser!.uid } override func viewDidLoad() { super.viewDidLoad() self.sendBarItem = ToolbarItem(title: "Send", target: self, action: #selector(send)) self.toolBar.setItems([ToolbarItem(customView: self.textView), self.sendBarItem], animated: false) // Start self.listen() } override func transcript(willSend transcript: Transcript) -> Bool { guard let text: String = self.textView.text else { return false } if text.isEmpty { return false } transcript.text = text self.textView.text = nil return true } }class BoxViewController: Muni<User, Room, Transcript>.InboxViewController { override func viewDidLoad() { super.viewDidLoad() // Start self.listen() } override func messageViewController(with room: Room) -> Muni<User, Room, Transcript>.MessagesViewController { return MessageViewController(roomID: room.id) } }Muni internally uses Firestore Query. An error occurs if there is no Index in Firestore. You can create an Index by accessing the URL on the console.
