diff --git a/apps/ios/Shared/Assets.xcassets/github.imageset/Contents.json b/apps/ios/Shared/Assets.xcassets/github.imageset/Contents.json new file mode 100644 index 000000000..e30e4bc7c --- /dev/null +++ b/apps/ios/Shared/Assets.xcassets/github.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "github32px.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "github64px.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "github64px-1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/ios/Shared/Assets.xcassets/github.imageset/github32px.png b/apps/ios/Shared/Assets.xcassets/github.imageset/github32px.png new file mode 100644 index 000000000..8b25551a9 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/github.imageset/github32px.png differ diff --git a/apps/ios/Shared/Assets.xcassets/github.imageset/github64px-1.png b/apps/ios/Shared/Assets.xcassets/github.imageset/github64px-1.png new file mode 100644 index 000000000..182a1a3f7 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/github.imageset/github64px-1.png differ diff --git a/apps/ios/Shared/Assets.xcassets/github.imageset/github64px.png b/apps/ios/Shared/Assets.xcassets/github.imageset/github64px.png new file mode 100644 index 000000000..182a1a3f7 Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/github.imageset/github64px.png differ diff --git a/apps/ios/Shared/Assets.xcassets/logo.imageset/Contents.json b/apps/ios/Shared/Assets.xcassets/logo.imageset/Contents.json new file mode 100644 index 000000000..8fcba17f9 --- /dev/null +++ b/apps/ios/Shared/Assets.xcassets/logo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "logo-2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "logo-1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "logo.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/ios/Shared/Assets.xcassets/logo.imageset/logo-1.png b/apps/ios/Shared/Assets.xcassets/logo.imageset/logo-1.png new file mode 100644 index 000000000..7f25ea17d Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/logo.imageset/logo-1.png differ diff --git a/apps/ios/Shared/Assets.xcassets/logo.imageset/logo-2.png b/apps/ios/Shared/Assets.xcassets/logo.imageset/logo-2.png new file mode 100644 index 000000000..7f25ea17d Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/logo.imageset/logo-2.png differ diff --git a/apps/ios/Shared/Assets.xcassets/logo.imageset/logo.png b/apps/ios/Shared/Assets.xcassets/logo.imageset/logo.png new file mode 100644 index 000000000..7f25ea17d Binary files /dev/null and b/apps/ios/Shared/Assets.xcassets/logo.imageset/logo.png differ diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index db216b2fe..91265fb85 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -100,7 +100,7 @@ final class ChatModel: ObservableObject { } } -struct User: Decodable { +struct User: Decodable, NamedChat { var userId: Int64 var userContactId: Int64 var localDisplayName: ContactName @@ -115,6 +115,10 @@ struct User: Decodable { // self.activeUser = activeUser // } + var displayName: String { get { profile.displayName } } + + var fullName: String { get { profile.fullName } } + static let sampleData = User( userId: 1, userContactId: 1, diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index ccfb4b89f..5eda7af1c 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -16,6 +16,7 @@ struct ChatView: View { @Environment(\.colorScheme) var colorScheme @ObservedObject var chat: Chat @State private var inProgress: Bool = false + @FocusState private var keyboardVisible: Bool @State private var showChatInfo = false var body: some View { @@ -32,8 +33,16 @@ struct ChatView: View { } .onAppear { scrollToBottom(proxy) } .onChange(of: chatModel.chatItems.count) { _ in scrollToBottom(proxy) } + .onChange(of: keyboardVisible) { _ in + if keyboardVisible { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { + scrollToBottom(proxy, animation: .easeInOut(duration: 1)) + } + } + } } } + .coordinateSpace(name: "scrollView") .onTapGesture { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } @@ -42,7 +51,11 @@ struct ChatView: View { Spacer(minLength: 0) - SendMessageView(sendMessage: sendMessage, inProgress: inProgress) + SendMessageView( + sendMessage: sendMessage, + inProgress: inProgress, + keyboardVisible: $keyboardVisible + ) } .navigationTitle(cInfo.chatViewName) .navigationBarTitleDisplayMode(.inline) @@ -85,9 +98,9 @@ struct ChatView: View { .navigationBarBackButtonHidden(true) } - func scrollToBottom(_ proxy: ScrollViewProxy) { + func scrollToBottom(_ proxy: ScrollViewProxy, animation: Animation = .default) { if let id = chatModel.chatItems.last?.id { - withAnimation { + withAnimation(animation) { proxy.scrollTo(id, anchor: .bottom) } } diff --git a/apps/ios/Shared/Views/Chat/SendMessageView.swift b/apps/ios/Shared/Views/Chat/SendMessageView.swift index d5d075b30..60e914456 100644 --- a/apps/ios/Shared/Views/Chat/SendMessageView.swift +++ b/apps/ios/Shared/Views/Chat/SendMessageView.swift @@ -13,6 +13,7 @@ struct SendMessageView: View { var inProgress: Bool = false @State private var message: String = "" //Lorem ipsum dolor sit amet, consectetur" // adipiscing elit, sed do eiusmod tempor incididunt ut labor7 et dolore magna aliqua. Ut enim ad minim veniam, quis"// nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."// Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." @Namespace var namespace + @FocusState.Binding var keyboardVisible: Bool @State private var teHeight: CGFloat = 42 @State private var teFont: Font = .body var maxHeight: CGFloat = 360 @@ -31,8 +32,9 @@ struct SendMessageView: View { .background(GeometryReader(content: updateHeight)) TextEditor(text: $message) .onSubmit(submit) + .focused($keyboardVisible) .font(teFont) - .textInputAutocapitalization(.never) + .textInputAutocapitalization(.sentences) .padding(.horizontal, 5) .allowsTightening(false) .frame(height: teHeight) @@ -79,10 +81,15 @@ struct SendMessageView: View { struct SendMessageView_Previews: PreviewProvider { static var previews: some View { - VStack { + @FocusState var keyboardVisible: Bool + + return VStack { Text("") Spacer(minLength: 0) - SendMessageView(sendMessage: { print ($0) }) + SendMessageView( + sendMessage: { print ($0) }, + keyboardVisible: $keyboardVisible + ) } } } diff --git a/apps/ios/Shared/Views/ChatList/ChatHelp.swift b/apps/ios/Shared/Views/ChatList/ChatHelp.swift new file mode 100644 index 000000000..c1b5e1492 --- /dev/null +++ b/apps/ios/Shared/Views/ChatList/ChatHelp.swift @@ -0,0 +1,66 @@ +// +// ChatHelp.swift +// SimpleX +// +// Created by Evgeny Poberezkin on 10/02/2022. +// Copyright © 2022 SimpleX Chat. All rights reserved. +// + +import SwiftUI + +struct ChatHelp: View { + @EnvironmentObject var chatModel: ChatModel + @Binding var showSettings: Bool + + var body: some View { + VStack(alignment: .leading, spacing: 10) { + Text("Thank you for installing SimpleX Chat!") + + HStack(spacing: 4) { + Text("You can") + Button("connect to SimpleX team.") { + showSettings = false + DispatchQueue.main.async { + UIApplication.shared.open(simplexTeamURL) + } + } + } + + VStack(alignment: .leading, spacing: 10) { + Text("To start a new chat") + .font(.title2) + .fontWeight(.bold) + + HStack(spacing: 8) { + Text("Tap button ") + NewChatButton() + Text("above, then:") + } + + Text("**Add new contact**: to create your one-time QR Code for your contact.") + Text("**Scan QR code**: to connect to your contact who shows QR code to you.") + } + .padding(.top, 24) + + VStack(alignment: .leading, spacing: 10) { + Text("To connect via link") + .font(.title2) + .fontWeight(.bold) + + Text("If you received SimpleX Chat invitation link you can open it in your browser:") + + Text("💻 desktop: scan displayed QR code from the app, via **Scan QR code**.") + Text("📱 mobile: tap **Open in mobile app**, then tap **Connect** in the app.") + } + .padding(.top, 24) + } + .padding() + } +} + +struct ChatHelp_Previews: PreviewProvider { + static var previews: some View { + @State var showSettings = false + return ChatHelp(showSettings: $showSettings) + } +} diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index bdc3c815c..af43f7bad 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -12,40 +12,43 @@ struct ChatListView: View { @EnvironmentObject var chatModel: ChatModel @State private var connectAlert = false @State private var connectError: Error? + // not really used in this view + @State private var showSettings = false var user: User var body: some View { - VStack { -// if chatModel.chats.isEmpty { -// VStack { -// Text("Hello chat") -// Text("Active user: \(user.localDisplayName) (\(user.profile.fullName))") -// } -// } - - NavigationView { - List { - ForEach(chatModel.chats) { chat in - ChatListNavLink(chat: chat) + NavigationView { + List { + if chatModel.chats.isEmpty { + VStack(alignment: .leading) { + ChatHelp(showSettings: $showSettings) + HStack { + Text("This text is available in settings") + SettingsButton() + } + .padding(.leading) } } - .padding(0) - .offset(x: -8) - .listStyle(.plain) - .navigationTitle("Your chats") - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - SettingsButton() - } - ToolbarItem(placement: .navigationBarTrailing) { - NewChatButton() - } + ForEach(chatModel.chats) { chat in + ChatListNavLink(chat: chat) } - .alert(isPresented: $chatModel.connectViaUrl) { connectViaUrlAlert() } } - .alert(isPresented: $connectAlert) { connectionErrorAlert() } + .offset(x: -8) + .listStyle(.plain) + .navigationTitle(chatModel.chats.isEmpty ? "Welcome \(user.displayName)!" : "Your chats") + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + SettingsButton() + } + ToolbarItem(placement: .navigationBarTrailing) { + NewChatButton() + } + } + .alert(isPresented: $chatModel.connectViaUrl) { connectViaUrlAlert() } } + .navigationViewStyle(.stack) + .alert(isPresented: $connectAlert) { connectionErrorAlert() } } private func connectViaUrlAlert() -> Alert { @@ -106,7 +109,11 @@ struct ChatListView_Previews: PreviewProvider { ) ] - return ChatListView(user: User.sampleData) - .environmentObject(chatModel) + return Group { + ChatListView(user: User.sampleData) + .environmentObject(chatModel) + ChatListView(user: User.sampleData) + .environmentObject(ChatModel()) + } } } diff --git a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift index 012f57791..741b55e9a 100644 --- a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift @@ -72,7 +72,7 @@ struct ChatPreviewView: View { struct ChatPreviewView_Previews: PreviewProvider { static var previews: some View { - Group{ + Group { ChatPreviewView(chat: Chat( chatInfo: ChatInfo.sampleData.direct, chatItems: [] diff --git a/apps/ios/Shared/Views/NewChat/NewChatButton.swift b/apps/ios/Shared/Views/NewChat/NewChatButton.swift index ba495dfd2..0064ac929 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatButton.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatButton.swift @@ -21,7 +21,7 @@ struct NewChatButton: View { var body: some View { Button { showAddChat = true } label: { - Image(systemName: "square.and.pencil") + Image(systemName: "person.crop.circle.badge.plus") } .confirmationDialog("Start new chat", isPresented: $showAddChat, titleVisibility: .visible) { Button("Add contact") { addContactAction() } diff --git a/apps/ios/Shared/Views/TerminalView.swift b/apps/ios/Shared/Views/TerminalView.swift index 2410ff37b..74015c2de 100644 --- a/apps/ios/Shared/Views/TerminalView.swift +++ b/apps/ios/Shared/Views/TerminalView.swift @@ -11,7 +11,8 @@ import SwiftUI struct TerminalView: View { @EnvironmentObject var chatModel: ChatModel @State var inProgress: Bool = false - + @FocusState private var keyboardVisible: Bool + var body: some View { VStack { ScrollViewReader { proxy in @@ -22,29 +23,45 @@ struct TerminalView: View { ScrollView { Text(item.details) .textSelection(.enabled) + .padding() } } label: { - Text(item.label) - .frame(width: 360, height: 30, alignment: .leading) + HStack { + Text(item.id.formatted(date: .omitted, time: .standard)) + Text(item.label) + .frame(maxWidth: .infinity, maxHeight: 30, alignment: .leading) + } + .padding(.horizontal) } } .onAppear { scrollToBottom(proxy) } .onChange(of: chatModel.terminalItems.count) { _ in scrollToBottom(proxy) } + .onChange(of: keyboardVisible) { _ in + if keyboardVisible { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { + scrollToBottom(proxy, animation: .easeInOut(duration: 1)) + } + } + } } } Spacer() - SendMessageView(sendMessage: sendMessage, inProgress: inProgress) + SendMessageView( + sendMessage: sendMessage, + inProgress: inProgress, + keyboardVisible: $keyboardVisible + ) } } .navigationViewStyle(.stack) .navigationTitle("Chat console") } - func scrollToBottom(_ proxy: ScrollViewProxy) { + func scrollToBottom(_ proxy: ScrollViewProxy, animation: Animation = .default) { if let id = chatModel.terminalItems.last?.id { - withAnimation { + withAnimation(animation) { proxy.scrollTo(id, anchor: .bottom) } } diff --git a/apps/ios/Shared/Views/UserSettings/SettingsButton.swift b/apps/ios/Shared/Views/UserSettings/SettingsButton.swift index f73521408..7bfc2eec4 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsButton.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsButton.swift @@ -17,7 +17,7 @@ struct SettingsButton: View { Image(systemName: "gearshape") } .sheet(isPresented: $showSettings, content: { - SettingsView() + SettingsView(showSettings: $showSettings) .onAppear { do { chatModel.userAddress = try apiGetUserAddress() diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index 9d901956e..35d969e1f 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -8,8 +8,11 @@ import SwiftUI +let simplexTeamURL = URL(string: "simplex:/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D")! + struct SettingsView: View { @EnvironmentObject var chatModel: ChatModel + @Binding var showSettings: Bool var body: some View { let user: User = chatModel.currentUser! @@ -44,11 +47,59 @@ struct SettingsView: View { } } + Section("Help") { + NavigationLink { + VStack(alignment: .leading, spacing: 10) { + Text("Welcome \(user.displayName)!") + .font(.largeTitle) + .padding(.leading) + Divider() + ChatHelp(showSettings: $showSettings) + } + .frame(maxHeight: .infinity, alignment: .top) + } label: { + HStack { + Image(systemName: "questionmark.circle") + .padding(.trailing, 8) + Text("How to use SimpleX Chat") + } + } + HStack { + Image(systemName: "number") + .padding(.trailing, 8) + Button { + showSettings = false + DispatchQueue.main.async { + UIApplication.shared.open(simplexTeamURL) + } + } label: { + Text("Get help & advice via chat") + } + } + HStack { + Image(systemName: "envelope") + .padding(.trailing, 4) + Text("[Ask questions via email](mailto:chat@simplex.chat)") + } + } + Section("Develop") { NavigationLink { TerminalView() } label: { - Text("Chat console") + HStack { + Image(systemName: "terminal") + .frame(maxWidth: 24) + .padding(.trailing, 8) + Text("Chat console") + } + } + HStack { + Image("github") + .resizable() + .frame(width: 24, height: 24) + .padding(.trailing, 8) + Text("Install [SimpleX Chat for terminal](https://github.com/simplex-chat/simplex-chat)") } } @@ -65,7 +116,9 @@ struct SettingsView_Previews: PreviewProvider { static var previews: some View { let chatModel = ChatModel() chatModel.currentUser = User.sampleData - return SettingsView() + @State var showSettings = false + + return SettingsView(showSettings: $showSettings) .environmentObject(chatModel) } } diff --git a/apps/ios/Shared/Views/WelcomeView.swift b/apps/ios/Shared/Views/WelcomeView.swift index 0daf7c44d..02ab3d165 100644 --- a/apps/ios/Shared/Views/WelcomeView.swift +++ b/apps/ios/Shared/Views/WelcomeView.swift @@ -13,30 +13,44 @@ struct WelcomeView: View { @State var fullName: String = "" var body: some View { - VStack(alignment: .leading) { - Text("Create profile") - .font(.largeTitle) - .padding(.bottom) - Text("Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile.") - .padding(.bottom) - TextField("Display name", text: $displayName) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .padding(.bottom) - TextField("Full name (optional)", text: $fullName) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .padding(.bottom) - Button("Create") { - let profile = Profile( - displayName: displayName, - fullName: fullName - ) - do { - let user = try apiCreateActiveUser(profile) - chatModel.currentUser = user - } catch { - fatalError("Failed to create user: \(error)") + GeometryReader { g in + VStack(alignment: .leading) { + Image("logo") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: g.size.width * 0.7) + .padding(.vertical) + Text("You control your chat!") + .font(.title) + .padding(.bottom) + Text("The messaging and application platform protecting your privacy and security.") + .padding(.bottom, 8) + Text("We don't store any of your contacts or messages (once delivered) on the servers.") + .padding(.bottom, 24) + Text("Create profile") + .font(.largeTitle) + .padding(.bottom) + Text("Your profile is stored on your device and shared only with your contacts.") + .padding(.bottom) + TextField("Display name", text: $displayName) + .textInputAutocapitalization(.never) + .disableAutocorrection(true) + .padding(.bottom) + TextField("Full name (optional)", text: $fullName) + .textInputAutocapitalization(.never) + .disableAutocorrection(true) + .padding(.bottom) + Button("Create") { + let profile = Profile( + displayName: displayName, + fullName: fullName + ) + 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 84ada554d..752c52f81 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -21,17 +21,19 @@ 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 */; }; 5C35CFC827B2782E00FB6C6D /* BGManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFC727B2782E00FB6C6D /* BGManager.swift */; }; 5C35CFC927B2782E00FB6C6D /* BGManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFC727B2782E00FB6C6D /* BGManager.swift */; }; 5C35CFCB27B2E91D00FB6C6D /* NtfManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFCA27B2E91D00FB6C6D /* NtfManager.swift */; }; 5C35CFCC27B2E91D00FB6C6D /* NtfManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFCA27B2E91D00FB6C6D /* NtfManager.swift */; }; + 5C5346A827B59A6A004DF848 /* ChatHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5346A727B59A6A004DF848 /* ChatHelp.swift */; }; + 5C5346A927B59A6A004DF848 /* ChatHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5346A727B59A6A004DF848 /* ChatHelp.swift */; }; 5C6AD81327A834E300348BD7 /* NewChatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6AD81227A834E300348BD7 /* NewChatButton.swift */; }; 5C6AD81427A834E300348BD7 /* NewChatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6AD81227A834E300348BD7 /* NewChatButton.swift */; }; + 5C75059C27B5CD9300BE3227 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C75059727B5CD9300BE3227 /* libgmp.a */; }; + 5C75059D27B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C75059827B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj-ghc8.10.7.a */; }; + 5C75059E27B5CD9300BE3227 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C75059927B5CD9300BE3227 /* libffi.a */; }; + 5C75059F27B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C75059A27B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj.a */; }; + 5C7505A027B5CD9300BE3227 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C75059B27B5CD9300BE3227 /* libgmpxx.a */; }; 5C764E80279C7276000C6508 /* dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E7F279C7276000C6508 /* dummy.m */; }; 5C764E81279C7276000C6508 /* dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E7F279C7276000C6508 /* dummy.m */; }; 5C764E82279C748B000C6508 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C764E7B279C71D4000C6508 /* libiconv.tbd */; }; @@ -115,15 +117,16 @@ 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 = ""; }; 5C35CFC727B2782E00FB6C6D /* BGManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BGManager.swift; sourceTree = ""; }; 5C35CFCA27B2E91D00FB6C6D /* NtfManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NtfManager.swift; sourceTree = ""; }; 5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SimpleX (iOS).entitlements"; sourceTree = ""; }; + 5C5346A727B59A6A004DF848 /* ChatHelp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatHelp.swift; sourceTree = ""; }; 5C6AD81227A834E300348BD7 /* NewChatButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewChatButton.swift; sourceTree = ""; }; + 5C75059727B5CD9300BE3227 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; + 5C75059827B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj-ghc8.10.7.a"; sourceTree = ""; }; + 5C75059927B5CD9300BE3227 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; + 5C75059A27B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj.a"; sourceTree = ""; }; + 5C75059B27B5CD9300BE3227 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; 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; }; 5C764E7C279C71DB000C6508 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; }; 5C764E7D279C7275000C6508 /* SimpleX (iOS)-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleX (iOS)-Bridging-Header.h"; sourceTree = ""; }; @@ -166,14 +169,14 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5C35CF7027B031FB00FB6C6D /* libHSsimplex-chat-1.1.0-Cr0nZom8Et1JJ5D58xT8LZ.a in Frameworks */, - 5C35CF6F27B031FB00FB6C6D /* libgmpxx.a in Frameworks */, 5C8F01CD27A6F0D8007D2C8D /* CodeScanner in Frameworks */, + 5C75059E27B5CD9300BE3227 /* libffi.a in Frameworks */, 5C764E83279C748B000C6508 /* libz.tbd 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 */, + 5C75059F27B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj.a in Frameworks */, + 5C7505A027B5CD9300BE3227 /* libgmpxx.a in Frameworks */, + 5C75059C27B5CD9300BE3227 /* libgmp.a in Frameworks */, 5C764E82279C748B000C6508 /* libiconv.tbd in Frameworks */, + 5C75059D27B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj-ghc8.10.7.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -233,11 +236,11 @@ 5C764E5C279C70B7000C6508 /* Libraries */ = { isa = PBXGroup; children = ( - 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 */, + 5C75059927B5CD9300BE3227 /* libffi.a */, + 5C75059727B5CD9300BE3227 /* libgmp.a */, + 5C75059B27B5CD9300BE3227 /* libgmpxx.a */, + 5C75059827B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj-ghc8.10.7.a */, + 5C75059A27B5CD9300BE3227 /* libHSsimplex-chat-1.1.1-GMOrBlCwBvRIONTwKLN6tj.a */, ); path = Libraries; sourceTree = ""; @@ -365,6 +368,7 @@ isa = PBXGroup; children = ( 5C2E260A27A30CFA00F70299 /* ChatListView.swift */, + 5C5346A727B59A6A004DF848 /* ChatHelp.swift */, 5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */, 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */, 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */, @@ -553,6 +557,7 @@ 5CE4407627ADB66A007B033A /* TextItemView.swift in Sources */, 5CB924E127A867BA00ACCCDD /* UserProfile.swift in Sources */, 5CE4407927ADB701007B033A /* EmojiItemView.swift in Sources */, + 5C5346A827B59A6A004DF848 /* ChatHelp.swift in Sources */, 5C764E80279C7276000C6508 /* dummy.m in Sources */, 5CB924E427A8683A00ACCCDD /* UserAddress.swift in Sources */, 5C063D2727A4564100AEC577 /* ChatPreviewView.swift in Sources */, @@ -592,6 +597,7 @@ 5CE4407727ADB66A007B033A /* TextItemView.swift in Sources */, 5CB924E227A867BA00ACCCDD /* UserProfile.swift in Sources */, 5CE4407A27ADB701007B033A /* EmojiItemView.swift in Sources */, + 5C5346A927B59A6A004DF848 /* ChatHelp.swift in Sources */, 5C764E81279C7276000C6508 /* dummy.m in Sources */, 5CB924E527A8683A00ACCCDD /* UserAddress.swift in Sources */, 5C063D2827A4564100AEC577 /* ChatPreviewView.swift in Sources */, @@ -775,7 +781,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -792,10 +798,10 @@ "$(inherited)", "@executable_path/Frameworks", ); - LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/Libraries"; + LIBRARY_SEARCH_PATHS = ""; "LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = "$(PROJECT_DIR)/Libraries/ios"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = "$(PROJECT_DIR)/Libraries/sim"; - MARKETING_VERSION = 0.2.2; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; @@ -815,7 +821,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -832,10 +838,10 @@ "$(inherited)", "@executable_path/Frameworks", ); - LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/Libraries"; + LIBRARY_SEARCH_PATHS = ""; "LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = "$(PROJECT_DIR)/Libraries/ios"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = "$(PROJECT_DIR)/Libraries/sim"; - MARKETING_VERSION = 0.2.2; + MARKETING_VERSION = 0.3; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos;