diff --git a/.gitignore b/.gitignore index 7150d5f51c78c170f946c6d459dfd675c3cb3182..4bbaf767e833b0971dac648d17c267716498b793 100644 --- a/.gitignore +++ b/.gitignore @@ -56,7 +56,6 @@ Rambafile # # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts -Podfile.lock Carthage/Build # fastlane diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 179cef84f2b6c94ab420ddfb0319f678eaf8fdf0..e8fb31c3d4338c70e57266f2b41bebfc6df2b1bd 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -13092,7 +13092,7 @@ "${BUILT_PRODUCTS_DIR}/CryptoSwift/CryptoSwift.framework", "${BUILT_PRODUCTS_DIR}/GRDBCipher/GRDBCipher.framework", "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", - "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/GoogleToolboxForMac/GoogleToolboxForMac.framework", "${BUILT_PRODUCTS_DIR}/JTAppleCalendar/JTAppleCalendar.framework", "${BUILT_PRODUCTS_DIR}/MDFTextAccessibility/MDFTextAccessibility.framework", "${BUILT_PRODUCTS_DIR}/MaterialComponents/MaterialComponents.framework", @@ -13117,7 +13117,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CryptoSwift.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRDBCipher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleToolboxForMac.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JTAppleCalendar.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MDFTextAccessibility.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MaterialComponents.framework", diff --git a/Nynja/ChatService/ChatService.swift b/Nynja/ChatService/ChatService.swift index d2a84b297d3244e50d06ab778dc0b74b9ddf2a4c..c0afad58bd3bf254fe438ae0b062729fc47d3c63 100644 --- a/Nynja/ChatService/ChatService.swift +++ b/Nynja/ChatService/ChatService.swift @@ -6,14 +6,9 @@ // Copyright © 2018 TecSynt Solutions. All rights reserved. // -enum ReaderOwner { - case contact(String) - case room(String) -} - enum ReaderKind: Int { case other = 0 - case own = 1 + case own } final class ChatService { @@ -22,18 +17,6 @@ final class ChatService { private static let storageService = StorageService.sharedInstance // MARK: - Fetch - static func fetchReader(for owner: ReaderOwner, kind: ReaderKind) -> MessageServerId? { - let reader: Int64? - - switch owner { - case .contact(let phoneId): - reader = ContactDAO.fetchReader(for: phoneId, kind: kind) - case .room(let roomId): - reader = RoomDAO.fetchReader(for: roomId, kind: kind) - } - - return reader - } static func fetchChatModel(from message: Message) -> ChatModel? { if let p = message.feed_id as? p2p, let target = p.opponentId, let contact = ContactDAO.findContactBy(phoneId: target) { @@ -53,8 +36,8 @@ final class ChatService { if let phoneId = message.p2pFeed?.opponentId { ContactDAO.updateReader(reader, phoneId: phoneId, kind: kind) - } else if let roomId = message.mucFeed?.name { - RoomDAO.updateReader(reader, roomId: roomId, kind: kind) + } else if let roomId = message.mucFeed?.name, let phoneId = message.from { + RoomDAO.updateReader(reader, roomId: roomId, phoneId: phoneId, kind: kind) } } diff --git a/Nynja/Library/UI/Extensions/GCD.swift b/Nynja/Library/UI/Extensions/GCD.swift index 9aa6d00bdc2851f9a7c5894d55fc2289a2183790..88181367b29774605aee7a9c9ef43f5c92bb99fc 100644 --- a/Nynja/Library/UI/Extensions/GCD.swift +++ b/Nynja/Library/UI/Extensions/GCD.swift @@ -48,11 +48,7 @@ func dispatchGetDefaultQueue() -> DispatchQueue { } func dispatchAsyncMain(_ block: @escaping GCDBlock) { - if Thread.isMainThread == true { - block() - } else { - DispatchQueue.main.async(execute: block) - } + DispatchQueue.main.async(execute: block) } func dispatchAsyncDefault(_ block: @escaping GCDBlock) { diff --git a/Nynja/Modules/Message/Interactor/MessageInteractor+Fetch.swift b/Nynja/Modules/Message/Interactor/MessageInteractor+Fetch.swift index 98159365106aba6d89708e60c2f28de657089fa2..30fb03171d11b07128fab146bac7752818b2ea57 100644 --- a/Nynja/Modules/Message/Interactor/MessageInteractor+Fetch.swift +++ b/Nynja/Modules/Message/Interactor/MessageInteractor+Fetch.swift @@ -141,6 +141,7 @@ extension MessageInteractor { presentationConfiguration.position = adjustChatPosition(unreadCount) presentationConfiguration.reader = chat.otherReader presentationConfiguration.selfReader = unreadCount > 0 ? initialSelfReader : nil + presentationConfiguration.unreadCount = unreadCount presentationConfiguration.shouldShowUnread = !isAfterConnectionAppeared presentationConfiguration.links = fetchLinks() presentationConfiguration.mentions = fetchMentions(for: messages) diff --git a/Nynja/Modules/Message/Interactor/MessageInteractor.swift b/Nynja/Modules/Message/Interactor/MessageInteractor.swift index 4536f8dfb624b9da35bacea3361dbb63451698e9..9c773e57b80e4d4e72441eb605b55894955e25ee 100644 --- a/Nynja/Modules/Message/Interactor/MessageInteractor.swift +++ b/Nynja/Modules/Message/Interactor/MessageInteractor.swift @@ -261,7 +261,7 @@ final class MessageInteractor: BaseInteractor, MessageInteractorInputProtocol, H } let shouldReadInMySelf = isMyselfChat && message.isCursor - let shouldReadInOther = !message.isOwn + let shouldReadInOther = !isMyselfChat && (!message.isOwn || message.isSystem) if shouldReadInMySelf || shouldReadInOther { readMessage(serverId) diff --git a/Nynja/Modules/Message/Models/Configurations/ChatConfiguration.swift b/Nynja/Modules/Message/Models/Configurations/ChatConfiguration.swift index e800225ec6228e0635c896603bed1520127c81e8..e7da50d2c7b8576e31ada605175f6a144c6779d7 100644 --- a/Nynja/Modules/Message/Models/Configurations/ChatConfiguration.swift +++ b/Nynja/Modules/Message/Models/Configurations/ChatConfiguration.swift @@ -32,13 +32,13 @@ struct ChatConfiguration { var position: PositionType = .none var reader: Int64? var selfReader: Int64? + var unreadCount: Int = 0 var shouldShowUnread: Bool = false mutating func join(_ configuration: ChatConfiguration) { // left messages as it is, but join other data progressModels.mergeUniquingOther(with: configuration.progressModels) - repliedModels.mergeUniquingOther(with: configuration.repliedModels) stars.mergeUniquingOther(with: configuration.stars) links.mergeUniquingOther(with: configuration.links) @@ -51,6 +51,8 @@ struct ChatConfiguration { position = configuration.position reader = configuration.reader + selfReader = configuration.selfReader + unreadCount = configuration.unreadCount shouldShowUnread = configuration.shouldShowUnread } } diff --git a/Nynja/Modules/Message/Presenter/MessagePresenter+MentionUnreadCounter.swift b/Nynja/Modules/Message/Presenter/MessagePresenter+MentionUnreadCounter.swift index 2e1b5d1d110531414090b59f450fa2f8b8b79701..37fd3d4b36474e96b9d5353fd512bf6ec8abd21c 100644 --- a/Nynja/Modules/Message/Presenter/MessagePresenter+MentionUnreadCounter.swift +++ b/Nynja/Modules/Message/Presenter/MessagePresenter+MentionUnreadCounter.swift @@ -12,7 +12,7 @@ extension MessagePresenter { // MARK: - Unread Counter - func prepareMentionedMessages(in room: Room) { + func fetchMentionedMessages(in room: Room) { guard let mentions = room.mentions?.compactMap({ MessageServerId($0) }) else { return } @@ -27,11 +27,13 @@ extension MessagePresenter { defer { lastVisibleMessageId = lastUnreadId } - guard !unreadMentionIds.isEmpty, uniqueUnreadMentionIds.contains(serverMessageId) else { + guard !unreadMentionIds.isEmpty else { return lastUnreadMentionCount } - let index = unreadMentionIds.index { $0 > lastUnreadId } ?? unreadMentionIds.count - lastUnreadMentionCount = unreadMentionIds.count - index + let totalCount = unreadMentionIds.count + let index = unreadMentionIds.index { $0 > lastUnreadId } ?? totalCount + + lastUnreadMentionCount = totalCount - index return lastUnreadMentionCount } @@ -39,13 +41,18 @@ extension MessagePresenter { func showNextMentionedMessage() { guard let nextUnreadMentionedMessageServerId = nextUnreadMentionIdentifier(after: lastVisibleMessageId) else { // Should never happen but handle this case. - resetUnreadMentionCounterData() + resetMentionsCounterView() view.scrollToBottom() return } view.scrollToMessage(serverId: nextUnreadMentionedMessageServerId, at: .center, animated: true) } + func resetMentionsCounterView() { + resetUnreadMentionCounterData() + view.resetUnreadMentionCounter() + } + func updateMentionsCounter(in room: Room) { guard room.hasMentions else { return @@ -58,14 +65,6 @@ extension MessagePresenter { // MARK: - Utils - func resetMentionsCounterView() { - guard lastUnreadMentionCount > 0 else { - return - } - resetUnreadMentionCounterData() - view.resetUnreadMentionCounter() - } - private func resetUnreadMentionCounterData() { uniqueUnreadMentionIds.removeAll() unreadMentionIds.removeAll() @@ -88,7 +87,7 @@ extension MessagePresenter { return } var unique: Set = [] - for case let mention in mentions { + for mention in mentions { guard let id = MessageServerId(mention) else { continue } diff --git a/Nynja/Modules/Message/Presenter/MessagePresenter.swift b/Nynja/Modules/Message/Presenter/MessagePresenter.swift index 49d438c1771abb56eaa12b298cc8fd8f45a822cf..a567e58e07ff4e1281905aeb72671519b7ceec3c 100644 --- a/Nynja/Modules/Message/Presenter/MessagePresenter.swift +++ b/Nynja/Modules/Message/Presenter/MessagePresenter.swift @@ -71,7 +71,7 @@ class MessagePresenter: BasePresenter, MessagePresenterProtocol, MessageInteract super.screenLoaded() interactor.askForInternetStatus() - interactor.room.map { prepareMentionedMessages(in: $0) } + interactor.room.map { fetchMentionedMessages(in: $0) } } @@ -106,7 +106,7 @@ class MessagePresenter: BasePresenter, MessagePresenterProtocol, MessageInteract if wasViewDisappeared { let unreadCount = Int(interactor.chat.unreadCount) if unreadCount != 0 { - view.updateUnreadTitle(interactor.chat.selfReader) + view.updateUnreadTitle(interactor.chat.selfReader, unreadCount: unreadCount) } } } @@ -600,7 +600,11 @@ class MessagePresenter: BasePresenter, MessagePresenterProtocol, MessageInteract } } - if configuration.shouldShowUnread, let index = cells.unreadIndex(selfReader: configuration.selfReader) { + if configuration.shouldShowUnread, + let index = cells.unreadIndex( + selfReader: configuration.selfReader, + unreadCount: configuration.unreadCount) { + cells.insert(.makeUnreadModel(), at: index) unreadIndex = index } else { @@ -693,8 +697,8 @@ class MessagePresenter: BasePresenter, MessagePresenterProtocol, MessageInteract position = .unread(index) } - let isUnreadShown: Bool = configuration.shouldShowUnread && unreadIndex != nil - + let isUnreadShown = configuration.shouldShowUnread && unreadIndex != nil + return DisplayChatConfiguration(cells: cells, position: position, isUnreadShown: isUnreadShown) } diff --git a/Nynja/Modules/Message/Protocols/MessageProtocols.swift b/Nynja/Modules/Message/Protocols/MessageProtocols.swift index e9701e7f09a07de830f1e17bd74334062bc26f6e..9a5dd81bf9b164e17a372889221d16c083d0b989 100644 --- a/Nynja/Modules/Message/Protocols/MessageProtocols.swift +++ b/Nynja/Modules/Message/Protocols/MessageProtocols.swift @@ -275,7 +275,7 @@ protocol MessageViewProtocol: class { func updateMessage(_ model: BaseChatCellModel) func updateStar(starID: String?, messageId: String) - func updateUnreadTitle(_ selfRead: Int64?) + func updateUnreadTitle(_ selfRead: Int64?, unreadCount: Int) func updateUnreadMentions() func resetUnreadMentionCounter() diff --git a/Nynja/Modules/Message/View/MessageVC.swift b/Nynja/Modules/Message/View/MessageVC.swift index c8cc69c0bcc217f32c33465e6ab7e99edb326100..a4a329b916f058509586651d30dc25854e42f10a 100644 --- a/Nynja/Modules/Message/View/MessageVC.swift +++ b/Nynja/Modules/Message/View/MessageVC.swift @@ -669,6 +669,8 @@ final class MessageVC: BaseVC, MessageViewProtocol, ReplyPreviewDelegate, BackSw // MARK: - Mentions + + private(set) var isMentionsVisible = false func setupUnreadMentions(after index: Int) { var serverId = messageDS.cellModel(at: index).serverID @@ -680,14 +682,17 @@ final class MessageVC: BaseVC, MessageViewProtocol, ReplyPreviewDelegate, BackSw if let id = serverId { let count = presenter.mentionsCount(after: id) mentionCounterView.count = count - toggleMentionsCounter(count > 0) + + isMentionsVisible = count > 0 + toggleMentionsCounter(isMentionsVisible) } else { + isMentionsVisible = false presenter.resetMentionsCounterView() } } - func showNexMentionedMessage() { + private func showNexMentionedMessage() { presenter.showNextMentionedMessage() } @@ -830,8 +835,6 @@ final class MessageVC: BaseVC, MessageViewProtocol, ReplyPreviewDelegate, BackSw adjustPosition(with: configuration, isLastMessageVisible: isLastMessageVisible) adjustButtonState(configuration) - - updateUnreadMentions() } func updateNewData(_ history: [BaseChatCellModel]) { @@ -853,8 +856,6 @@ final class MessageVC: BaseVC, MessageViewProtocol, ReplyPreviewDelegate, BackSw collectionView.reloadData() loadingStatus = false - - updateUnreadMentions() } private func adjustPosition(with configuration: DisplayChatConfiguration, isLastMessageVisible: Bool) { @@ -875,8 +876,9 @@ final class MessageVC: BaseVC, MessageViewProtocol, ReplyPreviewDelegate, BackSw case .message(let localId): scrollToMessage(with: localId) case .unread(let index): - let index = messageDS.presentationIndex(from: index) + 1 + let index = messageDS.presentationIndex(from: index) scrollToUnreadMessage(with: index) + updateUnreadMentions() case .checkpoint(let checkpoint): guard case .none = lastPosition else { return @@ -1126,10 +1128,11 @@ final class MessageVC: BaseVC, MessageViewProtocol, ReplyPreviewDelegate, BackSw collectionView.reloadData() } - func updateUnreadTitle(_ selfReader: Int64?) { - guard let index = messageDS.unreadIndex(selfReader: selfReader) else { + func updateUnreadTitle(_ selfReader: Int64?, unreadCount: Int) { + guard let index = messageDS.unreadIndex(selfReader: selfReader, unreadCount: unreadCount) else { return } + let unreadIndex = messageDS.unreadCellIndex if let unreadIndex = unreadIndex { diff --git a/Nynja/Modules/Message/View/Views/CollectionView/MessageCollectionViewDataSource.swift b/Nynja/Modules/Message/View/Views/CollectionView/MessageCollectionViewDataSource.swift index 024b4252a0842d964835fb2a348cdc4508f7fdf6..bd01b92f570ffb965a655eef71f23f3657322036 100644 --- a/Nynja/Modules/Message/View/Views/CollectionView/MessageCollectionViewDataSource.swift +++ b/Nynja/Modules/Message/View/Views/CollectionView/MessageCollectionViewDataSource.swift @@ -65,8 +65,8 @@ final class MessageCollectionViewDataSource: NSObject { } } - func unreadIndex(selfReader: MessageServerId?) -> Int? { - guard let index = cells.unreadIndex(selfReader: selfReader) else { + func unreadIndex(selfReader: MessageServerId?, unreadCount: Int) -> Int? { + guard let index = cells.unreadIndex(selfReader: selfReader, unreadCount: unreadCount) else { return nil } return presentationIndex(from: index) diff --git a/Nynja/Modules/Message/View/Views/CollectionView/MessageCollectionViewDelegate.swift b/Nynja/Modules/Message/View/Views/CollectionView/MessageCollectionViewDelegate.swift index 13da59484f3b2819162aa7d74d5d43d7b2f5e120..1587fe99aa582e41b535604a4efc2696fbb9a4b7 100644 --- a/Nynja/Modules/Message/View/Views/CollectionView/MessageCollectionViewDelegate.swift +++ b/Nynja/Modules/Message/View/Views/CollectionView/MessageCollectionViewDelegate.swift @@ -97,6 +97,10 @@ final class MessageCollectionViewDelegate: NSObject, UICollectionViewDelegateFlo // MARK: - Private private func setupMentions(cell: UICollectionViewCell, indexPath: IndexPath) { + guard view.isMentionsVisible else { + lastVisibleIndex = nil + return + } func setup() { lastVisibleIndex = indexPath.item view.setupUnreadMentions(after: indexPath.item) diff --git a/Nynja/Modules/Message/View/Views/TableView/Cells/Models/BaseChatCellModel.swift b/Nynja/Modules/Message/View/Views/TableView/Cells/Models/BaseChatCellModel.swift index cdc3c66d2e0a1b39bddb3b9e1c34a75c5b6e27f4..41459284e5ea1a4d3783350d3d56ec6a0be8491c 100644 --- a/Nynja/Modules/Message/View/Views/TableView/Cells/Models/BaseChatCellModel.swift +++ b/Nynja/Modules/Message/View/Views/TableView/Cells/Models/BaseChatCellModel.swift @@ -264,8 +264,8 @@ extension BaseChatCellModel { extension Array where Element == BaseChatCellModel { - func unreadIndex(selfReader: MessageServerId?) -> Int? { - guard let lastSeenIndex = self.lastSeenIndex(selfReader: selfReader) else { + func unreadIndex(selfReader: MessageServerId?, unreadCount: Int) -> Int? { + guard let lastSeenIndex = self.lastSeenIndex(selfReader: selfReader, unreadCount: unreadCount) else { return nil } @@ -282,17 +282,25 @@ extension Array where Element == BaseChatCellModel { return nil } - private func lastSeenIndex(selfReader: MessageServerId?) -> Int? { + private func lastSeenIndex(selfReader: MessageServerId?, unreadCount: Int) -> Int? { guard let selfReader = selfReader else { return nil } - return self.lastIndex { (cell) -> Bool in + let possibleIndex = self.lastIndex { (cell) -> Bool in guard let serverId = cell.serverID else { return false } return serverId <= selfReader } + + if let index = possibleIndex { + return index + } else if unreadCount <= self.count(where: { $0.modelType.isMessage }) { + return 0 + } + + return nil } } diff --git a/Nynja/Modules/Stickers/View/CollectionView/Cells/Sticker/StickerCellModel.swift b/Nynja/Modules/Stickers/View/CollectionView/Cells/Sticker/StickerCellModel.swift index fc0bd9728c17cabd364ba5905b2adc53a5c7a79f..0dfe5344b922f11243768f357d85335c7c517bb4 100644 --- a/Nynja/Modules/Stickers/View/CollectionView/Cells/Sticker/StickerCellModel.swift +++ b/Nynja/Modules/Stickers/View/CollectionView/Cells/Sticker/StickerCellModel.swift @@ -17,8 +17,8 @@ struct StickerCellModel: CellViewModel { let sticker: Sticker func setup(cell: StickerCollectionViewCell) { - cell.imageView.setImage(url: sticker.url, placeHolder: nil, accessibilityPrefix: nil) { (_, _) in - cell.setupTestingKeys() + cell.imageView.setImage(url: sticker.url) { [weak cell] _, _ in + cell?.setupTestingKeys() } } } diff --git a/Nynja/Modules/Stickers/View/CollectionView/Cells/Sticker/StickerCollectionViewCell.swift b/Nynja/Modules/Stickers/View/CollectionView/Cells/Sticker/StickerCollectionViewCell.swift index 172ab910c7f4901fcab2be28c011a46d18ad8f97..7771cb68c543216043a3407260abcfa7ace4e1a8 100644 --- a/Nynja/Modules/Stickers/View/CollectionView/Cells/Sticker/StickerCollectionViewCell.swift +++ b/Nynja/Modules/Stickers/View/CollectionView/Cells/Sticker/StickerCollectionViewCell.swift @@ -55,6 +55,7 @@ final class StickerCollectionViewCell: UICollectionViewCell, ScalableCell, Testa imageView.transform = .identity } + // MARK: - Testable func setupTestingKeys() { diff --git a/Nynja/RoomDAO.swift b/Nynja/RoomDAO.swift index ddefef3d8c684caa208603782dcf092810bf8962..477c02b81058823b5e6851286b4431f1dc1fb93a 100644 --- a/Nynja/RoomDAO.swift +++ b/Nynja/RoomDAO.swift @@ -73,13 +73,11 @@ class RoomDAO: RoomDAOProtocol { .asRequest(of: Int64.self) .fetchOne(db) } - } else { - guard let phoneId = StorageService.sharedInstance.phoneId else { - return nil - } - + } else if let phoneId = StorageService.sharedInstance.phoneId { return MemberDAO.findMemberBy(roomId: roomId, phoneId: phoneId)?.reader } + + return nil } // MARK: -- Mentions @@ -122,35 +120,42 @@ class RoomDAO: RoomDAOProtocol { } // MARK: -- Fields - static func updateReader(_ reader: Int64, roomId: String, kind: ReaderKind) { + static func updateReader(_ reader: Int64, roomId: String, phoneId: String, kind: ReaderKind) { if kind == .other { - updateOtherReader(reader, roomId: roomId) - } else { - updateOwnReader(reader, roomId: roomId) + updateChatReader(reader, roomId: roomId) + } else if kind == .own { + updateMentions(with: reader, roomId: roomId) } + + MemberDAO.updateReader(reader, roomId: roomId, phoneId: phoneId) } - private static func updateOtherReader(_ reader: Int64, roomId: String) { - // Remove mentions that has been read. - let unreadMentions = fetchMentions(for: roomId)?.compactMap { $0 > reader ? $0 as AnyObject : nil } - - let room = Room() - room.id = roomId - room.readers = [reader as AnyObject] - room.mentions = unreadMentions + private static func updateChatReader(_ reader: Int64, roomId: String) { + guard let room = fetchRoom(by: roomId), + let oldReader = room.reader, + oldReader < reader else { + return + } - let columns: Set = [RoomTable.Column.reader.title, RoomTable.Column.mentions.title] + room.reader = reader + let columns: Set = [RoomTable.Column.reader.title] try? dbManager.perform(action: .updateColumns(columns), with: room) } - private static func updateOwnReader(_ reader: Int64, roomId: String) { - guard let phoneId = StorageService.sharedInstance.phoneId, - let member = MemberDAO.findMemberBy(roomId: roomId, phoneId: phoneId) else { - return + private static func updateMentions(with reader: Int64, roomId: String) { + let mentions = fetchMentions(for: roomId) ?? [] + guard !mentions.isEmpty else { + return } - member.reader = reader - MemberDAO.updateColumns([.reader], member: member) + let unreadMentions = mentions.compactMap { $0 > reader ? $0 as AnyObject : nil } + + let room = Room() + room.id = roomId + room.mentions = unreadMentions + + let columns: Set = [RoomTable.Column.mentions.title] + try? dbManager.perform(action: .updateColumns(columns), with: room) } static func updatedMentions(with message: Message, roomId: String) -> UpdateResult<[Int64]> { diff --git a/Nynja/RoomDAOProtocol.swift b/Nynja/RoomDAOProtocol.swift index 2dd4ef83b9a118a651842d46f9f6cd09ef4c7dab..0cd19c45180d660e226a397c92fca37a18021469 100644 --- a/Nynja/RoomDAOProtocol.swift +++ b/Nynja/RoomDAOProtocol.swift @@ -29,7 +29,7 @@ protocol RoomDAOProtocol: DAOProtocol { static func updateColumns(_ columns: Set, room: Room) // MARK: -- Fields - static func updateReader(_ reader: Int64, roomId: String, kind: ReaderKind) + static func updateReader(_ reader: Int64, roomId: String, phoneId: String, kind: ReaderKind) static func updatedMentions(with message: Message, roomId: String) -> UpdateResult<[Int64]> // MARK: - Contains Members diff --git a/Nynja/Services/Aps.swift b/Nynja/Services/Aps.swift index 14a69cd788fd5ed5409acaf7ea5fab6b51948c5c..89a705a03b030db37c03cf8815f42a866064955a 100644 --- a/Nynja/Services/Aps.swift +++ b/Nynja/Services/Aps.swift @@ -109,18 +109,19 @@ struct Aps { } } if text == nil, - let desc = chat?.last_msg?.mainFile, - let type = desc.type { + let desc = chat?.last_msg?.mainFile, + let type = desc.type { + if (contact?.status as? StringAtom)?.string == "friend" && (desc.payload == "" && desc.mime == "text") { + return "\(sender ?? "") accepted your contact request! Send a message!" + } switch type { case .sticker: let stick: String = desc.messageRepresentation ?? "" text = "\(sender ?? ""): \(stick)" - default: - if (contact?.status as? StringAtom)?.string == "friend" { - text = "\(sender ?? "") accepted your contact request! Send a message!" - break - } + case .audio,.contact,.location,.image,.video,.file,.place: text = "\(sender ?? ""): \(type.messageDescription)" + default: + break } } if text == nil, let c = contact { diff --git a/Nynja/Services/HandleServices/MessageHandler.swift b/Nynja/Services/HandleServices/MessageHandler.swift index 8b2f411a16be814166bf6fe9ccab4a734bc60fc6..b585642f2f3393f57c8bafb42eeb83a4f6964391 100644 --- a/Nynja/Services/HandleServices/MessageHandler.swift +++ b/Nynja/Services/HandleServices/MessageHandler.swift @@ -80,10 +80,7 @@ final class MessageHandler: BaseHandler { } if let oldMessage = MessageDAO.fetchMessage(serverId: link) { - oldMessage.files = message.files - - oldMessage.markAsEdited() - oldMessage.messageStatus = nil + oldMessage.edit(by: message) do { try saveIntoDatabase(message: oldMessage) diff --git a/Nynja/Services/HandleServices/RoomHandler.swift b/Nynja/Services/HandleServices/RoomHandler.swift index 34d7b905ca0083944f6776b5dee90eafcef250a9..06de24f4ee5e3dd97dc57f247b9cb71d9411ce2c 100644 --- a/Nynja/Services/HandleServices/RoomHandler.swift +++ b/Nynja/Services/HandleServices/RoomHandler.swift @@ -39,6 +39,7 @@ class RoomHandler: BaseHandler { switch status { case .get: RoomDAO.updateRoom(room) { (new, old) in + new.mentions = old.mentions new.message = old.message return new } diff --git a/Nynja/Services/Member/MemberDAO.swift b/Nynja/Services/Member/MemberDAO.swift index 9af0b48c9664cc286b2069c90bd6cead643662ba..9cf7ed62a213c754530a8e8225a72be8f597268f 100644 --- a/Nynja/Services/Member/MemberDAO.swift +++ b/Nynja/Services/Member/MemberDAO.swift @@ -60,4 +60,13 @@ class MemberDAO: MemberDAOProtocol { try? dbManager.perform(action: .updateColumns(columns), with: member) } + static func updateReader(_ reader: Int64, roomId: String, phoneId: String) { + guard let member = MemberDAO.findMemberBy(roomId: roomId, phoneId: phoneId) else { + return + } + + member.reader = reader + MemberDAO.updateColumns([.reader], member: member) + } + } diff --git a/Nynja/Services/Member/MemberDAOProtocol.swift b/Nynja/Services/Member/MemberDAOProtocol.swift index 379bd5a8ba9fef92b8a4734f2a796d85c77c9615..a8d461120e5eafe0a3de125159ba54602ef286a6 100644 --- a/Nynja/Services/Member/MemberDAOProtocol.swift +++ b/Nynja/Services/Member/MemberDAOProtocol.swift @@ -19,5 +19,6 @@ protocol MemberDAOProtocol: DAOProtocol { // MARK: - Update static func updateColumns(_ columns: Set, member: Member) + static func updateReader(_ reader: Int64, roomId: String, phoneId: String) } diff --git a/Nynja/Services/PushService.swift b/Nynja/Services/PushService.swift index 4a4fd9ccc897b1ae7075a5bd5b429a940c50a996..14b78315ad8b534e934d6456dfaa37bdf75d66a1 100644 --- a/Nynja/Services/PushService.swift +++ b/Nynja/Services/PushService.swift @@ -90,8 +90,14 @@ final class PushService: NSObject, PKPushRegistryDelegate, UserSettingsRespondab removePushesFromChat(message) case .updateHistory: if let room = aps.room { - guard let reader = room.reader else { return } - RoomDAO.updateColumns([.unread, .reader], room: room) + guard let reader = room.selfReader, + let phoneId = room.selfMember?.phone_id, + let roomId = room.id else { + return + } + + MemberDAO.updateReader(reader, roomId: roomId, phoneId: phoneId) + RoomDAO.updateColumns([.unread], room: room) readPushes(feed: room, reader: reader) } if let contact = aps.contact { @@ -102,8 +108,10 @@ final class PushService: NSObject, PKPushRegistryDelegate, UserSettingsRespondab case .messageDelete: guard let message = getMessage(aps) else { return } try? saveIntoDatabase(message: message) - ChatService.removeMessage(message) - removePush(message) + if MessageDAO.shouldMarkMessageAsDeleted(message) { + ChatService.removeMessage(message) + removePush(message) + } case .messageEdit: guard let message = getMessage(aps) else { return } try? saveIntoDatabase(message: message) @@ -113,10 +121,7 @@ final class PushService: NSObject, PKPushRegistryDelegate, UserSettingsRespondab } if let oldMessage = MessageDAO.fetchMessage(serverId: link) { - oldMessage.files = message.files - - oldMessage.markAsEdited() - oldMessage.messageStatus = nil + oldMessage.edit(by: message) do { try saveIntoDatabase(message: oldMessage) diff --git a/Nynja/WCBaseItemsFactory.swift b/Nynja/WCBaseItemsFactory.swift index 58b219d27fa9330bce9af5569ac7f378e0a044e3..89afd7baae615583a7520d72c957f03bd80fad83 100644 --- a/Nynja/WCBaseItemsFactory.swift +++ b/Nynja/WCBaseItemsFactory.swift @@ -94,7 +94,8 @@ class WCBaseItemsFactory: WCItemsFactory { var channels: ImageActionItemModel { return ImageActionItemModel(nameImage: "ic_channel_inactive", navItem: .channels) { [weak navigateDelegate] (item, indexPath) in - navigateDelegate?.showChannels(indexPath: indexPath) + // navigateDelegate?.showChannels(indexPath: indexPath) + navigateDelegate?.unavailableFunctionality() } } diff --git a/Podfile b/Podfile index 7591f30d602ae50d0dc7ecb78b2c5be0f5504dd0..c026df3ca051992265bb4c9d36a0272220e23758 100644 --- a/Podfile +++ b/Podfile @@ -26,7 +26,7 @@ def commonPodsForNynja pod 'QRCode' pod 'CocoaLumberjack', :git => 'https://github.com/CocoaLumberjack/CocoaLumberjack', :commit => '12948ff' pod 'AWSS3', '~> 2.6.1' - pod 'SDWebImage', '~> 4.0' + pod 'SDWebImage', '~> 4.4.2' pod 'GoogleMaps' pod 'GooglePlaces' @@ -55,7 +55,7 @@ def commonPodsForNynjaTests pod 'QRCode' pod 'CocoaLumberjack', :git => 'https://github.com/CocoaLumberjack/CocoaLumberjack', :commit => '12948ff' pod 'AWSS3', '~> 2.6.1' - pod 'SDWebImage', '~> 4.0' + pod 'SDWebImage', '~> 4.4.2' pod 'GoogleMaps' pod 'GooglePlaces' @@ -71,7 +71,7 @@ def commonPodsForNynjaShare pod 'AWSS3', '~> 2.6.1' pod 'CocoaMQTT' pod 'SnapKit', '~> 4.0.0' - pod 'SDWebImage', '~> 4.0' + pod 'SDWebImage', '~> 4.4.2' pod 'GRDBCipher', '~> 2.10.0' pod 'CryptoSwift' end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000000000000000000000000000000000000..a3585957b5ad4844d2e5a9cd933f0aaf59a920de --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,178 @@ +PODS: + - AutoScrollLabel (0.4.3) + - AWSCore (2.6.19) + - AWSS3 (2.6.19): + - AWSCore (= 2.6.19) + - CocoaAsyncSocket (7.6.3) + - CocoaLumberjack (3.2.1): + - CocoaLumberjack/Default (= 3.2.1) + - CocoaLumberjack/Extensions (= 3.2.1) + - CocoaLumberjack/Default (3.2.1) + - CocoaLumberjack/Extensions (3.2.1): + - CocoaLumberjack/Default + - CocoaMQTT (1.1.2): + - CocoaAsyncSocket (~> 7.6.1) + - SwiftyTimer (~> 2.0.0) + - Crashlytics (3.8.6): + - Fabric (~> 1.6.3) + - CryptoSwift (0.10.0) + - Fabric (1.6.13) + - Firebase/Auth (5.1.0): + - Firebase/CoreOnly + - FirebaseAuth (= 5.0.0) + - Firebase/CoreOnly (5.1.0): + - FirebaseCore (= 5.0.2) + - Firebase/Storage (5.1.0): + - Firebase/CoreOnly + - FirebaseStorage (= 3.0.0) + - FirebaseAuth (5.0.0): + - FirebaseCore (~> 5.0) + - GTMSessionFetcher/Core (~> 1.1) + - FirebaseCore (5.0.2): + - "GoogleToolboxForMac/NSData+zlib (~> 2.1)" + - FirebaseStorage (3.0.0): + - FirebaseCore (~> 5.0) + - GTMSessionFetcher/Core (~> 1.1) + - GoogleMaps (2.7.0): + - GoogleMaps/Maps (= 2.7.0) + - GoogleMaps/Base (2.7.0) + - GoogleMaps/Maps (2.7.0): + - GoogleMaps/Base + - GooglePlaces (2.7.0): + - GoogleMaps/Base (= 2.7.0) + - GoogleToolboxForMac/Defines (2.1.4) + - "GoogleToolboxForMac/NSData+zlib (2.1.4)": + - GoogleToolboxForMac/Defines (= 2.1.4) + - GRDBCipher (2.10.0): + - SQLCipher (~> 3.4.1) + - GTMSessionFetcher/Core (1.1.15) + - JTAppleCalendar (7.1.5) + - libPhoneNumber-iOS (0.9.13) + - MaterialComponents/FlexibleHeader (55.3.0): + - MaterialComponents/private/Application + - MaterialComponents/private/UIMetrics + - MDFTextAccessibility + - MaterialComponents/private/Application (55.3.0) + - MaterialComponents/private/UIMetrics (55.3.0): + - MaterialComponents/private/Application + - MDFTextAccessibility (1.2.0) + - MulticastDelegateSwift (2.1.1) + - NynjaSDK (1.5.5) + - QRCode (2.0) + - SDWebImage (4.4.2): + - SDWebImage/Core (= 4.4.2) + - SDWebImage/Core (4.4.2) + - SnapKit (4.0.0) + - SQLCipher (3.4.2): + - SQLCipher/standard (= 3.4.2) + - SQLCipher/common (3.4.2) + - SQLCipher/standard (3.4.2): + - SQLCipher/common + - SwiftyJSON (4.0.0) + - SwiftyTimer (2.0.0) + - TestFairy (1.13.4) + +DEPENDENCIES: + - AutoScrollLabel + - AWSS3 (~> 2.6.1) + - CocoaLumberjack (from `https://github.com/CocoaLumberjack/CocoaLumberjack`, commit `12948ff`) + - CocoaMQTT + - Crashlytics (~> 3.8.6) + - CryptoSwift + - Fabric (~> 1.6.13) + - Firebase/Auth + - Firebase/Storage + - GoogleMaps + - GooglePlaces + - GRDBCipher (~> 2.10.0) + - JTAppleCalendar (~> 7.0) + - libPhoneNumber-iOS (~> 0.8) + - MaterialComponents/FlexibleHeader + - MulticastDelegateSwift (~> 2.1.1) + - NynjaSDK (= 1.5.5) + - QRCode + - SDWebImage (~> 4.4.2) + - SnapKit (~> 4.0.0) + - SwiftyJSON (~> 4.0.0) + - TestFairy (~> 1.13.1) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - AutoScrollLabel + - AWSCore + - AWSS3 + - CocoaAsyncSocket + - CocoaMQTT + - Crashlytics + - CryptoSwift + - Fabric + - Firebase + - FirebaseAuth + - FirebaseCore + - FirebaseStorage + - GoogleMaps + - GooglePlaces + - GoogleToolboxForMac + - GRDBCipher + - GTMSessionFetcher + - JTAppleCalendar + - libPhoneNumber-iOS + - MaterialComponents + - MDFTextAccessibility + - MulticastDelegateSwift + - QRCode + - SDWebImage + - SnapKit + - SQLCipher + - SwiftyJSON + - SwiftyTimer + - TestFairy + https://nynjagroup.jfrog.io/nynjagroup/api/pods/cocoapods-local: + - NynjaSDK + +EXTERNAL SOURCES: + CocoaLumberjack: + :commit: 12948ff + :git: https://github.com/CocoaLumberjack/CocoaLumberjack + +CHECKOUT OPTIONS: + CocoaLumberjack: + :commit: 12948ff + :git: https://github.com/CocoaLumberjack/CocoaLumberjack + +SPEC CHECKSUMS: + AutoScrollLabel: bee53a1d4532569b49cbecaf9b80ca003bed3767 + AWSCore: 3019940607dee2a467e0a8de638649d9fcb9afc3 + AWSS3: 003ab3d5b42cd512d812d9227cd927d0345b739b + CocoaAsyncSocket: eafaa68a7e0ec99ead0a7b35015e0bf25d2c8987 + CocoaLumberjack: 520616f8e72226ca2c729b43981b66bc483745ce + CocoaMQTT: d33ab3cd4e329f9f1cfbb62e25306a318a606616 + Crashlytics: 95d05f4e4c19a771250c4bd9ce344d996de32bbf + CryptoSwift: 6c778d69282bed3b4e975ff97a79d074f20bb011 + Fabric: 2fb5676bc811af011a04513451f463dac6803206 + Firebase: e08fb0795f35707aeb1d8a715c731c45bdf6fd56 + FirebaseAuth: acbeef02fe7c3a26624e309849f3fe30c84115af + FirebaseCore: b81044df1044c0857a0737c6324678b72d4f7f00 + FirebaseStorage: 7ca4bb7b58a25fa647b04f524033fc7cb7eb272b + GoogleMaps: f79af95cb24d869457b1f961c93d3ce8b2f3b848 + GooglePlaces: 3d06e6c99654545b4738ce49648745779c25f2ef + GoogleToolboxForMac: 91c824d21e85b31c2aae9bb011c5027c9b4e738f + GRDBCipher: eef21d242c727a21e0f87ad44f8ea2df03edd252 + GTMSessionFetcher: 5fa5b80fd20e439ef5f545fb2cb3ca6c6714caa2 + JTAppleCalendar: 2d4f974f9f3c8b4964d51ca1f6e004883c031fbe + libPhoneNumber-iOS: e444379ac18bbfbdefad571da735b2cd7e096caa + MaterialComponents: 915f4e844400a35db3ea4c710a9af40aa8bcb093 + MDFTextAccessibility: 94098925e0853551c5a311ce7c1ecefbe297cdb6 + MulticastDelegateSwift: 93eb077c24f50574b3f8a3f23bf71be6de6e3b41 + NynjaSDK: 172c9fb3500e41621588e66822be3b2afd040a65 + QRCode: f98a1886c8f37523704a7512a4c0cd45b34c18a4 + SDWebImage: 624d6e296c69b244bcede364c72ae0430ac14681 + SnapKit: a42d492c16e80209130a3379f73596c3454b7694 + SQLCipher: f9fcf29b2e59ced7defc2a2bdd0ebe79b40d4990 + SwiftyJSON: 070dabdcb1beb81b247c65ffa3a79dbbfb3b48aa + SwiftyTimer: 2efd74b060d69ad4f1496baf5bbedbe132125fcf + TestFairy: 842f8ddc45477b208eb85326b0418047b40f7137 + +PODFILE CHECKSUM: 15b9c2aebe41ec75db76990258a9b24479322460 + +COCOAPODS: 1.5.3 diff --git a/Shared/Library/Extensions/Models/Message/MessageExtension.swift b/Shared/Library/Extensions/Models/Message/MessageExtension.swift index 3b25236b89faaaaafd7480bcce4bd054ca27cd82..5e1fbf9465eb4b94b305b3353754973696e0d356 100644 --- a/Shared/Library/Extensions/Models/Message/MessageExtension.swift +++ b/Shared/Library/Extensions/Models/Message/MessageExtension.swift @@ -123,6 +123,18 @@ extension Message { } } +// MARK: - Actions + +extension Message { + + func edit(by message: Message) { + files = message.files + mentioned = message.mentioned + markAsEdited() + messageStatus = nil + } +} + // MARK: - Feed extension Message { diff --git a/Shared/Library/Extensions/Models/Room/Room+BaseChatModel.swift b/Shared/Library/Extensions/Models/Room/Room+BaseChatModel.swift index 68e9ed45506acbde912eb98d268e66ef6cb55b44..ee3c6ff7860a6399eef609c0f8f16c844e8badd6 100644 --- a/Shared/Library/Extensions/Models/Room/Room+BaseChatModel.swift +++ b/Shared/Library/Extensions/Models/Room/Room+BaseChatModel.swift @@ -18,7 +18,7 @@ extension Room: BaseChatModel { var selfReader: Int64? { get { - return allMembers?.filter { $0.phone_id == StorageService.sharedInstance.phoneId}.first?.reader + return selfMember?.reader } }