Эх сурвалжийг харах

don't throw a fatal error if the DcLot pointer is nil. The core takes care of 'careless' calls using nil pointers

cyberta 3 жил өмнө
parent
commit
6c694bf342

+ 8 - 6
DcCore/DcCore/DC/Wrapper.swift

@@ -763,9 +763,7 @@ public class DcChatlist {
     }
 
     public func getSummary(index: Int) -> DcLot {
-        guard let lotPointer = dc_chatlist_get_summary(self.chatListPointer, index, nil) else {
-            fatalError("lot-pointer was nil")
-        }
+        let lotPointer = dc_chatlist_get_summary(self.chatListPointer, index, nil)
         return DcLot(lotPointer)
     }
 }
@@ -786,6 +784,10 @@ public class DcChat {
         return Int(dc_chat_get_id(chatPointer))
     }
 
+    public var isValid: Bool {
+        return self.chatPointer != nil
+    }
+
     public var name: String {
         guard let cString = dc_chat_get_name(chatPointer) else { return "" }
         let swiftString = String(cString: cString)
@@ -1155,10 +1157,10 @@ public class DcMsg {
 
     public func summary(chat: DcChat) -> DcLot {
         guard let chatPointer = chat.chatPointer else {
-            fatalError()
+            return DcLot(nil);
         }
         guard let dcLotPointer = dc_msg_get_summary(messagePointer, chatPointer) else {
-            fatalError()
+            return DcLot(nil)
         }
         return DcLot(dcLotPointer)
     }
@@ -1274,7 +1276,7 @@ public class DcLot {
     private var dcLotPointer: OpaquePointer?
 
     // takes ownership of specified pointer
-    public init(_ dcLotPointer: OpaquePointer) {
+    public init(_ dcLotPointer: OpaquePointer?) {
         self.dcLotPointer = dcLotPointer
     }
 

+ 13 - 0
deltachat-ios/ViewModel/ChatListViewModel.swift

@@ -232,6 +232,19 @@ private extension ChatListViewModel {
         let msg: DcMsg = dcContext.getMessage(id: msgId)
         let chatId: Int = msg.chatId
         let chat: DcChat = dcContext.getChat(chatId: chatId)
+        if !chat.isValid {
+            // chat might be deleted and searchResultMessageIds deprecated, so return a dummy view model
+            // cleanup of the searchResultMessageIds will be done in message change event handling
+            return ChatCellViewModel(
+                dcContext: dcContext,
+                chatData: ChatCellData(
+                    chatId: 0,
+                    highlightMsgId: 0,
+                    summary: DcLot(nil),
+                    unreadMessages: 0
+                )
+            )
+        }
         let summary: DcLot = msg.summary(chat: chat)
         let unreadMessages = dcContext.getUnreadMessages(chatId: chatId)