diff --git a/apps/ios/Shared/Assets.xcassets/AccentColor.colorset/Contents.json b/apps/ios/Shared/Assets.xcassets/AccentColor.colorset/Contents.json index eb8789700..eebacd743 100644 --- a/apps/ios/Shared/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/apps/ios/Shared/Assets.xcassets/AccentColor.colorset/Contents.json @@ -7,5 +7,8 @@ "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "localizable" : true } } diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 21b8f13bc..60a8a9b92 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -32,7 +32,9 @@ final class ChatModel: ObservableObject { } func addChat(_ chat: Chat) { - chats.insert(chat, at: 0) + withAnimation { + chats.insert(chat, at: 0) + } } func updateChatInfo(_ cInfo: ChatInfo) { @@ -64,7 +66,9 @@ final class ChatModel: ObservableObject { } func removeChat(_ id: String) { - chats.removeAll(where: { $0.id == id }) + withAnimation { + chats.removeAll(where: { $0.id == id }) + } } } diff --git a/apps/ios/Shared/Views/Helpers/ChatItemView.swift b/apps/ios/Shared/Views/Chat/ChatItemView.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/ChatItemView.swift rename to apps/ios/Shared/Views/Chat/ChatItemView.swift diff --git a/apps/ios/Shared/Views/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift similarity index 73% rename from apps/ios/Shared/Views/ChatView.swift rename to apps/ios/Shared/Views/Chat/ChatView.swift index 17e2aa9ae..77d077633 100644 --- a/apps/ios/Shared/Views/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -11,15 +11,18 @@ import SwiftUI struct ChatView: View { @EnvironmentObject var chatModel: ChatModel var chatInfo: ChatInfo - var width: CGFloat @State private var inProgress: Bool = false var body: some View { VStack { - ScrollView { - LazyVStack(spacing: 5) { - ForEach(chatModel.chatItems) { - ChatItemView(chatItem: $0) + ScrollViewReader { proxy in + ScrollView { + VStack { + ForEach(chatModel.chatItems, id: \.id) { + ChatItemView(chatItem: $0) + } + .onAppear { scrollToBottom(proxy) } + .onChange(of: chatModel.chatItems.count) { _ in scrollToBottom(proxy) } } } } @@ -28,24 +31,26 @@ struct ChatView: View { SendMessageView(sendMessage: sendMessage, inProgress: inProgress) } + .navigationTitle(chatInfo.localDisplayName) .toolbar { - HStack { + ToolbarItem(placement: .navigationBarLeading) { Button { chatModel.chatId = nil } label: { Image(systemName: "chevron.backward") } - Spacer() - Text(chatInfo.localDisplayName) - .font(.title3) - Spacer() - EmptyView() } - .padding(.horizontal) - .frame(minWidth: width, maxWidth: .infinity, alignment: .center) } .navigationBarBackButtonHidden(true) } + func scrollToBottom(_ proxy: ScrollViewProxy) { + if let id = chatModel.chatItems.last?.id { + withAnimation { + proxy.scrollTo(id, anchor: .bottom) + } + } + } + func sendMessage(_ msg: String) { do { let chatItem = try apiSendMessage(type: chatInfo.chatType, id: chatInfo.apiId, msg: .text(msg)) @@ -69,7 +74,7 @@ struct ChatView_Previews: PreviewProvider { chatItemSample(6, .directSnd, Date.now, "how are you?"), chatItemSample(7, .directSnd, Date.now, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore 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.") ] - return ChatView(chatInfo: sampleDirectChatInfo, width: 300) + return ChatView(chatInfo: sampleDirectChatInfo) .environmentObject(chatModel) } } diff --git a/apps/ios/Shared/Views/Helpers/SendMessageView.swift b/apps/ios/Shared/Views/Chat/SendMessageView.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/SendMessageView.swift rename to apps/ios/Shared/Views/Chat/SendMessageView.swift diff --git a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift index d7aa1cd5b..7a4317610 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift @@ -11,7 +11,6 @@ import SwiftUI struct ChatListNavLink: View { @EnvironmentObject var chatModel: ChatModel @State var chat: Chat - var width: CGFloat @State private var showDeleteContactAlert = false @State private var showDeleteGroupAlert = false @@ -33,10 +32,7 @@ struct ChatListNavLink: View { } private func chatView() -> some View { - ChatView( - chatInfo: chat.chatInfo, - width: width - ) + ChatView(chatInfo: chat.chatInfo) .onAppear { do { let cInfo = chat.chatInfo @@ -93,7 +89,7 @@ struct ChatListNavLink: View { } private func contactRequestNavLink(_ contactRequest: UserContactRequest) -> some View { - ChatPreviewView(chat: chat) + ContactRequestView(contactRequest: contactRequest) .swipeActions(edge: .trailing, allowsFullSwipe: true) { Button { acceptContactRequest(contactRequest) } label: { Label("Accept", systemImage: "checkmark") } @@ -108,8 +104,7 @@ struct ChatListNavLink: View { .alert(isPresented: $showContactRequestAlert) { contactRequestAlert(alertContactRequest!) } - .background(Color(uiColor: .systemBackground)) - .frame(width: width, height: 80) + .frame(height: 80) .onTapGesture { showContactRequestDialog = true } .confirmationDialog("Connection request", isPresented: $showContactRequestDialog, titleVisibility: .visible) { Button("Accept contact") { acceptContactRequest(contactRequest) } @@ -182,15 +177,15 @@ struct ChatListNavLink_Previews: PreviewProvider { ChatListNavLink(chat: Chat( chatInfo: sampleDirectChatInfo, chatItems: [chatItemSample(1, .directSnd, Date.now, "hello")] - ), width: 300) + )) ChatListNavLink(chat: Chat( chatInfo: sampleDirectChatInfo, chatItems: [chatItemSample(1, .directSnd, Date.now, "hello")] - ), width: 300) + )) ChatListNavLink(chat: Chat( chatInfo: sampleContactRequestChatInfo, chatItems: [] - ), width: 300) + )) } .previewLayout(.fixed(width: 360, height: 80)) } diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index d02b7c09a..c7befab26 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -25,28 +25,30 @@ struct ChatListView: View { // } NavigationView { - GeometryReader { geometry in - List { - NavigationLink { - TerminalView() - } label: { - Text("Terminal") - } - - ForEach(chatModel.chats) { chat in - ChatListNavLink( - chat: chat, - width: geometry.size.width - ) - } + List { + NavigationLink { + TerminalView() + } label: { + Text("Terminal") + } + + ForEach(chatModel.chats) { chat in + ChatListNavLink(chat: chat) } - .padding(0) - .offset(x: -8) - .listStyle(.plain) - .toolbar { ChatListToolbar(width: geometry.size.width) } - .navigationBarTitleDisplayMode(.inline) - .alert(isPresented: $connectAlert) { connectionErrorAlert() } } + .padding(0) + .offset(x: -8) + .listStyle(.plain) + .navigationTitle("Your chats") + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + SettingsButton() + } + ToolbarItem(placement: .navigationBarTrailing) { + NewChatButton() + } + } + .alert(isPresented: $connectAlert) { connectionErrorAlert() } } .alert(isPresented: $chatModel.connectViaUrl) { connectViaUrlAlert() } } diff --git a/apps/ios/Shared/Views/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift similarity index 99% rename from apps/ios/Shared/Views/ChatPreviewView.swift rename to apps/ios/Shared/Views/ChatList/ChatPreviewView.swift index caf51a394..7447b8cd8 100644 --- a/apps/ios/Shared/Views/ChatPreviewView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift @@ -1,5 +1,5 @@ // -// ChatPreviewView.swift +// ChatNavLabel.swift // SimpleX // // Created by Evgeny Poberezkin on 28/01/2022. diff --git a/apps/ios/Shared/Views/ChatList/ContactRequestView.swift b/apps/ios/Shared/Views/ChatList/ContactRequestView.swift new file mode 100644 index 000000000..140c398d9 --- /dev/null +++ b/apps/ios/Shared/Views/ChatList/ContactRequestView.swift @@ -0,0 +1,46 @@ +// +// ContactRequestView.swift +// SimpleX +// +// Created by Evgeny Poberezkin on 02/02/2022. +// Copyright © 2022 SimpleX Chat. All rights reserved. +// + +import SwiftUI + +struct ContactRequestView: View { + var contactRequest: UserContactRequest + + var body: some View { + return VStack(alignment: .leading, spacing: 4) { + HStack(alignment: .top) { + Text("@\(contactRequest.localDisplayName)") + .font(.title3) + .fontWeight(.bold) + .foregroundColor(.blue) + .padding(.leading, 8) + .padding(.top, 4) + .frame(maxHeight: .infinity, alignment: .topLeading) + Spacer() + Text("12:34")// getDateFormatter().string(from: cItem.meta.itemTs)) + .font(.subheadline) + .padding(.trailing, 28) + .padding(.top, 4) + .frame(minWidth: 60, alignment: .trailing) + .foregroundColor(.secondary) + } + Text("wants to connect to you!") + .frame(minHeight: 44, maxHeight: 44, alignment: .topLeading) + .padding([.leading, .trailing], 8) + .padding(.bottom, 4) + .padding(.top, 1) + } + } +} + +struct ContactRequestView_Previews: PreviewProvider { + static var previews: some View { + ContactRequestView(contactRequest: sampleContactRequest) + .previewLayout(.fixed(width: 360, height: 80)) + } +} diff --git a/apps/ios/Shared/Views/Helpers/ChatListNavLink.swift b/apps/ios/Shared/Views/Helpers/ChatListNavLink.swift deleted file mode 100644 index 0034622b0..000000000 --- a/apps/ios/Shared/Views/Helpers/ChatListNavLink.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// ChatListNavLink.swift -// SimpleX -// -// Created by Evgeny Poberezkin on 01/02/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI - -struct ChatListNavLink: View { - var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -struct ChatListNavLink_Previews: PreviewProvider { - static var previews: some View { - ChatListNavLink() - } -} diff --git a/apps/ios/Shared/Views/Helpers/ChatListToolbar.swift b/apps/ios/Shared/Views/Helpers/ChatListToolbar.swift deleted file mode 100644 index a79209418..000000000 --- a/apps/ios/Shared/Views/Helpers/ChatListToolbar.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// ChatListToolbar.swift -// SimpleX -// -// Created by Evgeny Poberezkin on 29/01/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI - -struct ChatListToolbar: View { - var width: CGFloat - - var body: some View { - HStack { - SettingsButton() - Spacer() - Text("Your chats") - .font(.title3) - Spacer() - NewChatButton() - } - .padding(.horizontal) - .frame(minWidth: width, maxWidth: .infinity, alignment: .center) - } -} - -struct ChatListToolbar_Previews: PreviewProvider { - static var previews: some View { - return ChatListToolbar(width: 300) - .previewLayout(.fixed(width: 300, height: 70)) - } -} diff --git a/apps/ios/Shared/Views/Helpers/Settings/ProfileHeader.swift b/apps/ios/Shared/Views/Helpers/Settings/ProfileHeader.swift deleted file mode 100644 index 3592feb16..000000000 --- a/apps/ios/Shared/Views/Helpers/Settings/ProfileHeader.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// ProfileHeader.swift -// SimpleX -// -// Created by Evgeny Poberezkin on 31/01/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI - -struct ProfileHeader: View { - var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -struct ProfileHeader_Previews: PreviewProvider { - static var previews: some View { - ProfileHeader() - } -} diff --git a/apps/ios/Shared/Views/Helpers/NewChat/AddContactView.swift b/apps/ios/Shared/Views/NewChat/AddContactView.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/NewChat/AddContactView.swift rename to apps/ios/Shared/Views/NewChat/AddContactView.swift diff --git a/apps/ios/Shared/Views/Helpers/NewChat/ConnectContactView.swift b/apps/ios/Shared/Views/NewChat/ConnectContactView.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/NewChat/ConnectContactView.swift rename to apps/ios/Shared/Views/NewChat/ConnectContactView.swift diff --git a/apps/ios/Shared/Views/Helpers/NewChat/CreateGroupView.swift b/apps/ios/Shared/Views/NewChat/CreateGroupView.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/NewChat/CreateGroupView.swift rename to apps/ios/Shared/Views/NewChat/CreateGroupView.swift diff --git a/apps/ios/Shared/Views/Helpers/NewChat/NewChatButton.swift b/apps/ios/Shared/Views/NewChat/NewChatButton.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/NewChat/NewChatButton.swift rename to apps/ios/Shared/Views/NewChat/NewChatButton.swift diff --git a/apps/ios/Shared/Views/Helpers/NewChat/QRCode.swift b/apps/ios/Shared/Views/NewChat/QRCode.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/NewChat/QRCode.swift rename to apps/ios/Shared/Views/NewChat/QRCode.swift diff --git a/apps/ios/Shared/Views/Helpers/NewChat/ShareSheet.swift b/apps/ios/Shared/Views/NewChat/ShareSheet.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/NewChat/ShareSheet.swift rename to apps/ios/Shared/Views/NewChat/ShareSheet.swift diff --git a/apps/ios/Shared/Views/ChatList/TerminalView.swift b/apps/ios/Shared/Views/TerminalView.swift similarity index 100% rename from apps/ios/Shared/Views/ChatList/TerminalView.swift rename to apps/ios/Shared/Views/TerminalView.swift diff --git a/apps/ios/Shared/Views/Helpers/UserSettings/SettingsButton.swift b/apps/ios/Shared/Views/UserSettings/SettingsButton.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/UserSettings/SettingsButton.swift rename to apps/ios/Shared/Views/UserSettings/SettingsButton.swift diff --git a/apps/ios/Shared/Views/Helpers/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/UserSettings/SettingsView.swift rename to apps/ios/Shared/Views/UserSettings/SettingsView.swift diff --git a/apps/ios/Shared/Views/Helpers/UserSettings/UserAddress.swift b/apps/ios/Shared/Views/UserSettings/UserAddress.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/UserSettings/UserAddress.swift rename to apps/ios/Shared/Views/UserSettings/UserAddress.swift diff --git a/apps/ios/Shared/Views/Helpers/UserSettings/UserProfile.swift b/apps/ios/Shared/Views/UserSettings/UserProfile.swift similarity index 100% rename from apps/ios/Shared/Views/Helpers/UserSettings/UserProfile.swift rename to apps/ios/Shared/Views/UserSettings/UserProfile.swift diff --git a/apps/ios/Shared/Views/UserView.swift b/apps/ios/Shared/Views/UserView.swift deleted file mode 100644 index 61e3f5e7e..000000000 --- a/apps/ios/Shared/Views/UserView.swift +++ /dev/null @@ -1,83 +0,0 @@ -// -// UserView.swift -// SimpleX -// -// Created by Evgeny Poberezkin on 27/01/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI - -struct UserView: View { - @EnvironmentObject var chatModel: ChatModel - var user: User - -// private let controller: chat_ctrl -// -// var chatStore: chat_store - -// @State private var logbuffer = [String]() -// @State private var chatcmd: String = "" -// @State private var chatlog: String = "" -// @FocusState private var focused: Bool - -// func addLine(line: String) { -// print(line) -// logbuffer.append(line) -// if(logbuffer.count > 50) { _ = logbuffer.dropFirst() } -// chatlog = logbuffer.joined(separator: "\n") -// } - - var body: some View { - if chatModel.userChats.isEmpty { - VStack { - Text("Hello chat") - Text("Active user: \(user.localDisplayName) (\(user.profile.fullName))") - } - } else { - ChatList() - } - - - -// DispatchQueue.global().async { -// while(true) { -// let msg = String.init(cString: chat_recv_msg(controller)) -// -// DispatchQueue.main.async { -// addLine(line: msg) -// } -// } -// } - -// return VStack { -// ScrollView { -// VStack(alignment: .leading) { -// HStack { Spacer() } -// Text(chatlog) -// .lineLimit(nil) -// .font(.system(.body, design: .monospaced)) -// } -// .frame(maxWidth: .infinity) -// } -// -// TextField("Chat command", text: $chatcmd) -// .focused($focused) -// .onSubmit { -// print(chatcmd) -// var cCmd = chatcmd.cString(using: .utf8)! -//// print(String.init(cString: chat_send_cmd(controller, &cCmd))) -// } -// .textInputAutocapitalization(.never) -// .disableAutocorrection(true) -// .padding() -// } - } - -} - -//struct UserView_Previews: PreviewProvider { -// static var previews: some View { -// UserView() -// } -//} diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index c604bf60a..ebbe134a3 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 5C063D2727A4564100AEC577 /* ChatPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */; }; 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 */; }; 5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; }; 5C1A4C1F27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; }; 5C1AEB86279F4A6400247F08 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C1AEB7F279F4A6400247F08 /* libffi.a */; }; @@ -70,8 +72,6 @@ 5CC1C99327A6C7F5000D9FF6 /* QRCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */; }; 5CC1C99527A6CF7F000D9FF6 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */; }; 5CC1C99627A6CF7F000D9FF6 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */; }; - 5CCD403127A5F1C600368C90 /* ChatListToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403027A5F1C600368C90 /* ChatListToolbar.swift */; }; - 5CCD403227A5F1C600368C90 /* ChatListToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403027A5F1C600368C90 /* ChatListToolbar.swift */; }; 5CCD403427A5F6DF00368C90 /* AddContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403327A5F6DF00368C90 /* AddContactView.swift */; }; 5CCD403527A5F6DF00368C90 /* AddContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403327A5F6DF00368C90 /* AddContactView.swift */; }; 5CCD403727A5F9A200368C90 /* ConnectContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403627A5F9A200368C90 /* ConnectContactView.swift */; }; @@ -99,6 +99,7 @@ /* 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 = ""; }; 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemView.swift; sourceTree = ""; }; 5C1AEB7F279F4A6400247F08 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; 5C1AEB80279F4A6400247F08 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; @@ -139,7 +140,6 @@ 5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListNavLink.swift; sourceTree = ""; }; 5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCode.swift; sourceTree = ""; }; 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = ""; }; - 5CCD403027A5F1C600368C90 /* ChatListToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListToolbar.swift; sourceTree = ""; }; 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 = ""; }; @@ -195,25 +195,24 @@ 5C2E260D27A30E2400F70299 /* Views */ = { isa = PBXGroup; children = ( - 5C5F4AC227A5E9AF00B51EF1 /* Helpers */, - 5CA05A4B27974EB60002BEB4 /* WelcomeView.swift */, + 5C5F4AC227A5E9AF00B51EF1 /* Chat */, 5CB9250B27A942F300ACCCDD /* ChatList */, - 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */, - 5C2E260E27A30FDC00F70299 /* ChatView.swift */, + 5CB924DD27A8622200ACCCDD /* NewChat */, + 5CB924DF27A8678B00ACCCDD /* UserSettings */, + 5C2E261127A30FEA00F70299 /* TerminalView.swift */, + 5CA05A4B27974EB60002BEB4 /* WelcomeView.swift */, ); path = Views; sourceTree = ""; }; - 5C5F4AC227A5E9AF00B51EF1 /* Helpers */ = { + 5C5F4AC227A5E9AF00B51EF1 /* Chat */ = { isa = PBXGroup; children = ( + 5C2E260E27A30FDC00F70299 /* ChatView.swift */, 5C9FD96D27A5D6ED0075386C /* SendMessageView.swift */, 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */, - 5CCD403027A5F1C600368C90 /* ChatListToolbar.swift */, - 5CB924DF27A8678B00ACCCDD /* UserSettings */, - 5CB924DD27A8622200ACCCDD /* NewChat */, ); - path = Helpers; + path = Chat; sourceTree = ""; }; 5C764E5C279C70B7000C6508 /* Libraries */ = { @@ -341,8 +340,9 @@ isa = PBXGroup; children = ( 5C2E260A27A30CFA00F70299 /* ChatListView.swift */, - 5C2E261127A30FEA00F70299 /* TerminalView.swift */, 5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */, + 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */, + 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */, ); path = ChatList; sourceTree = ""; @@ -524,7 +524,7 @@ 5C9FD96B27A56D4D0075386C /* JSON.swift in Sources */, 5C9FD96E27A5D6ED0075386C /* SendMessageView.swift in Sources */, 5CC1C99227A6C7F5000D9FF6 /* QRCode.swift in Sources */, - 5CCD403127A5F1C600368C90 /* ChatListToolbar.swift in Sources */, + 5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */, 5CB9250D27A9432000ACCCDD /* ChatListNavLink.swift in Sources */, 5CA059ED279559F40002BEB4 /* ContentView.swift in Sources */, 5CCD403427A5F6DF00368C90 /* AddContactView.swift in Sources */, @@ -556,7 +556,7 @@ 5C9FD96C27A56D4D0075386C /* JSON.swift in Sources */, 5C9FD96F27A5D6ED0075386C /* SendMessageView.swift in Sources */, 5CC1C99327A6C7F5000D9FF6 /* QRCode.swift in Sources */, - 5CCD403227A5F1C600368C90 /* ChatListToolbar.swift in Sources */, + 5C116CDD27AABE0400E66D01 /* ContactRequestView.swift in Sources */, 5CB9250E27A9432000ACCCDD /* ChatListNavLink.swift in Sources */, 5CA059EE279559F40002BEB4 /* ContentView.swift in Sources */, 5CCD403527A5F6DF00368C90 /* AddContactView.swift in Sources */,