Ver Fonte

feat: update TUIKit

陈文艺 há 4 meses atrás
pai
commit
28bb5c6716
100 ficheiros alterados com 998 adições e 3078 exclusões
  1. 12 3
      Lanu.xcodeproj/project.pbxproj
  2. 3 6
      Lanu/AppDelegate.swift
  3. 1 0
      Lanu/Common/Storage/LNUserDefaultsKey.swift
  4. 41 0
      Lanu/Common/Utils/DispatchQueue+Extension.swift
  5. 1 1
      Lanu/Common/Views/Base/LNNavigationController.swift
  6. 2 2
      Lanu/Common/Views/Base/LNViewController.swift
  7. 9 0
      Lanu/Lanu-Bridging-Header.h
  8. 44 21
      Lanu/Manager/Account/LNAccountManager.swift
  9. 89 0
      Lanu/Manager/IM/GenerateTestUserSig.h
  10. 99 0
      Lanu/Manager/IM/GenerateTestUserSig.m
  11. 18 1
      Lanu/Manager/IM/LNIMManager.swift
  12. 1 1
      Lanu/Manager/Network/LNHttpManager.swift
  13. 33 20
      Lanu/Manager/Profile/LNProfileManager.swift
  14. 3 1
      Lanu/Manager/Profile/LNUserProfileInfo.swift
  15. 6 6
      Lanu/SceneDelegate.swift
  16. 20 0
      Lanu/Views/IM/LNIMViewController.swift
  17. 11 5
      Lanu/Views/Login/LNLoginViewController.swift
  18. 15 1
      Lanu/Views/Main/LNMainViewController.swift
  19. 4 29
      Podfile.lock
  20. 0 41
      ThirdParty/TUIKit/TIMCommon/BaseCell/TUIMessageCell.m
  21. 0 3
      ThirdParty/TUIKit/TIMCommon/BaseCellData/TUIMessageCellData.h
  22. 0 56
      ThirdParty/TUIKit/TIMCommon/BaseCellData/TUIMessageCellData.m
  23. 1 1
      ThirdParty/TUIKit/TIMCommon/CommonModel/TIMCommonModel.m
  24. 1 1
      ThirdParty/TUIKit/TIMCommon/Resources/TIMCommonTheme.bundle/dark/manifest.plist
  25. 0 1
      ThirdParty/TUIKit/TIMCommon/TIMCommon.podspec
  26. 0 16
      ThirdParty/TUIKit/TIMCommon/UI_Classic/MOCustomView/MOCustomSvgaPlayerView.h
  27. 0 21
      ThirdParty/TUIKit/TIMCommon/UI_Classic/MOCustomView/MOCustomSvgaPlayerView.m
  28. 0 30
      ThirdParty/TUIKit/TIMCommon/UI_Classic/MOCustomView/MOHeadNormalView.h
  29. 0 179
      ThirdParty/TUIKit/TIMCommon/UI_Classic/MOCustomView/MOHeadNormalView.m
  30. 0 34
      ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOSystemNormalCellData.h
  31. 0 208
      ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOSystemNormalCellData.m
  32. 0 28
      ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOUserLinkCellData.h
  33. 0 112
      ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOUserLinkCellData.m
  34. 0 28
      ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOUserNotificationCellData.h
  35. 0 112
      ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOUserNotificationCellData.m
  36. 0 8
      ThirdParty/TUIKit/TUIChat/BaseDataProvider/Base/TUIMessageBaseDataProvider.h
  37. 7 21
      ThirdParty/TUIKit/TUIChat/BaseDataProvider/Base/TUIMessageBaseDataProvider.m
  38. 3 3
      ThirdParty/TUIKit/TUIChat/BaseDataProvider/Impl/TUIChatDataProvider.m
  39. 0 26
      ThirdParty/TUIKit/TUIChat/BaseDataProvider/Impl/TUIMessageDataProvider.m
  40. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/ToolViewEmotion_2@2x.png
  41. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/ToolViewEmotion_2@3x.png
  42. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/ToolViewKeyboard_2@2x.png
  43. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/ToolViewKeyboard_2@3x.png
  44. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/TypeSelectorBtn_Black_2@2x.png
  45. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/TypeSelectorBtn_Black_2@3x.png
  46. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/icon_new_send_btn@2x.png
  47. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/icon_new_send_btn@3x.png
  48. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_camera_2@2x.png
  49. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_camera_2@3x.png
  50. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_picture_2@2x.png
  51. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_picture_2@3x.png
  52. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_video_2@2x.png
  53. BIN
      ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_video_2@3x.png
  54. 495 455
      ThirdParty/TUIKit/TUIChat/Resources/TUIChatFace.bundle/emoji/emoji.plist
  55. 0 1
      ThirdParty/TUIKit/TUIChat/TUIChat.podspec
  56. 8 0
      ThirdParty/TUIKit/TUIChat/TUIChat/TUIChat.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  57. 1 7
      ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Base/TUIInputMoreCell.m
  58. 0 1
      ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Base/TUITextMessageCell.m
  59. 0 30
      ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOSystemNormalCell.h
  60. 0 361
      ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOSystemNormalCell.m
  61. 0 31
      ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOUserLinkCell.h
  62. 0 269
      ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOUserLinkCell.m
  63. 0 24
      ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOUserNotificationCell.h
  64. 0 159
      ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOUserNotificationCell.m
  65. 0 19
      ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIBaseChatViewController.h
  66. 2 30
      ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIBaseChatViewController.m
  67. 0 8
      ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIBaseMessageController.h
  68. 1 83
      ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIBaseMessageController.m
  69. 3 4
      ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIC2CChatViewController.m
  70. 0 4
      ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIMessageCellConfig.m
  71. 1 2
      ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIMessageController.m
  72. 19 101
      ThirdParty/TUIKit/TUIChat/UI_Classic/Input/TUIInputBar.m
  73. 0 8
      ThirdParty/TUIKit/TUIChat/UI_Classic/Input/TUIInputController.m
  74. 0 4
      ThirdParty/TUIKit/TUIChat/UI_Classic/Input/TUIResponderTextView.h
  75. 0 56
      ThirdParty/TUIKit/TUIChat/UI_Classic/Input/TUIResponderTextView.m
  76. 1 1
      ThirdParty/TUIKit/TUIChat/UI_Minimalist/Cell/Base/TUIGroupProfileCardViewCell_Minimalist.m
  77. 1 1
      ThirdParty/TUIKit/TUIChat/UI_Minimalist/Chat/TUIBaseChatViewController_Minimalist.m
  78. 9 1
      ThirdParty/TUIKit/TUIChat/UI_Minimalist/Chat/TUIBaseMessageController_Minimalist.m
  79. 1 0
      ThirdParty/TUIKit/TUIChat/UI_Minimalist/Chat/TUIGroupInfoController_Minimalist.m
  80. 2 0
      ThirdParty/TUIKit/TUIChat/UI_Minimalist/Chat/TUIRepliesDetailViewController_Minimalist.m
  81. 0 5
      ThirdParty/TUIKit/TUIConversation/BaseCell/CellData/TUIConversationCellData.h
  82. 0 16
      ThirdParty/TUIKit/TUIConversation/BaseCell/CellUI/MOConversationEmptyCell.h
  83. 0 33
      ThirdParty/TUIKit/TUIConversation/BaseCell/CellUI/MOConversationEmptyCell.m
  84. 0 2
      ThirdParty/TUIKit/TUIConversation/BaseCell/CellUI/TUIConversationCell.h
  85. 14 166
      ThirdParty/TUIKit/TUIConversation/BaseCell/CellUI/TUIConversationCell.m
  86. 0 11
      ThirdParty/TUIKit/TUIConversation/BaseDataProvider/TUIConversationListBaseDataProvider.h
  87. 0 2
      ThirdParty/TUIKit/TUIConversation/TUIConversation.podspec
  88. 0 47
      ThirdParty/TUIKit/TUIConversation/UI_Classic/DataProvider/TUIConversationListDataProvider.m
  89. 0 3
      ThirdParty/TUIKit/TUIConversation/UI_Classic/UI/TUIConversationListController.h
  90. 1 5
      ThirdParty/TUIKit/TUIConversation/UI_Classic/UI/TUIConversationListController.m
  91. 5 26
      ThirdParty/TUIKit/TUIConversation/UI_Classic/UI/TUIConversationTableView.m
  92. 0 46
      ThirdParty/TUIKit/TUIConversation/UI_Minimalist/DataProvider/TUIConversationListDataProvider_Minimalist.m
  93. 0 3
      ThirdParty/TUIKit/TUIConversation/UI_Minimalist/UI/TUIConversationListController_Minimalist.m
  94. 3 3
      ThirdParty/TUIKit/TUICore/TUICommonModel.h
  95. 3 3
      ThirdParty/TUIKit/TUICore/TUICommonModel.m
  96. 1 1
      ThirdParty/TUIKit/TUICore/TUICore.h
  97. 1 1
      ThirdParty/TUIKit/TUICore/TUIDefine.h
  98. 0 1
      ThirdParty/TUIKit/TUICore/TUITool.h
  99. 0 16
      ThirdParty/TUIKit/TUICore/TUITool.m
  100. 2 2
      ThirdParty/TUIKit/TUICore/UIColor+TUIHexColor.m

+ 12 - 3
Lanu.xcodeproj/project.pbxproj

@@ -41,11 +41,12 @@
 				"Common/Theme/UIColor+Theme.swift",
 				"Common/Theme/UIFont+Theme.swift",
 				Common/Utils/AppUtils.swift,
+				"Common/Utils/DispatchQueue+Extension.swift",
 				"Common/Utils/String+Extension.swift",
 				"Common/Utils/UIColor+Extension.swift",
 				"Common/Utils/UIView+Extension.swift",
-				Common/Views/Base/LNBaseViewController.swift,
 				Common/Views/Base/LNNavigationController.swift,
+				Common/Views/Base/LNViewController.swift,
 				Config_Debug.xcconfig,
 				Config_Release.xcconfig,
 				"GoogleService-Info-Debug.plist",
@@ -54,6 +55,7 @@
 				Manager/Account/LNAccountManager.swift,
 				"Manager/Account/Network/LNHttpManager+Login.swift",
 				Manager/Account/Network/LNLoginResponse.swift,
+				Manager/IM/GenerateTestUserSig.m,
 				Manager/IM/LNIMManager.swift,
 				Manager/LNDelayTask.swift,
 				Manager/LNEventDeliver.swift,
@@ -69,6 +71,7 @@
 				Manager/Profile/Network/LNProfileResponse.swift,
 				Manager/Purchase/LNPurchaseManager.swift,
 				SceneDelegate.swift,
+				Views/IM/LNIMViewController.swift,
 				Views/Login/LNLoginViewController.swift,
 				Views/Main/LNMainViewController.swift,
 			);
@@ -185,6 +188,7 @@
 				TargetAttributes = {
 					FBFE13BF2EBC39B000DCE6E9 = {
 						CreatedOnToolsVersion = 26.0.1;
+						LastSwiftMigration = 2600;
 					};
 				};
 			};
@@ -303,6 +307,7 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 5H8D98R72W;
@@ -318,13 +323,15 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0;
+				MARKETING_VERSION = 1.0.0;
 				PRODUCT_BUNDLE_IDENTIFIER = com.jiehe.lanu.debug;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				STRING_CATALOG_GENERATE_SYMBOLS = YES;
 				SWIFT_APPROACHABLE_CONCURRENCY = YES;
 				SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
 				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_OBJC_BRIDGING_HEADER = "Lanu/Lanu-Bridging-Header.h";
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
 				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -337,6 +344,7 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 5H8D98R72W;
@@ -352,13 +360,14 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0;
+				MARKETING_VERSION = 1.0.0;
 				PRODUCT_BUNDLE_IDENTIFIER = com.jiehe.lanu;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				STRING_CATALOG_GENERATE_SYMBOLS = YES;
 				SWIFT_APPROACHABLE_CONCURRENCY = YES;
 				SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
 				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_OBJC_BRIDGING_HEADER = "Lanu/Lanu-Bridging-Header.h";
 				SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
 				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";

+ 3 - 6
Lanu/AppDelegate.swift

@@ -17,9 +17,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         
         setupLogger()
         setupFirebase()
-        setupGoogleSignIn()
         LNNetworkMonitor.startMonitoring()
         
+        _ = LNProfileManager.shared
+        _ = LNIMManager.shared
+        
         LNEventDeliver.notifyAppLaunchFinished()
         
         return true
@@ -48,11 +50,6 @@ extension AppDelegate {
         FirebaseApp.configure(options: options!)
     }
     
-    private func setupGoogleSignIn() {
-        let clientID = Bundle.main.object(forInfoDictionaryKey: "GoogleClientID") as! String
-        GIDSignIn.sharedInstance.configuration = GIDConfiguration(clientID: clientID)
-    }
-    
     private func setupLogger() {
         let formatter = LNLoggerFormater()
         

+ 1 - 0
Lanu/Common/Storage/LNUserDefaultsKey.swift

@@ -11,4 +11,5 @@ enum LNUserDefaultsKey: String {
     case appEnv
     
     case token
+    case uid
 }

+ 41 - 0
Lanu/Common/Utils/DispatchQueue+Extension.swift

@@ -0,0 +1,41 @@
+//
+//  DispatchQueue+Extension.swift
+//  Lanu
+//
+//  Created by OneeChan on 2025/11/13.
+//
+
+import Foundation
+
+
+extension DispatchQueue {
+    func asyncIfNotGlobal(block: @escaping () -> Void) {
+        if self != .global() {
+            async {
+                block()
+            }
+        } else {
+            block()
+        }
+    }
+    
+    func asyncIfNotMain(block: @escaping () -> Void) {
+        if self != .main {
+            async {
+                block()
+            }
+        } else {
+            block()
+        }
+    }
+}
+
+func runOnMain(block: @escaping () -> Void) {
+    if Thread.isMainThread {
+        block()
+    } else {
+        DispatchQueue.main.async {
+            block()
+        }
+    }
+}

+ 1 - 1
Lanu/Common/Views/Base/LNNavigationController.swift

@@ -33,7 +33,7 @@ class LNNavigationController: UINavigationController {
 extension LNNavigationController: UIGestureRecognizerDelegate {
     func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
         guard viewControllers.count > 1 else { return false }
-        guard let viewController = viewControllers.last as? LNBaseViewController else { return true }
+        guard let viewController = viewControllers.last as? LNViewController else { return true }
         return viewController.enableDragBack
     }
     

+ 2 - 2
Lanu/Common/Views/Base/LNBaseViewController.swift → Lanu/Common/Views/Base/LNViewController.swift

@@ -1,5 +1,5 @@
 //
-//  LNBaseViewController.swift
+//  LNViewController.swift
 //  Lanu
 //
 //  Created by OneeChan on 2025/11/6.
@@ -9,7 +9,7 @@ import Foundation
 import UIKit
 
 
-class LNBaseViewController: UIViewController {
+class LNViewController: UIViewController {
     var showNavigationBar = true
     var enableDragBack = true
     var navigationBarColor: UIColor = .white

+ 9 - 0
Lanu/Lanu-Bridging-Header.h

@@ -0,0 +1,9 @@
+//
+//  Use this file to import your target's public headers that you would like to expose to Swift.
+//
+
+
+#import "TUICore/TUILogin.h"
+#import "TIMPush/TIMPush.h"
+
+#import "GenerateTestUserSig.h"

+ 44 - 21
Lanu/Manager/Account/LNAccountManager.swift

@@ -18,60 +18,83 @@ extension LNUserMainEvent {
     func onUserLogout() {}
 }
 
+extension String {
+    var isMyUid: Bool {
+        myUid == self
+    }
+}
+
+var myUid: String {
+    LNAccountManager.shared.uid
+}
+
 class LNAccountManager {
-    private(set) static var token = LNUserDefaults[.token, ""] {
+    static let shared = LNAccountManager()
+    
+    private(set) var token = LNUserDefaults[.token, ""] {
         didSet { LNUserDefaults[.token] = token }
     }
-    private(set) static var uid = ""
+    private(set) var uid: String = LNUserDefaults[.uid, ""] {
+        didSet { LNUserDefaults[.uid] = uid }
+    }
+    
+    var wasLogin: Bool {
+        !token.isEmpty && !uid.isEmpty
+    }
     
-    static var wasLogin: Bool {
-        !token.isEmpty
+    func loginByToken(completion: ((Bool) -> Void)? = nil) {
+        completion?(true)
+        notifyUserLogin()
     }
     
-    static func loginByGoogle(data: String, completion: @escaping (LNHttpError?) -> Void) {
-        LNHttpManager.shared.loginByGoogle(data: data) { response, err in
+    func loginByGoogle(data: String, completion: ((Bool) -> Void)? = nil) {
+        LNHttpManager.shared.loginByGoogle(data: data) { [weak self] response, err in
+            guard let self else { return }
             guard err == nil, let response else {
-                completion(err)
+                completion?(false)
                 return
             }
-            token = response.token
-            uid = response.userProfile.id
-            completion(nil)
+            self.token = response.token
+            self.uid = response.userProfile.id
+            completion?(true)
             
-            notifyUserLogin()
+            self.notifyUserLogin()
         }
     }
     
 #if DEBUG
-    static func loginByEmail(email: String, completion: @escaping (LNHttpError?) -> Void) {
-        LNHttpManager.shared.loginByEmail(email: email) { response, err in
+    func loginByEmail(email: String, completion: @escaping (Bool) -> Void) {
+        LNHttpManager.shared.loginByEmail(email: email) { [weak self] response, err in
+            guard let self else { return }
             guard err == nil, let response else {
-                completion(err)
+                completion(false)
                 return
             }
-            token = response.token
-            uid = response.userProfile.id
-            completion(nil)
+            self.token = response.token
+            self.uid = response.userProfile.id
+            completion(true)
             
-            notifyUserLogin()
+            self.notifyUserLogin()
         }
     }
 #endif
 }
 
 extension LNAccountManager {
-    static func clean() {
+    func clean() {
         token = ""
         uid = ""
+        
+        notifyUserLogout()
     }
 }
 
 extension LNAccountManager {
-    static func notifyUserLogin() {
+    func notifyUserLogin() {
         LNEventDeliver.notifyEvent { ($0 as? LNUserMainEvent)?.onUserLogin() }
     }
 
-    static func notifyUserLogout() {
+    func notifyUserLogout() {
         LNEventDeliver.notifyEvent { ($0 as? LNUserMainEvent)?.onUserLogout() }
     }
 }

+ 89 - 0
Lanu/Manager/IM/GenerateTestUserSig.h

@@ -0,0 +1,89 @@
+
+/*
+ * Module:   GenerateTestUserSig
+ *
+ * Function:  Used to generate UserSig for testing. UserSig is a security signature designed by Tencent Cloud for its cloud services.
+ *           It is calculated based on SDKAppID, UserID, and EXPIRETIME using the HMAC-SHA256 encryption algorithm.
+ *
+ * Attention: Do not use the code below in your commercial application. This is because:
+ *
+ *            The code may be able to calculate UserSig correctly, but it is only for quick testing of the SDK’s basic features, not for commercial applications.
+ *            SECRETKEY in client code can be easily decompiled and reversed, especially on web.
+ *            Once your key is disclosed, attackers will be able to steal your Tencent Cloud traffic.
+ *
+ *            The correct method is to deploy the UserSig calculation code and encryption key on your project server so that your application can request from your server a UserSig that is calculated whenever one is needed.
+ *            Given that it is more difficult to hack a server than a client application, server-end calculation can better protect your key.
+ *
+ * Reference:https://intl.cloud.tencent.com/document/product/1047/34385
+ */
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+#define SDKAPPID [GenerateTestUserSig currentSDKAppid]
+#define SECRETKEY [GenerateTestUserSig currentSecretkey]
+
+
+/**
+ * Tencent Cloud SDKAppID. Set it to the SDKAppID of your account.
+ *
+ * You can view your SDKAppID after creating an application in the [Tencent Cloud IM console](https://console.intl.cloud.tencent.com/im).
+ * SDKAppID uniquely identifies a Tencent Cloud account.
+ */
+
+static const int public_SDKAPPID = 20030346;
+
+
+/**
+ *  Signature validity period, which should not be set too short
+ *
+ *  Time unit: second
+ *  Default value: 604800 (7 days)
+ */
+static const int EXPIRETIME = 604800;
+
+
+/**
+ * Follow the steps below to obtain the key required for UserSig calculation.
+ *
+ * Step 1. Log in to the [Tencent Cloud IM console](https://console.intl.cloud.tencent.com/im), and create an application if you don’t have one.
+ * Step 2. Click Application Configuration to go to the basic configuration page and locate Account System Integration.
+ * Step 3. Click View Key to view the encrypted key used for UserSig calculation. Then copy and paste the key to the variable below.
+ *
+ * Note: this method is for testing only. Before commercial launch, please migrate the UserSig calculation code and key to your backend server to prevent key disclosure and traffic stealing.
+ * Reference:https://intl.cloud.tencent.com/document/product/1047/34385
+ */
+static NSString * const public_SECRETKEY = @"a063a1a88b743dacba7f969b70e0b3aec161be06f1326a3913032c5632ed28f9";
+
+
+@interface GenerateTestUserSig : NSObject
+
+
+// Get the current SDKAppID and SecretKey
+
++ (unsigned int)currentSDKAppid;
+
++ (NSString *)currentSecretkey;
+
+/**
+ * Calculate UserSig
+ *
+ * The asymmetric encryption algorithm HMAC-SHA256 is used in the function to calculate UserSig based on SDKAppID, UserID, and EXPIRETIME.
+ *
+ * Attention: Do not use the code below in your commercial application. This is because:
+ *
+ * The code may be able to calculate UserSig correctly, but it is only for quick testing of the SDK’s basic features, not for commercial applications.
+ * SECRETKEY in client code can be easily decompiled and reversed, especially on web.
+ * Once your key is disclosed, attackers will be able to steal your Tencent Cloud traffic.
+ *
+ * The correct method is to deploy the UserSig calculation code and encryption key on your project server so that your application can request from your server a UserSig that is calculated whenever one is needed.
+ * Given that it is more difficult to hack a server than a client application, server-end calculation can better protect your key.
+ *
+ * Reference:https://intl.cloud.tencent.com/document/product/1047/34385
+ */
+
++ (NSString *)genTestUserSig:(NSString *)identifier;
+@end
+
+NS_ASSUME_NONNULL_END

+ 99 - 0
Lanu/Manager/IM/GenerateTestUserSig.m

@@ -0,0 +1,99 @@
+#import "GenerateTestUserSig.h"
+#import <CommonCrypto/CommonCrypto.h>
+#import <zlib.h>
+
+@implementation GenerateTestUserSig
+
++ (unsigned int)currentSDKAppid {
+    return public_SDKAPPID;
+}
+
++ (NSString *)currentSecretkey {
+    return public_SECRETKEY;
+}
+
+
++ (NSString *)genTestUserSig:(NSString *)identifier
+{
+    CFTimeInterval current = CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970;
+    long TLSTime = floor(current);
+    NSMutableDictionary *obj = [@{@"TLS.ver": @"2.0",
+                                  @"TLS.identifier": identifier,
+                                  @"TLS.sdkappid": @(SDKAPPID),
+                                  @"TLS.expire": @(EXPIRETIME),
+                                  @"TLS.time": @(TLSTime)} mutableCopy];
+    NSMutableString *stringToSign = [[NSMutableString alloc] init];
+    NSArray *keyOrder = @[@"TLS.identifier",
+                          @"TLS.sdkappid",
+                          @"TLS.time",
+                          @"TLS.expire"];
+    for (NSString *key in keyOrder) {
+        [stringToSign appendFormat:@"%@:%@\n", key, obj[key]];
+    }
+    NSLog(@"%@", stringToSign);
+    //NSString *sig = [self sigString:stringToSign];
+    NSString *sig = [self hmac:stringToSign];
+
+    obj[@"TLS.sig"] = sig;
+    NSLog(@"sig: %@", sig);
+    NSError *error = nil;
+    NSData *jsonToZipData = [NSJSONSerialization dataWithJSONObject:obj options:0 error:&error];
+    if (error) {
+        NSLog(@"[Error] json serialization failed: %@", error);
+        return @"";
+    }
+
+    const Bytef* zipsrc = (const Bytef*)[jsonToZipData bytes];
+    uLongf srcLen = jsonToZipData.length;
+    uLong upperBound = compressBound(srcLen);
+    Bytef *dest = (Bytef*)malloc(upperBound);
+    uLongf destLen = upperBound;
+    int ret = compress2(dest, &destLen, (const Bytef*)zipsrc, srcLen, Z_BEST_SPEED);
+    if (ret != Z_OK) {
+        NSLog(@"[Error] Compress Error %d, upper bound: %lu", ret, upperBound);
+        free(dest);
+        return @"";
+    }
+    NSString *result = [self base64URL: [NSData dataWithBytesNoCopy:dest length:destLen]];
+    return result;
+}
+
++ (NSString *)hmac:(NSString *)plainText
+{
+    const char *cKey  = [SECRETKEY cStringUsingEncoding:NSASCIIStringEncoding];
+    const char *cData = [plainText cStringUsingEncoding:NSASCIIStringEncoding];
+
+    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
+
+    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
+
+    NSData *HMACData = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
+    return [HMACData base64EncodedStringWithOptions:0];
+}
+
++ (NSString *)base64URL:(NSData *)data
+{
+    NSString *result = [data base64EncodedStringWithOptions:0];
+    NSMutableString *final = [[NSMutableString alloc] init];
+    const char *cString = [result cStringUsingEncoding:NSUTF8StringEncoding];
+    for (int i = 0; i < result.length; ++ i) {
+        char x = cString[i];
+        switch(x){
+            case '+':
+                [final appendString:@"*"];
+                break;
+            case '/':
+                [final appendString:@"-"];
+                break;
+            case '=':
+                [final appendString:@"_"];
+                break;
+            default:
+                [final appendFormat:@"%c", x];
+                break;
+        }
+    }
+    return final;
+}
+
+@end

+ 18 - 1
Lanu/Manager/IM/LNIMManager.swift

@@ -8,5 +8,22 @@
 import Foundation
 
 class LNIMManager {
-    static let appId = "20030346"
+    static let appId: Int32 = 20030346
+    static let secretKey = "a063a1a88b743dacba7f969b70e0b3aec161be06f1326a3913032c5632ed28f9"
+    
+    static var shared = LNIMManager()
+    
+    private init() {
+        LNEventDeliver.addObserver(self)
+    }
+}
+
+extension LNIMManager: LNUserMainEvent {
+    func onUserLogin() {
+        let userSig = GenerateTestUserSig.genTestUserSig(myUid)
+        
+        TUILogin.login(Self.appId, userID: myUid, userSig: userSig) {
+        } fail: { code, err in
+        }
+    }
 }

+ 1 - 1
Lanu/Manager/Network/LNHttpManager.swift

@@ -111,7 +111,7 @@ class LNHttpManager {
         sign += time
         commonHeader["time"] = time
         
-        let token = LNAccountManager.token
+        let token = LNAccountManager.shared.token
         if !token.isEmpty {
             sign += token
             commonHeader["token"] = token

+ 33 - 20
Lanu/Manager/Profile/LNProfileManager.swift

@@ -12,11 +12,14 @@ protocol LNProfileManagerNotify {
     func onUserInfoChanged(userInfo: LNUserProfileInfo)
 }
 
+var myUserInfo: LNUserProfileInfo {
+    LNProfileManager.shared.myUserInfo
+}
 
 class LNProfileManager {
     static let shared = LNProfileManager()
     
-    private(set) static var myUserInfo: LNUserProfileInfo = LNUserProfileInfo()
+    private(set) var myUserInfo: LNUserProfileInfo = LNUserProfileInfo()
     
     private let lock = NSLock()
     private var profileCached: [String: LNUserProfileInfo] = [:]
@@ -53,44 +56,54 @@ class LNProfileManager {
 
 extension LNProfileManager {
     func reloadMyProfile() {
-        LNHttpManager.shared.getMyProfile { res, err in
+        LNHttpManager.shared.getMyProfile { [weak self] res, err in
+            guard let self else { return }
             guard err == nil, let res else { return }
             
-            Self.myUserInfo.update(by: res.userProfile)
-            
-            self.lock.lock()
-            self.profileCached[res.userProfile.id] = Self.myUserInfo
-            self.lock.unlock()
-            
-            self.notifyUserInfoChanged(newInfo: Self.myUserInfo)
+            let info = LNUserProfileInfo(profile: res.userProfile)
+            self.updateUserInfo(info: info)
         }
     }
     
     func modifyMyProfile(age: Int? = nil, avatar: String? = nil,
                          nickname: String? = nil, gender: Int? = nil,
                          voiceBar: String? = nil,
-                         completion: @escaping (LNMyProfileResponseVO?, LNHttpError?) -> Void) {
+                         completion: @escaping (LNMyProfileResponseVO?) -> Void) {
         LNHttpManager.shared.modifyMyProfile(age: age, avatar: avatar,
                                              nickname: nickname, gender: gender,
-                                             voiceBar: voiceBar) { res, err in
-            if err == nil, let res {
-                Self.myUserInfo.update(by: res.userProfile)
-                
-                self.lock.lock()
-                self.profileCached[res.userProfile.id] = Self.myUserInfo
-                self.lock.unlock()
-                
-                self.notifyUserInfoChanged(newInfo: Self.myUserInfo)
+                                             voiceBar: voiceBar) { [weak self] res, err in
+            guard let self else { return }
+            guard err == nil, let res else {
+                completion(nil)
+                return
             }
-            completion(res, err)
+            let info = LNUserProfileInfo(profile: res.userProfile)
+            self.updateUserInfo(info: info)
         }
     }
 }
 
+extension LNProfileManager {
+    private func updateUserInfo(info: LNUserProfileInfo) {
+        if info.id.isMyUid {
+            myUserInfo = info
+        }
+        lock.lock()
+        profileCached[info.id] = info
+        lock.unlock()
+        
+        notifyUserInfoChanged(newInfo: info)
+    }
+}
+
 extension LNProfileManager: LNUserMainEvent {
     func onUserLogin() {
         reloadMyProfile()
     }
+    
+    func onUserLogout() {
+        myUserInfo = LNUserProfileInfo()
+    }
 }
 
 extension LNProfileManager {

+ 3 - 1
Lanu/Manager/Profile/LNUserProfileInfo.swift

@@ -18,7 +18,9 @@ class LNUserProfileInfo {
     var intro: String = ""
     var playmate: Bool = false
     
-    func update(by profile: LNUserProfileVO) {
+    init() {}
+    
+    init(profile: LNUserProfileVO) {
         id = profile.id
         userNo = profile.userNo
         avatar = profile.avatar

+ 6 - 6
Lanu/SceneDelegate.swift

@@ -8,10 +8,8 @@
 import UIKit
 
 class SceneDelegate: UIResponder, UIWindowSceneDelegate {
-
     var window: UIWindow?
-
-
+    
     func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
         // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
         // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
@@ -20,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
         
         window = UIWindow(windowScene: sceneWindow)
         window?.backgroundColor = .white
-        if LNAccountManager.wasLogin {
+        if LNAccountManager.shared.wasLogin {
             window?.rootViewController = LNNavigationController(rootViewController: LNMainViewController())
         } else {
             window?.rootViewController = LNNavigationController(rootViewController: LNLoginViewController())
@@ -28,6 +26,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
         window?.makeKeyAndVisible()
         
         LNEventDeliver.addObserver(self)
+        
+        autoLoginIfNeed()
     }
 
     func sceneDidDisconnect(_ scene: UIScene) {
@@ -85,9 +85,9 @@ extension SceneDelegate: LNUserMainEvent {
 
 extension SceneDelegate {
     private func autoLoginIfNeed() {
-        guard LNAccountManager.wasLogin,
+        guard LNAccountManager.shared.wasLogin,
               LNNetworkMonitor.curState == .available else { return }
         
-//        LNAccountManager.loginByToken(completion: { success in })
+        LNAccountManager.shared.loginByToken()
     }
 }

+ 20 - 0
Lanu/Views/IM/LNIMViewController.swift

@@ -0,0 +1,20 @@
+//
+//  LNIMViewController.swift
+//  Lanu
+//
+//  Created by OneeChan on 2025/11/13.
+//
+
+import Foundation
+import UIKit
+import SnapKit
+import TUIConversation
+
+
+class LNIMViewController: TUIConversationListController {
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        
+        isShowBanner = false
+    }
+}

+ 11 - 5
Lanu/Views/Login/LNLoginViewController.swift

@@ -10,14 +10,22 @@ import UIKit
 import SnapKit
 import GoogleSignIn
 
-class LNLoginViewController: LNBaseViewController {
+class LNLoginViewController: LNViewController {
     override func viewDidLoad() {
         super.viewDidLoad()
         
+        setupGoogleSignIn()
         setupViews()
     }
 }
 
+extension LNLoginViewController {
+    private func setupGoogleSignIn() {
+        let clientID = Bundle.main.object(forInfoDictionaryKey: "GoogleClientID") as! String
+        GIDSignIn.sharedInstance.configuration = GIDConfiguration(clientID: clientID)
+    }
+}
+
 extension LNLoginViewController {
     private func setupViews() {
         showNavigationBar = false
@@ -41,12 +49,10 @@ extension LNLoginViewController {
         loginButton.addAction(UIAction(handler: { [weak self] _ in
             guard let self else { return }
             GIDSignIn.sharedInstance.signIn(withPresenting: self) { [weak self] result, err in
-                guard let self else { return }
+                guard self != nil else { return }
                 guard err == nil, let result else { return }
                 guard let token = result.user.idToken?.tokenString else { return }
-                LNAccountManager.loginByGoogle(data: token) { [weak self] err in
-                    guard let self else { return }
-                }
+                LNAccountManager.shared.loginByGoogle(data: token)
             }
         }), for: .touchUpInside)
         

+ 15 - 1
Lanu/Views/Main/LNMainViewController.swift

@@ -8,8 +8,9 @@
 import Foundation
 import UIKit
 import SnapKit
+import TUIConversation
 
-class LNMainViewController: LNBaseViewController {
+class LNMainViewController: LNViewController {
     override func viewDidLoad() {
         super.viewDidLoad()
         
@@ -21,5 +22,18 @@ class LNMainViewController: LNBaseViewController {
         title.snp.makeConstraints { make in
             make.center.equalToSuperview()
         }
+        
+        let chat = UIButton()
+        chat.setTitle("Chat", for: .normal)
+        chat.setTitleColor(.black, for: .normal)
+        chat.addAction(UIAction(handler: { [weak self] _ in
+            guard let self else { return }
+            navigationController?.pushViewController(LNIMViewController(), animated: true)
+        }), for: .touchUpInside)
+        view.addSubview(chat)
+        chat.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.centerY.equalToSuperview().multipliedBy(0.5)
+        }
     }
 }

+ 4 - 29
Podfile.lock

@@ -1,39 +1,25 @@
 PODS:
   - Masonry (1.1.0)
-  - Protobuf (3.29.5)
   - ReactiveObjC (3.1.1)
   - SDWebImage (5.21.3):
     - SDWebImage/Core (= 5.21.3)
   - SDWebImage/Core (5.21.3)
-  - SSZipArchive (2.4.3)
-  - SVGAPlayer-iOS (1.1.13):
-    - SVGAPlayer-iOS/Core (= 1.1.13)
-    - SVGAPlayer-iOS/ProtoFiles (= 1.1.13)
-  - SVGAPlayer-iOS/Core (1.1.13):
-    - SSZipArchive (>= 1.8.1)
-    - SVGAPlayer-iOS/ProtoFiles
-  - SVGAPlayer-iOS/ProtoFiles (1.1.13):
-    - Protobuf (~> 3.4)
   - TIMCommon (1.0.0):
     - Masonry
     - ReactiveObjC
     - SDWebImage
-    - SVGAPlayer-iOS
     - TUICore
   - TIMPush (8.7.7201):
     - TXIMSDK_Plus_iOS_XCFramework (>= 8.7.7201)
   - TUIChat (1.0.0):
     - ReactiveObjC
     - SDWebImage
-    - SVGAPlayer-iOS
     - TIMCommon
     - TUICore
   - TUIConversation (1.0.0):
     - ReactiveObjC
-    - SVGAPlayer-iOS
     - TIMCommon
     - TUICore
-    - YYKit
   - TUICore (1.0.0):
     - SDWebImage
     - TUICore/ImSDK_Plus (= 1.0.0)
@@ -44,9 +30,6 @@ PODS:
     - TUICore/Base
     - TXIMSDK_Plus_iOS_XCFramework
   - TXIMSDK_Plus_iOS_XCFramework (8.7.7201)
-  - YYKit (1.0.9):
-    - YYKit/no-arc (= 1.0.9)
-  - YYKit/no-arc (1.0.9)
 
 DEPENDENCIES:
   - TIMCommon (from `./ThirdParty/TUIKit/TIMCommon`)
@@ -59,14 +42,10 @@ DEPENDENCIES:
 SPEC REPOS:
   https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git:
     - Masonry
-    - Protobuf
     - ReactiveObjC
     - SDWebImage
-    - SSZipArchive
-    - SVGAPlayer-iOS
     - TIMPush
     - TXIMSDK_Plus_iOS_XCFramework
-    - YYKit
 
 EXTERNAL SOURCES:
   TIMCommon:
@@ -80,19 +59,15 @@ EXTERNAL SOURCES:
 
 SPEC CHECKSUMS:
   Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
-  Protobuf: 164aea2ae380c3951abdc3e195220c01d17400e0
   ReactiveObjC: 011caa393aa0383245f2dcf9bf02e86b80b36040
   SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
-  SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef
-  SVGAPlayer-iOS: cc24eb156f93f793b9e72e7b8de617f22f1864d0
-  TIMCommon: 39343d50032dd1e022aef14faafdd59041cd4cfa
+  TIMCommon: 5a716eda26c177556be02dd4932ea73a66efd6ba
   TIMPush: 4f4fa655697c4106309054d0b50a485e642b4f80
-  TUIChat: 47d612d109c68854b427dcfe92e109171559ae6a
-  TUIConversation: ea832cc28987495091203ca892fe046414b29e5f
+  TUIChat: 74fc0a4bf0ccaa3998f69068ac31ac77238e4faa
+  TUIConversation: 7352e1f4835d24c09c302f756ad5b74d98bb1270
   TUICore: c1e480d7644ad9efb0db8c353e26ff39d7e4933b
   TXIMSDK_Plus_iOS_XCFramework: 3b435eae84c639f35ae8dc9c8b92c399a8b0a67f
-  YYKit: 7cda43304a8dc3696c449041e2cb3107b4e236e7
 
-PODFILE CHECKSUM: 79149af608319cad7ddddf1975edb1df49217cf3
+PODFILE CHECKSUM: 86238246a28235c1048520f290323b7290e6b9a1
 
 COCOAPODS: 1.16.2

+ 0 - 41
ThirdParty/TUIKit/TIMCommon/BaseCell/TUIMessageCell.m

@@ -13,13 +13,10 @@
 #import "NSString+TUIEmoji.h"
 #import "TUISystemMessageCellData.h"
 #import <TUICore/TUICore.h>
-#import <TIMCommon/MOHeadNormalView.h>
 
 @interface TUIMessageCell () <CAAnimationDelegate>
 @property(nonatomic, strong) TUIMessageCellData *messageData;
 
-@property (nonatomic, strong) MOHeadNormalView *headBgView;//头像框
-
 @end
 
 @implementation TUIMessageCell
@@ -44,8 +41,6 @@
     UILongPressGestureRecognizer *tap2 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onLongSelectMessageAvatar:)];
     [_avatarView addGestureRecognizer:tap2];
     [_avatarView setUserInteractionEnabled:YES];
-    
-    [self.contentView addSubview:self.headBgView];
 
     // nameLabel
     _nameLabel = [[UILabel alloc] init];
@@ -120,13 +115,6 @@
 
 - (void)makeConstraints {
     
-    [self.headBgView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.centerX.equalTo(self.avatarView);
-        make.centerY.equalTo(self.avatarView);
-        make.width.height.equalTo(@40.0);
-    }];
-    self.headBgView.headImgWidth = 40.0;
-    
     [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
         make.leading.mas_equalTo(_container.mas_leading).mas_offset(7);
         make.top.mas_equalTo(self.avatarView.mas_top);
@@ -274,13 +262,6 @@
           make.size.mas_equalTo(self.readReceiptLabel.frame.size);
         }];
     }
-    
-    [self.headBgView mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.centerX.equalTo(self.avatarView);
-        make.centerY.equalTo(self.avatarView);
-        make.width.height.equalTo(@40.0);
-    }];
-    self.headBgView.headImgWidth = 40.0;
 
     if (!self.messageModifyRepliesButton.isHidden) {
         self.messageModifyRepliesButton.mm_sizeToFit();
@@ -424,21 +405,6 @@
       [weakSelf highlightWhenMatchKeyword:data.highlightKeyword];
     });
     
-    if(![data isKindOfClass:[TUISystemMessageCellData class]]){
-        if(data.headdress.length > 0){
-            self.headBgView.hidden = NO;
-            self.headBgView.isLiving = NO;
-            self.headBgView.effectType = data.headgearType;
-            self.headBgView.imgUrlStr = data.headdress;
-        }
-        else{
-            self.headBgView.hidden = YES;
-        }
-    }
-    else{
-        self.headBgView.hidden = YES;
-    }
-    
     // tell constraints they need updating
     [self setNeedsUpdateConstraints];
 
@@ -711,11 +677,4 @@ static UIFont *gIncommingNameFont;
     gIncommingNameFont = incommingNameFont;
 }
 
-- (MOHeadNormalView *)headBgView{
-    if(!_headBgView){
-        _headBgView = [[MOHeadNormalView alloc] init];
-    }
-    return _headBgView;
-}
-
 @end

+ 0 - 3
ThirdParty/TUIKit/TIMCommon/BaseCellData/TUIMessageCellData.h

@@ -102,9 +102,6 @@ typedef NS_ENUM(NSUInteger, TMsgSource) {
  */
 @property(nonatomic, strong) UIImage *__nullable avatarImage __attribute__((deprecated("not supported")));
 
-@property (nonatomic, strong) NSString *headdress;//头饰链接
-@property (nonatomic, assign) NSInteger headgearType;//头饰 - 头饰类型(0=无资源文件,1=动态webp,2=SVGA,3=VAP)
-
 /**
  * Whether to use the receiver's avatar, default is NO
  */

+ 0 - 56
ThirdParty/TUIKit/TIMCommon/BaseCellData/TUIMessageCellData.m

@@ -89,15 +89,6 @@
 
 - (NSString *)senderName {
     if (self.innerMessage) {
-        
-        if(self.innerMessage.localCustomData){
-            NSDictionary *dict = [self dictionaryFromData:self.innerMessage.localCustomData];
-            NSString *nickName = [TUIMessageCellData objectOrNilForKey:@"showName" fromDictionary:dict];
-            if(nickName.length > 0){
-                return nickName;
-            }
-        }
-        
         return self.innerMessage.nameCard ? : (self.innerMessage.friendRemark ? : (self.innerMessage.nickName ? : self.innerMessage.sender));
     }
     return nil;
@@ -107,63 +98,16 @@
     _avatarUrl = avatarUrl;
 }
 
-- (NSDictionary *)dictionaryFromData:(NSData *)data {
-    NSError *error = nil;
-    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
-    if (error) {
-        NSLog(@"Error converting NSData to NSDictionary: %@", error.localizedDescription);
-        return nil;
-    }
-    return dictionary;
-}
-
-+ (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
-{
-    id object = [dict objectForKey:aKey];
-    return [object isEqual:[NSNull null]] ? nil : object;
-}
-
 - (NSURL *)avatarUrl {
     if (_avatarUrl) {
         return _avatarUrl;
     }
     if (self.innerMessage) {
-        
-        if(self.innerMessage.localCustomData){
-            NSDictionary *dict = [self dictionaryFromData:self.innerMessage.localCustomData];
-            NSString *avatarStr = [TUIMessageCellData objectOrNilForKey:@"avatarURL" fromDictionary:dict];
-            if(avatarStr.length > 0){
-                return [NSURL URLWithString:avatarStr];
-            }
-        }
-        
         return [NSURL URLWithString:self.innerMessage.faceURL];;
     }
     return nil;
 }
 
-- (NSInteger)headgearType{
-    if (self.innerMessage){
-        if(self.innerMessage.localCustomData){
-            NSDictionary *dict = [self dictionaryFromData:self.innerMessage.localCustomData];
-            NSInteger type = [[TUIMessageCellData objectOrNilForKey:@"headgearType" fromDictionary:dict] integerValue];
-            return type;
-        }
-    }
-    return 0;
-}
-
-- (NSString *)headdress{
-    if (self.innerMessage){
-        if(self.innerMessage.localCustomData){
-            NSDictionary *dict = [self dictionaryFromData:self.innerMessage.localCustomData];
-            NSString *headdressStr = [TUIMessageCellData objectOrNilForKey:@"headdress" fromDictionary:dict];
-            return headdressStr;
-        }
-    }
-    return @"";
-}
-
 - (BOOL)canForward {
     return YES;
 }

+ 1 - 1
ThirdParty/TUIKit/TIMCommon/CommonModel/TIMCommonModel.m

@@ -1269,7 +1269,7 @@
 - (void)setupViews {
     _unReadLabel = [[UILabel alloc] init];
     _unReadLabel.text = @"11";
-    _unReadLabel.font = [UIFont systemFontOfSize:10];
+    _unReadLabel.font = [UIFont systemFontOfSize:12];
     _unReadLabel.textColor = [UIColor whiteColor];
     _unReadLabel.textAlignment = NSTextAlignmentCenter;
     [_unReadLabel sizeToFit];

+ 1 - 1
ThirdParty/TUIKit/TIMCommon/Resources/TIMCommonTheme.bundle/dark/manifest.plist

@@ -137,7 +137,7 @@
 	<key>chat_react_desc_color</key>
 	<string>#FFFFFF</string>
 	<key>chat_highlight_link_color</key>
-	<string>#6495ED</string>
+	<string>#1667f7</string>
 	<key>chat_nav_more_menu_img</key>
 	<string>chat_nav_more_menu.png</string>
 </dict>

+ 0 - 1
ThirdParty/TUIKit/TIMCommon/TIMCommon.podspec

@@ -16,7 +16,6 @@ Pod::Spec.new do |spec|
   spec.dependency 'SDWebImage'
   spec.dependency 'ReactiveObjC'
   spec.dependency 'Masonry'
-  spec.dependency 'SVGAPlayer-iOS'
   spec.requires_arc = true
 
   spec.source = { :git => 'https://git.woa.com/lynxzhang/tui-components.git', :tag => spec.version}

+ 0 - 16
ThirdParty/TUIKit/TIMCommon/UI_Classic/MOCustomView/MOCustomSvgaPlayerView.h

@@ -1,16 +0,0 @@
-//
-//  MOCustomSvgaPlayerView.h
-//  TIMCommon
-//
-//  Created by SuperC on 2025/5/19.
-//
-
-#import <SVGAPlayer_iOS/SVGA.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOCustomSvgaPlayerView : SVGAPlayer
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 21
ThirdParty/TUIKit/TIMCommon/UI_Classic/MOCustomView/MOCustomSvgaPlayerView.m

@@ -1,21 +0,0 @@
-//
-//  MOCustomSvgaPlayerView.m
-//  TIMCommon
-//
-//  Created by SuperC on 2025/5/19.
-//
-
-#import "MOCustomSvgaPlayerView.h"
-
-@implementation MOCustomSvgaPlayerView
-
-/**
- 每个view都有这个方法,用来处理用户的操作事件。
- @return 它返回:self,代表这个view会接受用户的操作事件,返回:nil,则代表这个view不会接受用户的操作事件。
- */
-
-- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
-    return nil;
-}
-
-@end

+ 0 - 30
ThirdParty/TUIKit/TIMCommon/UI_Classic/MOCustomView/MOHeadNormalView.h

@@ -1,30 +0,0 @@
-//
-//  MOHeadNormalView.h
-//  TIMCommon
-//
-//  Created by SuperC on 2025/5/19.
-//
-
-#import <UIKit/UIKit.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOHeadNormalView : UIView
-
-/** 头像的宽度 */
-@property (nonatomic, assign) CGFloat headImgWidth;
-
-/** 是否在直播中 */
-@property (nonatomic, assign) BOOL isLiving;
-/** 是否动画 */
-@property (nonatomic, assign) BOOL isAnimation;
-@property (nonatomic, copy) NSString *imgUrlStr;
-
-/**道具存储 - 特效类型(0=无资源文件,1=动态webp,2=SVGA,3=VAP,4=Mp4) */
-@property (nonatomic, assign) double effectType;
-
-- (void)updataViewStatus;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 179
ThirdParty/TUIKit/TIMCommon/UI_Classic/MOCustomView/MOHeadNormalView.m

@@ -1,179 +0,0 @@
-//
-//  MOHeadNormalView.m
-//  TIMCommon
-//
-//  Created by SuperC on 2025/5/19.
-//
-
-#import "MOHeadNormalView.h"
-#import "MOCustomSvgaPlayerView.h"
-#import <TIMCommon/TIMDefine.h>
-
-@interface MOHeadNormalView ()
-
-@property (nonatomic, strong) UIImageView *bgImgView;
-
-/** svga 播放 管理类 */
-@property (nonatomic, strong) MOCustomSvgaPlayerView *aPlayer;
-@property (nonatomic, strong) SVGAParser *aParser;
-
-
-@end
-
-@implementation MOHeadNormalView
-
-- (instancetype)init
-{
-    if (self = [super init])
-    {
-        [self setupUI];
-    }
-    return self;
-}
-
-- (instancetype)initWithFrame:(CGRect)frame
-{
-    self = [super initWithFrame:frame];
-    if (self)
-    {
-        [self setupUI];
-    }
-    return self;
-}
-
-- (void)setupUI{
-    
-    self.backgroundColor = [UIColor clearColor];
-    self.userInteractionEnabled = NO;
-    
-    [self addSubview:self.bgImgView];
-    [self.bgImgView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.centerY.equalTo(self);
-        make.width.equalTo(@20.0);
-        make.height.equalTo(@20.0);
-        make.centerX.equalTo(self);
-    }];
-    
-    [self addSubview:self.aPlayer];
-    [self.aPlayer mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.centerY.equalTo(self);
-        make.width.equalTo(@30.0);
-        make.height.equalTo(@30.0);
-        make.centerX.equalTo(self);
-    }];
-}
-
-
-- (void)setHeadImgWidth:(CGFloat)headImgWidth{
-    _headImgWidth = headImgWidth;
-    
-    //bgImgView 3 / 4
-    CGFloat width = headImgWidth * 1.7 ;
-    [self.bgImgView mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.width.equalTo(@(width));
-        make.height.equalTo(@(width));
-        make.centerY.equalTo(self);
-        make.centerX.equalTo(self);
-    }];
-    
-    //svga 9 / 12
-    CGFloat svgaWidth = headImgWidth * 1.7;
-    [self.aPlayer mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.width.equalTo(@(svgaWidth));
-        make.height.equalTo(@(svgaWidth));
-        make.centerY.equalTo(self);
-        make.centerX.equalTo(self);
-    }];
-}
-
-
-- (void)setIsAnimation:(BOOL)isAnimation{
-    _isAnimation = isAnimation;
-    
-    [self updataViewStatus];
-}
-
-- (void)setEffectType:(double)effectType{
-    _effectType = effectType;
-    
-    [self updataViewStatus];
-}
-
-- (void)updataViewStatus{
-    if(self.isLiving){
-        //直播中
-        self.aPlayer.hidden = YES;
-        self.bgImgView.hidden = YES;
-    }
-    else{
-        //不在直播中, 显示头像框
-        if(self.effectType == 2){//svga
-            self.aPlayer.hidden = NO;
-            self.bgImgView.hidden = YES;
-        }
-        else if (self.effectType == 0 || self.effectType == 1){//png 或 webp
-            self.aPlayer.hidden = YES;
-            self.bgImgView.hidden = NO;
-        }
-        else{
-            self.aPlayer.hidden = YES;
-            self.bgImgView.hidden = YES;
-        }
-    }
-}
-
-
-- (void)setImgUrlStr:(NSString *)imgUrlStr{
-    _imgUrlStr = imgUrlStr;
-    
-    @weakify(self);
-    if(self.effectType == 2){//svga
-        [self.aPlayer clear];
-        [self.aParser parseWithURL:[NSURL URLWithString:imgUrlStr] completionBlock:^(SVGAVideoEntity * _Nullable videoItem) {
-            @strongify(self);
-            if (videoItem) {
-                self.aPlayer.videoItem = videoItem;
-                [self.aPlayer startAnimation];
-            }
-            
-        } failureBlock:^(NSError * _Nullable error) {
-            NSLog(@"播放失败~~~~~~~~");
-        }];
-    }
-    else if (self.effectType == 0 || self.effectType == 1){//png 或 webp
-        [self.bgImgView sd_setImageWithURL:[NSURL URLWithString:imgUrlStr]];
-    }
-}
-
-#pragma mark - Lazy
-
-- (UIImageView *)bgImgView{
-    if(!_bgImgView){
-        _bgImgView = [[UIImageView alloc] init];
-        _bgImgView.contentMode = UIViewContentModeScaleAspectFit;
-        _bgImgView.hidden = YES;
-    }
-    return _bgImgView;
-}
-
-- (MOCustomSvgaPlayerView *)aPlayer{
-    if (_aPlayer == nil) {
-        _aPlayer = [[MOCustomSvgaPlayerView alloc] init];
-        _aPlayer.contentMode = UIViewContentModeScaleAspectFill;
-        _aPlayer.hidden = YES;
-        _aPlayer.loops = 0;
-        _aPlayer.clearsAfterStop = NO;
-    }
-    return _aPlayer;
-}
-
-- (SVGAParser *)aParser{
-    
-    if (_aParser == nil) {
-        _aParser = [[SVGAParser alloc] init];
-    }
-    
-    return _aParser;
-}
-
-@end

+ 0 - 34
ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOSystemNormalCellData.h

@@ -1,34 +0,0 @@
-//
-//  MOSystemNormalCellData.h
-//  TUIConversation
-//
-//  Created by SuperC on 2025/5/16.
-//
-
-#import <TIMCommon/TUIBubbleMessageCellData.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOSystemNormalCellData : TUIBubbleMessageCellData
-
-@property(nonatomic, assign) NSInteger type;// 类型,非空
-@property(nonatomic, copy) NSString *img;// 图片,可空,当类型(1,2,3,4)时非空
-@property(nonatomic, copy) NSString *title;// 标题,可空,当类型(1,2,5,7)时非空
-@property(nonatomic, copy) NSString *content;// 内容,非空
-@property(nonatomic, copy) NSString *link;// 链接,可空,当类型(1,4,5,6,7,8)时非空
-@property(nonatomic, copy) NSString *linkStr;// content中链接对应的文案,可空,当类型(7,8)时非空
-
-- (CGSize)contentSize;
-
-//显示图片
-- (BOOL)showPicture;
-//显示标题
-- (BOOL)showTitle;
-//显示底部detailsview
-- (BOOL)showDetailsView;
-
-+ (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 208
ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOSystemNormalCellData.m

@@ -1,208 +0,0 @@
-//
-//  MOSystemNormalCellData.m
-//  TUIConversation
-//
-//  Created by SuperC on 2025/5/16.
-//
-
-#import "MOSystemNormalCellData.h"
-
-@implementation MOSystemNormalCellData
-
-+ (TUIMessageCellData *)getCellData:(V2TIMMessage *)message {
-    NSDictionary *param = [NSJSONSerialization JSONObjectWithData:message.customElem.data options:NSJSONReadingAllowFragments error:nil];
-    if (param == nil) {
-        return nil;
-    }
-    MOSystemNormalCellData *cellData = [[MOSystemNormalCellData alloc] initWithDirection:message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming];
-    cellData.reuseId = @"MOSystemNormalCell";
-    cellData.innerMessage = message;
-    cellData.type = [[MOSystemNormalCellData objectOrNilForKey:@"type" fromDictionary:param] integerValue];
-    cellData.img = [MOSystemNormalCellData objectOrNilForKey:@"img" fromDictionary:param];
-    cellData.title = [MOSystemNormalCellData objectOrNilForKey:@"title" fromDictionary:param];
-    cellData.content = [MOSystemNormalCellData objectOrNilForKey:@"content" fromDictionary:param];
-    cellData.link = [MOSystemNormalCellData objectOrNilForKey:@"link" fromDictionary:param];
-    cellData.linkStr = [MOSystemNormalCellData objectOrNilForKey:@"linkStr" fromDictionary:param];
-    return cellData;
-}
-
-+ (NSString *)getDisplayString:(V2TIMMessage *)message {
-    NSDictionary *param = [NSJSONSerialization JSONObjectWithData:message.customElem.data options:NSJSONReadingAllowFragments error:nil];
-    if (param == nil) {
-        return nil;
-    }
-    
-    NSString *contentStr = [MOSystemNormalCellData objectOrNilForKey:@"content" fromDictionary:param];
-    if(contentStr.length > 0){
-        return contentStr;
-    }
-    
-    return message.customElem.desc;
-}
-
-- (BOOL)showPicture {
-    if (self.type == 1) {//图片.标题。内容.链接
-        return YES;
-    } if (self.type == 2) {//图片.标题。内容
-        return YES;
-    } else if (self.type == 3) {//图片.内容
-        return YES;
-    } else if (self.type == 4) {//图片.内容。链接
-        return YES;
-    } else if (self.type == 5) {//标题.内容。链接
-        return NO;
-    } else if (self.type == 6) {//内容。链接
-        return NO;
-    } else if (self.type == 7) {//标题,内容,文字调整链接
-        return NO;
-    } else if (self.type == 8) {//内容,文字调整链接
-        return NO;
-    } else if (self.type == 9) {//内容
-        return NO;
-    }
-    return NO;
-}
-
-- (BOOL)showTitle {
-    if (self.type == 1) {//图片.标题。内容.链接
-        return YES;
-    } if (self.type == 2) {//图片.标题。内容
-        return YES;
-    } else if (self.type == 3) {//图片.内容
-        return NO;
-    } else if (self.type == 4) {//图片.内容。链接
-        return NO;
-    } else if (self.type == 5) {//标题.内容。链接
-        return YES;
-    } else if (self.type == 6) {//内容。链接
-        return NO;
-    } else if (self.type == 7) {//标题,内容,文字调整链接
-        return YES;
-    } else if (self.type == 8) {//内容,文字调整链接
-        return NO;
-    } else if (self.type == 9) {//内容
-        return NO;
-    }
-    return NO;
-}
-
-- (BOOL)showDetailsView {
-    if (self.type == 1) {//图片.标题。内容.链接
-        return YES;
-    } if (self.type == 2) {//图片.标题。内容
-        return NO;
-    } else if (self.type == 3) {//图片.内容
-        return NO;
-    } else if (self.type == 4) {//图片.内容。链接
-        return YES;
-    } else if (self.type == 5) {//标题.内容。链接
-        return YES;
-    } else if (self.type == 6) {//内容。链接
-        return YES;
-    } else if (self.type == 7) {//标题,内容,文字调整链接
-        return NO;
-    } else if (self.type == 8) {//内容,文字调整链接
-        return NO;
-    } else if (self.type == 9) {//内容
-        return NO;
-    }
-    return NO;
-}
-
-- (CGSize)contentSize {
-    //文字内容显示区域
-    CGFloat viewWidth = [[UIScreen mainScreen] bounds].size.width - 15.0 * 2.0;
-    CGFloat contentWidth = viewWidth - 10.0 * 2.0;
-    
-    //标题以上固定距离
-    CGFloat titleTopSpacing = 40.0;
-    
-    CGFloat pictureHeight = 0;
-    if (self.img.length > 0 && [self showPicture]) {
-        pictureHeight = 74 + 10;//10是图片底部的间距
-    }
-        
-    //标题高度
-    CGFloat titleHeight = 0;
-    if (self.title.length > 0 && [self showTitle]) {
-        UIFont *titleFont = [MOSystemNormalCellData getTheFontWithSize:15.0 AndFontName:@"Roboto-Bold"];
-        titleHeight = [self.title boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                               options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : titleFont}
-                                               context:nil].size.height + 2;//2是补偿高度
-       
-    }
-
-    //内容高度
-    CGFloat contentHeight = 0;
-    if(self.content.length > 0){
-        UIFont *contentFont = [MOSystemNormalCellData getTheFontWithSize:13.0 AndFontName:@"Roboto"];
-        contentHeight = [self.content boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
-                                                        attributes:@{NSFontAttributeName : contentFont}
-                                                           context:nil].size.height;
-    }
- 
-    //跳转链接内容高度
-    CGFloat linkHeight = 0;
-    if (self.link.length > 0 && [self showDetailsView]) {
-        linkHeight = 30;
-    }
-    
-    //30是bgView上下距离
-    CGFloat bgViewSpacing = 30;
-    
-    CGFloat totalHeigh = 0;
-    if (self.type == 1) {//图片.标题。内容.链接
-        totalHeigh = titleTopSpacing + pictureHeight + titleHeight + contentHeight + linkHeight + bgViewSpacing;
-    } if (self.type == 2) {//图片.标题。内容
-        totalHeigh = titleTopSpacing + titleHeight + pictureHeight + contentHeight + bgViewSpacing;
-    } else if (self.type == 3) {//图片.内容
-        totalHeigh = titleTopSpacing + pictureHeight + contentHeight + bgViewSpacing;
-    } else if (self.type == 4) {//图片.内容。链接
-        totalHeigh = titleTopSpacing + pictureHeight + contentHeight + linkHeight + bgViewSpacing;
-    } else if (self.type == 5) {//标题.内容。链接
-        totalHeigh = titleTopSpacing + titleHeight + contentHeight + linkHeight + bgViewSpacing;
-    } else if (self.type == 6) {//内容。链接
-        totalHeigh = titleTopSpacing + contentHeight + linkHeight + bgViewSpacing;
-    } else if (self.type == 7) {//标题,内容,文字调整链接
-        totalHeigh = titleTopSpacing + titleHeight + contentHeight + bgViewSpacing;
-    } else if (self.type == 8) {//内容,文字调整链接
-        totalHeigh = titleTopSpacing + contentHeight + bgViewSpacing;
-    } else if (self.type == 9) {//内容
-        totalHeigh = titleTopSpacing + contentHeight + bgViewSpacing - 5;//这个类型有5的偏差,直接这里改好了
-    }
-    
-    CGSize size = CGSizeMake(245, ceilf(totalHeigh));
-    return size;
-}
-
-+ (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
-{
-    id object = [dict objectForKey:aKey];
-    return [object isEqual:[NSNull null]] ? nil : object;
-}
-
-+ (UIFont *)getTheFontWithSize:(CGFloat)fontSize AndFontName:(NSString *)fontName{
-    UIFont *customFont = [UIFont fontWithName:fontName size:fontSize];
-    if(!customFont){
-        customFont = [MOSystemNormalCellData MODisplayFontWithSize:fontSize bold:YES itatic:NO weight:UIFontWeightMedium];
-    }
-    return customFont;
-}
-
-+ (UIFont *)MODisplayFontWithSize:(CGFloat)fontSize
-                             bold:(BOOL)bold itatic:(BOOL)italic weight:(UIFontWeight)weight  {
-
-    UIFont *font = [UIFont systemFontOfSize:fontSize weight:weight];
-    UIFontDescriptorSymbolicTraits symbolicTraits = 0;
-    if (italic) {
-        symbolicTraits |= UIFontDescriptorTraitItalic;
-    }
-    if (bold) {
-        symbolicTraits |= UIFontDescriptorTraitBold;
-    }
-    UIFont *specialFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:symbolicTraits] size:font.pointSize];
-    return specialFont;
-}
-
-@end

+ 0 - 28
ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOUserLinkCellData.h

@@ -1,28 +0,0 @@
-//
-//  MOUserLinkCellData.h
-//  TUIChat
-//
-//  Created by SuperC on 2025/10/13.
-//
-
-#import <TIMCommon/TUIBubbleMessageCellData.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOUserLinkCellData : TUIBubbleMessageCellData
-
-// type == 100 私聊, 标题, 内容, 链接
-
-@property(nonatomic, assign) NSInteger type;// 类型,非空
-@property(nonatomic, copy) NSString *title;// 标题,可空,当类型(1,2,5,7)时非空
-@property(nonatomic, copy) NSString *content;// 内容,非空
-@property(nonatomic, copy) NSString *link;// 链接,可空,当类型(1,4,5,6,7,8)时非空
-
-@property(nonatomic, copy) NSString *img;//
-@property(nonatomic, copy) NSString *linkStr;// content中链接对应的文案,可空,当类型(7,8)时非空
-
-- (CGSize)contentSize;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 112
ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOUserLinkCellData.m

@@ -1,112 +0,0 @@
-//
-//  MOUserLinkCellData.m
-//  TUIChat
-//
-//  Created by SuperC on 2025/10/13.
-//
-
-#import "MOUserLinkCellData.h"
-
-@implementation MOUserLinkCellData
-
-+ (TUIMessageCellData *)getCellData:(V2TIMMessage *)message {
-    NSDictionary *param = [NSJSONSerialization JSONObjectWithData:message.customElem.data options:NSJSONReadingAllowFragments error:nil];
-    if (param == nil) {
-        return nil;
-    }
-    MOUserLinkCellData *cellData = [[MOUserLinkCellData alloc] initWithDirection:message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming];
-    cellData.reuseId = @"MOUserLinkCell";
-    cellData.innerMessage = message;
-    cellData.type = [[MOUserLinkCellData objectOrNilForKey:@"type" fromDictionary:param] integerValue];
-    cellData.img = [MOUserLinkCellData objectOrNilForKey:@"img" fromDictionary:param];
-    cellData.title = [MOUserLinkCellData objectOrNilForKey:@"title" fromDictionary:param];
-    cellData.content = [MOUserLinkCellData objectOrNilForKey:@"content" fromDictionary:param];
-    cellData.link = [MOUserLinkCellData objectOrNilForKey:@"link" fromDictionary:param];
-    cellData.linkStr = [MOUserLinkCellData objectOrNilForKey:@"linkStr" fromDictionary:param];
-    return cellData;
-}
-
-+ (NSString *)getDisplayString:(V2TIMMessage *)message {
-    NSDictionary *param = [NSJSONSerialization JSONObjectWithData:message.customElem.data options:NSJSONReadingAllowFragments error:nil];
-    if (param == nil) {
-        return nil;
-    }
-    
-    NSString *contentStr = [MOUserLinkCellData objectOrNilForKey:@"content" fromDictionary:param];
-    if(contentStr.length > 0){
-        return contentStr;
-    }
-    
-    return message.customElem.desc;
-}
-
-- (CGSize)contentSize{
-    //文字内容显示区域
-    CGFloat viewWidth = [[UIScreen mainScreen] bounds].size.width - 64.0 - 12.0;
-    CGFloat contentWidth = viewWidth - 12.0 * 2;
-    
-    //标题以上固定距离
-    CGFloat titleTopSpacing = 8.0;
-    
-    //标题高度
-    CGFloat titleHeight = 0;
-    if (self.title.length > 0) {
-        UIFont *titleFont = [MOUserLinkCellData getTheFontWithSize:16.0 AndFontName:@"Inter-Regular_Medium"];
-        titleHeight = [self.title boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                               options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : titleFont}
-                                               context:nil].size.height + 2;//2是补偿高度
-       
-    }
-    
-    //内容高度
-    CGFloat contentHeight = 0;
-    if(self.content.length > 0){
-        UIFont *contentFont = [MOUserLinkCellData getTheFontWithSize:14.0 AndFontName:@"Inter-Regular"];
-        contentHeight = [self.content boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
-                                                        attributes:@{NSFontAttributeName : contentFont}
-                                                           context:nil].size.height;
-    }
-    
-    //30是bgView上下距离
-    CGFloat bgViewBottomSpacing = 8.0;
-    
-    CGFloat totalHeight = titleTopSpacing + 12.0 + titleHeight + 8.0 + contentHeight + 10.0 + 40.0 + bgViewBottomSpacing;
-    
-    CGSize size = CGSizeMake(viewWidth, ceilf(totalHeight));
-    return size;
-}
-
-
-#pragma mark - Tools
-+ (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
-{
-    id object = [dict objectForKey:aKey];
-    return [object isEqual:[NSNull null]] ? nil : object;
-}
-
-+ (UIFont *)getTheFontWithSize:(CGFloat)fontSize AndFontName:(NSString *)fontName{
-    UIFont *customFont = [UIFont fontWithName:fontName size:fontSize];
-    if(!customFont){
-        customFont = [MOUserLinkCellData MODisplayFontWithSize:fontSize bold:YES itatic:NO weight:UIFontWeightMedium];
-    }
-    return customFont;
-}
-
-+ (UIFont *)MODisplayFontWithSize:(CGFloat)fontSize
-                             bold:(BOOL)bold itatic:(BOOL)italic weight:(UIFontWeight)weight  {
-
-    UIFont *font = [UIFont systemFontOfSize:fontSize weight:weight];
-    UIFontDescriptorSymbolicTraits symbolicTraits = 0;
-    if (italic) {
-        symbolicTraits |= UIFontDescriptorTraitItalic;
-    }
-    if (bold) {
-        symbolicTraits |= UIFontDescriptorTraitBold;
-    }
-    UIFont *specialFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:symbolicTraits] size:font.pointSize];
-    return specialFont;
-}
-
-
-@end

+ 0 - 28
ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOUserNotificationCellData.h

@@ -1,28 +0,0 @@
-//
-//  MOUserNotificationCellData.h
-//  TUIChat
-//
-//  Created by SuperC on 2025/10/13.
-//
-
-#import <TIMCommon/TUIBubbleMessageCellData.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOUserNotificationCellData : TUIBubbleMessageCellData
-
-//type == 101 私聊, 标题, 内容(居中)
-
-@property(nonatomic, assign) NSInteger type;// 类型,非空
-@property(nonatomic, copy) NSString *title;// 标题,可空,当类型(1,2,5,7)时非空
-@property(nonatomic, copy) NSString *content;// 内容,非空
-
-@property(nonatomic, copy) NSString *img;// 图片,可空,当类型(1,2,3,4)时非空
-@property(nonatomic, copy) NSString *link;// 链接,可空,当类型(1,4,5,6,7,8)时非空
-@property(nonatomic, copy) NSString *linkStr;// content中链接对应的文案,可空,当类型(7,8)时非空
-
-- (CGSize)contentSize;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 112
ThirdParty/TUIKit/TUIChat/BaseCellData/Custom/MOUserNotificationCellData.m

@@ -1,112 +0,0 @@
-//
-//  MOUserNotificationCellData.m
-//  TUIChat
-//
-//  Created by SuperC on 2025/10/13.
-//
-
-#import "MOUserNotificationCellData.h"
-
-@implementation MOUserNotificationCellData
-
-+ (TUIMessageCellData *)getCellData:(V2TIMMessage *)message {
-    NSDictionary *param = [NSJSONSerialization JSONObjectWithData:message.customElem.data options:NSJSONReadingAllowFragments error:nil];
-    if (param == nil) {
-        return nil;
-    }
-    MOUserNotificationCellData *cellData = [[MOUserNotificationCellData alloc] initWithDirection:message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming];
-    cellData.reuseId = @"MOUserNotificationCell";
-    cellData.innerMessage = message;
-    cellData.type = [[MOUserNotificationCellData objectOrNilForKey:@"type" fromDictionary:param] integerValue];
-    cellData.img = [MOUserNotificationCellData objectOrNilForKey:@"img" fromDictionary:param];
-    cellData.title = [MOUserNotificationCellData objectOrNilForKey:@"title" fromDictionary:param];
-    cellData.content = [MOUserNotificationCellData objectOrNilForKey:@"content" fromDictionary:param];
-    cellData.link = [MOUserNotificationCellData objectOrNilForKey:@"link" fromDictionary:param];
-    cellData.linkStr = [MOUserNotificationCellData objectOrNilForKey:@"linkStr" fromDictionary:param];
-    return cellData;
-}
-
-+ (NSString *)getDisplayString:(V2TIMMessage *)message {
-    NSDictionary *param = [NSJSONSerialization JSONObjectWithData:message.customElem.data options:NSJSONReadingAllowFragments error:nil];
-    if (param == nil) {
-        return nil;
-    }
-    
-    NSString *contentStr = [MOUserNotificationCellData objectOrNilForKey:@"content" fromDictionary:param];
-    if(contentStr.length > 0){
-        return contentStr;
-    }
-    
-    return message.customElem.desc;
-}
-
-- (CGSize)contentSize{
-    //文字内容显示区域
-    CGFloat viewWidth = [[UIScreen mainScreen] bounds].size.width - 15.0 * 2.0;
-    CGFloat contentWidth = viewWidth - 10.0 * 2.0;
-    
-    //标题以上固定距离
-    CGFloat titleTopSpacing = 8.0;
-    
-    //标题高度
-    CGFloat titleHeight = 0;
-    if (self.title.length > 0) {
-        UIFont *titleFont = [MOUserNotificationCellData getTheFontWithSize:12.0 AndFontName:@"Inter-Regular_Medium"];
-        titleHeight = [self.title boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                               options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : titleFont}
-                                               context:nil].size.height + 2;//2是补偿高度
-       
-    }
-    
-    //内容高度
-    CGFloat contentHeight = 0;
-    if(self.content.length > 0){
-        UIFont *contentFont = [MOUserNotificationCellData getTheFontWithSize:10.0 AndFontName:@"Inter-Regular"];
-        contentHeight = [self.content boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
-                                                        attributes:@{NSFontAttributeName : contentFont}
-                                                           context:nil].size.height;
-    }
-    
-    //30是bgView上下距离
-    CGFloat bgViewBottomSpacing = 8.0;
-    
-    CGFloat totalHeight = titleTopSpacing + titleHeight + 2.0 + contentHeight + bgViewBottomSpacing;
-    
-    CGSize size = CGSizeMake(245, ceilf(totalHeight));
-    return size;
-}
-
-
-#pragma mark - Tools
-+ (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
-{
-    id object = [dict objectForKey:aKey];
-    return [object isEqual:[NSNull null]] ? nil : object;
-}
-
-+ (UIFont *)getTheFontWithSize:(CGFloat)fontSize AndFontName:(NSString *)fontName{
-    UIFont *customFont = [UIFont fontWithName:fontName size:fontSize];
-    if(!customFont){
-        customFont = [MOUserNotificationCellData MODisplayFontWithSize:fontSize bold:YES itatic:NO weight:UIFontWeightMedium];
-    }
-    return customFont;
-}
-
-+ (UIFont *)MODisplayFontWithSize:(CGFloat)fontSize
-                             bold:(BOOL)bold itatic:(BOOL)italic weight:(UIFontWeight)weight  {
-
-    UIFont *font = [UIFont systemFontOfSize:fontSize weight:weight];
-    UIFontDescriptorSymbolicTraits symbolicTraits = 0;
-    if (italic) {
-        symbolicTraits |= UIFontDescriptorTraitItalic;
-    }
-    if (bold) {
-        symbolicTraits |= UIFontDescriptorTraitBold;
-    }
-    UIFont *specialFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:symbolicTraits] size:font.pointSize];
-    return specialFont;
-}
-
-
-@end

+ 0 - 8
ThirdParty/TUIKit/TUIChat/BaseDataProvider/Base/TUIMessageBaseDataProvider.h

@@ -74,12 +74,6 @@ typedef NS_ENUM(NSUInteger, TUIMessageBaseDataProviderDataSourceChangeType) {
 - (BOOL)isDataSourceConsistent;
 @end
 
-@protocol TUIMessageBaseDataProviderDataSource_Two <NSObject>
-
-- (nullable V2TIMMessage *)dataProvider_Two:(TUIMessageBaseDataProvider *)dataProvider CustomCellDataFromNewIMMessage:(V2TIMMessage *)msg;
-
-@end
-
 /**
  *
  * 【Module name】Chat message list view model (TUIMessageDataProvider)
@@ -97,8 +91,6 @@ typedef NS_ENUM(NSUInteger, TUIMessageBaseDataProviderDataSourceChangeType) {
 @property(nonatomic, assign, readonly) BOOL isNoMoreMsg;
 @property(nonatomic, assign, readonly) BOOL isFirstLoad;
 
-@property(nonatomic, weak) id<TUIMessageBaseDataProviderDataSource_Two> dataSource_Two;
-
 /**
  * ,
  *

+ 7 - 21
ThirdParty/TUIKit/TUIChat/BaseDataProvider/Base/TUIMessageBaseDataProvider.m

@@ -202,13 +202,6 @@
         if ([self.dataSource respondsToSelector:@selector(dataProvider:CustomCellDataFromNewIMMessage:)]) {
             cellData = [self.dataSource dataProvider:self CustomCellDataFromNewIMMessage:msg];
         }
-        
-        if([self.dataSource_Two respondsToSelector:@selector(dataProvider_Two:CustomCellDataFromNewIMMessage:)]) {
-            V2TIMMessage *newMsg = [self.dataSource_Two dataProvider_Two:self CustomCellDataFromNewIMMessage:msg];
-            if(newMsg){
-                msg = newMsg;
-            }
-        }
 
         /**
          * Determine whether it is a component internal message
@@ -217,21 +210,14 @@
             cellData = [self.class getCellData:msg];
         }
         if (cellData) {
-            
-            if([cellData.innerMessage.sender isEqualToString:@"10000"] || [cellData.innerMessage.sender isEqualToString:@"10001"]){
-                //不加入时间dateMsg
-            }
-            else{
-                TUIMessageCellData *dateMsg = [self getSystemMsgFromDate:msg.timestamp];
-                if (dateMsg) {
-                    if (self.mergeAdjacentMsgsFromTheSameSender) {
-                        dateMsg.showName = NO;
-                    }
-                    self.msgForDate = msg;
-                    [uiMsgs addObject:dateMsg];
+            TUIMessageCellData *dateMsg = [self getSystemMsgFromDate:msg.timestamp];
+            if (dateMsg) {
+                if (self.mergeAdjacentMsgsFromTheSameSender) {
+                    dateMsg.showName = NO;
                 }
+                self.msgForDate = msg;
+                [uiMsgs addObject:dateMsg];
             }
-            
             if (self.mergeAdjacentMsgsFromTheSameSender) {
                 cellData.showName = NO;
             }
@@ -1191,6 +1177,7 @@ static const int kOfflinePushVersion = 1;
         pushInfo.AndroidHuaWeiCategory = @"IM";
         pushInfo.AndroidVIVOCategory = @"IM";
         pushInfo.AndroidHonorImportance = @"NORMAL";
+        pushInfo.AndroidMeizuNotifyType = 1;
         pushInfo.iOSInterruptionLevel = @"time-sensitive";
         pushInfo.enableIOSBackgroundNotification = NO;
     }
@@ -1223,7 +1210,6 @@ static const int kOfflinePushVersion = 1;
         progress:progress
         succ:^{
           succ();
-        [[NSNotificationCenter defaultCenter] postNotificationName:@"kNotification_SendMessage" object:nil];
         }
         fail:^(int code, NSString *desc) {
           if (code == ERR_SDK_INTERFACE_NOT_SUPPORT) {

+ 3 - 3
ThirdParty/TUIKit/TUIChat/BaseDataProvider/Impl/TUIChatDataProvider.m

@@ -173,7 +173,7 @@
     TUIInputMoreCellData *albumData = [[TUIInputMoreCellData alloc] init];
     albumData.priority = 1000;
     albumData.title = TIMCommonLocalizableString(TUIKitMorePhoto);
-    albumData.image = TUIChatBundleThemeImage(@"chat_more_picture_img", @"more_picture_2");
+    albumData.image = TUIChatBundleThemeImage(@"chat_more_picture_img", @"more_picture");
     albumData.onClicked = ^(NSDictionary *actionParam) {
       if ([weakSelf.delegate respondsToSelector:@selector(onSelectPhotoMoreCellData)]) {
           [weakSelf.delegate onSelectPhotoMoreCellData];
@@ -183,7 +183,7 @@
     TUIInputMoreCellData *takePictureData = [[TUIInputMoreCellData alloc] init];
     takePictureData.priority = 900;
     takePictureData.title = TIMCommonLocalizableString(TUIKitMoreCamera);
-    takePictureData.image = TUIChatBundleThemeImage(@"chat_more_camera_img", @"more_camera_2");
+    takePictureData.image = TUIChatBundleThemeImage(@"chat_more_camera_img", @"more_camera");
     takePictureData.onClicked = ^(NSDictionary *actionParam) {
       if ([weakSelf.delegate respondsToSelector:@selector(onTakePictureMoreCellData)]) {
           [weakSelf.delegate onTakePictureMoreCellData];
@@ -193,7 +193,7 @@
     TUIInputMoreCellData *videoData = [[TUIInputMoreCellData alloc] init];
     videoData.priority = 800;
     videoData.title = TIMCommonLocalizableString(TUIKitMoreVideo);
-    videoData.image = TUIChatBundleThemeImage(@"chat_more_video_img", @"more_video_2");
+    videoData.image = TUIChatBundleThemeImage(@"chat_more_video_img", @"more_video");
     videoData.onClicked = ^(NSDictionary *actionParam) {
       if ([weakSelf.delegate respondsToSelector:@selector(onTakeVideoMoreCellData)]) {
           [weakSelf.delegate onTakeVideoMoreCellData];

+ 0 - 26
ThirdParty/TUIKit/TUIChat/BaseDataProvider/Impl/TUIMessageDataProvider.m

@@ -269,26 +269,6 @@ static Class<TUIMessageDataProviderDataSource> gDataSourceClass = nil;
     }
 }
 
-+ (NSString *)getDisplayStringAboutCustom:(V2TIMMessage *)message {
-    NSDictionary *param = [NSJSONSerialization JSONObjectWithData:message.customElem.data options:NSJSONReadingAllowFragments error:nil];
-    if (param == nil) {
-        return nil;
-    }
-    
-    NSString *contentStr = [TUIMessageDataProvider objectOrNilForKey:@"content" fromDictionary:param];
-    if(contentStr.length > 0){
-        return contentStr;
-    }
-    
-    return message.customElem.desc;
-}
-
-+ (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
-{
-    id object = [dict objectForKey:aKey];
-    return [object isEqual:[NSNull null]] ? nil : object;
-}
-
 + (TUIMessageCellData *)getUnsupportedCellData:(V2TIMMessage *)message {
     TUITextMessageCellData *cellData = [[TUITextMessageCellData alloc] initWithDirection:(message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming)];
     cellData.content = TIMCommonLocalizableString(TUIKitNotSupportThisMessage);
@@ -546,12 +526,6 @@ static Class<TUIMessageDataProviderDataSource> gDataSourceClass = nil;
         if ([businessID tui_containsString:BussinessID_CustomerService]) {
             return nil;
         }
-        
-        NSString *tipStr = [self getDisplayStringAboutCustom:message];
-        if(tipStr.length > 0){
-            return tipStr;
-        }
-        
         return TIMCommonLocalizableString(TUIKitMessageTipsUnsupportCustomMessage);
     } else {
         return TIMCommonLocalizableString(TUIKitMessageTipsUnsupportCustomMessage);

BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/ToolViewEmotion_2@2x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/ToolViewEmotion_2@3x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/ToolViewKeyboard_2@2x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/ToolViewKeyboard_2@3x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/TypeSelectorBtn_Black_2@2x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/TypeSelectorBtn_Black_2@3x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/icon_new_send_btn@2x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/icon_new_send_btn@3x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_camera_2@2x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_camera_2@3x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_picture_2@2x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_picture_2@3x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_video_2@2x.png


BIN
ThirdParty/TUIKit/TUIChat/Resources/TUIChat.bundle/more_video_2@3x.png


+ 495 - 455
ThirdParty/TUIKit/TUIChat/Resources/TUIChatFace.bundle/emoji/emoji.plist

@@ -3,460 +3,500 @@
 <plist version="1.0">
 <array>
 	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Smile]</string>
-		<key>face_file</key>
-		<string>emoji_0</string>
-		<key>face_id</key>
-		<string>001</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Expect]</string>
-		<key>face_file</key>
-		<string>emoji_1</string>
-		<key>face_id</key>
-		<string>002</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Blink]</string>
-		<key>face_file</key>
-		<string>emoji_2</string>
-		<key>face_id</key>
-		<string>003</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Guffaw]</string>
-		<key>face_file</key>
-		<string>emoji_3</string>
-		<key>face_id</key>
-		<string>004</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_KindSmile]</string>
-		<key>face_file</key>
-		<string>emoji_4</string>
-		<key>face_id</key>
-		<string>005</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Haha]</string>
-		<key>face_file</key>
-		<string>emoji_5</string>
-		<key>face_id</key>
-		<string>006</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Cheerful]</string>
-		<key>face_file</key>
-		<string>emoji_6</string>
-		<key>face_id</key>
-		<string>007</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Speechless]</string>
-		<key>face_file</key>
-		<string>emoji_7</string>
-		<key>face_id</key>
-		<string>008</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Amazed]</string>
-		<key>face_file</key>
-		<string>emoji_8</string>
-		<key>face_id</key>
-		<string>009</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Sorrow]</string>
-		<key>face_file</key>
-		<string>emoji_9</string>
-		<key>face_id</key>
-		<string>010</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Complacent]</string>
-		<key>face_file</key>
-		<string>emoji_10</string>
-		<key>face_id</key>
-		<string>011</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Silly]</string>
-		<key>face_file</key>
-		<string>emoji_11</string>
-		<key>face_id</key>
-		<string>012</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Lustful]</string>
-		<key>face_file</key>
-		<string>emoji_12</string>
-		<key>face_id</key>
-		<string>013</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Giggle]</string>
-		<key>face_file</key>
-		<string>emoji_13</string>
-		<key>face_id</key>
-		<string>014</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Kiss]</string>
-		<key>face_file</key>
-		<string>emoji_14</string>
-		<key>face_id</key>
-		<string>015</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Wail]</string>
-		<key>face_file</key>
-		<string>emoji_15</string>
-		<key>face_id</key>
-		<string>016</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_TearsLaugh]</string>
-		<key>face_file</key>
-		<string>emoji_16</string>
-		<key>face_id</key>
-		<string>017</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Trapped]</string>
-		<key>face_file</key>
-		<string>emoji_17</string>
-		<key>face_id</key>
-		<string>018</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Mask]</string>
-		<key>face_file</key>
-		<string>emoji_18</string>
-		<key>face_id</key>
-		<string>019</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Fear]</string>
-		<key>face_file</key>
-		<string>emoji_19</string>
-		<key>face_id</key>
-		<string>020</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_BareTeeth]</string>
-		<key>face_file</key>
-		<string>emoji_20</string>
-		<key>face_id</key>
-		<string>021</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_FlareUp]</string>
-		<key>face_file</key>
-		<string>emoji_21</string>
-		<key>face_id</key>
-		<string>022</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Yawn]</string>
-		<key>face_file</key>
-		<string>emoji_22</string>
-		<key>face_id</key>
-		<string>023</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Tact]</string>
-		<key>face_file</key>
-		<string>emoji_23</string>
-		<key>face_id</key>
-		<string>024</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Stareyes]</string>
-		<key>face_file</key>
-		<string>emoji_24</string>
-		<key>face_id</key>
-		<string>025</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_ShutUp]</string>
-		<key>face_file</key>
-		<string>emoji_25</string>
-		<key>face_id</key>
-		<string>026</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Sigh]</string>
-		<key>face_file</key>
-		<string>emoji_26</string>
-		<key>face_id</key>
-		<string>027</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Hehe]</string>
-		<key>face_file</key>
-		<string>emoji_27</string>
-		<key>face_id</key>
-		<string>028</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Silent]</string>
-		<key>face_file</key>
-		<string>emoji_28</string>
-		<key>face_id</key>
-		<string>029</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Surprised]</string>
-		<key>face_file</key>
-		<string>emoji_29</string>
-		<key>face_id</key>
-		<string>030</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Askance]</string>
-		<key>face_file</key>
-		<string>emoji_30</string>
-		<key>face_id</key>
-		<string>031</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Ok]</string>
-		<key>face_file</key>
-		<string>emoji_31</string>
-		<key>face_id</key>
-		<string>032</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Shit]</string>
-		<key>face_file</key>
-		<string>emoji_32</string>
-		<key>face_id</key>
-		<string>033</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Monster]</string>
-		<key>face_file</key>
-		<string>emoji_33</string>
-		<key>face_id</key>
-		<string>034</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Daemon]</string>
-		<key>face_file</key>
-		<string>emoji_34</string>
-		<key>face_id</key>
-		<string>035</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Rage]</string>
-		<key>face_file</key>
-		<string>emoji_35</string>
-		<key>face_id</key>
-		<string>036</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Fool]</string>
-		<key>face_file</key>
-		<string>emoji_36</string>
-		<key>face_id</key>
-		<string>037</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Pig]</string>
-		<key>face_file</key>
-		<string>emoji_37</string>
-		<key>face_id</key>
-		<string>038</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Cow]</string>
-		<key>face_file</key>
-		<string>emoji_38</string>
-		<key>face_id</key>
-		<string>039</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Ai]</string>
-		<key>face_file</key>
-		<string>emoji_39</string>
-		<key>face_id</key>
-		<string>040</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Skull]</string>
-		<key>face_file</key>
-		<string>emoji_40</string>
-		<key>face_id</key>
-		<string>041</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Bombs]</string>
-		<key>face_file</key>
-		<string>emoji_41</string>
-		<key>face_id</key>
-		<string>042</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Coffee]</string>
-		<key>face_file</key>
-		<string>emoji_42</string>
-		<key>face_id</key>
-		<string>043</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Cake]</string>
-		<key>face_file</key>
-		<string>emoji_43</string>
-		<key>face_id</key>
-		<string>044</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Beer]</string>
-		<key>face_file</key>
-		<string>emoji_44</string>
-		<key>face_id</key>
-		<string>045</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Flower]</string>
-		<key>face_file</key>
-		<string>emoji_45</string>
-		<key>face_id</key>
-		<string>046</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Watermelon]</string>
-		<key>face_file</key>
-		<string>emoji_46</string>
-		<key>face_id</key>
-		<string>047</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Heart]</string>
-		<key>face_file</key>
-		<string>emoji_48</string>
-		<key>face_id</key>
-		<string>049</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Moon]</string>
-		<key>face_file</key>
-		<string>emoji_49</string>
-		<key>face_id</key>
-		<string>050</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Sun]</string>
-		<key>face_file</key>
-		<string>emoji_50</string>
-		<key>face_id</key>
-		<string>051</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Star]</string>
-		<key>face_file</key>
-		<string>emoji_51</string>
-		<key>face_id</key>
-		<string>052</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_RedPacket]</string>
-		<key>face_file</key>
-		<string>emoji_52</string>
-		<key>face_id</key>
-		<string>053</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Celebrate]</string>
-		<key>face_file</key>
-		<string>emoji_53</string>
-		<key>face_id</key>
-		<string>054</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_666]</string>
-		<key>face_file</key>
-		<string>emoji_58</string>
-		<key>face_id</key>
-		<string>059</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_857]</string>
-		<key>face_file</key>
-		<string>emoji_59</string>
-		<key>face_id</key>
-		<string>060</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Knife]</string>
-		<key>face_file</key>
-		<string>emoji_60</string>
-		<key>face_id</key>
-		<string>061</string>
-	</dict>
-	<dict>
-		<key>face_name</key>
-		<string>[TUIEmoji_Like]</string>
-		<key>face_file</key>
-		<string>emoji_61</string>
-		<key>face_id</key>
-		<string>062</string>
-	</dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Smile]</string>
+	<key>face_file</key>
+	<string>emoji_0</string>
+	<key>face_id</key>
+	<string>001</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Expect]</string>
+	<key>face_file</key>
+	<string>emoji_1</string>
+	<key>face_id</key>
+	<string>002</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Blink]</string>
+	<key>face_file</key>
+	<string>emoji_2</string>
+	<key>face_id</key>
+	<string>003</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Guffaw]</string>
+	<key>face_file</key>
+	<string>emoji_3</string>
+	<key>face_id</key>
+	<string>004</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_KindSmile]</string>
+	<key>face_file</key>
+	<string>emoji_4</string>
+	<key>face_id</key>
+	<string>005</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Haha]</string>
+	<key>face_file</key>
+	<string>emoji_5</string>
+	<key>face_id</key>
+	<string>006</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Cheerful]</string>
+	<key>face_file</key>
+	<string>emoji_6</string>
+	<key>face_id</key>
+	<string>007</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Speechless]</string>
+	<key>face_file</key>
+	<string>emoji_7</string>
+	<key>face_id</key>
+	<string>008</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Amazed]</string>
+	<key>face_file</key>
+	<string>emoji_8</string>
+	<key>face_id</key>
+	<string>009</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Sorrow]</string>
+	<key>face_file</key>
+	<string>emoji_9</string>
+	<key>face_id</key>
+	<string>010</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Complacent]</string>
+	<key>face_file</key>
+	<string>emoji_10</string>
+	<key>face_id</key>
+	<string>011</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Silly]</string>
+	<key>face_file</key>
+	<string>emoji_11</string>
+	<key>face_id</key>
+	<string>012</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Lustful]</string>
+	<key>face_file</key>
+	<string>emoji_12</string>
+	<key>face_id</key>
+	<string>013</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Giggle]</string>
+	<key>face_file</key>
+	<string>emoji_13</string>
+	<key>face_id</key>
+	<string>014</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Kiss]</string>
+	<key>face_file</key>
+	<string>emoji_14</string>
+	<key>face_id</key>
+	<string>015</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Wail]</string>
+	<key>face_file</key>
+	<string>emoji_15</string>
+	<key>face_id</key>
+	<string>016</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_TearsLaugh]</string>
+	<key>face_file</key>
+	<string>emoji_16</string>
+	<key>face_id</key>
+	<string>017</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Trapped]</string>
+	<key>face_file</key>
+	<string>emoji_17</string>
+	<key>face_id</key>
+	<string>018</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Mask]</string>
+	<key>face_file</key>
+	<string>emoji_18</string>
+	<key>face_id</key>
+	<string>019</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Fear]</string>
+	<key>face_file</key>
+	<string>emoji_19</string>
+	<key>face_id</key>
+	<string>020</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_BareTeeth]</string>
+	<key>face_file</key>
+	<string>emoji_20</string>
+	<key>face_id</key>
+	<string>021</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_FlareUp]</string>
+	<key>face_file</key>
+	<string>emoji_21</string>
+	<key>face_id</key>
+	<string>022</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Yawn]</string>
+	<key>face_file</key>
+	<string>emoji_22</string>
+	<key>face_id</key>
+	<string>023</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Tact]</string>
+	<key>face_file</key>
+	<string>emoji_23</string>
+	<key>face_id</key>
+	<string>024</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Stareyes]</string>
+	<key>face_file</key>
+	<string>emoji_24</string>
+	<key>face_id</key>
+	<string>025</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_ShutUp]</string>
+	<key>face_file</key>
+	<string>emoji_25</string>
+	<key>face_id</key>
+	<string>026</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Sigh]</string>
+	<key>face_file</key>
+	<string>emoji_26</string>
+	<key>face_id</key>
+	<string>027</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Hehe]</string>
+	<key>face_file</key>
+	<string>emoji_27</string>
+	<key>face_id</key>
+	<string>028</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Silent]</string>
+	<key>face_file</key>
+	<string>emoji_28</string>
+	<key>face_id</key>
+	<string>029</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Surprised]</string>
+	<key>face_file</key>
+	<string>emoji_29</string>
+	<key>face_id</key>
+	<string>030</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Askance]</string>
+	<key>face_file</key>
+	<string>emoji_30</string>
+	<key>face_id</key>
+	<string>031</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Ok]</string>
+	<key>face_file</key>
+	<string>emoji_31</string>
+	<key>face_id</key>
+	<string>032</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Shit]</string>
+	<key>face_file</key>
+	<string>emoji_32</string>
+	<key>face_id</key>
+	<string>033</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Monster]</string>
+	<key>face_file</key>
+	<string>emoji_33</string>
+	<key>face_id</key>
+	<string>034</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Daemon]</string>
+	<key>face_file</key>
+	<string>emoji_34</string>
+	<key>face_id</key>
+	<string>035</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Rage]</string>
+	<key>face_file</key>
+	<string>emoji_35</string>
+	<key>face_id</key>
+	<string>036</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Fool]</string>
+	<key>face_file</key>
+	<string>emoji_36</string>
+	<key>face_id</key>
+	<string>037</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Pig]</string>
+	<key>face_file</key>
+	<string>emoji_37</string>
+	<key>face_id</key>
+	<string>038</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Cow]</string>
+	<key>face_file</key>
+	<string>emoji_38</string>
+	<key>face_id</key>
+	<string>039</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Ai]</string>
+	<key>face_file</key>
+	<string>emoji_39</string>
+	<key>face_id</key>
+	<string>040</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Skull]</string>
+	<key>face_file</key>
+	<string>emoji_40</string>
+	<key>face_id</key>
+	<string>041</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Bombs]</string>
+	<key>face_file</key>
+	<string>emoji_41</string>
+	<key>face_id</key>
+	<string>042</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Coffee]</string>
+	<key>face_file</key>
+	<string>emoji_42</string>
+	<key>face_id</key>
+	<string>043</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Cake]</string>
+	<key>face_file</key>
+	<string>emoji_43</string>
+	<key>face_id</key>
+	<string>044</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Beer]</string>
+	<key>face_file</key>
+	<string>emoji_44</string>
+	<key>face_id</key>
+	<string>045</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Flower]</string>
+	<key>face_file</key>
+	<string>emoji_45</string>
+	<key>face_id</key>
+	<string>046</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Watermelon]</string>
+	<key>face_file</key>
+	<string>emoji_46</string>
+	<key>face_id</key>
+	<string>047</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Rich]</string>
+	<key>face_file</key>
+	<string>emoji_47</string>
+	<key>face_id</key>
+	<string>048</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Heart]</string>
+	<key>face_file</key>
+	<string>emoji_48</string>
+	<key>face_id</key>
+	<string>049</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Moon]</string>
+	<key>face_file</key>
+	<string>emoji_49</string>
+	<key>face_id</key>
+	<string>050</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Sun]</string>
+	<key>face_file</key>
+	<string>emoji_50</string>
+	<key>face_id</key>
+	<string>051</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Star]</string>
+	<key>face_file</key>
+	<string>emoji_51</string>
+	<key>face_id</key>
+	<string>052</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_RedPacket]</string>
+	<key>face_file</key>
+	<string>emoji_52</string>
+	<key>face_id</key>
+	<string>053</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Celebrate]</string>
+	<key>face_file</key>
+	<string>emoji_53</string>
+	<key>face_id</key>
+	<string>054</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Bless]</string>
+	<key>face_file</key>
+	<string>emoji_54</string>
+	<key>face_id</key>
+	<string>055</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Fortune]</string>
+	<key>face_file</key>
+	<string>emoji_55</string>
+	<key>face_id</key>
+	<string>056</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Convinced]</string>
+	<key>face_file</key>
+	<string>emoji_56</string>
+	<key>face_id</key>
+	<string>057</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Prohibit]</string>
+	<key>face_file</key>
+	<string>emoji_57</string>
+	<key>face_id</key>
+	<string>058</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_666]</string>
+	<key>face_file</key>
+	<string>emoji_58</string>
+	<key>face_id</key>
+	<string>059</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_857]</string>
+	<key>face_file</key>
+	<string>emoji_59</string>
+	<key>face_id</key>
+	<string>060</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Knife]</string>
+	<key>face_file</key>
+	<string>emoji_60</string>
+	<key>face_id</key>
+	<string>061</string>
+</dict>
+<dict>
+	<key>face_name</key>
+	<string>[TUIEmoji_Like]</string>
+	<key>face_file</key>
+	<string>emoji_61</string>
+	<key>face_id</key>
+	<string>062</string>
+</dict>
 </array>
 </plist>

+ 0 - 1
ThirdParty/TUIKit/TUIChat/TUIChat.podspec

@@ -16,7 +16,6 @@ Pod::Spec.new do |spec|
   spec.dependency 'TIMCommon'
   spec.dependency 'SDWebImage'
   spec.dependency 'ReactiveObjC'
-  spec.dependency 'SVGAPlayer-iOS'
   
   spec.requires_arc = true
 

+ 8 - 0
ThirdParty/TUIKit/TUIChat/TUIChat/TUIChat.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 1 - 7
ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Base/TUIInputMoreCell.m

@@ -28,7 +28,6 @@
     [_title setFont:[UIFont systemFontOfSize:10]];
     [_title setTextColor:[UIColor grayColor]];
     _title.textAlignment = NSTextAlignmentCenter;
-    _title.hidden = YES;
     [self addSubview:_title];
 }
 
@@ -40,19 +39,14 @@
     [_title setText:data.title];
     // update layout
     CGSize menuSize = TMoreCell_Image_Size;
-    menuSize = CGSizeMake(30, 30);
     _image.frame = CGRectMake(0, 0, menuSize.width, menuSize.height);
-    _image.center = CGPointMake(20, 20);
-    
     _title.frame = CGRectMake(0, _image.frame.origin.y + _image.frame.size.height, _image.frame.size.width + 10, TMoreCell_Title_Height);
     _title.center = CGPointMake(_image.center.x, _title.center.y);
 }
 
 + (CGSize)getSize {
     CGSize menuSize = TMoreCell_Image_Size;
-    menuSize = CGSizeMake(40, 40);
-//    return CGSizeMake(menuSize.width, menuSize.height + TMoreCell_Title_Height);
-    return CGSizeMake(menuSize.width, menuSize.height);
+    return CGSizeMake(menuSize.width, menuSize.height + TMoreCell_Title_Height);
 }
 @end
 

+ 0 - 1
ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Base/TUITextMessageCell.m

@@ -103,7 +103,6 @@
     [self updateConstraintsIfNeeded];
 
     [self layoutIfNeeded];
-    
 }
 
 + (BOOL)requiresConstraintBasedLayout {

+ 0 - 30
ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOSystemNormalCell.h

@@ -1,30 +0,0 @@
-//
-//  MOSystemNormalCell.h
-//  TUIChat
-//
-//  Created by SuperC on 2025/5/16.
-//z
-
-#import <TIMCommon/TIMCommonModel.h>
-#import "MOSystemNormalCellData.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOSystemNormalCell : TUICommonTableViewCell
-
-@property (nonatomic, strong) UIView *bgView;
-@property (nonatomic, strong) UIImageView *iconImgView;
-@property (nonatomic, strong) UILabel *groupLabel;
-@property (nonatomic, strong) UILabel *titleLab;
-@property (nonatomic, strong) UILabel *timeLab;
-@property (nonatomic, strong) UIImageView *pictureView;
-@property (nonatomic, strong) UILabel *contentLab;
-@property (nonatomic, strong) UIView *detailsView;
-
-@property (nonatomic, strong) MOSystemNormalCellData *dataModel;
-
-- (void)fillWithData:(MOSystemNormalCellData *)data;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 361
ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOSystemNormalCell.m

@@ -1,361 +0,0 @@
-//
-//  MOSystemNormalCell.m
-//  TUIChat
-//
-//  Created by SuperC on 2025/5/16.
-//
-
-#define UIColorFromHex(HexValue) [UIColor colorWithRed:((float)((HexValue & 0xFF0000) >> 16))/255.0 green:((float)((HexValue & 0xFF00) >> 8))/255.0 blue:((float)(HexValue & 0xFF))/255.0 alpha:1.0]
-
-#import "MOSystemNormalCell.h"
-
-@implementation MOSystemNormalCell
-
-- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
-    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
-    if(self){
-        
-        self.backgroundColor = [UIColor clearColor];
-        self.contentView.backgroundColor = [UIColor clearColor];
-        //Cell 去除选中效果
-        self.selectionStyle = UITableViewCellSelectionStyleNone;
-        
-        [self.contentView addSubview:self.bgView];
-        [self.bgView addSubview:self.iconImgView];
-        [self.bgView addSubview:self.groupLabel];
-        [self.bgView addSubview:self.titleLab];
-        [self.bgView addSubview:self.timeLab];
-        [self.bgView addSubview:self.pictureView];
-        [self.bgView addSubview:self.contentLab];
-        [self.bgView addSubview:self.detailsView];
-        
-        [self setupView];
-    }
-    return self;
-}
-
-- (void)setupView{
-    [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.leading.equalTo(self.contentView).offset(15.0);
-        make.trailing.equalTo(self.contentView).offset(-15.0);
-        make.top.equalTo(self.contentView).offset(7.5);
-        make.bottom.equalTo(self.contentView).offset(-7.5);
-    }];
-    
-    [self.iconImgView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.leading.equalTo(self.bgView).offset(10.0);
-        make.top.equalTo(self.bgView).offset(8.0);
-        make.size.mas_equalTo(CGSizeMake(24, 24));
-    }];
-    
-    [self.groupLabel mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.leading.mas_equalTo(40);
-        make.top.mas_equalTo(13);
-        make.width.lessThanOrEqualTo(@180);
-    }];
-    
-    [self.pictureView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.top.mas_equalTo(40);
-        make.leading.mas_equalTo(10);
-        make.trailing.mas_equalTo(-10);
-        make.height.mas_equalTo(75);
-    }];
-    
-    [self.timeLab mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.trailing.equalTo(self.bgView).offset(-10.0);
-        make.top.mas_equalTo(13);
-        make.width.lessThanOrEqualTo(@180);
-    }];
-    
-    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.top.mas_equalTo(40);
-        make.leading.mas_equalTo(10);
-        make.trailing.mas_equalTo(-10);
-    }];
-    
-    [self.contentLab mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.leading.equalTo(self.bgView).offset(10.0);
-        make.trailing.equalTo(self.bgView).offset(-10.0);
-        make.bottom.mas_equalTo(-41);
-    }];
-    
-    [self.detailsView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.bottom.leading.trailing.mas_equalTo(0);
-        make.height.mas_equalTo(30);
-    }];
-    
-}
-
-- (void)awakeFromNib {
-    [super awakeFromNib];
-    // Initialization code
-}
-
-- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
-    [super setSelected:selected animated:animated];
-
-    // Configure the view for the selected state
-}
-
-- (UIImage *)getAppIcon {
-    NSDictionary *infoPlist = [[NSBundle mainBundle] infoDictionary];
-    NSString *iconName = nil;
-
-    // iOS 5+ 的 AppIcon 路径解析
-    NSDictionary *iconsDict = infoPlist[@"CFBundleIcons"];
-    NSDictionary *primaryIcons = iconsDict[@"CFBundlePrimaryIcon"];
-    NSArray *iconFiles = primaryIcons[@"CFBundleIconFiles"];
-    
-    // 获取最后一个(最大尺寸)icon
-    iconName = iconFiles.lastObject;
-    
-    return [UIImage imageNamed:iconName];
-}
-
-- (void)fillWithData:(MOSystemNormalCellData *)data {
-    [super fillWithData:data];
-    
-    _dataModel = data;
-    
-    [self.iconImgView setImage:[self getAppIcon]];
-//    if([data.innerMessage.sender isEqualToString:@"10000"]){
-//        //官方消息
-//        [self.iconImgView setImage:[UIImage imageNamed:@"icon_im_official_news" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil]];
-//    }
-//    else{
-//        //官方活动
-//        [self.iconImgView setImage:[UIImage imageNamed:@"icon_im_activity_noti" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil]];
-//    }
-    
-    
-    self.contentLab.text = data.content;
-    
-    self.timeLab.text = [TUITool convertDateToDetailStr:data.innerMessage.timestamp];
-    
-    
-    if ([self.dataModel showPicture]) {//显示图片
-        self.pictureView.hidden = NO;
-        [self.pictureView sd_setImageWithURL:[NSURL URLWithString:data.img]];
-    } else {//不显示图片
-        self.pictureView.hidden = YES;
-    }
-    
-    if ([self.dataModel showTitle]) {
-        self.titleLab.hidden = NO;
-        self.titleLab.text = data.title;
-        if (!self.pictureView.hidden) {//显示图片
-            [self.titleLab mas_updateConstraints:^(MASConstraintMaker *make) {
-                make.top.mas_equalTo(125);
-            }];
-        } else {//不显示图片
-            [self.titleLab mas_updateConstraints:^(MASConstraintMaker *make) {
-                make.top.mas_equalTo(40);
-            }];
-        }
-    } else {
-        self.titleLab.hidden = YES;
-    }
-    
-    if ([self.dataModel showDetailsView]) {//显示底部detailsView
-        self.detailsView.hidden = NO;
-        [self.contentLab mas_updateConstraints:^(MASConstraintMaker *make) {
-            make.bottom.mas_equalTo(-41);
-        }];
-        
-    } else {//不显示底部detailsView
-        self.detailsView.hidden = YES;
-        [self.contentLab mas_updateConstraints:^(MASConstraintMaker *make) {
-            make.bottom.mas_equalTo(-10);
-        }];
-    }
-    
-    if (data.linkStr.length > 0) {//富文本
-        NSString *fullText = data.content;
-        NSRange linkRange = [fullText rangeOfString:data.linkStr];
-        NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:fullText];
-        if (linkRange.location != NSNotFound) {
-            [attrStr addAttribute:NSForegroundColorAttributeName value:UIColorFromHex(0x0BDDFC) range:linkRange];
-        }
-        self.contentLab.attributedText = attrStr;
-        self.contentLab.userInteractionEnabled = YES;
-        // 添加点击手势
-        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(detailViewClick)];
-        [self.contentLab addGestureRecognizer:tap];
-    } else {
-        self.contentLab.text = data.content;
-    }
-}
-
-
-
-- (void)detailViewClick {
-    if (self.dataModel.link) {
-        [[NSNotificationCenter defaultCenter] postNotificationName:@"MOChatJumpLink" object:self.dataModel.link];
-    }
-}
-
-- (void)layoutSubviews {
-    [super layoutSubviews];
-}
-
-#pragma mark - TUIMessageCellProtocol
-+ (CGSize)getContentSize:(TUIMessageCellData *)data {
-    
-    MOSystemNormalCellData *evaluationCellData = (MOSystemNormalCellData *)data;
-    
-    CGFloat topTitleHeight = 15.0 / 2.0 + 8.0 + 24.0 + 8.0;
-    CGFloat viewWidth = [[UIScreen mainScreen] bounds].size.width - 15.0 * 2.0;
-    CGFloat contentWidth = viewWidth - 10.0 * 2.0;
-    
-    CGRect contentRect;
-    if(evaluationCellData.type == 9){
-        contentRect = [evaluationCellData.content boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
-                                                        attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:13]}
-                                                           context:nil];
-        contentRect.size.height = contentRect.size.height + topTitleHeight + 10.0 + 15.0 / 2.0;
-    }
- 
-    CGSize size = CGSizeMake(245, ceilf(contentRect.size.height));
-    return size;
-}
-
-
-#pragma mark - Lazy
-- (UIView *)bgView{
-    if (_bgView == nil){
-        _bgView = [UIView new];
-        _bgView.layer.cornerRadius = 12.0;
-        _bgView.layer.masksToBounds = YES;
-        _bgView.backgroundColor = [UIColor whiteColor];
-    }
-    return _bgView;
-}
-
-- (UIImageView *)iconImgView{
-    if (!_iconImgView){
-        _iconImgView = [[UIImageView alloc] init];
-        _iconImgView.userInteractionEnabled = NO;
-        _iconImgView.layer.cornerRadius = 6;
-        _iconImgView.layer.masksToBounds = YES;
-    }
-    return _iconImgView;
-}
-
-- (UILabel *)groupLabel {
-    if (!_groupLabel) {
-        _groupLabel = [UILabel new];
-        _groupLabel.textColor = UIColorFromHex(0x666666);
-        _groupLabel.textAlignment = NSTextAlignmentLeft;
-        _groupLabel.font = [MOSystemNormalCell getTheFontWithSize:13.0 AndFontName:@"Roboto"];
-        _groupLabel.text = @"MiMo Team";
-    }
-    return _groupLabel;
-}
-
-- (UILabel *)titleLab{
-    if(!_titleLab){
-        _titleLab = [UILabel new];
-        _titleLab.numberOfLines = 0;
-        _titleLab.textColor = UIColorFromHex(0x666666);
-        _titleLab.textAlignment = NSTextAlignmentLeft;
-        _titleLab.font = [MOSystemNormalCell getTheFontWithSize:15.0 AndFontName:@"Roboto-Bold"];
-    }
-    return _titleLab;
-}
-
-- (UILabel *)timeLab{
-    if(!_timeLab){
-        _timeLab = [UILabel new];
-        _timeLab.textColor = UIColorFromHex(0x333333);
-        _timeLab.textAlignment = NSTextAlignmentRight;
-        _timeLab.font = [MOSystemNormalCell getTheFontWithSize:12.0 AndFontName:@"Roboto"];
-    }
-    return _timeLab;
-}
-
-- (UIImageView *)pictureView {
-    if (!_pictureView) {
-        _pictureView = [[UIImageView alloc] init];
-        _pictureView.contentMode = UIViewContentModeScaleAspectFill;
-        _pictureView.layer.masksToBounds = YES;
-        _pictureView.layer.cornerRadius = 12;
-    }
-    return _pictureView;
-}
-
-- (UILabel *)contentLab{
-    if(!_contentLab){
-        _contentLab = [UILabel new];
-        _contentLab.textColor = UIColorFromHex(0x333333);
-        _contentLab.textAlignment = NSTextAlignmentLeft;
-        _contentLab.font = [MOSystemNormalCell getTheFontWithSize:13.0 AndFontName:@"Roboto"];
-        _contentLab.numberOfLines = 0;
-    }
-    return _contentLab;
-}
-
-- (UIView *)detailsView {
-    if (!_detailsView) {
-        _detailsView = [[UIView alloc] init];
-        
-        UIView *lineView = [[UIView alloc] init];
-        lineView.backgroundColor = UIColorFromHex(0xEEEEEE);
-        [_detailsView addSubview:lineView];
-        [lineView mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.top.mas_equalTo(0);
-            make.left.mas_equalTo(10);
-            make.right.mas_equalTo(-10);
-            make.height.mas_equalTo(1);
-        }];
-        
-        UILabel *detailLabel = [[UILabel alloc] init];
-        detailLabel.textColor = UIColorFromHex(0x0BDDFC);
-        detailLabel.font = [MOSystemNormalCell getTheFontWithSize:12.0 AndFontName:@"Roboto"];
-        detailLabel.text = @"View details";
-        [_detailsView addSubview:detailLabel];
-        [detailLabel mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.left.mas_equalTo(10);
-            make.centerY.mas_equalTo(0);
-        }];
-        
-        UIImageView *arrowImageView = [[UIImageView alloc] init];
-        [arrowImageView setImage:[UIImage imageNamed:@"icon_im_arrow" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil]];
-        [_detailsView addSubview:arrowImageView];
-        [arrowImageView mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.right.mas_equalTo(-10);
-            make.centerY.mas_equalTo(0);
-            make.size.mas_equalTo(CGSizeMake(12, 12));
-        }];
-        
-        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(detailViewClick)];
-        [_detailsView addGestureRecognizer:tap];
-    }
-    return _detailsView;
-}
-
-#pragma mark - 类方法
-+ (UIFont *)getTheFontWithSize:(CGFloat)fontSize AndFontName:(NSString *)fontName{
-    UIFont *customFont = [UIFont fontWithName:fontName size:fontSize];
-    if(!customFont){
-        customFont = [MOSystemNormalCell MODisplayFontWithSize:fontSize bold:YES itatic:NO weight:UIFontWeightMedium];
-    }
-    return customFont;
-}
-
-+ (UIFont *)MODisplayFontWithSize:(CGFloat)fontSize
-                             bold:(BOOL)bold itatic:(BOOL)italic weight:(UIFontWeight)weight  {
-
-    UIFont *font = [UIFont systemFontOfSize:fontSize weight:weight];
-    UIFontDescriptorSymbolicTraits symbolicTraits = 0;
-    if (italic) {
-        symbolicTraits |= UIFontDescriptorTraitItalic;
-    }
-    if (bold) {
-        symbolicTraits |= UIFontDescriptorTraitBold;
-    }
-    UIFont *specialFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:symbolicTraits] size:font.pointSize];
-    return specialFont;
-}
-
-@end

+ 0 - 31
ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOUserLinkCell.h

@@ -1,31 +0,0 @@
-//
-//  MOUserLinkCell.h
-//  TUIChat
-//
-//  Created by SuperC on 2025/10/13.
-//
-
-#import <TIMCommon/TUIBubbleMessageCell.h>
-#import "MOUserLinkCellData.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOUserLinkCell : TUIBubbleMessageCell
-
-@property (nonatomic, strong) UIView *bgView;
-
-@property (nonatomic, strong) UILabel *titleLab;
-@property (nonatomic, strong) UILabel *contentLab;
-@property (nonatomic, strong) UIView *lineView;
-@property (nonatomic, strong) UILabel *detailTagLab;
-@property (nonatomic, strong) UIImageView *arrowImgView;
-
-@property (nonatomic, strong) UIButton *actionBtn;
-
-@property (nonatomic, strong) MOUserLinkCellData *dataModel;
-
-- (void)fillWithData:(MOUserLinkCellData *)data;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 269
ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOUserLinkCell.m

@@ -1,269 +0,0 @@
-//
-//  MOUserLinkCell.m
-//  TUIChat
-//
-//  Created by SuperC on 2025/10/13.
-//
-
-#define UIColorFromHex(HexValue) [UIColor colorWithRed:((float)((HexValue & 0xFF0000) >> 16))/255.0 green:((float)((HexValue & 0xFF00) >> 8))/255.0 blue:((float)(HexValue & 0xFF))/255.0 alpha:1.0]
-
-#import "MOUserLinkCell.h"
-
-@implementation MOUserLinkCell
-
-- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
-    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
-    if (self) {
-        
-        self.bubbleView.hidden = YES;
-        [self.container addSubview:self.bgView];
-        
-        [self.container addSubview:self.titleLab];
-        [self.container addSubview:self.contentLab];
-        [self.container addSubview:self.lineView];
-        [self.container addSubview:self.detailTagLab];
-        [self.container addSubview:self.arrowImgView];
-        
-        [self.container addSubview:self.actionBtn];
-    }
-    return self;
-}
-
-- (void)fillWithData:(MOUserLinkCellData *)data{
-    [super fillWithData:data];
-    
-    self.dataModel = data;
-    
-    self.titleLab.text = data.title;
-    self.contentLab.text = data.content;
-    
-    // tell constraints they need updating
-    [self setNeedsUpdateConstraints];
-
-    // update constraints now so we can animate the change
-    [self updateConstraintsIfNeeded];
-
-    [self layoutIfNeeded];
-}
-
-- (void)awakeFromNib {
-    [super awakeFromNib];
-    // Initialization code
-}
-
-- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
-    [super setSelected:selected animated:animated];
-
-    // Configure the view for the selected state
-}
-
-+ (BOOL)requiresConstraintBasedLayout {
-    return YES;
-}
-
-#pragma mark - Lazy
-
-- (UIView *)bgView{
-    if(!_bgView){
-        _bgView = [[UIView alloc] init];
-        _bgView.backgroundColor = [UIColor whiteColor];
-        _bgView.layer.cornerRadius = 16.0;
-        _bgView.layer.masksToBounds = YES;
-    }
-    return _bgView;
-}
-
-- (UILabel *)titleLab{
-    if(!_titleLab){
-        _titleLab = [UILabel new];
-        _titleLab.numberOfLines = 0;
-        _titleLab.textColor = UIColorFromHex(0x000000);
-        _titleLab.textAlignment = NSTextAlignmentLeft;
-        _titleLab.font = [MOUserLinkCell getTheFontWithSize:16.0 AndFontName:@"Inter-Regular_Medium"];
-    }
-    return _titleLab;
-}
-
-- (UILabel *)contentLab{
-    if(!_contentLab){
-        _contentLab = [UILabel new];
-        _contentLab.textColor = UIColorFromHex(0x000000);
-        _contentLab.textAlignment = NSTextAlignmentLeft;
-        _contentLab.font = [MOUserLinkCell getTheFontWithSize:14.0 AndFontName:@"Inter-Regular"];
-        _contentLab.numberOfLines = 0;
-    }
-    return _contentLab;
-}
-
-- (UIView *)lineView{
-    if(!_lineView){
-        _lineView = [[UIView alloc] init];
-        _lineView.backgroundColor = UIColorFromHex(0xF3F4FA);
-    }
-    return _lineView;
-}
-
-- (UILabel *)detailTagLab{
-    if(!_detailTagLab){
-        _detailTagLab = [UILabel new];
-        _detailTagLab.textColor = UIColorFromHex(0x4363FF);
-        _detailTagLab.textAlignment = NSTextAlignmentLeft;
-        _detailTagLab.font = [MOUserLinkCell getTheFontWithSize:14.0 AndFontName:@"Inter-Regular"];
-        _detailTagLab.numberOfLines = 0;
-        _detailTagLab.text = @"View details";
-    }
-    return _detailTagLab;
-}
-
-- (UIImageView *)arrowImgView{
-    if(!_arrowImgView){
-        _arrowImgView = [[UIImageView alloc] init];
-        [_arrowImgView setImage:[UIImage imageNamed:@"icon_im_arrow" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil]];
-    }
-    return _arrowImgView;
-}
-
-- (UIButton *)actionBtn{
-    if(!_actionBtn){
-        _actionBtn = [UIButton buttonWithType:UIButtonTypeCustom];
-        [_actionBtn setTitle:@"" forState:UIControlStateNormal];
-        [_actionBtn addTarget:self action:@selector(actionBtnClick) forControlEvents:UIControlEventTouchUpInside];
-    }
-    return _actionBtn;
-}
-
-- (void)actionBtnClick{
-    if (self.dataModel.link) {
-        [[NSNotificationCenter defaultCenter] postNotificationName:@"MOChatJumpLink" object:self.dataModel.link];
-    }
-}
-
-// this is Apple's recommended place for adding/updating constraints
-- (void)updateConstraints{
-    [super updateConstraints];
-    
-    CGFloat viewWidth = [[UIScreen mainScreen] bounds].size.width - 64.0 - 12.0;
-    CGFloat contentWidth = viewWidth - 12.0 * 2;
-    
-    CGRect titleRect = [self.titleLab.text boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                                      options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
-                                                   attributes:@{NSFontAttributeName : [MOUserLinkCell getTheFontWithSize:16.0 AndFontName:@"Inter-Regular_Medium"]}
-                                                      context:nil];
-    
-    CGRect contentRect = [self.contentLab.text boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                                      options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
-                                                   attributes:@{NSFontAttributeName : [MOUserLinkCell getTheFontWithSize:14.0 AndFontName:@"Inter-Regular"]}
-                                                      context:nil];
-    
-    [self.bgView mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.edges.equalTo(self.container);
-    }];
-    
-    [self.titleLab mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.top.mas_equalTo(12);
-        make.leading.mas_equalTo(12);
-        make.width.mas_equalTo(245);
-        make.height.mas_equalTo(titleRect.size.height);
-    }];
-    
-    [self.contentLab mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.top.mas_equalTo(self.titleLab.mas_bottom).mas_offset(8);
-        make.leading.mas_equalTo(12);
-        make.width.mas_equalTo(245);
-        make.height.mas_equalTo(contentRect.size.height);
-    }];
-    
-    [self.lineView mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.leading.mas_equalTo(12);
-        make.trailing.mas_equalTo(0);
-        make.height.mas_equalTo(0.5);
-        make.bottom.mas_equalTo(-40);
-    }];
-    
-    [self.detailTagLab mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.leading.mas_equalTo(12);
-        make.height.mas_equalTo(17);
-        make.bottom.mas_equalTo(-12);
-    }];
-    
-    [self.arrowImgView mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.centerY.equalTo(self.detailTagLab);
-        make.trailing.mas_equalTo(-12);
-        make.width.height.mas_equalTo(14);
-    }];
-    
-    [self.actionBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.edges.equalTo(self.container);
-    }];
-}
-
-- (void)layoutSubviews {
-    [super layoutSubviews];
-}
-
-#pragma mark - TUIMessageCellProtocol
-+ (CGSize)getContentSize:(TUIMessageCellData *)data {
-    
-    MOUserLinkCellData *evaluationCellData = (MOUserLinkCellData *)data;
-    
-    CGFloat viewWidth = [[UIScreen mainScreen] bounds].size.width - 64.0 - 12.0;
-    CGFloat contentWidth = viewWidth - 12.0 * 2;
-    
-    //标题以上固定距离
-    CGFloat titleTopSpacing = 0.0;
-    
-    //标题高度
-    CGFloat titleHeight = 0;
-    if (evaluationCellData.title.length > 0) {
-        UIFont *titleFont = [self getTheFontWithSize:16.0 AndFontName:@"Inter-Regular_Medium"];
-        titleHeight = [evaluationCellData.title boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                               options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : titleFont}
-                                               context:nil].size.height + 2;//2是补偿高度
-       
-    }
-    
-    //内容高度
-    CGFloat contentHeight = 0;
-    if(evaluationCellData.content.length > 0){
-        UIFont *contentFont = [self getTheFontWithSize:14.0 AndFontName:@"Inter-Regular"];
-        contentHeight = [evaluationCellData.content boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
-                                                        attributes:@{NSFontAttributeName : contentFont}
-                                                           context:nil].size.height;
-    }
-    
-    //30是bgView上下距离
-    CGFloat bgViewBottomSpacing = 0.0;
-    
-    CGFloat totalHeight = titleTopSpacing + 12.0 + titleHeight + 8.0 + contentHeight + 10.0 + 40.0 + bgViewBottomSpacing;
-    
-    CGSize size = CGSizeMake(viewWidth, ceilf(totalHeight));
-    return size;
-}
-
-#pragma mark - 类方法
-+ (UIFont *)getTheFontWithSize:(CGFloat)fontSize AndFontName:(NSString *)fontName{
-    UIFont *customFont = [UIFont fontWithName:fontName size:fontSize];
-    if(!customFont){
-        customFont = [MOUserLinkCell MODisplayFontWithSize:fontSize bold:YES itatic:NO weight:UIFontWeightMedium];
-    }
-    return customFont;
-}
-
-+ (UIFont *)MODisplayFontWithSize:(CGFloat)fontSize
-                             bold:(BOOL)bold itatic:(BOOL)italic weight:(UIFontWeight)weight  {
-
-    UIFont *font = [UIFont systemFontOfSize:fontSize weight:weight];
-    UIFontDescriptorSymbolicTraits symbolicTraits = 0;
-    if (italic) {
-        symbolicTraits |= UIFontDescriptorTraitItalic;
-    }
-    if (bold) {
-        symbolicTraits |= UIFontDescriptorTraitBold;
-    }
-    UIFont *specialFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:symbolicTraits] size:font.pointSize];
-    return specialFont;
-}
-
-
-@end

+ 0 - 24
ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOUserNotificationCell.h

@@ -1,24 +0,0 @@
-//
-//  MOUserNotificationCell.h
-//  TUIChat
-//
-//  Created by SuperC on 2025/10/13.
-//
-
-#import <TIMCommon/TIMCommonModel.h>
-#import "MOUserNotificationCellData.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOUserNotificationCell : TUICommonTableViewCell
-
-@property (nonatomic, strong) UILabel *titleLab;
-@property (nonatomic, strong) UILabel *contentLab;
-
-@property (nonatomic, strong) MOUserNotificationCellData *dataModel;
-
-- (void)fillWithData:(MOUserNotificationCellData *)data;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 159
ThirdParty/TUIKit/TUIChat/UI_Classic/Cell/Custom/MOUserNotificationCell.m

@@ -1,159 +0,0 @@
-//
-//  MOUserNotificationCell.m
-//  TUIChat
-//
-//  Created by SuperC on 2025/10/13.
-//
-
-#define UIColorFromHex(HexValue) [UIColor colorWithRed:((float)((HexValue & 0xFF0000) >> 16))/255.0 green:((float)((HexValue & 0xFF00) >> 8))/255.0 blue:((float)(HexValue & 0xFF))/255.0 alpha:1.0]
-
-#import "MOUserNotificationCell.h"
-
-@implementation MOUserNotificationCell
-
-- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
-    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
-    if(self){
-        self.backgroundColor = [UIColor clearColor];
-        self.contentView.backgroundColor = [UIColor clearColor];
-        //Cell 去除选中效果
-        self.selectionStyle = UITableViewCellSelectionStyleNone;
-        
-        [self.contentView addSubview:self.titleLab];
-        [self.contentView addSubview:self.contentLab];
-        
-        [self setupView];
-    }
-    return self;
-}
-
-- (void)setupView{
-    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.leading.equalTo(self.contentView).offset(25.0);
-        make.trailing.equalTo(self.contentView).offset(-25.0);
-        make.top.equalTo(self.contentView).offset(8.0);
-    }];
-    
-    [self.contentLab mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.leading.equalTo(self.contentView).offset(25.0);
-        make.trailing.equalTo(self.contentView).offset(-25.0);
-        make.top.equalTo(self.titleLab.mas_bottom).offset(2.0);
-    }];
-}
-
-- (void)fillWithData:(MOUserNotificationCellData *)data{
-    [super fillWithData:data];
-    
-    _dataModel = data;
-    
-    self.titleLab.text = data.title;
-    self.contentLab.text = data.content;
-    
-    // tell constraints they need updating
-    [self setNeedsUpdateConstraints];
-
-    // update constraints now so we can animate the change
-    [self updateConstraintsIfNeeded];
-
-    [self layoutIfNeeded];
-}
-
-- (void)awakeFromNib {
-    [super awakeFromNib];
-    // Initialization code
-}
-
-- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
-    [super setSelected:selected animated:animated];
-
-    // Configure the view for the selected state
-}
-
-- (UILabel *)titleLab{
-    if(!_titleLab){
-        _titleLab = [UILabel new];
-        _titleLab.numberOfLines = 0;
-        _titleLab.textColor = UIColorFromHex(0x17171A);
-        _titleLab.textAlignment = NSTextAlignmentCenter;
-        _titleLab.font = [MOUserNotificationCell getTheFontWithSize:12.0 AndFontName:@"Inter-Regular_Medium"];
-    }
-    return _titleLab;
-}
-
-- (UILabel *)contentLab{
-    if(!_contentLab){
-        _contentLab = [UILabel new];
-        _contentLab.textColor = UIColorFromHex(0x878A99);
-        _contentLab.textAlignment = NSTextAlignmentCenter;
-        _contentLab.font = [MOUserNotificationCell getTheFontWithSize:10.0 AndFontName:@"Inter-Regular"];
-        _contentLab.numberOfLines = 0;
-    }
-    return _contentLab;
-}
-
-#pragma mark - TUIMessageCellProtocol
-+ (CGSize)getContentSize:(TUIMessageCellData *)data {
-    
-    MOUserNotificationCellData *evaluationCellData = (MOUserNotificationCellData *)data;
-    
-    CGFloat viewWidth = [[UIScreen mainScreen] bounds].size.width - 15.0 * 2.0;
-    CGFloat contentWidth = viewWidth - 10.0 * 2.0;
-    
-    //标题以上固定距离
-    CGFloat titleTopSpacing = 8.0;
-    
-    //标题高度
-    CGFloat titleHeight = 0;
-    if (evaluationCellData.title.length > 0) {
-        UIFont *titleFont = [self getTheFontWithSize:12.0 AndFontName:@"Inter-Regular_Medium"];
-        titleHeight = [evaluationCellData.title boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                               options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : titleFont}
-                                               context:nil].size.height + 2;//2是补偿高度
-       
-    }
-    
-    //内容高度
-    CGFloat contentHeight = 0;
-    if(evaluationCellData.content.length > 0){
-        UIFont *contentFont = [self getTheFontWithSize:10.0 AndFontName:@"Inter-Regular"];
-        contentHeight = [evaluationCellData.content boundingRectWithSize:CGSizeMake(contentWidth, MAXFLOAT)
-                                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
-                                                        attributes:@{NSFontAttributeName : contentFont}
-                                                           context:nil].size.height;
-    }
-    
-    //30是bgView上下距离
-    CGFloat bgViewBottomSpacing = 8.0;
-    
-    CGFloat totalHeight = titleTopSpacing + titleHeight + 2.0 + contentHeight + bgViewBottomSpacing;
-    
-    CGSize size = CGSizeMake(245, ceilf(totalHeight));
-    return size;
-}
-
-#pragma mark - 类方法
-+ (UIFont *)getTheFontWithSize:(CGFloat)fontSize AndFontName:(NSString *)fontName{
-    UIFont *customFont = [UIFont fontWithName:fontName size:fontSize];
-    if(!customFont){
-        customFont = [MOUserNotificationCell MODisplayFontWithSize:fontSize bold:YES itatic:NO weight:UIFontWeightMedium];
-    }
-    return customFont;
-}
-
-+ (UIFont *)MODisplayFontWithSize:(CGFloat)fontSize
-                             bold:(BOOL)bold itatic:(BOOL)italic weight:(UIFontWeight)weight  {
-
-    UIFont *font = [UIFont systemFontOfSize:fontSize weight:weight];
-    UIFontDescriptorSymbolicTraits symbolicTraits = 0;
-    if (italic) {
-        symbolicTraits |= UIFontDescriptorTraitItalic;
-    }
-    if (bold) {
-        symbolicTraits |= UIFontDescriptorTraitBold;
-    }
-    UIFont *specialFont = [UIFont fontWithDescriptor:[[font fontDescriptor] fontDescriptorWithSymbolicTraits:symbolicTraits] size:font.pointSize];
-    return specialFont;
-}
-
-
-@end

+ 0 - 19
ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIBaseChatViewController.h

@@ -26,15 +26,6 @@
 //
 /////////////////////////////////////////////////////////////////////////////////
 
-@protocol TUIBaseChatViewControllerDelegate_Two <NSObject>
-
-- (V2TIMMessage *)baseChatViewController_Two:(TUIBaseMessageController *)controller onNewMessage:(V2TIMMessage *)message;
-
-@end
-
-// 定义外部异步请求的 Block,传递结果和错误
-typedef void (^AsyncRequestBlock)(void (^httpBlock)(BOOL result));
-
 /**
  *
  * 【Module name】TUIBaseChatViewController
@@ -57,16 +48,6 @@ typedef void (^AsyncRequestBlock)(void (^httpBlock)(BOOL result));
 
 @property(nonatomic, strong) TUIChatConversationModel *conversationData;
 
-/** 数据源 */
-@property (nonatomic, weak) id <TUIBaseChatViewControllerDelegate_Two> delegate_Two;
-//黑名单
-@property (nonatomic, assign) NSInteger direction;
-@property (nonatomic, assign) BOOL isBlackUser;
-@property (nonatomic, assign) BOOL canSend;
-// 用来执行外部异步请求的 Block
-@property (nonatomic, copy) AsyncRequestBlock externalRequestBlock;
-@property (nonatomic, copy) void (^theTypingBlock)(BOOL isTyping);//输入中回调
-
 /**
  * Highlight text
  * In the search scenario, when highlightKeyword is not empty and matches @locateMessage, opening the chat session page will highlight the current cell

+ 2 - 30
ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIBaseChatViewController.m

@@ -57,7 +57,6 @@ static CGRect gCustomTopViewRect;
                                          V2TIMConversationListener,
                                          TUINavigationControllerDelegate,
                                          TUIChatMediaDataListener,
-                                         TUIBaseMessageControllerDelegate_Two,
                                          TIMInputViewMoreActionProtocol>
 
 @property(nonatomic, strong) TUINaviBarIndicatorView *titleView;
@@ -267,12 +266,10 @@ static CGRect gCustomTopViewRect;
       BOOL otherSideTypingFlag = [otherSideTyping boolValue];
       if (!otherSideTypingFlag) {
           [weakSelf checkTitle:YES];
-          weakSelf.theTypingBlock ? weakSelf.theTypingBlock(NO) : nil;
       }
       else {
           NSString *typingText = [NSString stringWithFormat:@"%@...", TIMCommonLocalizableString(TUIKitTyping)];
           [weakSelf.titleView setTitle:typingText];
-          weakSelf.theTypingBlock ? weakSelf.theTypingBlock(YES) : nil;
       }
     }];
 
@@ -330,7 +327,6 @@ static CGRect gCustomTopViewRect;
     vc.isMsgNeedReadReceipt = self.conversationData.msgNeedReadReceipt && [TUIChatConfig defaultConfig].msgNeedReadReceipt;
     _messageController = vc;
     _messageController.delegate = self;
-    _messageController.delegate_Two = self;
     [_messageController setConversation:self.conversationData];
     
     CGFloat textViewHeight = TUIChatConfig.defaultConfig.enableMainPageInputBar? TTextView_Height:0;
@@ -675,21 +671,6 @@ static CGRect gCustomTopViewRect;
     return height;
 }
 
-- (void)setIsBlackUser:(BOOL)isBlackUser{
-    _isBlackUser = isBlackUser;
-    
-    if(isBlackUser){
-        if(self.direction == 2){
-            self.inputController.inputBar.inputTextView.placeHolderColor = [UIColor grayColor];
-            self.inputController.inputBar.inputTextView.placeHolder = NSLocalizedString(@"mimo_chat_black_my_do_tip", nil);
-        }
-        else{
-            self.inputController.inputBar.inputTextView.placeHolderColor = [UIColor grayColor];
-            self.inputController.inputBar.inputTextView.placeHolder = NSLocalizedString(@"mimo_chat_black_she_do_tip", nil);
-        }
-    }
-}
-
 #pragma mark - Event Response
 - (void)onChangeUnReadCount:(UInt64)totalCount {
     /**
@@ -877,10 +858,7 @@ static CGRect gCustomTopViewRect;
 }
 
 - (void)inputController:(TUIInputController *)inputController didSendMessage:(V2TIMMessage *)msg {
-    
-    if(self.canSend){
-        [self.messageController sendMessage:msg];
-    }
+    [self.messageController sendMessage:msg];
 }
 
 - (void)inputControllerDidInputAt:(TUIInputController *)inputController {
@@ -950,13 +928,7 @@ static CGRect gCustomTopViewRect;
     return NO;
 }
 
-- (V2TIMMessage *)messageController_Two:(TUIBaseMessageController *)controller onNewMessage:(V2TIMMessage *)message{
-    if(self.delegate_Two && [self.delegate_Two respondsToSelector:@selector(baseChatViewController_Two:onNewMessage:)]){
-        V2TIMMessage *newMsg = [self.delegate_Two baseChatViewController_Two:controller onNewMessage:message];
-        if(newMsg){
-            return newMsg;
-        }
-    }
+- (TUIMessageCellData *)messageController:(TUIBaseMessageController *)controller onNewMessage:(V2TIMMessage *)message {
     return nil;
 }
 

+ 0 - 8
ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIBaseMessageController.h

@@ -29,12 +29,6 @@ NS_ASSUME_NONNULL_BEGIN
 //
 /////////////////////////////////////////////////////////////////////////////////
 
-@protocol TUIBaseMessageControllerDelegate_Two <NSObject>
-
-- (V2TIMMessage *)messageController_Two:(TUIBaseMessageController *)controller onNewMessage:(V2TIMMessage *)message;
-
-@end
-
 /**
  *
  * 【Module name】TUIBaseMessageController
@@ -53,8 +47,6 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property(nonatomic, weak) id<TUIBaseMessageControllerDelegate> delegate;
 
-@property(nonatomic, weak) id<TUIBaseMessageControllerDelegate_Two> delegate_Two;
-
 @property(nonatomic, assign) BOOL isInVC;
 
 /**

+ 1 - 83
ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIBaseMessageController.m

@@ -43,18 +43,12 @@
 #import "TUIVoiceMessageCell.h"
 #import "TUIMessageCellConfig.h"
 
-#import "MOSystemNormalCellData.h"
-#import "MOSystemNormalCell.h"
-#import "MOUserLinkCellData.h"
-#import "MOUserNotificationCellData.h"
-
 @interface TUIBaseMessageController () <TUIMessageCellDelegate,
                                         TUIJoinGroupMessageCellDelegate,
                                         TUIMessageProgressManagerDelegate,
                                         TUIMessageDataProviderDataSource,
                                         TUINotificationProtocol,
-                                        TIMPopActionProtocol,
-                                        TUIMessageBaseDataProviderDataSource_Two>
+                                        TIMPopActionProtocol>
 
 @property(nonatomic, strong) TUIMessageDataProvider *messageDataProvider;
 @property(nonatomic, strong) TUIMessageCellData *menuUIMsg;
@@ -92,9 +86,6 @@
     self.isActive = YES;
     [TUITool addUnsupportNotificationInVC:self];
     [TUIMessageProgressManager.shareManager addDelegate:self];
-    
-    CGFloat offset = Bottom_SafeHeight > 0 ? Bottom_SafeHeight : 20;
-    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, offset, 0);
 }
 
 - (void)dealloc {
@@ -198,7 +189,6 @@
     if (!self.messageDataProvider) {
         self.messageDataProvider = [[TUIMessageDataProvider alloc] initWithConversationModel:conversationData];
         self.messageDataProvider.dataSource = self;
-        self.messageDataProvider.dataSource_Two = self;
     }
     [self loadMessage];
     [self loadGroupInfo];
@@ -689,32 +679,6 @@
         return nil;
     }
     
-    if(msg.elemType == V2TIM_ELEM_TYPE_CUSTOM){
-        NSDictionary *param = [NSJSONSerialization JSONObjectWithData:msg.customElem.data options:NSJSONReadingAllowFragments error:nil];
-        if (param) {
-            NSInteger type = [[MOSystemNormalCellData objectOrNilForKey:@"type" fromDictionary:param] integerValue];
-            if(type == 100){
-                TUIMessageCellData *cellData = [MOUserLinkCellData getCellData:msg];
-                if(cellData){
-                    return cellData;
-                }
-            }
-            else if (type == 101){
-                TUIMessageCellData *cellData = [MOUserNotificationCellData getCellData:msg];
-                if(cellData){
-                    return cellData;
-                }
-            }
-            
-            if(type > 0){
-                TUIMessageCellData *cellData = [MOSystemNormalCellData getCellData:msg];
-                if(cellData){
-                    return cellData;
-                }
-            }
-        }
-    }
-    
     if ([self.delegate respondsToSelector:@selector(messageController:onNewMessage:)]) {
         TUIMessageCellData *customCellData = [self.delegate messageController:self onNewMessage:msg];
         if (customCellData) {
@@ -725,16 +689,6 @@
     return nil;
 }
 
-- (nullable V2TIMMessage *)dataProvider_Two:(TUIMessageBaseDataProvider *)dataProvider CustomCellDataFromNewIMMessage:(V2TIMMessage *)msg{
-    if([self.delegate_Two respondsToSelector:@selector(messageController_Two:onNewMessage:)]) {
-        V2TIMMessage *newMessage = [self.delegate_Two messageController_Two:self onNewMessage:msg];
-        if(newMessage){
-            return newMessage;
-        }
-    }
-    return nil;
-}
-
 - (void)dataProvider:(TUIMessageDataProvider *)dataProvider ReceiveReadMsgWithUserID:(NSString *)userId Time:(time_t)timestamp {
     if (userId.length > 0 && [userId isEqualToString:self.conversationData.userID]) {
         for (int i = 0; i < self.messageDataProvider.uiMsgs.count; i++) {
@@ -904,34 +858,6 @@ ReceiveReadMsgWithGroupID:(NSString *)groupID
 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
     if (indexPath.row < self.messageDataProvider.uiMsgs.count) {
         TUIMessageCellData *cellData = self.messageDataProvider.uiMsgs[indexPath.row];
-        
-        if([cellData isKindOfClass:[MOSystemNormalCellData class]]){
-            MOSystemNormalCellData *tempCellData = (MOSystemNormalCellData *)cellData;
-            CGSize size = [tempCellData contentSize];
-            
-            if(size.height <= 0){
-                size.height = 80.0;
-            }
-            
-            return size.height;
-        }
-        else if ([cellData isKindOfClass:[MOUserLinkCellData class]]){
-            MOUserLinkCellData *tempCellData = (MOUserLinkCellData *)cellData;
-            CGSize size = [tempCellData contentSize];
-            if(size.height <= 0){
-                size.height = 100.0;
-            }
-            return size.height;
-        }
-        else if ([cellData isKindOfClass:[MOUserNotificationCellData class]]){
-            MOUserNotificationCellData *tempCellData = (MOUserNotificationCellData *)cellData;
-            CGSize size = [tempCellData contentSize];
-            if(size.height <= 0){
-                size.height = 52.0;
-            }
-            return size.height;
-        }
-        
         return [self.messageCellConfig getHeightFromMessageCellData:cellData];
     } else {
         return 0;
@@ -959,14 +885,6 @@ ReceiveReadMsgWithGroupID:(NSString *)groupID
         }
     }
     
-    if([data isKindOfClass:[MOSystemNormalCellData class]] ||
-       [data isKindOfClass:[MOUserLinkCellData class]] ||
-       [data isKindOfClass:[MOUserNotificationCellData class]] ){
-        cell = [tableView dequeueReusableCellWithIdentifier:data.reuseId forIndexPath:indexPath];
-        [cell fillWithData:data];
-        return cell;
-    }
-    
     if (!data.reuseId) {
         NSAssert(NO, @"Unknow cell");
         return nil;

+ 3 - 4
ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIC2CChatViewController.m

@@ -121,10 +121,9 @@
         return;
     }
 
-    //注释下面的代码, 低端机过不了判断
-//    if (![self sendTypingBaseCondation]) {
-//        return;
-//    }
+    if (![self sendTypingBaseCondation]) {
+        return;
+    }
 
     NSError *error = nil;
     NSDictionary *param = @{

+ 0 - 4
ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIMessageCellConfig.m

@@ -79,10 +79,6 @@ static NSMutableDictionary *gCustomMessageInfoMap = nil;
     // [self registerCustomMessageCell:#your message cell# messageCellData:#your message cell data# forBusinessID:#your id#];
     //
     // ...
-    
-    [self registerCustomMessageCell:@"MOSystemNormalCell" messageCellData:@"MOSystemNormalCellData" forBusinessID:@"MOSystemNormalCell"];
-    [self registerCustomMessageCell:@"MOUserLinkCell" messageCellData:@"MOUserLinkCellData" forBusinessID:@"MOUserLinkCell"];
-    [self registerCustomMessageCell:@"MOUserNotificationCell" messageCellData:@"MOUserNotificationCellData" forBusinessID:@"MOUserNotificationCell"];
 }
 
 + (void)registerCustomMessageCell:(TUICellClassName)messageCellName

+ 1 - 2
ThirdParty/TUIKit/TUIChat/UI_Classic/Chat/TUIMessageController.m

@@ -19,7 +19,7 @@
 
 #define MSG_GET_COUNT 20
 
-@interface TUIMessageController () <TUIChatSmallTongueViewDelegate,TUIMessageBaseDataProviderDataSource_Two>
+@interface TUIMessageController () <TUIChatSmallTongueViewDelegate>
 @property(nonatomic, strong) UIActivityIndicatorView *bottomIndicatorView;
 @property(nonatomic, assign) uint64_t locateGroupMessageSeq;
 @property(nonatomic, strong) TUIChatSmallTongueView *tongueView;
@@ -179,7 +179,6 @@
     self.conversationData = conversationData;
     self.messageDataProvider = [[TUIMessageSearchDataProvider alloc] initWithConversationModel:self.conversationData];
     self.messageDataProvider.dataSource = self;
-    self.messageDataProvider.dataSource_Two = self;
     if (self.locateMessage) {
         [self loadAndScrollToLocateMessages:NO isHighlight:YES];
     } else {

+ 19 - 101
ThirdParty/TUIKit/TUIChat/UI_Classic/Input/TUIInputBar.m

@@ -30,10 +30,6 @@
 @property(nonatomic, assign) BOOL isFocusOn;
 @property(nonatomic, strong) NSTimer *sendTypingStatusTimer;
 @property(nonatomic, assign) BOOL allowSendTypingStatusByChangeWord;
-
-@property(nonatomic, strong) UIButton *sendButton;
-@property(nonatomic, strong) UIView *bgView;
-
 @end
 
 @implementation TUIInputBar
@@ -63,44 +59,31 @@
     _lineView = [[UIView alloc] init];
     _lineView.backgroundColor = TIMCommonDynamicColor(@"separator_color", @"#FFFFFF");
     [self addSubview:_lineView];
-    
-    _bgView = [[UIView alloc] init];
-    _bgView.backgroundColor = TUIChatDynamicColor(@"chat_input_bg_color", @"#FFFFFF");
-    _bgView.layer.cornerRadius = 12.0f;
-    _bgView.layer.masksToBounds = YES;
-    [self addSubview:_bgView];
 
     _micButton = [[UIButton alloc] init];
     [_micButton addTarget:self action:@selector(onMicButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
     [_micButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewInputVoice_img", @"ToolViewInputVoice") forState:UIControlStateNormal];
     [_micButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewInputVoiceHL_img", @"ToolViewInputVoiceHL") forState:UIControlStateHighlighted];
     [self addSubview:_micButton];
-    _micButton.hidden = YES;
 
     _faceButton = [[UIButton alloc] init];
     [_faceButton addTarget:self action:@selector(onFaceEmojiButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
-    [_faceButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewEmotion_img", @"ToolViewEmotion_2") forState:UIControlStateNormal];
-    [_faceButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewEmotionHL_img", @"ToolViewEmotionHL_2") forState:UIControlStateHighlighted];
+    [_faceButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewEmotion_img", @"ToolViewEmotion") forState:UIControlStateNormal];
+    [_faceButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewEmotionHL_img", @"ToolViewEmotionHL") forState:UIControlStateHighlighted];
     [self addSubview:_faceButton];
 
     _keyboardButton = [[UIButton alloc] init];
     [_keyboardButton addTarget:self action:@selector(onKeyboardButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
-    [_keyboardButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewKeyboard_img", @"ToolViewKeyboard_2") forState:UIControlStateNormal];
-    [_keyboardButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewKeyboardHL_img", @"ToolViewKeyboardHL_2") forState:UIControlStateHighlighted];
+    [_keyboardButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewKeyboard_img", @"ToolViewKeyboard") forState:UIControlStateNormal];
+    [_keyboardButton setImage:TUIChatBundleThemeImage(@"chat_ToolViewKeyboardHL_img", @"ToolViewKeyboardHL") forState:UIControlStateHighlighted];
     _keyboardButton.hidden = YES;
     [self addSubview:_keyboardButton];
 
     _moreButton = [[UIButton alloc] init];
     [_moreButton addTarget:self action:@selector(onMoreButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
-    [_moreButton setImage:TUIChatBundleThemeImage(@"chat_TypeSelectorBtn_Black_img", @"TypeSelectorBtn_Black_2") forState:UIControlStateNormal];
-    [_moreButton setImage:TUIChatBundleThemeImage(@"chat_TypeSelectorBtnHL_Black_img", @"TypeSelectorBtnHL_Black_2") forState:UIControlStateHighlighted];
+    [_moreButton setImage:TUIChatBundleThemeImage(@"chat_TypeSelectorBtn_Black_img", @"TypeSelectorBtn_Black") forState:UIControlStateNormal];
+    [_moreButton setImage:TUIChatBundleThemeImage(@"chat_TypeSelectorBtnHL_Black_img", @"TypeSelectorBtnHL_Black") forState:UIControlStateHighlighted];
     [self addSubview:_moreButton];
-    
-    _sendButton = [[UIButton alloc] init];
-    [_sendButton addTarget:self action:@selector(onSendButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
-    [_sendButton setImage:TUIChatBundleThemeImage(@"chat_icon_new_send_btn_img", @"icon_new_send_btn") forState:UIControlStateNormal];
-    [_sendButton setImage:TUIChatBundleThemeImage(@"chat_icon_new_send_btn_img", @"icon_new_send_btn") forState:UIControlStateHighlighted];
-    [self addSubview:_sendButton];
 
     _recordButton = [[UIButton alloc] init];
     [_recordButton.titleLabel setFont:[UIFont systemFontOfSize:15.0f]];
@@ -117,8 +100,7 @@
     _inputTextView = [[TUIResponderTextView alloc] init];
     _inputTextView.delegate = self;
     [_inputTextView setFont:kTUIInputNoramlFont];
-//    _inputTextView.backgroundColor = TUIChatDynamicColor(@"chat_input_bg_color", @"#FFFFFF");
-    _inputTextView.backgroundColor = [UIColor clearColor];
+    _inputTextView.backgroundColor = TUIChatDynamicColor(@"chat_input_bg_color", @"#FFFFFF");
     _inputTextView.textColor = TUIChatDynamicColor(@"chat_input_text_color", @"#000000");
     _inputTextView.textAlignment = isRTL()?NSTextAlignmentRight: NSTextAlignmentLeft;
     [_inputTextView setReturnKeyType:UIReturnKeySend];
@@ -141,13 +123,9 @@
 
     if (_inputTextView) {
         [_inputTextView.layer setMasksToBounds:YES];
-//        [_inputTextView.layer setCornerRadius:4.0f];
-        [_inputTextView.layer setCornerRadius:12.0f];
-//        [_inputTextView.layer setBorderWidth:0.5f];
-//        [_inputTextView.layer setBorderColor:TIMCommonDynamicColor(@"separator_color", @"#DBDBDB").CGColor];
-        
-        [_bgView.layer setBorderWidth:0.5f];
-        [_bgView.layer setBorderColor:TIMCommonDynamicColor(@"separator_color", @"#DBDBDB").CGColor];
+        [_inputTextView.layer setCornerRadius:4.0f];
+        [_inputTextView.layer setBorderWidth:0.5f];
+        [_inputTextView.layer setBorderColor:TIMCommonDynamicColor(@"separator_color", @"#DBDBDB").CGColor];
     }
 }
 
@@ -170,59 +148,32 @@
     [_keyboardButton mas_remakeConstraints:^(MASConstraintMaker *make) {
         make.edges.mas_equalTo(_micButton);
     }];
-    
-    [_sendButton mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.trailing.mas_equalTo(self.mas_trailing).mas_offset(0);
-        make.size.mas_equalTo(buttonSize);
-        make.centerY.mas_equalTo(self);
-    }];
 
-//    [_moreButton mas_remakeConstraints:^(MASConstraintMaker *make) {
-//        make.trailing.mas_equalTo(self.mas_trailing).mas_offset(0);
-//        make.size.mas_equalTo(buttonSize);
-//        make.centerY.mas_equalTo(self);
-//    }];
-//    [_faceButton mas_remakeConstraints:^(MASConstraintMaker *make) {
-//        make.trailing.mas_equalTo(_moreButton.mas_leading).mas_offset(- TTextView_Margin);
-//        make.size.mas_equalTo(buttonSize);
-//        make.centerY.mas_equalTo(self);
-//    }];
-    
     [_moreButton mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.leading.mas_equalTo(self.mas_leading);
-        make.centerY.mas_equalTo(self);
+        make.trailing.mas_equalTo(self.mas_trailing).mas_offset(0);
         make.size.mas_equalTo(buttonSize);
+        make.centerY.mas_equalTo(self);
     }];
     [_faceButton mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.trailing.mas_equalTo(_sendButton.mas_leading).mas_offset(- TTextView_Margin * 2.0);
+        make.trailing.mas_equalTo(_moreButton.mas_leading).mas_offset(- TTextView_Margin);
         make.size.mas_equalTo(buttonSize);
         make.centerY.mas_equalTo(self);
     }];
-    
     [_recordButton mas_remakeConstraints:^(MASConstraintMaker *make) {
         make.leading.mas_equalTo(_micButton.mas_trailing).mas_offset(10);
         make.trailing.mas_equalTo(_faceButton.mas_leading).mas_offset(-10);;
         make.height.mas_equalTo(TTextView_TextView_Height_Min);
         make.centerY.mas_equalTo(self);
     }];
-    
-    [_bgView mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.leading.mas_equalTo(_moreButton.mas_trailing).mas_offset(10);
-        make.trailing.mas_equalTo(_sendButton.mas_leading).mas_offset(-TTextView_Margin);
-        make.height.mas_equalTo(TTextView_TextView_Height_Min);
-        make.centerY.mas_equalTo(self);
-    }];
 
     [_inputTextView mas_remakeConstraints:^(MASConstraintMaker *make) {
         if (self.isFromReplyPage) {
             make.leading.mas_equalTo(self.mas_leading).mas_offset(10);
         }
         else {
-//            make.leading.mas_equalTo(_micButton.mas_trailing).mas_offset(10);
-//            make.leading.mas_equalTo(self.mas_leading);
-            make.leading.mas_equalTo(_moreButton.mas_trailing).mas_offset(10);
+            make.leading.mas_equalTo(_micButton.mas_trailing).mas_offset(10);
         }
-        make.trailing.mas_equalTo(_faceButton.mas_leading).mas_offset(-10);
+        make.trailing.mas_equalTo(_faceButton.mas_leading).mas_offset(-10);;
         make.height.mas_equalTo(TTextView_TextView_Height_Min);
         make.centerY.mas_equalTo(self);
     }];
@@ -249,10 +200,6 @@
     CGRect voiceFrame = _micButton.frame;
     voiceFrame.origin.y = originY;
     _micButton.frame = voiceFrame;
-    
-    CGRect sendFrame = _sendButton.frame;
-    sendFrame.origin.y = originY;
-    _sendButton.frame = sendFrame;
 
     [_keyboardButton mas_remakeConstraints:^(MASConstraintMaker *make) {
         make.edges.mas_equalTo(_faceButton);
@@ -282,8 +229,7 @@
 }
 
 - (void)onKeyboardButtonClicked:(UIButton *)sender {
-//    _micButton.hidden = NO;
-    _micButton.hidden = YES;
+    _micButton.hidden = NO;
     _keyboardButton.hidden = YES;
     _recordButton.hidden = YES;
     _inputTextView.hidden = NO;
@@ -295,8 +241,7 @@
 }
 
 - (void)onFaceEmojiButtonClicked:(UIButton *)sender {
-//    _micButton.hidden = NO;
-    _micButton.hidden = YES;
+    _micButton.hidden = NO;
     _faceButton.hidden = YES;
     _keyboardButton.hidden = NO;
     _recordButton.hidden = YES;
@@ -315,23 +260,6 @@
     }
 }
 
-- (void)onSendButtonClicked:(UIButton *)sender {
-    //自定义发送按钮 触发
-    if (_delegate && [_delegate respondsToSelector:@selector(inputBar:didSendText:)]) {
-        NSString *sp = [[self.inputTextView.textStorage tui_getPlainString] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
-        if (sp.length == 0) {
-            UIAlertController *ac = [UIAlertController alertControllerWithTitle:TIMCommonLocalizableString(TUIKitInputBlankMessageTitle)
-                                                                        message:nil
-                                                                 preferredStyle:UIAlertControllerStyleAlert];
-            [ac tuitheme_addAction:[UIAlertAction actionWithTitle:TIMCommonLocalizableString(Confirm) style:UIAlertActionStyleDefault handler:nil]];
-            [self.mm_viewController presentViewController:ac animated:YES completion:nil];
-        } else {
-            [_delegate inputBar:self didSendText:[self.inputTextView.textStorage tui_getPlainString]];
-            [self clearInput];
-        }
-    }
-}
-
 - (void)onRecordButtonTouchDown:(UIButton *)sender {
     [self.recorder record];
 }
@@ -415,8 +343,7 @@
 #pragma mark-- UITextViewDelegate
 - (void)textViewDidBeginEditing:(UITextView *)textView {
     self.keyboardButton.hidden = YES;
-//    self.micButton.hidden = NO;
-    self.micButton.hidden = YES;
+    self.micButton.hidden = NO;
     self.faceButton.hidden = NO;
 
     self.isFocusOn = YES;
@@ -478,20 +405,11 @@
     [UIView animateWithDuration:0.3
                      animations:^{
                        [ws.inputTextView mas_remakeConstraints:^(MASConstraintMaker *make) {
-//                         make.leading.mas_equalTo(ws.micButton.mas_trailing).mas_offset(10);
-//                           make.leading.mas_equalTo(ws.mas_leading);
-                           make.leading.mas_equalTo(ws.moreButton.mas_trailing).mas_offset(10);
+                         make.leading.mas_equalTo(ws.micButton.mas_trailing).mas_offset(10);
                          make.trailing.mas_equalTo(ws.faceButton.mas_leading).mas_offset(-10);
                          make.height.mas_equalTo(newHeight);
                          make.centerY.mas_equalTo(self);
                        }];
-        
-        [ws.bgView mas_remakeConstraints:^(MASConstraintMaker *make) {
-          make.leading.mas_equalTo(ws.moreButton.mas_trailing).mas_offset(10);
-          make.trailing.mas_equalTo(ws.sendButton.mas_leading).mas_offset(-TTextView_Margin);
-          make.height.mas_equalTo(newHeight);
-          make.centerY.mas_equalTo(self);
-        }];
                        [ws layoutButton:newHeight + 2 * TTextView_Margin];
                      }];
 }

+ 0 - 8
ThirdParty/TUIKit/TUIChat/UI_Classic/Input/TUIInputController.m

@@ -82,14 +82,6 @@
     _inputBar = [[TUIInputBar alloc] initWithFrame:CGRectZero];
     _inputBar.delegate = self;
     [self.view addSubview:_inputBar];
-    
-    UIView *lineView = [[UIView alloc] init];
-    lineView.backgroundColor = TUIChatDynamicColor(@"chat_input_controller_bg_color", @"#E2E3E8");
-    [self.view addSubview:lineView];
-    [lineView mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.top.left.right.equalTo(self.view);
-        make.height.equalTo(@0.5);
-    }];
 }
 
 - (void)keyboardWillHide:(NSNotification *)notification {

+ 0 - 4
ThirdParty/TUIKit/TUIChat/UI_Classic/Input/TUIResponderTextView.h

@@ -18,8 +18,4 @@
 
 @interface TUIResponderTextView : UITextView
 @property(nonatomic, weak) UIResponder *overrideNextResponder;
-
-@property(strong, nonatomic) NSString *placeHolder;
-@property(strong, nonatomic) UIColor *placeHolderColor;
-
 @end

+ 0 - 56
ThirdParty/TUIKit/TUIChat/UI_Classic/Input/TUIResponderTextView.m

@@ -9,64 +9,8 @@
 #import "TUIResponderTextView.h"
 #import <TIMCommon/NSString+TUIEmoji.h>
 
-@interface TUIResponderTextView ()
-@property (nonatomic ,strong) UILabel *placeHolderLabel;
-@end
-
 @implementation TUIResponderTextView
 
-- (instancetype)init {
-    self = [super init];
-    if (self) {
-        [[NSNotificationCenter defaultCenter] addObserver:self
-                                                 selector:@selector(didReceiveTextDidChangeNotification:)
-                                                     name:UITextViewTextDidChangeNotification
-                                                   object:self];
-        [self placeAndLayoutSubviews];
-    }
-    return self;
-}
-
-- (void)placeAndLayoutSubviews {
-    [self addSubview:self.placeHolderLabel];
-    [self.placeHolderLabel mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.top.equalTo(self).offset(7.0);
-        make.left.equalTo(self).offset(14.0);
-        make.right.equalTo(self).offset(-14.0);
-    }];
-}
-
-- (void)dealloc {
-    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self];
-}
-
-#pragma mark - Notifications
-- (void)didReceiveTextDidChangeNotification:(NSNotification *)notification {
-    self.placeHolderLabel.hidden = self.text.length > 0 ? YES : NO;
-}
-
-#pragma mark getter and setter
-- (UILabel *)placeHolderLabel {
-    if (_placeHolderLabel == nil) {
-        _placeHolderLabel = [[UILabel alloc] init];
-        _placeHolderLabel.font = self.font;
-        _placeHolderLabel.textColor = [UIColor lightGrayColor];
-        _placeHolderLabel.textAlignment = NSTextAlignmentLeft;
-        _placeHolderLabel.lineBreakMode = NSLineBreakByTruncatingTail;
-    }
-    return _placeHolderLabel;
-}
-
-- (void)setPlaceHolder:(NSString *)placeHolder {
-    _placeHolder = placeHolder;
-    self.placeHolderLabel.text = _placeHolder;
-}
-
-- (void)setPlaceHolderColor:(UIColor *)placeHolderColor {
-    _placeHolderColor = placeHolderColor;
-    self.placeHolderLabel.textColor = _placeHolderColor;
-}
-
 - (UIResponder *)nextResponder {
     if (_overrideNextResponder == nil) {
         return [super nextResponder];

+ 1 - 1
ThirdParty/TUIKit/TUIChat/UI_Minimalist/Cell/Base/TUIGroupProfileCardViewCell_Minimalist.m

@@ -288,7 +288,7 @@
 
     [self.headerView.headImg sd_setImageWithURL:data.avatarUrl placeholderImage:data.avatarImage];
     self.headerView.descriptionLabel.text = data.name;
-    self.headerView.idLabel.text = [NSString stringWithFormat:@"ID %@", data.identifier];
+    self.headerView.idLabel.text = [NSString stringWithFormat:@"ID: %@", data.identifier];
 }
 - (void)layoutSubviews {
     [super layoutSubviews];

+ 1 - 1
ThirdParty/TUIKit/TUIChat/UI_Minimalist/Chat/TUIBaseChatViewController_Minimalist.m

@@ -129,7 +129,7 @@ static CGRect gCustomTopViewRect;
     [self setupInputMoreMenu];
     [self setupInputController];
 
-    // data mo_provider
+    // data provider
     self.dataProvider = [[TUIChatDataProvider alloc] init];
     self.dataProvider.delegate = self;
 

+ 9 - 1
ThirdParty/TUIKit/TUIChat/UI_Minimalist/Chat/TUIBaseMessageController_Minimalist.m

@@ -1155,7 +1155,10 @@ static NSMutableArray *reloadMsgIndexs = nil;
 - (BOOL)isAddCopy:(V2TIMMessage *)imMsg data:(TUIMessageCellData *)data {
     BOOL isCopyShown = [TUIChatConfig defaultConfig].enablePopMenuCopyAction;
     BOOL isContentModerated = imMsg.hasRiskContent;
-    return isCopyShown && ([data isKindOfClass:[TUITextMessageCellData class]] || [data isKindOfClass:TUIReferenceMessageCellData.class]) && !isContentModerated;
+    return isCopyShown && ([data isKindOfClass:[TUITextMessageCellData class]]
+                           || [data isKindOfClass:[TUIReferenceMessageCellData class]]
+                           || [data isKindOfClass:[TUIReplyMessageCellData class]])
+                      && !isContentModerated;
 }
 
 - (BOOL)isAddMultiSelect:(V2TIMMessage *)imMsg {
@@ -1450,6 +1453,11 @@ static NSMutableArray *reloadMsgIndexs = nil;
         TUIReferenceMessageCellData *replyMsg = (TUIReferenceMessageCellData *)replyMsgCell.data;
         content = replyMsg.content;
     }
+    if ([sender isKindOfClass:TUIReplyMessageCell_Minimalist.class]) {
+        TUIReplyMessageCell_Minimalist *replyMsgCell = (TUIReplyMessageCell_Minimalist *)sender;
+        TUIReplyMessageCellData *replyMsg = (TUIReplyMessageCellData *)replyMsgCell.data;
+        content = replyMsg.content;
+    }
     if (content.length > 0) {
         UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
         pasteboard.string = content;

+ 1 - 0
ThirdParty/TUIKit/TUIChat/UI_Minimalist/Chat/TUIGroupInfoController_Minimalist.m

@@ -176,6 +176,7 @@
         return cell;
     } else if ([data isKindOfClass:[TUIGroupMemberCellData_Minimalist class]]) {
         TUICommonTableViewCell *cell = [[TUICommonTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TGroupMembersCell_ReuseId];
+        cell.frame = CGRectMake(0, 0, tableView.contentSize.width, [(TUIGroupMemberCellData_Minimalist *)data heightOfWidth:Screen_Width]);
         NSDictionary *param = @{
             @"data": data ,
             @"pushVC": self.navigationController,

+ 2 - 0
ThirdParty/TUIKit/TUIChat/UI_Minimalist/Chat/TUIRepliesDetailViewController_Minimalist.m

@@ -299,6 +299,8 @@
     self.cellData.cellLayout = self.originCellLayout;
     self.cellData.direction = self.direction;
     self.cellData.showMessageModifyReplies = YES;
+    self.cellData.showAvatar = self.showAvatar;
+    self.cellData.sameToNextMsgSender = self.sameToNextMsgSender;
 }
 
 - (NSMutableArray *)transUIMsgFromIMMsg:(NSArray *)msgs {

+ 0 - 5
ThirdParty/TUIKit/TUIConversation/BaseCell/CellData/TUIConversationCellData.h

@@ -56,11 +56,6 @@ typedef NS_ENUM(NSInteger, TUIConversationOnlineStatus) {
 
 @property(nonatomic, assign) int unreadCount;
 
-@property (nonatomic, strong) NSString *headdress;//头饰链接
-@property (nonatomic, assign) double headgearType;//头饰 - 头饰类型(0=无资源文件,1=动态webp,2=SVGA,3=VAP)
-@property (nonatomic, strong) NSAttributedString *nameAttrString; // 头衔元素
-@property (nonatomic, assign) CGFloat nameAttWidth;//头衔元素所需要的宽度
-
 /**
  *  Overview of conversation messages (sub title)
  *  The overview is responsible for displaying the content/type of the latest message for the corresponding conversation.

+ 0 - 16
ThirdParty/TUIKit/TUIConversation/BaseCell/CellUI/MOConversationEmptyCell.h

@@ -1,16 +0,0 @@
-//
-//  MOConversationEmptyCell.h
-//  TUIConversation
-//
-//  Created by SuperC on 2025/5/16.
-//
-
-#import <UIKit/UIKit.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface MOConversationEmptyCell : UITableViewCell
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 33
ThirdParty/TUIKit/TUIConversation/BaseCell/CellUI/MOConversationEmptyCell.m

@@ -1,33 +0,0 @@
-//
-//  MOConversationEmptyCell.m
-//  TUIConversation
-//
-//  Created by SuperC on 2025/5/16.
-//
-
-#import "MOConversationEmptyCell.h"
-
-@implementation MOConversationEmptyCell
-
-- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
-    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
-    if (self) {
-        self.backgroundColor = [UIColor clearColor];
-        self.contentView.backgroundColor = [UIColor clearColor];
-        self.selectionStyle = UITableViewCellSelectionStyleNone;
-    }
-    return self;
-}
-
-- (void)awakeFromNib {
-    [super awakeFromNib];
-    // Initialization code
-}
-
-- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
-    [super setSelected:selected animated:animated];
-
-    // Configure the view for the selected state
-}
-
-@end

+ 0 - 2
ThirdParty/TUIKit/TUIConversation/BaseCell/CellUI/TUIConversationCell.h

@@ -82,8 +82,6 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (void)fillWithData:(TUIConversationCellData *)convData;
 
-+ (NSString *)convertDateTwoToStr:(NSDate *)date;//列表日期格式
-
 @end
 
 NS_ASSUME_NONNULL_END

+ 14 - 166
ThirdParty/TUIKit/TUIConversation/BaseCell/CellUI/TUIConversationCell.m

@@ -12,49 +12,32 @@
 #import <TUICore/TUIThemeManager.h>
 #import <TUICore/TUITool.h>
 #import "TUIConversationConfig.h"
-#import <TIMCommon/MOHeadNormalView.h>
-#import <YYKit/YYLabel.h>
 
 #define kScale UIScreen.mainScreen.bounds.size.width / 375.0
 
-@interface TUIConversationCell ()
-
-@property (nonatomic, strong) MOHeadNormalView *headBgView;//头像框
-
-@property (nonatomic, strong) YYLabel *nameTagLab;
-
-@property (nonatomic, strong) UIView *lineView;//E1E2E8
-
-@end
-
 @implementation TUIConversationCell
 
 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
     if (self) {
-        self.backgroundColor = [UIColor clearColor];
         self.contentView.backgroundColor = TUIConversationDynamicColor(@"conversation_cell_bg_color", @"#FFFFFF");
 
         _headImageView = [[UIImageView alloc] init];
         [self.contentView addSubview:_headImageView];
-        
-        [self.contentView addSubview:self.headBgView];
 
         _timeLabel = [[UILabel alloc] init];
         _timeLabel.font = [UIFont systemFontOfSize:12];
-        _timeLabel.textColor = TIMCommonDynamicColor(@"form_desc_color", @"#878A99");;
+        _timeLabel.textColor = TIMCommonDynamicColor(@"form_desc_color", @"#BBBBBB");
         _timeLabel.layer.masksToBounds = YES;
         [_timeLabel setRtlAlignment:TUITextRTLAlignmentLeading];
         [self.contentView addSubview:_timeLabel];
 
         _titleLabel = [[UILabel alloc] init];
         _titleLabel.font = [UIFont systemFontOfSize:16];
-        _titleLabel.textColor = TIMCommonDynamicColor(@"form_title_color", @"#17171A");
+        _titleLabel.textColor = TIMCommonDynamicColor(@"form_title_color", @"#000000");
         _titleLabel.layer.masksToBounds = YES;
         [_titleLabel setRtlAlignment:TUITextRTLAlignmentLeading];
         [self.contentView addSubview:_titleLabel];
-        
-        [self.contentView addSubview:self.nameTagLab];
 
         _unReadView = [[TUIUnReadView alloc] init];
         [self.contentView addSubview:_unReadView];
@@ -62,7 +45,7 @@
         _subTitleLabel = [[UILabel alloc] init];
         _subTitleLabel.layer.masksToBounds = YES;
         _subTitleLabel.font = [UIFont systemFontOfSize:14];
-//        _subTitleLabel.textColor = TIMCommonDynamicColor(@"form_subtitle_color", @"#878A99");
+        _subTitleLabel.textColor = TIMCommonDynamicColor(@"form_subtitle_color", @"#888888");
         [_subTitleLabel setRtlAlignment:TUITextRTLAlignmentLeading];
         [self.contentView addSubview:_subTitleLabel];
 
@@ -74,13 +57,6 @@
 
         _notDisturbView = [[UIImageView alloc] init];
         [self.contentView addSubview:_notDisturbView];
-        
-        [self.contentView addSubview:self.lineView];
-        [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) {
-            make.bottom.right.equalTo(self.contentView);
-            make.left.equalTo(self.contentView).offset(82.0);
-            make.height.equalTo(@0.5);
-        }];
 
         [self setSeparatorInset:UIEdgeInsetsMake(0, TConversationCell_Margin, 0, 0)];
 
@@ -114,8 +90,7 @@
         self.subTitleLabel.font = [TUIConversationConfig sharedConfig].cellSubtitleLabelFont;
     }
     
-//    self.timeLabel.text = [TUITool convertDateToStr:convData.time];
-    self.timeLabel.text = [TUIConversationCell convertDateTwoToStr:convData.time];
+    self.timeLabel.text = [TUITool convertDateToStr:convData.time];
     if ([TUIConversationConfig sharedConfig].cellTimeLabelFont) {
         self.timeLabel.font = [TUIConversationConfig sharedConfig].cellTimeLabelFont;
     }
@@ -277,24 +252,6 @@
     [self configOnlineStatusIcon:convData];
 
     [self configDisplayLastMessageStatusImage:convData];
-    
-    if(convData.headdress.length > 0){
-        self.headBgView.hidden = NO;
-        self.headBgView.isLiving = NO;
-        self.headBgView.effectType = convData.headgearType;
-        self.headBgView.imgUrlStr = convData.headdress;
-    }
-    else{
-        self.headBgView.hidden = YES;
-    }
-    
-    if(convData.nameAttrString){
-        self.nameTagLab.hidden = NO;
-        self.nameTagLab.attributedText = convData.nameAttrString;
-    }
-    else{
-        self.nameTagLab.hidden = YES;
-    }
 
     // tell constraints they need updating
     [self setNeedsUpdateConstraints];
@@ -411,25 +368,10 @@
             make.leading.mas_equalTo(self.selectedIcon.mas_trailing).mas_offset(TConversationCell_Margin + 3);
         }
         else {
-            make.leading.mas_equalTo(self.contentView.mas_leading).mas_offset(TConversationCell_Margin + 14);
+            make.leading.mas_equalTo(self.contentView.mas_leading).mas_offset(TConversationCell_Margin + 3);
         }
     }];
     MASAttachKeys(self.headImageView);
-    
-    [self.headBgView mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.centerX.equalTo(self.headImageView);
-        make.centerY.equalTo(self.headImageView);
-        make.width.height.equalTo(@48.0);
-    }];
-    self.headBgView.headImgWidth = 48.0;
-    
-    CGFloat titleLabWidth = [self getWidthWithString:self.titleLabel.text font:[UIFont systemFontOfSize:16.0 weight:UIFontWeightMedium]] + 1.0;
-    if(titleLabWidth < 44.0){
-        titleLabWidth = 44.0;
-    }
-    if(titleLabWidth > 80.0){
-        titleLabWidth = 80.0;
-    }
 
     if ([TUIConfig defaultConfig].avatarType == TAvatarTypeRounded) {
         self.headImageView.layer.masksToBounds = YES;
@@ -446,7 +388,7 @@
             make.width.mas_greaterThanOrEqualTo(120);
             make.height.mas_greaterThanOrEqualTo(titleLabelHeight);
             make.top.mas_equalTo((height - titleLabelHeight) / 2);
-            make.leading.mas_equalTo(self.headImageView.mas_trailing).mas_offset(20);
+            make.leading.mas_equalTo(self.headImageView.mas_trailing).mas_offset(TConversationCell_Margin);
             make.trailing.mas_equalTo(self.contentView).mas_offset(- 2*TConversationCell_Margin_Text);
         }];
         self.timeLabel.hidden = YES;
@@ -462,7 +404,7 @@
             make.width.mas_equalTo(self.timeLabel);
             make.height.mas_greaterThanOrEqualTo(self.timeLabel.font.lineHeight);
             make.top.mas_equalTo(self.contentView.mas_top).mas_offset(TConversationCell_Margin_Text);
-            make.trailing.mas_equalTo(self.contentView.mas_trailing).mas_offset(-28);
+            make.trailing.mas_equalTo(self.contentView.mas_trailing).mas_offset(- TConversationCell_Margin_Text);
         }];
         MASAttachKeys(self.timeLabel);
 
@@ -478,9 +420,8 @@
         [self.titleLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
             make.height.mas_greaterThanOrEqualTo(titleLabelHeight);
             make.top.mas_equalTo(self.contentView.mas_top).mas_offset(TConversationCell_Margin_Text - 5);
-            make.leading.mas_equalTo(self.headImageView.mas_trailing).mas_offset(20);
-//            make.trailing.mas_lessThanOrEqualTo(self.timeLabel.mas_trailing).mas_offset(- 2*TConversationCell_Margin_Text);
-            make.width.equalTo(@(titleLabWidth));
+            make.leading.mas_equalTo(self.headImageView.mas_trailing).mas_offset(TConversationCell_Margin);
+            make.trailing.mas_lessThanOrEqualTo(self.timeLabel.mas_trailing).mas_offset(- 2*TConversationCell_Margin_Text);
         }];
         MASAttachKeys(self.titleLabel);
         [self.subTitleLabel sizeToFit];
@@ -491,28 +432,13 @@
             make.trailing.mas_equalTo(self.contentView).mas_offset(- 2*TConversationCell_Margin_Text);
         }];
         MASAttachKeys(self.subTitleLabel);
-        
-        [self.nameTagLab mas_remakeConstraints:^(MASConstraintMaker *make) {
-            make.leading.equalTo(self.titleLabel.mas_trailing).mas_offset(3);
-            make.centerY.equalTo(self.titleLabel.mas_centerY);
-            make.height.mas_equalTo(20);
-            make.width.mas_greaterThanOrEqualTo(20);
-            make.trailing.mas_lessThanOrEqualTo(self.timeLabel.mas_trailing).mas_offset(- 2*TConversationCell_Margin_Text);
-        }];
 
         [self.unReadView.unReadLabel sizeToFit];
-        
-        NSDictionary *attrs = @{NSFontAttributeName:[UIFont systemFontOfSize:10]};
-        CGFloat tempWidth = [self.unReadView.unReadLabel.text boundingRectWithSize:CGSizeZero options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size.width + 5.0;
-        if(tempWidth < kScale375(14)){
-            tempWidth = kScale375(14);
-        }
-        
         [self.unReadView mas_remakeConstraints:^(MASConstraintMaker *make) {
-            make.trailing.mas_equalTo(self.timeLabel.mas_trailing);
-            make.centerY.mas_equalTo(self.headImageView.mas_centerY).mas_offset(8);
-            make.width.mas_equalTo(tempWidth);
-            make.height.mas_equalTo(kScale375(14));
+            make.trailing.mas_equalTo(self.headImageView.mas_trailing).mas_offset(kScale375(5));
+            make.top.mas_equalTo(self.headImageView.mas_top).mas_offset(-kScale375(5));
+            make.width.mas_equalTo(kScale375(20));
+            make.height.mas_equalTo(kScale375(20));
         }];
         MASAttachKeys(self.unReadView);
 
@@ -520,7 +446,7 @@
             make.center.mas_equalTo(self.unReadView);
             make.size.mas_equalTo(self.unReadView.unReadLabel);
         }];
-        self.unReadView.layer.cornerRadius = kScale375(7);
+        self.unReadView.layer.cornerRadius = kScale375(10);
         [self.unReadView.layer masksToBounds];
         
         [self.notDisturbRedDot mas_remakeConstraints:^(MASConstraintMaker *make) {
@@ -543,88 +469,10 @@
         }];
         self.onlineStatusIcon.layer.cornerRadius = 0.5 * kScale375(15);
     }
-    
-    [self.nameTagLab mas_remakeConstraints:^(MASConstraintMaker *make) {
-        make.leading.equalTo(self.titleLabel.mas_trailing).mas_offset(3);
-        make.centerY.equalTo(self.titleLabel.mas_centerY);
-        make.height.mas_equalTo(20);
-        make.width.mas_greaterThanOrEqualTo(100);
-        make.trailing.mas_lessThanOrEqualTo(self.timeLabel.mas_trailing).mas_offset(- 2*TConversationCell_Margin_Text);
-    }];
 }
 
 - (void)layoutSubviews {
     [super layoutSubviews];
 }
 
-- (MOHeadNormalView *)headBgView{
-    if(!_headBgView){
-        _headBgView = [[MOHeadNormalView alloc] init];
-    }
-    return _headBgView;
-}
-
-- (YYLabel *)nameTagLab{
-    if(!_nameTagLab){
-        _nameTagLab = [[YYLabel alloc] init];
-        _nameTagLab.textAlignment = NSTextAlignmentLeft;
-    }
-    return _nameTagLab;
-}
-
-- (UIView *)lineView{
-    if(!_lineView){
-        _lineView = [[UIView alloc] init];
-        _lineView.backgroundColor = TIMCommonDynamicColor(@"separator_color", @"#E1E2E8");
-    }
-    return _lineView;
-}
-
-- (CGFloat)getWidthWithString:(NSString *)string font:(UIFont *)font
-{
-    NSDictionary *attrs = @{NSFontAttributeName:font};
-    CGFloat width = [string boundingRectWithSize:CGSizeZero options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size.width;
-    return width;
-}
-
-+ (NSString *)convertDateTwoToStr:(NSDate *)date {
-    if (!date) {
-        return nil;
-    }
-    
-    if ([date isEqualToDate:[NSDate distantPast]]) {
-        return @"";
-    }
-    
-    static NSDateFormatter *dateFmt = nil;
-    if (dateFmt == nil) {
-        dateFmt = [[NSDateFormatter alloc] init];
-    }
-    
-    NSCalendar *calendar = [NSCalendar currentCalendar];
-    NSDate *now = [NSDate date];
-    NSDateComponents *components = [calendar components:NSCalendarUnitDay | NSCalendarUnitWeekOfYear | NSCalendarUnitMonth | NSCalendarUnitYear
-                                             fromDate:date
-                                               toDate:now
-                                              options:0];
-    
-    // 同一天,显示时间
-    if (components.year == 0 && components.month == 0 && components.day == 0) {
-        dateFmt.dateFormat = @"HH:mm";
-        return [dateFmt stringFromDate:date];
-    }
-    // 一天内,显示"一天前"
-    else if (components.year == 0 && components.month == 0 && components.day <= 1) {
-        return NSLocalizedString(@"mimo_chat_time_day_1", nil);
-    }
-    // 一周内,显示"一周前"
-    else if (components.year == 0 && components.month == 0 && components.day <= 7) {
-        return NSLocalizedString(@"mimo_chat_time_week_1", nil);
-    }
-    // 一月内,显示"一月前"
-    else{
-        return NSLocalizedString(@"mimo_chat_time_month_1", nil);
-    }
-}
-
 @end

+ 0 - 11
ThirdParty/TUIKit/TUIConversation/BaseDataProvider/TUIConversationListBaseDataProvider.h

@@ -31,12 +31,6 @@ static NSString *gGroup_conversationFoldListMockID = @"group_conversationFoldLis
 - (void)updateMarkUnreadCount:(NSInteger)markUnreadCount markHideUnreadCount:(NSInteger)markHideUnreadCount;
 @end
 
-@protocol TUIConversationListDataProviderDelegate_Two <NSObject>
-
-- (TUIConversationCellData *)cellDataForConversation_Two:(V2TIMConversation *)conversation;
-
-@end
-
 @interface TUIConversationListBaseDataProvider : NSObject
 /**
  * 
@@ -74,8 +68,6 @@ static NSString *gGroup_conversationFoldListMockID = @"group_conversationFoldLis
 
 @property(nonatomic, strong) NSDictionary<NSString *, NSString *> *lastMessageDisplayMap;
 
-@property (nonatomic, weak, nullable) id <TUIConversationListDataProviderDelegate_Two> delegateTwo;
-
 - (void)loadNexPageConversations;
 - (void)addConversationList:(NSArray<TUIConversationCellData *> *)conversationList;
 - (void)removeConversation:(TUIConversationCellData *)conversation;
@@ -95,9 +87,6 @@ static NSString *gGroup_conversationFoldListMockID = @"group_conversationFoldLis
 - (NSString *)getDraftContent:(V2TIMConversation *)conv;
 - (BOOL)isConversationNotDisturb:(V2TIMConversation *)conversation;
 
-- (NSMutableArray<NSNumber *> *)getGroupatMsgSeqs:(V2TIMConversation *)conv;
-- (NSDate *)getLastDisplayDate:(V2TIMConversation *)conv;
-
 // subclass override
 - (Class)getConversationCellClass;
 - (void)asnycGetLastMessageDisplay:(NSArray<TUIConversationCellData *> *)duplicateDataList addedDataList:(NSArray<TUIConversationCellData *> *)addedDataList;

+ 0 - 2
ThirdParty/TUIKit/TUIConversation/TUIConversation.podspec

@@ -15,8 +15,6 @@ Pod::Spec.new do |spec|
   spec.dependency 'TUICore'
   spec.dependency 'TIMCommon'
   spec.dependency 'ReactiveObjC'
-  spec.dependency 'SVGAPlayer-iOS'
-  spec.dependency 'YYKit'
   spec.requires_arc = true
 
   spec.source = { :git => 'https://git.woa.com/lynxzhang/tui-components.git', :tag => spec.version}

+ 0 - 47
ThirdParty/TUIKit/TUIConversation/UI_Classic/DataProvider/TUIConversationListDataProvider.m

@@ -176,51 +176,4 @@
     }
     return attributeString;
 }
-
-- (TUIConversationCellData *)cellDataForConversation:(V2TIMConversation *)conversation {
-    Class cls = [self getConversationCellClass];
-    if (cls) {
-        TUIConversationCellData *data = (TUIConversationCellData *)[[cls alloc] init];
-        data.conversationID = conversation.conversationID;
-        data.groupID = conversation.groupID;
-        data.groupType = conversation.groupType;
-        data.userID = conversation.userID;
-        data.title = conversation.showName;
-        data.faceUrl = conversation.faceUrl;
-        data.subTitle = [self getLastDisplayString:conversation];
-        data.foldSubTitle = [self getLastDisplayStringForFoldList:conversation];
-        data.atTipsStr = [self getGroupAtTipString:conversation];
-        data.atMsgSeqs = [self getGroupatMsgSeqs:conversation];
-        data.time = [self getLastDisplayDate:conversation];
-        data.isOnTop = conversation.isPinned;
-        data.unreadCount = conversation.unreadCount;
-        data.draftText = conversation.draftText;
-        data.isNotDisturb = [self isConversationNotDisturb:conversation];
-        data.orderKey = conversation.orderKey;
-        data.avatarImage = (conversation.type == V2TIM_C2C ? DefaultAvatarImage : DefaultGroupAvatarImageByGroupType(conversation.groupType));
-        data.onlineStatus = TUIConversationOnlineStatusUnknown;
-        data.isMarkAsUnread = [TUIConversationCellData isMarkedByUnReadType:conversation.markList];
-        data.isMarkAsHide = [TUIConversationCellData isMarkedByHideType:conversation.markList];
-        data.isMarkAsFolded = [TUIConversationCellData isMarkedByFoldType:conversation.markList];
-        data.lastMessage = conversation.lastMessage;
-        data.innerConversation = conversation;
-        data.conversationGroupList = conversation.conversationGroupList;
-        data.conversationMarkList = conversation.markList;
-        
-        if (self.delegateTwo && [self.delegateTwo respondsToSelector:@selector(cellDataForConversation_Two:)]) {
-            TUIConversationCellData *tempData = [self.delegateTwo cellDataForConversation_Two:conversation];
-            data.title = tempData.title;
-            data.faceUrl = tempData.faceUrl;
-            data.headgearType = tempData.headgearType;
-            data.headdress = tempData.headdress;
-            data.nameAttrString = tempData.nameAttrString;
-            data.nameAttWidth = tempData.nameAttWidth;
-        }
-        
-        return data;
-    }
-    return nil;
-}
-
-
 @end

+ 0 - 3
ThirdParty/TUIKit/TUIConversation/UI_Classic/UI/TUIConversationListController.h

@@ -55,9 +55,6 @@ NS_ASSUME_NONNULL_BEGIN
  */
 @property(nonatomic) BOOL isShowConversationGroup;
 
-@property(nonatomic, assign) CGFloat theTopSpacing;
-@property(nonatomic, assign) CGFloat theTableViewHeight;
-
 - (void)startConversation:(V2TIMConversationType)type;
 @end
 

+ 1 - 5
ThirdParty/TUIKit/TUIConversation/UI_Classic/UI/TUIConversationListController.m

@@ -171,8 +171,7 @@
           self.actualShowConversationGroup = (extensionList.count > 0);
         });
     } else {
-//        self.tableViewContainer.frame = CGRectMake(0, self.bannerView.mm_maxY, self.view.mm_w, self.viewHeight - self.bannerView.mm_maxY);
-        self.tableViewContainer.frame = CGRectMake(0, 0, self.view.mm_w, self.theTableViewHeight);
+        self.tableViewContainer.frame = CGRectMake(0, self.bannerView.mm_maxY, self.view.mm_w, self.viewHeight - self.bannerView.mm_maxY);
         self.tableViewForAll.frame = self.tableViewContainer.bounds;
     }
 }
@@ -691,9 +690,6 @@
                             [groupName appendFormat:@"、%@", item.title];
                         }
 
-                        if ([groupName length] > 10) {
-                            groupName = [groupName substringToIndex:10].mutableCopy;
-                        }
                         void (^createGroupCompletion)(BOOL, V2TIMGroupInfo *) = ^(BOOL isSuccess, V2TIMGroupInfo *_Nonnull info) {
                           NSDictionary *param = @{
                               TUICore_TUIChatObjectFactory_ChatViewController_Title : info.groupName ?: @"",

+ 5 - 26
ThirdParty/TUIKit/TUIConversation/UI_Classic/UI/TUIConversationTableView.m

@@ -13,8 +13,6 @@
 #import "TUIFoldListViewController.h"
 #import "TUIConversationConfig.h"
 
-#import "MOConversationEmptyCell.h"
-
 @interface TUIConversationTableView () <UITableViewDelegate, UITableViewDataSource, TUIConversationListDataProviderDelegate>
 @property(nonatomic, strong) UIImageView *tipsView;
 @property(nonatomic, strong) UILabel *tipsLabel;
@@ -53,14 +51,12 @@
     self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
     self.backgroundColor = TUIConversationDynamicColor(@"conversation_bg_color", @"#FFFFFF");
     self.tableFooterView = [[UIView alloc] init];
-    self.contentInset = UIEdgeInsetsMake(0, 0, 120, 0);
+    self.contentInset = UIEdgeInsetsMake(0, 0, 8, 0);
     [self registerClass:[TUIConversationCell class] forCellReuseIdentifier:gConversationCell_ReuseId];
-    [self registerClass:[MOConversationEmptyCell class] forCellReuseIdentifier:@"MOConversationEmptyCell"];
     self.estimatedRowHeight = TConversationCell_Height;
     self.rowHeight = TConversationCell_Height;
     self.delaysContentTouches = NO;
-//    [self setSeparatorColor:TIMCommonDynamicColor(@"separator_color", @"#E1E2E8")];
-    self.separatorStyle = UITableViewCellSeparatorStyleNone;
+    [self setSeparatorColor:TIMCommonDynamicColor(@"separator_color", @"#DBDBDB")];
     self.delegate = self;
     self.dataSource = self;
     [self addSubview:self.tipsView];
@@ -96,7 +92,7 @@
 - (UIImageView *)tipsView {
     if (!_tipsView) {
         _tipsView = [[UIImageView alloc] init];
-//        _tipsView.image = TUIConversationDynamicImage(@"no_conversation_img", [UIImage imageNamed:TUIConversationImagePath(@"no_conversation")]);
+        _tipsView.image = TUIConversationDynamicImage(@"no_conversation_img", [UIImage imageNamed:TUIConversationImagePath(@"no_conversation")]);
         _tipsView.hidden = YES;
     }
     return _tipsView;
@@ -114,7 +110,7 @@
 }
 
 - (void)setTipsViewFrame {
-    self.tipsView.mm_width(128).mm_height(109).mm__centerX(self.mm_centerX).mm_top(200.0);
+    self.tipsView.mm_width(128).mm_height(109).mm__centerX(self.mm_centerX).mm__centerY(self.mm_centerY - 60);
     self.tipsLabel.mm_width(300).mm_height(20).mm__centerX(self.mm_centerX).mm_top(self.tipsView.mm_maxY + 18);
 }
 
@@ -240,16 +236,6 @@
     return self.dataProvider.conversationList.count;
 }
 
-- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
-    TUIConversationCellData *cellData = self.dataProvider.conversationList[indexPath.row];
-    if([cellData.conversationID isEqualToString:@"c2c_10000"] || [cellData.conversationID isEqualToString:@"c2c_10001"]) {
-        return 0.1;
-    }
-    else{
-        return TConversationCell_Height;
-    }
-}
-
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
     return YES;
 }
@@ -533,13 +519,6 @@
 }
 
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
-    
-    TUIConversationCellData *cellData = self.dataProvider.conversationList[indexPath.row];
-    if([cellData.conversationID isEqualToString:@"c2c_10000"] || [cellData.conversationID isEqualToString:@"c2c_10001"]) {
-        MOConversationEmptyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MOConversationEmptyCell" forIndexPath:indexPath];
-        return cell;
-    }
-    
     TUIConversationCell *cell = [tableView dequeueReusableCellWithIdentifier:gConversationCell_ReuseId forIndexPath:indexPath];
     if (cell && indexPath.row < self.dataProvider.conversationList.count) {
         TUIConversationCellData *data = [self.dataProvider.conversationList objectAtIndex:indexPath.row];
@@ -585,7 +564,7 @@
     // Turn on or off the length of the last line of dividers by controlling this switch
     BOOL needLastLineFromZeroToMax = NO;
     if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
-        [cell setSeparatorInset:UIEdgeInsetsMake(0, 82, 0, 0)];
+        [cell setSeparatorInset:UIEdgeInsetsMake(0, 75, 0, 0)];
         if (needLastLineFromZeroToMax && indexPath.row == (self.dataProvider.conversationList.count - 1)) {
             [cell setSeparatorInset:UIEdgeInsetsZero];
         }

+ 0 - 46
ThirdParty/TUIKit/TUIConversation/UI_Minimalist/DataProvider/TUIConversationListDataProvider_Minimalist.m

@@ -152,50 +152,4 @@
 
     return attributeString;
 }
-
-- (TUIConversationCellData *)cellDataForConversation:(V2TIMConversation *)conversation {
-    Class cls = [self getConversationCellClass];
-    if (cls) {
-        TUIConversationCellData *data = (TUIConversationCellData *)[[cls alloc] init];
-        data.conversationID = conversation.conversationID;
-        data.groupID = conversation.groupID;
-        data.groupType = conversation.groupType;
-        data.userID = conversation.userID;
-        data.title = conversation.showName;
-        data.faceUrl = conversation.faceUrl;
-        data.subTitle = [self getLastDisplayString:conversation];
-        data.foldSubTitle = [self getLastDisplayStringForFoldList:conversation];
-        data.atTipsStr = [self getGroupAtTipString:conversation];
-        data.atMsgSeqs = [self getGroupatMsgSeqs:conversation];
-        data.time = [self getLastDisplayDate:conversation];
-        data.isOnTop = conversation.isPinned;
-        data.unreadCount = conversation.unreadCount;
-        data.draftText = conversation.draftText;
-        data.isNotDisturb = [self isConversationNotDisturb:conversation];
-        data.orderKey = conversation.orderKey;
-        data.avatarImage = (conversation.type == V2TIM_C2C ? DefaultAvatarImage : DefaultGroupAvatarImageByGroupType(conversation.groupType));
-        data.onlineStatus = TUIConversationOnlineStatusUnknown;
-        data.isMarkAsUnread = [TUIConversationCellData isMarkedByUnReadType:conversation.markList];
-        data.isMarkAsHide = [TUIConversationCellData isMarkedByHideType:conversation.markList];
-        data.isMarkAsFolded = [TUIConversationCellData isMarkedByFoldType:conversation.markList];
-        data.lastMessage = conversation.lastMessage;
-        data.innerConversation = conversation;
-        data.conversationGroupList = conversation.conversationGroupList;
-        data.conversationMarkList = conversation.markList;
-        
-        if (self.delegateTwo && [self.delegateTwo respondsToSelector:@selector(cellDataForConversation_Two:)]) {
-            TUIConversationCellData *tempData = [self.delegateTwo cellDataForConversation_Two:conversation];
-            data.title = tempData.title;
-            data.faceUrl = tempData.faceUrl;
-            data.headgearType = tempData.headgearType;
-            data.headdress = tempData.headdress;
-            data.nameAttrString = tempData.nameAttrString;
-            data.nameAttWidth = tempData.nameAttWidth;
-        }
-        
-        return data;
-    }
-    return nil;
-}
-
 @end

+ 0 - 3
ThirdParty/TUIKit/TUIConversation/UI_Minimalist/UI/TUIConversationListController_Minimalist.m

@@ -245,9 +245,6 @@ static NSString *kConversationCell_Minimalist_ReuseId = @"kConversationCell_Mini
                             [groupName appendFormat:@"、%@", item.title];
                         }
 
-                        if ([groupName length] > 10) {
-                            groupName = [groupName substringToIndex:10].mutableCopy;
-                        }
                         void (^createGroupCompletion)(BOOL, V2TIMGroupInfo *, UIImage *) = ^(BOOL isSuccess, V2TIMGroupInfo *_Nonnull info,
                                                                                              UIImage *_Nonnull submitShowImage) {
                           NSDictionary *param = @{

+ 3 - 3
ThirdParty/TUIKit/TUICore/TUICommonModel.h

@@ -74,12 +74,12 @@ NS_ASSUME_NONNULL_BEGIN
  * Get the cached avatar asynchronously, this interface will request the interface to get the current number of group members, and return the avatar
  * corresponding to the local cache
  */
-+ (void)getCacheGroupAvatar:(NSString *)groupID callback:(void (^)(UIImage *, NSString *groupID))imageCallBack;
++ (void)getCacheGroupAvatar:(NSString *)groupID callback:(void (^)(UIImage * _Nullable, NSString *groupID))imageCallBack;
 
 /**
  * Get the cached avatar synchronously, this interface does not request the network
  */
-+ (UIImage *)getCacheAvatarForGroup:(NSString *)groupId number:(UInt32)memberNum;
++ (UIImage * _Nullable)getCacheAvatarForGroup:(NSString *)groupId number:(UInt32)memberNum;
 
 /**
  * 
@@ -99,7 +99,7 @@ NS_ASSUME_NONNULL_BEGIN
 + (instancetype)sharedInstance;
 
 - (void)addResourceToCache:(NSString *)path;
-- (UIImage *)getResourceFromCache:(NSString *)path;
+- (UIImage * _Nullable)getResourceFromCache:(NSString *)path;
 
 - (void)addFaceToCache:(NSString *)path;
 - (UIImage *)getFaceFromCache:(NSString *)path;

+ 3 - 3
ThirdParty/TUIKit/TUICore/TUICommonModel.m

@@ -437,7 +437,7 @@ static void *gScrollViewBoundsChangeNotificationContext = &gScrollViewBoundsChan
     });
 }
 
-+ (void)getCacheGroupAvatar:(NSString *)groupID callback:(void (^)(UIImage *, NSString *groupID))imageCallBack {
++ (void)getCacheGroupAvatar:(NSString *)groupID callback:(void (^)(UIImage * _Nullable, NSString *groupID))imageCallBack {
     if (groupID == nil || groupID.length == 0) {
         if (imageCallBack) {
             imageCallBack(nil, groupID);
@@ -474,7 +474,7 @@ static void *gScrollViewBoundsChangeNotificationContext = &gScrollViewBoundsChan
         }];
 }
 
-+ (UIImage *)getCacheAvatarForGroup:(NSString *)groupId number:(UInt32)memberNum {
++ (UIImage * _Nullable)getCacheAvatarForGroup:(NSString *)groupId number:(UInt32)memberNum {
     memberNum = MAX(1, memberNum);
     memberNum = MIN(memberNum, 9);
     ;
@@ -546,7 +546,7 @@ static void *gScrollViewBoundsChangeNotificationContext = &gScrollViewBoundsChan
                      }];
 }
 
-- (UIImage *)getResourceFromCache:(NSString *)path {
+- (UIImage * _Nullable)getResourceFromCache:(NSString *)path {
     if (path.length == 0) {
         return nil;
     }

+ 1 - 1
ThirdParty/TUIKit/TUICore/TUICore.h

@@ -66,7 +66,7 @@ typedef void (^TUIValueResultCallback)(NSDictionary *param);
 
 @interface NSObject (TUIRoute)
 
-@property(nonatomic, copy) TUIValueResultCallback navigateValueCallback;
+@property(nonatomic, copy, nullable) TUIValueResultCallback navigateValueCallback;
 
 @end
 

+ 1 - 1
ThirdParty/TUIKit/TUICore/TUIDefine.h

@@ -205,7 +205,7 @@ static inline NSString *getTUIFrameWorkName(NSString *bundleKeyClass) {
         return @"TUISearch";
     }
     if ([bundleKeyClass isEqualToString:TUIPollBundle_Key_Class]) {
-        return @"TUIPullPlugin";
+        return @"TUIPollPlugin";
     }
     if ([bundleKeyClass isEqualToString:TUIGroupNoteBundle_Key_Class]) {
         return @"TUIGroupNotePlugin";

+ 0 - 1
ThirdParty/TUIKit/TUICore/TUITool.h

@@ -29,7 +29,6 @@ typedef void (^TAsyncImageComplete)(NSString *path, UIImage *image);
 
 // date
 + (NSString *)convertDateToStr:(NSDate *)date;
-+ (NSString *)convertDateToDetailStr:(NSDate *)date;
 + (NSString *)convertDateToHMStr:(NSDate *)date;
 
 // msg code convert

+ 0 - 16
ThirdParty/TUIKit/TUICore/TUITool.m

@@ -613,22 +613,6 @@ static NSMutableDictionary * gIMErrorMsgMap = nil;
     return str;
 }
 
-+ (NSString *)convertDateToDetailStr:(NSDate *)date {
-    if (!date) {
-        return nil;
-    }
-
-    if ([date isEqualToDate:[NSDate distantPast]]) {
-        return @"";
-    }
-
-    NSDateFormatter *dateFmt = [[NSDateFormatter alloc] init];
-    dateFmt.dateFormat = @"yyyy-MM-dd HH:mm";
-    NSString *str = [dateFmt stringFromDate:date];
-    return str;
-}
-
-
 + (NSString *)convertDateToHMStr:(NSDate *)date {
     if (!date) {
         return nil;

+ 2 - 2
ThirdParty/TUIKit/TUICore/UIColor+TUIHexColor.m

@@ -36,7 +36,7 @@
     // Invalid if not 3, 6, or 8 characters
     NSUInteger length = [hex length];
     if (length != 3 && length != 6 && length != 8) {
-        return nil;
+        return [[UIColor alloc] init];
     }
 
     // Make the string 8 characters long for easier parsing
@@ -72,7 +72,7 @@
     // Invalid if not 3, 6, or 8 characters
     NSUInteger length = [hex length];
     if (length != 3 && length != 6 && length != 8) {
-        return nil;
+        return [[UIColor alloc] init];
     }
 
     // Make the string 8 characters long for easier parsing

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff