From 8efb8b2f8672ae47575745850354dbc5ec2d7745 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Sun, 6 Feb 2022 18:26:22 +0000 Subject: [PATCH] use simplified chat controller, fix keyboard removing on tap (#275) --- apps/ios/Shared/ContentView.swift | 13 +--- apps/ios/Shared/Model/SimpleXAPI.swift | 62 ++++++++----------- .../Shared/SimpleX (iOS)-Bridging-Header.h | 6 +- .../Shared/SimpleX (macOS)-Bridging-Header.h | 8 +-- apps/ios/Shared/SimpleXApp.swift | 16 ++++- apps/ios/Shared/Views/Chat/ChatView.swift | 6 +- apps/ios/Shared/Views/WelcomeView.swift | 5 +- apps/ios/SimpleX.xcodeproj/project.pbxproj | 48 +++++++------- src/Simplex/Chat/Store.hs | 1 + 9 files changed, 77 insertions(+), 88 deletions(-) diff --git a/apps/ios/Shared/ContentView.swift b/apps/ios/Shared/ContentView.swift index 60e98fb4c..067151653 100644 --- a/apps/ios/Shared/ContentView.swift +++ b/apps/ios/Shared/ContentView.swift @@ -14,20 +14,11 @@ struct ContentView: View { if let user = chatModel.currentUser { ChatListView(user: user) .onAppear { - DispatchQueue.global().async { - while(true) { - do { - try processReceivedMsg(chatModel, chatRecvMsg()) - } catch { - print("error receiving message: ", error) - } - } - } - do { + try apiStartChat() chatModel.chats = try apiGetChats() } catch { - print(error) + fatalError("Failed to start or load chats: \(error)") } } } else { diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index da3dedaeb..b1c27c759 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -9,7 +9,6 @@ import Foundation import UIKit -private var chatStore: chat_store? private var chatController: chat_ctrl? private let jsonDecoder = getJSONDecoder() private let jsonEncoder = getJSONEncoder() @@ -186,27 +185,6 @@ enum TerminalItem: Identifiable { } } -func chatGetUser() -> User? { - let store = getStore() - print("chatGetUser") - let r: UserResponse? = decodeCJSON(chat_get_user(store)) - let user = r?.user - if user != nil { initChatCtrl(store) } - print("user", user as Any) - return user -} - -func chatCreateUser(_ p: Profile) -> User? { - let store = getStore() - print("chatCreateUser") - var str = encodeCJSON(p) - chat_create_user(store, &str) - let user = chatGetUser() - if user != nil { initChatCtrl(store) } - print("user", user as Any) - return user -} - func chatSendCmd(_ cmd: ChatCommand) throws -> ChatResponse { var c = cmd.cmdString.cString(using: .utf8)! print("command", cmd.cmdString) @@ -222,6 +200,27 @@ func chatRecvMsg() throws -> ChatResponse { chatResponse(chat_recv_msg(getChatCtrl())!) } +func apiGetActiveUser() throws -> User? { + let r = try chatSendCmd(.showActiveUser) + switch r { + case let .activeUser(user): return user + case .chatCmdError(.error(.noActiveUser)): return nil + default: throw r + } +} + +func apiCreateActiveUser(_ p: Profile) throws -> User { + let r = try chatSendCmd(.createActiveUser(profile: p)) + if case let .activeUser(user) = r { return user } + throw r +} + +func apiStartChat() throws { + let r = try chatSendCmd(.startChat) + if case .chatStarted = r { return } + throw r +} + func apiGetChats() throws -> [Chat] { let r = try chatSendCmd(.apiGetChats) if case let .apiChats(chats) = r { return chats.map { Chat.init($0) } } @@ -384,23 +383,12 @@ func prettyJSON(_ obj: NSDictionary) -> String? { return nil } -private func getStore() -> chat_store { - if let store = chatStore { return store } - let dataDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.path + "/mobile_v1" - var cstr = dataDir.cString(using: .utf8)! - chatStore = chat_init_store(&cstr) - return chatStore! -} - -private func initChatCtrl(_ store: chat_store) { - if chatController == nil { - chatController = chat_start(store) - } -} - private func getChatCtrl() -> chat_ctrl { if let controller = chatController { return controller } - fatalError("Chat controller was not started!") + let dataDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.path + "/mobile_v1" + var cstr = dataDir.cString(using: .utf8)! + chatController = chat_init(&cstr) + return chatController! } private func decodeCJSON(_ cjson: UnsafePointer) -> T? { diff --git a/apps/ios/Shared/SimpleX (iOS)-Bridging-Header.h b/apps/ios/Shared/SimpleX (iOS)-Bridging-Header.h index e9f894877..bc28b42d3 100644 --- a/apps/ios/Shared/SimpleX (iOS)-Bridging-Header.h +++ b/apps/ios/Shared/SimpleX (iOS)-Bridging-Header.h @@ -4,12 +4,8 @@ extern void hs_init(int argc, char **argv[]); -typedef void* chat_store; typedef void* chat_ctrl; -extern chat_store chat_init_store(char *path); -extern char *chat_get_user(chat_store store); -extern char *chat_create_user(chat_store store, char *data); -extern chat_ctrl chat_start(chat_store store); +extern chat_ctrl chat_init(char *path); extern char *chat_send_cmd(chat_ctrl ctl, char *cmd); extern char *chat_recv_msg(chat_ctrl ctl); diff --git a/apps/ios/Shared/SimpleX (macOS)-Bridging-Header.h b/apps/ios/Shared/SimpleX (macOS)-Bridging-Header.h index 62f2ba662..bc28b42d3 100644 --- a/apps/ios/Shared/SimpleX (macOS)-Bridging-Header.h +++ b/apps/ios/Shared/SimpleX (macOS)-Bridging-Header.h @@ -2,14 +2,10 @@ // Use this file to import your target's public headers that you would like to expose to Swift. // -extern void hs_init(int argc, char ** argv[]); +extern void hs_init(int argc, char **argv[]); -typedef void* chat_store; typedef void* chat_ctrl; -extern chat_store chat_init_store(char * path); -extern char *chat_get_user(chat_store store); -extern char *chat_create_user(chat_store store, char *data); -extern chat_ctrl chat_start(chat_store store); +extern chat_ctrl chat_init(char *path); extern char *chat_send_cmd(chat_ctrl ctl, char *cmd); extern char *chat_recv_msg(chat_ctrl ctl); diff --git a/apps/ios/Shared/SimpleXApp.swift b/apps/ios/Shared/SimpleXApp.swift index 222ed168d..301f8522d 100644 --- a/apps/ios/Shared/SimpleXApp.swift +++ b/apps/ios/Shared/SimpleXApp.swift @@ -25,7 +25,21 @@ struct SimpleXApp: App { print(url) } .onAppear() { - chatModel.currentUser = chatGetUser() + DispatchQueue.global().async { + while(true) { + do { + try processReceivedMsg(chatModel, chatRecvMsg()) + } catch { + print("error receiving message: ", error) + } + } + } + + do { + chatModel.currentUser = try apiGetActiveUser() + } catch { + fatalError("Failed to initialize chat controller or database: \(error)") + } } } } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 81ec99355..0d24aa43b 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -27,6 +27,9 @@ struct ChatView: View { .onChange(of: chatModel.chatItems.count) { _ in scrollToBottom(proxy) } } } + .onTapGesture { + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + } } } @@ -66,9 +69,6 @@ struct ChatView: View { } } .navigationBarBackButtonHidden(true) - .onTapGesture { - UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) - } } func scrollToBottom(_ proxy: ScrollViewProxy) { diff --git a/apps/ios/Shared/Views/WelcomeView.swift b/apps/ios/Shared/Views/WelcomeView.swift index 759090631..0daf7c44d 100644 --- a/apps/ios/Shared/Views/WelcomeView.swift +++ b/apps/ios/Shared/Views/WelcomeView.swift @@ -32,8 +32,11 @@ struct WelcomeView: View { displayName: displayName, fullName: fullName ) - if let user = chatCreateUser(profile) { + do { + let user = try apiCreateActiveUser(profile) chatModel.currentUser = user + } catch { + fatalError("Failed to create user: \(error)") } } } diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 5de14db51..0cdc584e1 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -11,9 +11,6 @@ 5C063D2827A4564100AEC577 /* ChatPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */; }; 5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; }; 5C116CDD27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; }; - 5C116CF027ABC81C00E66D01 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C116CEB27ABC81C00E66D01 /* libgmp.a */; }; - 5C116CF127ABC81C00E66D01 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C116CEC27ABC81C00E66D01 /* libgmpxx.a */; }; - 5C116CF227ABC81C00E66D01 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C116CED27ABC81C00E66D01 /* libffi.a */; }; 5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; }; 5C1A4C1F27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; }; 5C2E260727A2941F00F70299 /* SimpleXAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260627A2941F00F70299 /* SimpleXAPI.swift */; }; @@ -24,6 +21,11 @@ 5C2E261027A30FDC00F70299 /* ChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260E27A30FDC00F70299 /* ChatView.swift */; }; 5C2E261227A30FEA00F70299 /* TerminalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E261127A30FEA00F70299 /* TerminalView.swift */; }; 5C2E261327A30FEA00F70299 /* TerminalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E261127A30FEA00F70299 /* TerminalView.swift */; }; + 5C35CF6F27B031FB00FB6C6D /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C35CF6A27B031FB00FB6C6D /* libgmpxx.a */; }; + 5C35CF7027B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C35CF6B27B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ.a */; }; + 5C35CF7127B031FB00FB6C6D /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C35CF6C27B031FB00FB6C6D /* libgmp.a */; }; + 5C35CF7227B031FB00FB6C6D /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C35CF6D27B031FB00FB6C6D /* libffi.a */; }; + 5C35CF7327B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C35CF6E27B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ-ghc8.10.7.a */; }; 5C6AD81327A834E300348BD7 /* NewChatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6AD81227A834E300348BD7 /* NewChatButton.swift */; }; 5C6AD81427A834E300348BD7 /* NewChatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6AD81227A834E300348BD7 /* NewChatButton.swift */; }; 5C764E80279C7276000C6508 /* dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E7F279C7276000C6508 /* dummy.m */; }; @@ -75,8 +77,6 @@ 5CCD403827A5F9A200368C90 /* ConnectContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403627A5F9A200368C90 /* ConnectContactView.swift */; }; 5CCD403A27A5F9BE00368C90 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403927A5F9BE00368C90 /* CreateGroupView.swift */; }; 5CCD403B27A5F9BE00368C90 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403927A5F9BE00368C90 /* CreateGroupView.swift */; }; - 5CE4406F27AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE4406D27AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi.a */; }; - 5CE4407027AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE4406E27AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi-ghc8.10.7.a */; }; 5CE4407227ADB1D0007B033A /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407127ADB1D0007B033A /* Emoji.swift */; }; 5CE4407327ADB1D0007B033A /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407127ADB1D0007B033A /* Emoji.swift */; }; 5CE4407627ADB66A007B033A /* TextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407527ADB66A007B033A /* TextItemView.swift */; }; @@ -105,15 +105,17 @@ /* Begin PBXFileReference section */ 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatPreviewView.swift; sourceTree = ""; }; 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactRequestView.swift; sourceTree = ""; }; - 5C116CEB27ABC81C00E66D01 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; - 5C116CEC27ABC81C00E66D01 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; - 5C116CED27ABC81C00E66D01 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemView.swift; sourceTree = ""; }; 5C2E260627A2941F00F70299 /* SimpleXAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleXAPI.swift; sourceTree = ""; }; 5C2E260927A2C63500F70299 /* MyPlayground.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = MyPlayground.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 5C2E260A27A30CFA00F70299 /* ChatListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListView.swift; sourceTree = ""; }; 5C2E260E27A30FDC00F70299 /* ChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatView.swift; sourceTree = ""; }; 5C2E261127A30FEA00F70299 /* TerminalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalView.swift; sourceTree = ""; }; + 5C35CF6A27B031FB00FB6C6D /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; + 5C35CF6B27B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ.a"; sourceTree = ""; }; + 5C35CF6C27B031FB00FB6C6D /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; + 5C35CF6D27B031FB00FB6C6D /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; + 5C35CF6E27B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ-ghc8.10.7.a"; sourceTree = ""; }; 5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SimpleX (iOS).entitlements"; sourceTree = ""; }; 5C6AD81227A834E300348BD7 /* NewChatButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewChatButton.swift; sourceTree = ""; }; 5C764E7B279C71D4000C6508 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib/libiconv.tbd; sourceTree = DEVELOPER_DIR; }; @@ -148,8 +150,6 @@ 5CCD403327A5F6DF00368C90 /* AddContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddContactView.swift; sourceTree = ""; }; 5CCD403627A5F9A200368C90 /* ConnectContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectContactView.swift; sourceTree = ""; }; 5CCD403927A5F9BE00368C90 /* CreateGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; - 5CE4406D27AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi.a"; sourceTree = ""; }; - 5CE4406E27AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi-ghc8.10.7.a"; sourceTree = ""; }; 5CE4407127ADB1D0007B033A /* Emoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Emoji.swift; sourceTree = ""; }; 5CE4407527ADB66A007B033A /* TextItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextItemView.swift; sourceTree = ""; }; 5CE4407827ADB701007B033A /* EmojiItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiItemView.swift; sourceTree = ""; }; @@ -160,13 +160,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5CE4406F27AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi.a in Frameworks */, - 5CE4407027AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi-ghc8.10.7.a in Frameworks */, + 5C35CF7027B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ.a in Frameworks */, + 5C35CF6F27B031FB00FB6C6D /* libgmpxx.a in Frameworks */, 5C8F01CD27A6F0D8007D2C8D /* CodeScanner in Frameworks */, - 5C116CF227ABC81C00E66D01 /* libffi.a in Frameworks */, - 5C116CF127ABC81C00E66D01 /* libgmpxx.a in Frameworks */, 5C764E83279C748B000C6508 /* libz.tbd in Frameworks */, - 5C116CF027ABC81C00E66D01 /* libgmp.a in Frameworks */, + 5C35CF7327B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ-ghc8.10.7.a in Frameworks */, + 5C35CF7227B031FB00FB6C6D /* libffi.a in Frameworks */, + 5C35CF7127B031FB00FB6C6D /* libgmp.a in Frameworks */, 5C764E82279C748B000C6508 /* libiconv.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -227,11 +227,11 @@ 5C764E5C279C70B7000C6508 /* Libraries */ = { isa = PBXGroup; children = ( - 5C116CED27ABC81C00E66D01 /* libffi.a */, - 5C116CEB27ABC81C00E66D01 /* libgmp.a */, - 5C116CEC27ABC81C00E66D01 /* libgmpxx.a */, - 5CE4406E27AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi-ghc8.10.7.a */, - 5CE4406D27AD2648007B033A /* libHSsimplex-chat-1.1.0-1RUev578BUjGkBObUSYLQi.a */, + 5C35CF6D27B031FB00FB6C6D /* libffi.a */, + 5C35CF6C27B031FB00FB6C6D /* libgmp.a */, + 5C35CF6A27B031FB00FB6C6D /* libgmpxx.a */, + 5C35CF6E27B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ-ghc8.10.7.a */, + 5C35CF6B27B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ.a */, ); path = Libraries; sourceTree = ""; @@ -763,7 +763,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -783,7 +783,7 @@ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/Libraries"; "LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = "$(PROJECT_DIR)/Libraries/ios"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = "$(PROJECT_DIR)/Libraries/sim"; - MARKETING_VERSION = 1.0.1; + MARKETING_VERSION = 0.2.0; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; @@ -803,7 +803,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -823,7 +823,7 @@ LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/Libraries"; "LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = "$(PROJECT_DIR)/Libraries/ios"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = "$(PROJECT_DIR)/Libraries/sim"; - MARKETING_VERSION = 1.0.1; + MARKETING_VERSION = 0.2.0; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs index 345368a68..08d05b1f3 100644 --- a/src/Simplex/Chat/Store.hs +++ b/src/Simplex/Chat/Store.hs @@ -2464,6 +2464,7 @@ createWithRandomBytes size gVar create = tryCreate 3 randomBytes :: TVar ChaChaDRG -> Int -> IO ByteString randomBytes gVar n = B64.encode <$> (atomically . stateTVar gVar $ randomBytesGenerate n) +-- These error type constructors must be added to mobile apps data StoreError = SEDuplicateName | SEContactNotFound {contactId :: Int64}