From f87acd28a60b4863ce1bc2f7aff8fb2140b52287 Mon Sep 17 00:00:00 2001 From: Dominic Vedericho <> Date: Wed, 18 Dec 2019 13:57:00 +0700 Subject: [PATCH] update version 1.0.20, handle emit user update, changing App-Version to SDK-Version in network header --- .../xcschemes/Pods-TapTalk.xcscheme | 24 +- .../xcschemes/xcschememanagement.plist | 22 ++ TapTalk.podspec | 2 +- TapTalk.xcodeproj/project.pbxproj | 4 +- .../UserInterfaceState.xcuserstate | Bin 68105 -> 110298 bytes TapTalk/Managers/TAPChatManager.m | 8 +- TapTalk/Managers/TAPContactManager.m | 34 +++ .../TAPCoreManager/TAPCoreChatRoomManager.m | 4 +- TapTalk/Managers/TAPNetworkManager.m | 2 +- .../TAPProfileViewController.m | 59 ++++- .../TapUIChatViewController.m | 247 +++++++++++++----- .../TapUIRoomListViewController.m | 14 + .../TAPMyChatBubbleTableViewCell.m | 2 +- .../TAPMyFileBubbleTableViewCell.m | 2 +- .../TAPMyImageBubbleTableViewCell.m | 2 +- .../TAPMyLocationBubbleTableViewCell.m | 2 +- .../TAPRoomListTableViewCell.m | 61 ++++- .../TAPSearchResultChatTableViewCell.m | 61 ++++- .../TAPYourChatBubbleTableViewCell.m | 39 ++- .../TAPYourChatDeletedBubbleTableViewCell.m | 32 ++- .../TAPYourFileBubbleTableViewCell.m | 38 ++- .../TAPYourImageBubbleTableViewCell.m | 35 ++- .../TAPYourLocationBubbleTableViewCell.m | 31 ++- .../TAPYourVideoBubbleTableViewCell.m | 35 ++- 24 files changed, 607 insertions(+), 153 deletions(-) diff --git a/Pods/Pods.xcodeproj/xcuserdata/dominicvedericho.xcuserdatad/xcschemes/Pods-TapTalk.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/dominicvedericho.xcuserdatad/xcschemes/Pods-TapTalk.xcscheme index 6ccf464..e14a2ca 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/dominicvedericho.xcuserdatad/xcschemes/Pods-TapTalk.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/dominicvedericho.xcuserdatad/xcschemes/Pods-TapTalk.xcscheme @@ -7,15 +7,15 @@ buildImplicitDependencies = "YES"> <BuildActionEntries> <BuildActionEntry - buildForAnalyzing = "YES" buildForTesting = "YES" buildForRunning = "YES" buildForProfiling = "YES" - buildForArchiving = "YES"> + buildForArchiving = "YES" + buildForAnalyzing = "YES"> <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "ECEFF4DE87169A8335FFBC8B46312B9E" - BuildableName = "Pods-TapTalk.framework" + BuildableName = "Pods_TapTalk.framework" BlueprintName = "Pods-TapTalk" ReferencedContainer = "container:Pods.xcodeproj"> </BuildableReference> @@ -23,14 +23,15 @@ </BuildActionEntries> </BuildAction> <TestAction + buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES" - buildConfiguration = "Debug"> - <AdditionalOptions> - </AdditionalOptions> + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + </Testables> </TestAction> <LaunchAction + buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" @@ -38,17 +39,14 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" - buildConfiguration = "Debug" allowLocationSimulation = "YES"> - <AdditionalOptions> - </AdditionalOptions> </LaunchAction> <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" savedToolIdentifier = "" useCustomWorkingDirectory = "NO" - debugDocumentVersioning = "YES" - buildConfiguration = "Release" - shouldUseLaunchSchemeArgsEnv = "YES"> + debugDocumentVersioning = "YES"> </ProfileAction> <AnalyzeAction buildConfiguration = "Debug"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/dominicvedericho.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/dominicvedericho.xcuserdatad/xcschemes/xcschememanagement.plist index d44f323..4d26c9f 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/dominicvedericho.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Pods/Pods.xcodeproj/xcuserdata/dominicvedericho.xcuserdatad/xcschemes/xcschememanagement.plist @@ -8,56 +8,78 @@ <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>0</integer> </dict> <key>GoogleMaps.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>1</integer> </dict> <key>GooglePlacePicker.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>2</integer> </dict> <key>GooglePlaces.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>3</integer> </dict> <key>JSONModel.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>4</integer> </dict> <key>PodAsset.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>5</integer> </dict> <key>Pods-TapTalk.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>6</integer> </dict> <key>Realm.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>7</integer> </dict> <key>SDWebImage.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>8</integer> </dict> <key>SocketRocket.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>9</integer> </dict> <key>ZSWTappableLabel.xcscheme</key> <dict> <key>isShown</key> <false/> + <key>orderHint</key> + <integer>10</integer> </dict> </dict> <key>SuppressBuildableAutocreation</key> diff --git a/TapTalk.podspec b/TapTalk.podspec index 0897481..60f9862 100644 --- a/TapTalk.podspec +++ b/TapTalk.podspec @@ -3,7 +3,7 @@ Pod::Spec.new do |s| # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # s.name = "TapTalk" - s.version = "1.0.18" + s.version = "1.0.20" s.summary = "TapTalk.io is a complete in-app chat SDK and messaging API. Its in-app chat feature give you and your user the best in-app chat experience, it provides you with UI Based implementation and code based implementation and fully customizable." s.homepage = "https://taptalk.io" diff --git a/TapTalk.xcodeproj/project.pbxproj b/TapTalk.xcodeproj/project.pbxproj index 18cb36c..a1cd834 100644 --- a/TapTalk.xcodeproj/project.pbxproj +++ b/TapTalk.xcodeproj/project.pbxproj @@ -2142,7 +2142,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.0.17; + MARKETING_VERSION = 1.0.20; PRODUCT_BUNDLE_IDENTIFIER = io.TapTalk.TapTalk; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -2176,7 +2176,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.0.17; + MARKETING_VERSION = 1.0.20; PRODUCT_BUNDLE_IDENTIFIER = io.TapTalk.TapTalk; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; diff --git a/TapTalk.xcworkspace/xcuserdata/dominicvedericho.xcuserdatad/UserInterfaceState.xcuserstate b/TapTalk.xcworkspace/xcuserdata/dominicvedericho.xcuserdatad/UserInterfaceState.xcuserstate index fd121278fe547c3cfa78ffa26ea5c10949ecba17..1851855c7e7b51bada52e66f53228961b60088c1 100644 GIT binary patch literal 110298 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%0DDVhd<zDeWw!ou#z1ly;Wh58A}_QI%50q0E4W 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 K`zPe8bN&yv#nJ)* delta 32372 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 R`vUx5X6pX0|362x{{y7(+kF54 diff --git a/TapTalk/Managers/TAPChatManager.m b/TapTalk/Managers/TAPChatManager.m index c1e4bc7..5941f9d 100644 --- a/TapTalk/Managers/TAPChatManager.m +++ b/TapTalk/Managers/TAPChatManager.m @@ -460,7 +460,7 @@ TAPMessageModel *quotedMessage = (TAPMessageModel *)quotedMessageObject; quotedMessage = [quotedMessage copy]; - if ([quotedMessage.quote.fileType isEqualToString:[NSString stringWithFormat: @"%ld", TAPChatMessageTypeFile]]) { + if ([quotedMessage.quote.fileType isEqualToString:[NSString stringWithFormat: @"%ld", TAPChatMessageTypeFile]] || [quotedMessage.quote.fileType isEqualToString:@"file"]) { //TYPE FILE message.quote = quotedMessage.quote; } @@ -762,7 +762,7 @@ //if message quoted from message model then should construct quote and reply to model TAPMessageModel *quotedMessage = (TAPMessageModel *)quotedMessageObject; quotedMessage = [quotedMessage copy]; - if ([quotedMessage.quote.fileType isEqualToString:[NSString stringWithFormat: @"%ld", TAPChatMessageTypeFile]]) { + if ([quotedMessage.quote.fileType isEqualToString:[NSString stringWithFormat: @"%ld", TAPChatMessageTypeFile]] || [quotedMessage.quote.fileType isEqualToString:@"file"]) { //TYPE FILE message.quote = quotedMessage.quote; } @@ -854,7 +854,7 @@ //if message quoted from message model then should construct quote and reply to model TAPMessageModel *quotedMessage = (TAPMessageModel *)quotedMessageObject; quotedMessage = [quotedMessage copy]; - if ([quotedMessage.quote.fileType isEqualToString:[NSString stringWithFormat: @"%ld", TAPChatMessageTypeFile]]) { + if ([quotedMessage.quote.fileType isEqualToString:[NSString stringWithFormat: @"%ld", TAPChatMessageTypeFile]] || [quotedMessage.quote.fileType isEqualToString:@"file"]) { //TYPE FILE message.quote = quotedMessage.quote; } @@ -1015,7 +1015,7 @@ TAPMessageModel *decryptedMessage = [TAPEncryptorManager decryptToMessageModelFromDictionary:dataDictionary]; //Add User to Contact Manager - [[TAPContactManager sharedManager] addContactWithUserModel:decryptedMessage.user saveToDatabase:NO]; + [[TAPContactManager sharedManager] addContactWithUserModel:decryptedMessage.user saveToDatabase:YES]; decryptedMessage.isSending = NO; diff --git a/TapTalk/Managers/TAPContactManager.m b/TapTalk/Managers/TAPContactManager.m index d5c7c67..584226a 100644 --- a/TapTalk/Managers/TAPContactManager.m +++ b/TapTalk/Managers/TAPContactManager.m @@ -68,6 +68,12 @@ TAPUserModel *activeUser = [TAPDataManager getActiveUser]; if(user.userID != activeUser.userID && user.userID != nil) { //if user != self set to Dictionary + + TAPUserModel *currentSavedUser = [self.contactUserDictionary objectForKey:user.userID]; + if ([user.updated longValue] < [currentSavedUser.updated longValue]) { + return; + } + [self.contactUserDictionary setObject:user forKey:user.userID]; [self.phoneUserDictionary setObject:user forKey:user.phoneWithCode]; @@ -81,6 +87,17 @@ }]; } } + else { + //update active user data + if (user.userID != nil) { + TAPUserModel *currentSavedUser = [self.contactUserDictionary objectForKey:user.userID]; + if ([user.updated longValue] < [currentSavedUser.updated longValue]) { + return; + } + + [TAPDataManager setActiveUser:user]; + } + } } - (void)addContactWithUserArray:(NSArray <TAPUserModel *> *)userArray saveToDatabase:(BOOL)save { @@ -95,6 +112,12 @@ TAPUserModel *activeUser = [TAPDataManager getActiveUser]; if(user.userID != activeUser.userID && user.userID != nil) { //if user != self set to Dictionary + + TAPUserModel *currentSavedUser = [self.contactUserDictionary objectForKey:user.userID]; + if ([user.updated longValue] < [currentSavedUser.updated longValue]) { + return; + } + [self.contactUserDictionary setObject:user forKey:user.userID]; [self.phoneUserDictionary setObject:user forKey:user.phoneWithCode]; @@ -102,6 +125,17 @@ [userDataArray addObject:user]; } } + else { + //update active user data + if (user.userID != nil) { + TAPUserModel *currentSavedUser = [self.contactUserDictionary objectForKey:user.userID]; + if ([user.updated longValue] < [currentSavedUser.updated longValue]) { + return; + } + + [TAPDataManager setActiveUser:user]; + } + } } if(save) { diff --git a/TapTalk/Managers/TAPCoreManager/TAPCoreChatRoomManager.m b/TapTalk/Managers/TAPCoreManager/TAPCoreChatRoomManager.m index 4577da2..6ad9adb 100644 --- a/TapTalk/Managers/TAPCoreManager/TAPCoreChatRoomManager.m +++ b/TapTalk/Managers/TAPCoreManager/TAPCoreChatRoomManager.m @@ -102,7 +102,9 @@ success(generatedRoom); } -- (void)getGroupChatRoomWithGroupRoomID:(NSString *)groupRoomID success:(void (^)(TAPRoomModel *room))success failure:(void (^)(NSError *error))failure { +- (void)getGroupChatRoomWithGroupRoomID:(NSString *)groupRoomID + success:(void (^)(TAPRoomModel *room))success + failure:(void (^)(NSError *error))failure { TAPRoomModel *obtainedRoom = [[TAPGroupManager sharedManager] getRoomWithRoomID:groupRoomID]; if (obtainedRoom == nil) { [TAPDataManager callAPIGetRoomWithRoomID:groupRoomID success:^(TAPRoomModel *room) { diff --git a/TapTalk/Managers/TAPNetworkManager.m b/TapTalk/Managers/TAPNetworkManager.m index 2d73722..f3952a1 100644 --- a/TapTalk/Managers/TAPNetworkManager.m +++ b/TapTalk/Managers/TAPNetworkManager.m @@ -73,7 +73,7 @@ static const NSInteger kAPITimeOut = 60; [manager.requestSerializer setValue:[[UIDevice currentDevice] model] forHTTPHeaderField:@"Device-Model"]; [manager.requestSerializer setValue:@"ios" forHTTPHeaderField:@"Device-Platform"]; [manager.requestSerializer setValue:[[UIDevice currentDevice] systemVersion] forHTTPHeaderField:@"Device-OS-Version"]; - [manager.requestSerializer setValue:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] forHTTPHeaderField:@"App-Version"]; + [manager.requestSerializer setValue:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] forHTTPHeaderField:@"SDK-Version"]; [manager.requestSerializer setValue:@"ios" forHTTPHeaderField:@"User-Agent"]; [manager.requestSerializer setTimeoutInterval:kAPITimeOut]; diff --git a/TapTalk/View Controllers/TAPProfileViewController.m b/TapTalk/View Controllers/TAPProfileViewController.m index 61475dd..b55129f 100644 --- a/TapTalk/View Controllers/TAPProfileViewController.m +++ b/TapTalk/View Controllers/TAPProfileViewController.m @@ -91,9 +91,60 @@ [self.profileView.navigationEditButton addTarget:self action:@selector(editButtonDidTapped) forControlEvents:UIControlEventTouchUpInside]; [self.profileView.editButton addTarget:self action:@selector(editButtonDidTapped) forControlEvents:UIControlEventTouchUpInside]; - - NSString *profileImageURL = self.room.imageURL.fullsize; + NSString *profileImageURL = @""; + NSString *roomName = @""; + if (self.room.type == RoomTypePersonal) { + NSString *otherUserID = [[TAPChatManager sharedManager] getOtherUserIDWithRoomID:self.room.roomID]; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:otherUserID]; + if([self.room.deleted longValue] != 0) { + profileImageURL = @""; + } + if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + profileImageURL = obtainedUser.imageURL.fullsize; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + else { + profileImageURL = self.room.imageURL.fullsize; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + + if (obtainedUser != nil && obtainedUser.fullname != nil && [self.room.deleted longValue] == 0) { + roomName = obtainedUser.fullname; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + else { + roomName = self.room.name; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + } + else if (self.room.type == RoomTypeGroup) { + TAPRoomModel *obtainedRoom = [[TAPGroupManager sharedManager] getRoomWithRoomID:self.room.roomID]; + NSString *groupProfileImageURL = obtainedRoom.imageURL.fullsize; + groupProfileImageURL = [TAPUtil nullToEmptyString:groupProfileImageURL]; + + NSString *groupRoomName = obtainedRoom.name; + groupRoomName = [TAPUtil nullToEmptyString:groupRoomName]; + + if ([groupProfileImageURL isEqualToString:@""]) { + profileImageURL = self.room.imageURL.fullsize; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + else { + profileImageURL = groupProfileImageURL; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + + if ([groupRoomName isEqualToString:@""]) { + roomName = self.room.name; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + else { + roomName = groupRoomName; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + } + if (profileImageURL == nil || [profileImageURL isEqualToString:@""]) { if (self.room.type == RoomTypePersonal) { //Personal @@ -108,8 +159,8 @@ [self.profileView.profileImageView setImageWithURLString:profileImageURL]; } - self.profileView.nameLabel.text = self.room.name; - self.profileView.navigationNameLabel.text = self.room.name; + self.profileView.nameLabel.text = roomName; + self.profileView.navigationNameLabel.text = roomName; if (self.tapProfileViewControllerType == TAPProfileViewControllerTypeDefault) { if (self.room.type == RoomTypePersonal) { diff --git a/TapTalk/View Controllers/TapUIChatViewController.m b/TapTalk/View Controllers/TapUIChatViewController.m index 332cff4..dc626d5 100644 --- a/TapTalk/View Controllers/TapUIChatViewController.m +++ b/TapTalk/View Controllers/TapUIChatViewController.m @@ -264,7 +264,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { - (void)setupNavigationViewData; - (void)setupInputAccessoryView; - (void)setupDeletedRoomView; -- (void)showDeletedRoomView:(BOOL)show isGroup:(BOOL)isGroup withDeleteButton:(BOOL)withDeleteButton; +- (void)showDeletedRoomView:(BOOL)show isGroup:(BOOL)isGroup; - (void)setDeleteRoomButtonAsLoading:(BOOL)loading animated:(BOOL)animated; - (void)setupKickedGroupView; - (void)checkAndSetupAddToContactsView; @@ -284,7 +284,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { - (void)firstLoadData; - (void)fetchBeforeMessageFromAPIAndUpdateUIWithRoomID:(NSString *)roomID maxCreated:(NSNumber *)maxCreated; - (void)retrieveExistingMessages; -- (void)updateMessageDataAndUIWithMessages:(NSArray *)messageArray checkFirstUnreadMessage:(BOOL)checkFirstUnreadMessage toTop:(BOOL)toTop withCompletionHandler:(void(^)())completionHandler; +- (void)updateMessageDataAndUIWithMessages:(NSArray *)messageArray checkFirstUnreadMessage:(BOOL)checkFirstUnreadMessage toTop:(BOOL)toTop updateUserDetail:(BOOL)updateUserDetail withCompletionHandler:(void(^)())completionHandler; - (void)sortAndFilterMessageArray; - (void)updateMessageModelValueWithMessage:(TAPMessageModel *)message; - (void)callAPIAfterAndUpdateUIAndScrollToTop:(BOOL)scrollToTop; @@ -351,7 +351,6 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { - (void)refreshRoomStatusUIInfo; - (void)refreshTypingLabelState; -- (void)setRoomNotAvailable; - (void)checkAndShowRoomViewState; @end @@ -537,15 +536,8 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { [self setupDeletedRoomView]; [self setupKickedGroupView]; - if (!self.currentRoom.isDeleted) { - //load data - [self firstLoadData]; - } - else { - //set not available and delete room data - [self setRoomNotAvailable]; - return; - } + //load data + [self firstLoadData]; [[TAPChatManager sharedManager] refreshShouldRefreshOnlineStatus]; @@ -661,19 +653,29 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { //check if last message is deleted room TAPMessageModel *lastMessage = [self.messageArray firstObject]; - if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/removeParticipant"] && [lastMessage.target.targetID isEqualToString:[TAPDataManager getActiveUser].userID]) { + if (lastMessage.room.type == RoomTypePersonal && lastMessage.room.isDeleted) { + [self.view endEditing:YES]; + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/removeParticipant"] && [lastMessage.target.targetID isEqualToString:[TAPDataManager getActiveUser].userID]) { //Check if system message with action remove participant and target user is current user //show deleted chat room view [self.view endEditing:YES]; - [self showDeletedRoomView:YES isGroup:YES withDeleteButton:YES]; + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:NO]; } else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/delete"]) { [self.view endEditing:YES]; - [self setRoomNotAvailable]; + + if (lastMessage.room.type == RoomTypePersonal) { + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + else if (lastMessage.room.type == RoomTypeGroup) { + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:YES]; + } } else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/leave"] && [lastMessage.user.userID isEqualToString:[TAPDataManager getActiveUser].userID]) { [self.view endEditing:YES]; - [self showDeletedRoomView:YES isGroup:NO withDeleteButton:YES]; + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; } else { [self showInputAccessoryView]; @@ -1628,12 +1630,16 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { [self handleMessageFromSocket:message isUpdatedMessage:NO]; //Check if user remove us from the group while we are inside the chat room, handle the case - if (message.type == TAPChatMessageTypeSystemMessage && [message.action isEqualToString:@"room/removeParticipant"]) { + if (message.room.type == RoomTypePersonal && message.room.isDeleted) { + [self.view endEditing:YES]; + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + else if (message.type == TAPChatMessageTypeSystemMessage && [message.action isEqualToString:@"room/removeParticipant"]) { if ([message.target.targetID isEqualToString:[TAPDataManager getActiveUser].userID]) { //Check if system message with action remove participant and target user is current user //show deleted chat room view [self.view endEditing:YES]; - [self showDeletedRoomView:YES isGroup:YES withDeleteButton:YES]; + [self showDeletedRoomView:YES isGroup:YES]; } //refresh room members by API [self checkAndRefreshOnlineStatus]; @@ -1641,14 +1647,20 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { else if (message.type == TAPChatMessageTypeSystemMessage && [message.action isEqualToString:@"room/addParticipant"]) { if ([message.target.targetID isEqualToString:[TAPDataManager getActiveUser].userID]) { [self.view endEditing:YES]; - [self showDeletedRoomView:NO isGroup:YES withDeleteButton:YES]; + [self showDeletedRoomView:NO isGroup:YES isGroupDeleted:NO]; } //refresh room members by API [self checkAndRefreshOnlineStatus]; } else if (message.type == TAPChatMessageTypeSystemMessage && [message.action isEqualToString:@"room/delete"]) { [self.view endEditing:YES]; - [self setRoomNotAvailable]; + + if (message.room.type == RoomTypePersonal) { + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + else if (message.room.type == RoomTypeGroup) { + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:YES]; + } } } @@ -1661,6 +1673,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { [self handleMessageFromSocket:message isUpdatedMessage:YES]; } + - (void)chatManagerDidReceiveOnlineStatus:(TAPOnlineStatusModel *)onlineStatus { _onlineStatus = onlineStatus; NSTimeInterval currentLastSeen = (double)self.onlineStatus.lastActive.doubleValue/1000.0f; @@ -2181,8 +2194,19 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { TAPQuoteModel *quote = [TAPQuoteModel new]; quote.fileID = [TAPUtil nullToEmptyString:[quotedMessageModel.data objectForKey:@"fileID"]]; quote.title = fileName; - quote.content = [NSString stringWithFormat:@"%@ %@", fileSize, fileExtension];; - quote.fileType = [NSString stringWithFormat:@"%ld", quotedMessageModel.type]; + quote.content = [NSString stringWithFormat:@"%@ %@", fileSize, fileExtension]; + + NSString *fileTypeString = @""; + if (quotedMessageModel.type == TAPChatMessageTypeImage) { + fileTypeString = @"image"; + } + else if (quotedMessageModel.type == TAPChatMessageTypeVideo) { + fileTypeString = @"video"; + } + else if (quotedMessageModel.type == TAPChatMessageTypeFile) { + fileTypeString = @"file"; + } + quote.fileType = fileTypeString; [self setQuoteWithQuote:quote userID:quotedMessageModel.user.userID]; quotedMessageModel.quote = quote; @@ -3061,8 +3085,18 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { TAPQuoteModel *quote = [TAPQuoteModel new]; quote.fileID = [TAPUtil nullToEmptyString:[quotedMessageModel.data objectForKey:@"fileID"]]; quote.title = fileName; - quote.content = [NSString stringWithFormat:@"%@ %@", fileSize, fileExtension];; - quote.fileType = [NSString stringWithFormat:@"%ld", quotedMessageModel.type]; + quote.content = [NSString stringWithFormat:@"%@ %@", fileSize, fileExtension]; + NSString *fileTypeString = @""; + if (quotedMessageModel.type == TAPChatMessageTypeImage) { + fileTypeString = @"image"; + } + else if (quotedMessageModel.type == TAPChatMessageTypeVideo) { + fileTypeString = @"video"; + } + else if (quotedMessageModel.type == TAPChatMessageTypeFile) { + fileTypeString = @"file"; + } + quote.fileType = fileTypeString; [self setQuoteWithQuote:quote userID:quotedMessageModel.user.userID]; quotedMessageModel.quote = quote; @@ -3905,13 +3939,18 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { self.deletedRoomViewHeightConstraint.constant = [TAPUtil safeAreaBottomPadding] + kInputMessageAccessoryViewHeight; } -- (void)showDeletedRoomView:(BOOL)show isGroup:(BOOL)isGroup withDeleteButton:(BOOL)withDeleteButton { +- (void)showDeletedRoomView:(BOOL)show isGroup:(BOOL)isGroup isGroupDeleted:(BOOL)isGroupDeleted { [self.messageTextView resignFirstResponder]; [self.secondaryTextField resignFirstResponder]; if (isGroup) { - self.deletedRoomContentLabel.text = NSLocalizedString(@"You are no longer a participant in this group", @""); + if (isGroupDeleted) { + self.deletedRoomContentLabel.text = NSLocalizedString(@"Sorry, this group is unavailable", @""); + } + else { + self.deletedRoomContentLabel.text = NSLocalizedString(@"You are no longer a participant in this group", @""); + } } else { self.deletedRoomContentLabel.text = NSLocalizedString(@"This user is no longer available", @""); @@ -3923,15 +3962,19 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { _isShowAccessoryView = NO; [self reloadInputViews]; - if (withDeleteButton) { - //74 is button height and padding - self.deletedRoomViewHeightConstraint.constant = [TAPUtil safeAreaBottomPadding] + kInputMessageAccessoryViewHeight + 74.0f; - self.tableViewBottomConstraint.constant = kInputMessageAccessoryViewHeight + 74.0f; - } - else { - self.deletedRoomViewHeightConstraint.constant = [TAPUtil safeAreaBottomPadding] + kInputMessageAccessoryViewHeight; - self.tableViewBottomConstraint.constant = kInputMessageAccessoryViewHeight; - } +// if (withDeleteButton) { +// //74 is button height and padding +// self.deletedRoomViewHeightConstraint.constant = [TAPUtil safeAreaBottomPadding] + kInputMessageAccessoryViewHeight + 74.0f; +// self.tableViewBottomConstraint.constant = kInputMessageAccessoryViewHeight + 74.0f; +// } +// else { +// self.deletedRoomViewHeightConstraint.constant = [TAPUtil safeAreaBottomPadding] + kInputMessageAccessoryViewHeight; +// self.tableViewBottomConstraint.constant = kInputMessageAccessoryViewHeight; +// } + + //74 is button height and padding + self.deletedRoomViewHeightConstraint.constant = [TAPUtil safeAreaBottomPadding] + kInputMessageAccessoryViewHeight + 74.0f; + self.tableViewBottomConstraint.constant = kInputMessageAccessoryViewHeight + 74.0f; self.deletedRoomView.alpha = 1.0f; } @@ -5263,7 +5306,17 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { quote.fileID = [TAPUtil nullToEmptyString:[quotedMessageModel.data objectForKey:@"fileID"]]; quote.title = fileName; quote.content = [NSString stringWithFormat:@"%@ %@", fileSize, fileExtension]; - quote.fileType = [NSString stringWithFormat:@"%ld", quotedMessageModel.type]; + NSString *fileTypeString = @""; + if (quotedMessageModel.type == TAPChatMessageTypeImage) { + fileTypeString = @"image"; + } + else if (quotedMessageModel.type == TAPChatMessageTypeVideo) { + fileTypeString = @"video"; + } + else if (quotedMessageModel.type == TAPChatMessageTypeFile) { + fileTypeString = @"file"; + } + quote.fileType = fileTypeString; [self setQuoteWithQuote:quote userID:quotedMessageModel.user.userID]; quotedMessageModel.quote = quote; @@ -5498,7 +5551,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { self.quoteSubtitleLabel.text = quote.content; - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.quoteFileView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; @@ -5631,6 +5684,35 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { } [TAPDataManager getMessageWithRoomID:roomID lastMessageTimeStamp:[NSNumber numberWithDouble:createdDate] limitData:TAP_NUMBER_OF_ITEMS_CHAT success:^(NSArray<TAPMessageModel *> *obtainedMessageArray) { + + //DV Note - check method checkAndShowRoomViewState too if wants to update code below + //Check if room is deleted or kicked + TAPMessageModel *lastMessage = [obtainedMessageArray firstObject]; + if (lastMessage.room.type == RoomTypePersonal && lastMessage.room.isDeleted) { + [self.view endEditing:YES]; + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/removeParticipant"] && [lastMessage.target.targetID isEqualToString:[TAPDataManager getActiveUser].userID]) { + //Check if system message with action remove participant and target user is current user + //show deleted chat room view + [self.view endEditing:YES]; + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:NO]; + } + else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/delete"]) { + [self.view endEditing:YES]; + if (lastMessage.room.type == RoomTypePersonal) { + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + else if (lastMessage.room.type == RoomTypeGroup) { + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:YES]; + } + } + else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/leave"] && [lastMessage.user.userID isEqualToString:[TAPDataManager getActiveUser].userID]) { + [self.view endEditing:YES]; + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + //END DV Note + if ([obtainedMessageArray count] == 0) { //No chat history, first time chat [self checkEmptyState]; @@ -5646,7 +5728,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { } else { //Has existing chat - [self updateMessageDataAndUIWithMessages:obtainedMessageArray checkFirstUnreadMessage:NO toTop:NO withCompletionHandler:^{ + [self updateMessageDataAndUIWithMessages:obtainedMessageArray checkFirstUnreadMessage:NO toTop:NO updateUserDetail:NO withCompletionHandler:^{ TAPMessageModel *earliestMessage = [obtainedMessageArray objectAtIndex:[obtainedMessageArray count] - 1]; NSNumber *minCreated = earliestMessage.created; _minCreatedMessage = minCreated; @@ -5681,7 +5763,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { //Update View - [self updateMessageDataAndUIWithMessages:messageArray checkFirstUnreadMessage:YES toTop:YES withCompletionHandler:^{ + [self updateMessageDataAndUIWithMessages:messageArray checkFirstUnreadMessage:YES toTop:YES updateUserDetail:YES withCompletionHandler:^{ //Update leftover message status to delivered if ([messageArray count] != 0) { @@ -5712,7 +5794,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { //Check if system message with action remove participant and target user is current user //show deleted chat room view [self.view endEditing:YES]; - [self showDeletedRoomView:YES isGroup:YES withDeleteButton:YES]; + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:NO]; } #ifdef DEBUG //Note - this alert only shown at debug @@ -5773,6 +5855,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { BOOL setAsRead = NO; BOOL setAsDeleted = NO; + if ([currentMessage.user.userID isEqualToString:currentUser.userID]) { //My Message if (currentMessage.isSending) { @@ -5807,6 +5890,9 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { //Update message data [self updateMessageModelValueWithMessage:message]; + //Check need to update profile data or not + [self checkUpdatedUserProfileWithMessage:message]; + //Update view NSInteger indexInArray = [self.messageArray indexOfObject:currentMessage]; NSIndexPath *messageIndexPath = [NSIndexPath indexPathForRow:indexInArray inSection:0]; @@ -6103,7 +6189,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { } } -- (void)updateMessageDataAndUIWithMessages:(NSArray *)messageArray checkFirstUnreadMessage:(BOOL)checkFirstUnreadMessage toTop:(BOOL)toTop withCompletionHandler:(void(^)())completionHandler { +- (void)updateMessageDataAndUIWithMessages:(NSArray *)messageArray checkFirstUnreadMessage:(BOOL)checkFirstUnreadMessage toTop:(BOOL)toTop updateUserDetail:(BOOL)updateUserDetail withCompletionHandler:(void(^)())completionHandler { //RN Note - If crash happen on opening room, this async might be the cause dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ @@ -6114,6 +6200,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { TAPMessageModel *message = [messageArray objectAtIndex:counter]; TAPMessageModel *currentMessage = [self.messageDictionary objectForKey:message.localID]; + if (currentMessage != nil) { //Message exist in dictionary [self updateMessageModelValueWithMessage:message]; @@ -6152,6 +6239,11 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { } } } + + if (updateUserDetail) { + //Check need to update profile data or not + [self checkUpdatedUserProfileWithMessage:message]; + } } dispatch_async(dispatch_get_main_queue(), ^{ @@ -6308,7 +6400,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { }); //Update View - [self updateMessageDataAndUIWithMessages:messageArray checkFirstUnreadMessage:YES toTop:scrollToTop withCompletionHandler:^{ + [self updateMessageDataAndUIWithMessages:messageArray checkFirstUnreadMessage:YES toTop:scrollToTop updateUserDetail:YES withCompletionHandler:^{ //Update leftover message status to delivered if ([messageArray count] != 0) { [[TAPMessageStatusManager sharedManager] filterAndUpdateBulkMessageStatusToDeliveredWithArray:messageArray]; @@ -6326,7 +6418,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { //Check if system message with action remove participant and target user is current user //show deleted chat room view [self.view endEditing:YES]; - [self showDeletedRoomView:YES isGroup:YES withDeleteButton:YES]; + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:NO]; } }]; } @@ -7466,7 +7558,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { //user not found //hide textview self.inputMessageAccessoryView.alpha = 0.0f; - [self showDeletedRoomView:YES isGroup:NO withDeleteButton:NO]; + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; } }]; } @@ -7488,7 +7580,7 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { //user not found //hide textview self.inputMessageAccessoryView.alpha = 0.0f; - [self showDeletedRoomView:YES isGroup:YES withDeleteButton:NO]; + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:YES]; } }]; } @@ -8043,24 +8135,6 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { }]; } -- (void)setRoomNotAvailable { - [self.messageTextView resignFirstResponder]; - [self.secondaryTextField resignFirstResponder]; - _isShowAccessoryView = NO; - [self reloadInputViews]; - self.kickedGroupRoomBackgroundView.alpha = 1.0f; - - //delete room - [TAPDataManager deleteAllMessageAndPhysicalFilesInRoomWithRoomID:self.currentRoom.roomID success:^{ - if ([self.delegate respondsToSelector:@selector(chatViewControllerDidLeaveOrDeleteGroupWithRoom:)]) { - [self.delegate chatViewControllerDidLeaveOrDeleteGroupWithRoom:self.currentRoom]; - } - } failure:^(NSError *error) { - - }]; - -} - - (void)showTapTalkMessageComposerView { [self showInputAccessoryView]; } @@ -8068,19 +8142,28 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { - (void)checkAndShowRoomViewState { //check if last message is deleted room TAPMessageModel *lastMessage = [self.messageArray firstObject]; - if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/removeParticipant"] && [lastMessage.target.targetID isEqualToString:[TAPDataManager getActiveUser].userID]) { + if (lastMessage.room.type == RoomTypePersonal && lastMessage.room.isDeleted) { + [self.view endEditing:YES]; + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/removeParticipant"] && [lastMessage.target.targetID isEqualToString:[TAPDataManager getActiveUser].userID]) { //Check if system message with action remove participant and target user is current user //show deleted chat room view [self.view endEditing:YES]; - [self showDeletedRoomView:YES isGroup:YES withDeleteButton:YES]; + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:NO]; } else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/delete"]) { [self.view endEditing:YES]; - [self setRoomNotAvailable]; + if (lastMessage.room.type == RoomTypePersonal) { + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; + } + else if (lastMessage.room.type == RoomTypeGroup) { + [self showDeletedRoomView:YES isGroup:YES isGroupDeleted:YES]; + } } else if (lastMessage.type == TAPChatMessageTypeSystemMessage && [lastMessage.action isEqualToString:@"room/leave"] && [lastMessage.user.userID isEqualToString:[TAPDataManager getActiveUser].userID]) { [self.view endEditing:YES]; - [self showDeletedRoomView:YES isGroup:NO withDeleteButton:YES]; + [self showDeletedRoomView:YES isGroup:NO isGroupDeleted:NO]; } } @@ -8121,5 +8204,35 @@ typedef NS_ENUM(NSInteger, TopFloatingIndicatorViewType) { }]; } +- (void)checkUpdatedUserProfileWithMessage:(TAPMessageModel *)message { + dispatch_async(dispatch_get_main_queue(), ^{ + if (message.type == TAPChatMessageTypeSystemMessage && ([message.action isEqualToString:@"user/update"] || [message.action isEqualToString:@"room/update"])) { + TAPRoomModel *room = [TAPChatManager sharedManager].activeRoom; + NSString *updatedImageURLString = message.room.imageURL.thumbnail; + NSString *currentImageURLString = room.imageURL.thumbnail; + if (![updatedImageURLString isEqualToString:currentImageURLString]) { + if (updatedImageURLString == nil || [updatedImageURLString isEqualToString:@""]) { + BOOL isGroup; + if (message.room.type == RoomTypeGroup) { + isGroup = YES; + } + + self.rightBarInitialNameView.alpha = 1.0f; + self.rightBarImageView.alpha = 0.0f; + self.rightBarInitialNameView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:message.room.name]; + self.rightBarInitialNameLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:message.room.name isGroup:isGroup]; + } + else { + self.rightBarInitialNameView.alpha = 0.0f; + self.rightBarImageView.alpha = 1.0f; + [self.rightBarImageView setImageWithURLString:updatedImageURLString]; + } + + self.nameLabel.text = message.room.name; + } + } + }); +} + @end diff --git a/TapTalk/View Controllers/TapUIRoomListViewController.m b/TapTalk/View Controllers/TapUIRoomListViewController.m index 5a9bf03..4d616c0 100644 --- a/TapTalk/View Controllers/TapUIRoomListViewController.m +++ b/TapTalk/View Controllers/TapUIRoomListViewController.m @@ -55,6 +55,7 @@ - (void)openNewChatViewController; - (void)hideSetupViewWithDelay:(double)delayTime; - (void)getAndUpdateNumberOfUnreadToDelegate; +- (void)checkUpdatedUserProfileWithMessage:(TAPMessageModel *)message; @end @@ -994,6 +995,11 @@ - (void)processMessageFromSocket:(TAPMessageModel *)message isNewMessage:(BOOL)isNewMessage { NSString *messageRoomID = message.room.roomID; + //Check need to update user data or not + if (message.type == TAPChatMessageTypeSystemMessage && ([message.action isEqualToString:@"user/update"] || [message.action isEqualToString:@"room/update"])) { + [self checkUpdatedUserProfileWithMessage:message]; + } + TAPRoomListModel *roomList = [self.roomListDictionary objectForKey:messageRoomID]; if (roomList != nil) { @@ -1161,4 +1167,12 @@ }); } +- (void)checkUpdatedUserProfileWithMessage:(TAPMessageModel *)message { + NSString *roomID = message.room.roomID; + TAPRoomListModel *roomList = [self.roomListDictionary objectForKey:roomID]; + NSInteger cellRow = [self.roomListArray indexOfObject:roomList]; + NSIndexPath *cellIndexPath = [NSIndexPath indexPathForRow:cellRow inSection:0]; + [self updateCellDataAtIndexPath:cellIndexPath updateUnreadBubble:NO]; +} + @end diff --git a/TapTalk/Views/UITableViewCells/TAPMyChatBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPMyChatBubbleTableViewCell.m index e452377..373dfb2 100644 --- a/TapTalk/Views/UITableViewCells/TAPMyChatBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPMyChatBubbleTableViewCell.m @@ -541,7 +541,7 @@ - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileImageView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; diff --git a/TapTalk/Views/UITableViewCells/TAPMyFileBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPMyFileBubbleTableViewCell.m index e7801bb..8792aa0 100644 --- a/TapTalk/Views/UITableViewCells/TAPMyFileBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPMyFileBubbleTableViewCell.m @@ -622,7 +622,7 @@ } - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileImageView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; diff --git a/TapTalk/Views/UITableViewCells/TAPMyImageBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPMyImageBubbleTableViewCell.m index 011b19f..3fe3ceb 100644 --- a/TapTalk/Views/UITableViewCells/TAPMyImageBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPMyImageBubbleTableViewCell.m @@ -1164,7 +1164,7 @@ - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileImageView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; diff --git a/TapTalk/Views/UITableViewCells/TAPMyLocationBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPMyLocationBubbleTableViewCell.m index 52a9798..b19d966 100644 --- a/TapTalk/Views/UITableViewCells/TAPMyLocationBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPMyLocationBubbleTableViewCell.m @@ -586,7 +586,7 @@ } - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileImageView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; diff --git a/TapTalk/Views/UITableViewCells/TAPRoomListTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPRoomListTableViewCell.m index eae7515..df16274 100644 --- a/TapTalk/Views/UITableViewCells/TAPRoomListTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPRoomListTableViewCell.m @@ -185,11 +185,6 @@ BOOL isGroup = NO; NSString *lastSender = @""; - NSString *profileImageURL = message.room.imageURL.thumbnail; - if ([[TAPGroupManager sharedManager] getRoomWithRoomID:message.room.roomID]) { - TAPRoomModel *room = [[TAPGroupManager sharedManager] getRoomWithRoomID:message.room.roomID]; - profileImageURL = room.imageURL.thumbnail; - } NSInteger numberOfUnreadMessage = roomList.numberOfUnreadMessages; TAPRoomModel *currentRoom = message.room; @@ -199,6 +194,59 @@ isGroup = YES; } + NSString *profileImageURL = @""; + NSString *roomName = @""; + if (message.room.type == RoomTypePersonal) { + NSString *otherUserID = [[TAPChatManager sharedManager] getOtherUserIDWithRoomID:currentRoom.roomID]; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:otherUserID]; + if([message.room.deleted longValue] != 0) { + profileImageURL = @""; + } + else if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + profileImageURL = obtainedUser.imageURL.thumbnail; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + else { + profileImageURL = message.room.imageURL.thumbnail; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + + if (obtainedUser != nil && obtainedUser.fullname != nil && [message.room.deleted longValue] == 0) { + roomName = obtainedUser.fullname; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + else { + roomName = message.room.name; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + } + else if (message.room.type == RoomTypeGroup) { + TAPRoomModel *obtainedRoom = [[TAPGroupManager sharedManager] getRoomWithRoomID:message.room.roomID]; + NSString *groupProfileImageURL = obtainedRoom.imageURL.thumbnail; + groupProfileImageURL = [TAPUtil nullToEmptyString:groupProfileImageURL]; + + NSString *groupRoomName = obtainedRoom.name; + groupRoomName = [TAPUtil nullToEmptyString:groupRoomName]; + + if ([groupProfileImageURL isEqualToString:@""]) { + profileImageURL = message.room.imageURL.thumbnail; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + else { + profileImageURL = groupProfileImageURL; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + + if ([groupRoomName isEqualToString:@""]) { + roomName = message.room.name; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + else { + roomName = groupRoomName; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + } + if (isGroup) { TAPUserModel *currentActiveUser = [TAPDataManager getActiveUser]; if ([currentActiveUser.userID isEqualToString:message.user.userID]) { @@ -209,9 +257,6 @@ } } - NSString *roomName = currentRoom.name; - roomName = [TAPUtil nullToEmptyString:roomName]; - NSTimeInterval lastMessageTimeInterval = [message.created doubleValue] / 1000.0f; //change to second from milisecond NSDate *lastMessageDate = [NSDate dateWithTimeIntervalSince1970:lastMessageTimeInterval]; diff --git a/TapTalk/Views/UITableViewCells/TAPSearchResultChatTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPSearchResultChatTableViewCell.m index f153e6c..1f4a11e 100644 --- a/TapTalk/Views/UITableViewCells/TAPSearchResultChatTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPSearchResultChatTableViewCell.m @@ -127,15 +127,62 @@ if (room.type == RoomTypeGroup || room.type == RoomTypeChannel) { isGroup = YES; } - - NSString *profileImageURL = room.imageURL.fullsize; + + NSString *profileImageURL = @""; + NSString *roomName = @""; + if (room.type == RoomTypePersonal) { + NSString *otherUserID = [[TAPChatManager sharedManager] getOtherUserIDWithRoomID:room.roomID]; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:otherUserID]; + if([room.deleted longValue] != 0) { + profileImageURL = @""; + } + else if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + profileImageURL = obtainedUser.imageURL.thumbnail; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + else { + profileImageURL = room.imageURL.thumbnail; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + + if (obtainedUser != nil && obtainedUser.fullname != nil && [room.deleted longValue] == 0) { + roomName = obtainedUser.fullname; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + else { + roomName = room.name; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + } + else if (room.type == RoomTypeGroup) { + TAPRoomModel *obtainedRoom = [[TAPGroupManager sharedManager] getRoomWithRoomID:room.roomID]; + NSString *groupProfileImageURL = obtainedRoom.imageURL.thumbnail; + groupProfileImageURL = [TAPUtil nullToEmptyString:groupProfileImageURL]; + + NSString *groupRoomName = obtainedRoom.name; + groupRoomName = [TAPUtil nullToEmptyString:groupRoomName]; + + if ([groupProfileImageURL isEqualToString:@""]) { + profileImageURL = room.imageURL.thumbnail; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + else { + profileImageURL = groupProfileImageURL; + profileImageURL = [TAPUtil nullToEmptyString:profileImageURL]; + } + + if ([groupRoomName isEqualToString:@""]) { + roomName = room.name; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + else { + roomName = groupRoomName; + roomName = [TAPUtil nullToEmptyString:roomName]; + } + } + NSInteger numberOfUnreadMessage = [unreadMessageCount integerValue]; - TAPRoomModel *currentRoom = room; - - NSString *roomName = currentRoom.name; - roomName = [TAPUtil nullToEmptyString:roomName]; - if (profileImageURL == nil || [profileImageURL isEqualToString:@""]) { //No photo found, get the initial self.initialNameView.alpha = 1.0f; diff --git a/TapTalk/Views/UITableViewCells/TAPYourChatBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPYourChatBubbleTableViewCell.m index 5599841..3435e0c 100644 --- a/TapTalk/Views/UITableViewCells/TAPYourChatBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPYourChatBubbleTableViewCell.m @@ -367,26 +367,47 @@ if (message.room.type == RoomTypeGroup) { [self showSenderInfo:YES]; - if ([message.user.imageURL.thumbnail isEqualToString:@""]) { + NSString *thumbnailImageString = @""; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:message.user.userID]; + if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + thumbnailImageString = obtainedUser.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + else { + thumbnailImageString = message.user.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + + NSString *fullNameString = @""; + if (obtainedUser != nil && ![obtainedUser.fullname isEqualToString:@""]) { + fullNameString = obtainedUser.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + else { + fullNameString = message.user.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + + if ([thumbnailImageString isEqualToString:@""]) { //No photo found, get the initial self.senderInitialView.alpha = 1.0f; self.senderImageView.alpha = 0.0f; - self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:message.user.fullname]; - self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:message.user.fullname isGroup:NO]; + self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:fullNameString]; + self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:fullNameString isGroup:NO]; } else { - if(![self.currentProfileImageURLString isEqualToString:message.user.imageURL.thumbnail]) { + if(![self.currentProfileImageURLString isEqualToString:thumbnailImageString]) { self.senderImageView.image = nil; } self.senderInitialView.alpha = 0.0f; self.senderImageView.alpha = 1.0f; - [self.senderImageView setImageWithURLString:message.user.imageURL.thumbnail]; - _currentProfileImageURLString = message.user.imageURL.thumbnail; + [self.senderImageView setImageWithURLString:thumbnailImageString]; + _currentProfileImageURLString = thumbnailImageString; } - self.senderNameLabel.text = message.user.fullname; + self.senderNameLabel.text = fullNameString; } else { [self showSenderInfo:NO]; @@ -618,7 +639,7 @@ } - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; @@ -635,7 +656,7 @@ } //check id message sender is equal to active user id, if yes change the title to "You" - if ([userID isEqualToString:[TAPDataManager getActiveUser].userID] && ![quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([userID isEqualToString:[TAPDataManager getActiveUser].userID] && !([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"])) { self.quoteTitleLabel.text = NSLocalizedString(@"You", @""); } else { diff --git a/TapTalk/Views/UITableViewCells/TAPYourChatDeletedBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPYourChatDeletedBubbleTableViewCell.m index 2b7779c..322c2a2 100644 --- a/TapTalk/Views/UITableViewCells/TAPYourChatDeletedBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPYourChatDeletedBubbleTableViewCell.m @@ -111,24 +111,46 @@ self.bubbleLabel.text = NSLocalizedString(@"This message was deleted.", @""); //CS NOTE - check chat room type, show sender info if group type + if (message.room.type == RoomTypeGroup) { [self showSenderInfo:YES]; + + NSString *thumbnailImageString = @""; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:message.user.userID]; + if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + thumbnailImageString = obtainedUser.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + else { + thumbnailImageString = message.user.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + + NSString *fullNameString = @""; + if (obtainedUser != nil && ![obtainedUser.fullname isEqualToString:@""]) { + fullNameString = obtainedUser.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + else { + fullNameString = message.user.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } - if ([message.user.imageURL.thumbnail isEqualToString:@""]) { + if ([thumbnailImageString isEqualToString:@""]) { //No photo found, get the initial self.senderInitialView.alpha = 1.0f; self.senderImageView.alpha = 0.0f; self.senderProfileImageButton.alpha = 0.0f; - self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:message.user.fullname]; - self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:message.user.fullname isGroup:NO]; + self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:fullNameString]; + self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:fullNameString isGroup:NO]; } else { self.senderInitialView.alpha = 0.0f; self.senderImageView.alpha = 1.0f; - [self.senderImageView setImageWithURLString:message.user.imageURL.thumbnail]; + [self.senderImageView setImageWithURLString:thumbnailImageString]; } - self.senderNameLabel.text = message.user.fullname; + self.senderNameLabel.text = fullNameString; } else { [self showSenderInfo:NO]; diff --git a/TapTalk/Views/UITableViewCells/TAPYourFileBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPYourFileBubbleTableViewCell.m index 62fb263..c3f5352 100644 --- a/TapTalk/Views/UITableViewCells/TAPYourFileBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPYourFileBubbleTableViewCell.m @@ -422,26 +422,48 @@ //CS NOTE - check chat room type, show sender info if group type if (message.room.type == RoomTypeGroup) { [self showSenderInfo:YES]; - if ([message.user.imageURL.thumbnail isEqualToString:@""]) { + + NSString *thumbnailImageString = @""; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:message.user.userID]; + if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + thumbnailImageString = obtainedUser.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + else { + thumbnailImageString = message.user.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + + NSString *fullNameString = @""; + if (obtainedUser != nil && ![obtainedUser.fullname isEqualToString:@""]) { + fullNameString = obtainedUser.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + else { + fullNameString = message.user.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + + if ([thumbnailImageString isEqualToString:@""]) { //No photo found, get the initial self.senderInitialView.alpha = 1.0f; self.senderImageView.alpha = 0.0f; - self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:message.user.fullname]; - self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:message.user.fullname isGroup:NO]; + self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:fullNameString]; + self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:fullNameString isGroup:NO]; } else { - if(![self.currentProfileImageURLString isEqualToString:message.user.imageURL.thumbnail]) { + if(![self.currentProfileImageURLString isEqualToString:thumbnailImageString]) { self.senderImageView.image = nil; } self.senderInitialView.alpha = 0.0f; self.senderImageView.alpha = 1.0f; - [self.senderImageView setImageWithURLString:message.user.imageURL.thumbnail]; - _currentProfileImageURLString = message.user.imageURL.thumbnail; + [self.senderImageView setImageWithURLString:thumbnailImageString]; + _currentProfileImageURLString = thumbnailImageString; } - self.senderNameLabel.text = message.user.fullname; + self.senderNameLabel.text = fullNameString; } else { [self showSenderInfo:NO]; @@ -699,7 +721,7 @@ } - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; diff --git a/TapTalk/Views/UITableViewCells/TAPYourImageBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPYourImageBubbleTableViewCell.m index aafaae6..b7f6854 100644 --- a/TapTalk/Views/UITableViewCells/TAPYourImageBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPYourImageBubbleTableViewCell.m @@ -537,23 +537,44 @@ self.senderImageViewTrailingConstraint.constant = 4.0f; self.senderProfileImageButtonWidthConstraint.constant = 30.0f; self.senderProfileImageButton.userInteractionEnabled = YES; + + NSString *thumbnailImageString = @""; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:message.user.userID]; + if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + thumbnailImageString = obtainedUser.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + else { + thumbnailImageString = message.user.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + + NSString *fullNameString = @""; + if (obtainedUser != nil && ![obtainedUser.fullname isEqualToString:@""]) { + fullNameString = obtainedUser.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + else { + fullNameString = message.user.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } - if ([message.user.imageURL.thumbnail isEqualToString:@""]) { + if ([thumbnailImageString isEqualToString:@""]) { //No photo found, get the initial self.senderInitialView.alpha = 1.0f; self.senderImageView.alpha = 0.0f; - self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:message.user.fullname]; - self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:message.user.fullname isGroup:NO]; + self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:fullNameString]; + self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:fullNameString isGroup:NO]; } else { - if(![self.currentProfileImageURLString isEqualToString:message.user.imageURL.thumbnail]) { + if(![self.currentProfileImageURLString isEqualToString:thumbnailImageString]) { self.senderImageView.image = nil; } self.senderInitialView.alpha = 0.0f; self.senderImageView.alpha = 1.0f; - [self.senderImageView setImageWithURLString:message.user.imageURL.thumbnail]; - _currentProfileImageURLString = message.user.imageURL.thumbnail; + [self.senderImageView setImageWithURLString:thumbnailImageString]; + _currentProfileImageURLString = thumbnailImageString; } //DV Note - Set sender name to empty string because image and video bubble not showing sender name @@ -1111,7 +1132,7 @@ } - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; diff --git a/TapTalk/Views/UITableViewCells/TAPYourLocationBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPYourLocationBubbleTableViewCell.m index 6baf5fb..6ee5e13 100644 --- a/TapTalk/Views/UITableViewCells/TAPYourLocationBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPYourLocationBubbleTableViewCell.m @@ -325,7 +325,28 @@ if (message.room.type == RoomTypeGroup) { [self showSenderInfo:YES]; - if ([message.user.imageURL.thumbnail isEqualToString:@""]) { + NSString *thumbnailImageString = @""; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:message.user.userID]; + if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + thumbnailImageString = obtainedUser.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + else { + thumbnailImageString = message.user.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + + NSString *fullNameString = @""; + if (obtainedUser != nil && ![obtainedUser.fullname isEqualToString:@""]) { + fullNameString = obtainedUser.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + else { + fullNameString = message.user.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + + if ([thumbnailImageString isEqualToString:@""]) { //No photo found, get the initial self.senderInitialView.alpha = 1.0f; self.senderImageView.alpha = 0.0f; @@ -333,14 +354,14 @@ self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:message.user.fullname isGroup:NO]; } else { - if(![self.currentProfileImageURLString isEqualToString:message.user.imageURL.thumbnail]) { + if(![self.currentProfileImageURLString isEqualToString:thumbnailImageString]) { self.senderImageView.image = nil; } self.senderInitialView.alpha = 0.0f; self.senderImageView.alpha = 1.0f; - [self.senderImageView setImageWithURLString:message.user.imageURL.thumbnail]; - _currentProfileImageURLString = message.user.imageURL.thumbnail; + [self.senderImageView setImageWithURLString:thumbnailImageString]; + _currentProfileImageURLString = thumbnailImageString; } self.senderNameLabel.text = message.user.fullname; @@ -583,7 +604,7 @@ } - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; diff --git a/TapTalk/Views/UITableViewCells/TAPYourVideoBubbleTableViewCell.m b/TapTalk/Views/UITableViewCells/TAPYourVideoBubbleTableViewCell.m index aba9ab7..7d06811 100644 --- a/TapTalk/Views/UITableViewCells/TAPYourVideoBubbleTableViewCell.m +++ b/TapTalk/Views/UITableViewCells/TAPYourVideoBubbleTableViewCell.m @@ -499,22 +499,43 @@ self.senderProfileImageButtonWidthConstraint.constant = 30.0f; self.senderProfileImageButton.userInteractionEnabled = YES; - if ([message.user.imageURL.thumbnail isEqualToString:@""]) { + NSString *thumbnailImageString = @""; + TAPUserModel *obtainedUser = [[TAPContactManager sharedManager] getUserWithUserID:message.user.userID]; + if (obtainedUser != nil && ![obtainedUser.imageURL.thumbnail isEqualToString:@""]) { + thumbnailImageString = obtainedUser.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + else { + thumbnailImageString = message.user.imageURL.thumbnail; + thumbnailImageString = [TAPUtil nullToEmptyString:thumbnailImageString]; + } + + NSString *fullNameString = @""; + if (obtainedUser != nil && ![obtainedUser.fullname isEqualToString:@""]) { + fullNameString = obtainedUser.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + else { + fullNameString = message.user.fullname; + fullNameString = [TAPUtil nullToEmptyString:fullNameString]; + } + + if ([thumbnailImageString isEqualToString:@""]) { //No photo found, get the initial self.senderInitialView.alpha = 1.0f; self.senderImageView.alpha = 0.0f; - self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:message.user.fullname]; - self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:message.user.fullname isGroup:NO]; + self.senderInitialView.backgroundColor = [[TAPStyleManager sharedManager] getRandomDefaultAvatarBackgroundColorWithName:fullNameString]; + self.senderInitialLabel.text = [[TAPStyleManager sharedManager] getInitialsWithName:fullNameString isGroup:NO]; } else { - if(![self.currentProfileImageURLString isEqualToString:message.user.imageURL.thumbnail]) { + if(![self.currentProfileImageURLString isEqualToString:thumbnailImageString]) { self.senderImageView.image = nil; } self.senderInitialView.alpha = 0.0f; self.senderImageView.alpha = 1.0f; - [self.senderImageView setImageWithURLString:message.user.imageURL.thumbnail]; - _currentProfileImageURLString = message.user.imageURL.thumbnail; + [self.senderImageView setImageWithURLString:thumbnailImageString]; + _currentProfileImageURLString = thumbnailImageString; } //DV Note - Set sender name to empty string because image and video bubble not showing sender name @@ -1034,7 +1055,7 @@ } - (void)setQuote:(TAPQuoteModel *)quote userID:(NSString *)userID { - if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]]) { + if ([quote.fileType isEqualToString:[NSString stringWithFormat:@"%ld", TAPChatMessageTypeFile]] || [quote.fileType isEqualToString:@"file"]) { //TYPE FILE self.fileView.alpha = 1.0f; self.quoteImageView.alpha = 0.0f; -- GitLab