From df266b9356f9020b18e16735ee11a3baa0c60327 Mon Sep 17 00:00:00 2001 From: Joel Oksanen <joel.oksanen17@imperial.ac.uk> Date: Tue, 25 Feb 2020 14:31:28 +0000 Subject: [PATCH] Finished messaging MVP on client --- ADAbot/ADAbot.xcodeproj/project.pbxproj | 10 ++- .../UserInterfaceState.xcuserstate | Bin 47753 -> 48454 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 18 ---- ADAbot/ADAbot/Chat/ADAMessage.swift | 6 +- ADAbot/ADAbot/Chat/Argument.swift | 9 +- ADAbot/ADAbot/Chat/ArgumentQuery.swift | 6 ++ ADAbot/ADAbot/Chat/ChatManager.swift | 39 ++++++++ ADAbot/ADAbot/Chat/ChatView.swift | 13 +-- ADAbot/ADAbot/Chat/FeatureView.swift | 84 ++++++++++++------ ADAbot/ADAbot/Chat/MessageView.swift | 63 ++++++++++--- ADAbot/ADAbot/Chat/QueryOptionView.swift | 23 +++++ ADAbot/ADAbot/Chat/UserMessage.swift | 17 +++- ADAbot/ADAbot/ConnectionManager.swift | 5 +- ADAbot/ADAbot/ContentView.swift | 6 +- ADAbot/ADAbot/Product/ProductView.swift | 2 +- 15 files changed, 228 insertions(+), 73 deletions(-) create mode 100644 ADAbot/ADAbot/Chat/ChatManager.swift create mode 100644 ADAbot/ADAbot/Chat/QueryOptionView.swift diff --git a/ADAbot/ADAbot.xcodeproj/project.pbxproj b/ADAbot/ADAbot.xcodeproj/project.pbxproj index f82e371..595bcb4 100644 --- a/ADAbot/ADAbot.xcodeproj/project.pbxproj +++ b/ADAbot/ADAbot.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 9449FE4924042D6500025F70 /* FeatureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9449FE4824042D6500025F70 /* FeatureView.swift */; }; 9449FE4B24042E8800025F70 /* Argument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9449FE4A24042E8800025F70 /* Argument.swift */; }; 9449FE4D2404561400025F70 /* ArgumentQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9449FE4C2404561400025F70 /* ArgumentQuery.swift */; }; + 9449FE4F240533FD00025F70 /* QueryOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9449FE4E240533FD00025F70 /* QueryOptionView.swift */; }; + 9449FE5124053DA500025F70 /* ChatManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9449FE5024053DA500025F70 /* ChatManager.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -52,6 +54,8 @@ 9449FE4824042D6500025F70 /* FeatureView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureView.swift; sourceTree = "<group>"; }; 9449FE4A24042E8800025F70 /* Argument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Argument.swift; sourceTree = "<group>"; }; 9449FE4C2404561400025F70 /* ArgumentQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArgumentQuery.swift; sourceTree = "<group>"; }; + 9449FE4E240533FD00025F70 /* QueryOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueryOptionView.swift; sourceTree = "<group>"; }; + 9449FE5024053DA500025F70 /* ChatManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatManager.swift; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -109,16 +113,18 @@ 9449FE3E2403EDB400025F70 /* Chat */ = { isa = PBXGroup; children = ( + 9449FE5024053DA500025F70 /* ChatManager.swift */, 9449FE442403F0A600025F70 /* Sender.swift */, 9449FE382403E9A400025F70 /* Message.swift */, 9449FE3A2403EC3800025F70 /* ADAMessage.swift */, 9449FE4A24042E8800025F70 /* Argument.swift */, 9449FE4C2404561400025F70 /* ArgumentQuery.swift */, 9449FE3C2403ED0200025F70 /* UserMessage.swift */, + 9449FE422403F02500025F70 /* MessageBubble.swift */, 9449FE302402C90800025F70 /* ChatView.swift */, 9449FE402403EF5A00025F70 /* MessageView.swift */, - 9449FE422403F02500025F70 /* MessageBubble.swift */, 9449FE4824042D6500025F70 /* FeatureView.swift */, + 9449FE4E240533FD00025F70 /* QueryOptionView.swift */, ); name = Chat; path = ADAbot/Chat; @@ -209,6 +215,7 @@ 9449FE3B2403EC3800025F70 /* ADAMessage.swift in Sources */, 9449FE3D2403ED0200025F70 /* UserMessage.swift in Sources */, 9449FE2F2402C8C500025F70 /* ProductView.swift in Sources */, + 9449FE4F240533FD00025F70 /* QueryOptionView.swift in Sources */, 9449FE4B24042E8800025F70 /* Argument.swift in Sources */, 9449FE372402D29E00025F70 /* Product.swift in Sources */, 9449FE432403F02500025F70 /* MessageBubble.swift in Sources */, @@ -218,6 +225,7 @@ 9449FE4D2404561400025F70 /* ArgumentQuery.swift in Sources */, 9449FE4924042D6500025F70 /* FeatureView.swift in Sources */, 9449FE312402C90800025F70 /* ChatView.swift in Sources */, + 9449FE5124053DA500025F70 /* ChatManager.swift in Sources */, 9449FE352402CCDA00025F70 /* ConnectionManager.swift in Sources */, 9449FE1D2402C84F00025F70 /* SceneDelegate.swift in Sources */, 9449FE1F2402C84F00025F70 /* ContentView.swift in Sources */, diff --git a/ADAbot/ADAbot.xcodeproj/project.xcworkspace/xcuserdata/joeloksanen.xcuserdatad/UserInterfaceState.xcuserstate b/ADAbot/ADAbot.xcodeproj/project.xcworkspace/xcuserdata/joeloksanen.xcuserdatad/UserInterfaceState.xcuserstate index da7af78889fe5c2a08258edb7e01a0ab8616562c..340987542d5d28546f80ba13fdd7337f16270485 100644 GIT binary patch delta 21429 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 delta 21293 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�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 diff --git a/ADAbot/ADAbot.xcodeproj/xcuserdata/joeloksanen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ADAbot/ADAbot.xcodeproj/xcuserdata/joeloksanen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index e00cd34..5e4eda7 100644 --- a/ADAbot/ADAbot.xcodeproj/xcuserdata/joeloksanen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/ADAbot/ADAbot.xcodeproj/xcuserdata/joeloksanen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,22 +3,4 @@ uuid = "91D35F8C-89D0-4137-A5A5-FAFC5B6FE3BA" type = "1" version = "2.0"> - <Breakpoints> - <BreakpointProxy - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> - <BreakpointContent - uuid = "01922009-364B-4C8F-87E5-58886FB47FAA" - shouldBeEnabled = "No" - ignoreCount = "0" - continueAfterRunningActions = "No" - filePath = "ADAbot/Chat/MessageView.swift" - startingColumnNumber = "9223372036854775807" - endingColumnNumber = "9223372036854775807" - startingLineNumber = "34" - endingLineNumber = "34" - landmarkName = "body" - landmarkType = "24"> - </BreakpointContent> - </BreakpointProxy> - </Breakpoints> </Bucket> diff --git a/ADAbot/ADAbot/Chat/ADAMessage.swift b/ADAbot/ADAbot/Chat/ADAMessage.swift index 191bbea..5d899ce 100644 --- a/ADAbot/ADAbot/Chat/ADAMessage.swift +++ b/ADAbot/ADAbot/Chat/ADAMessage.swift @@ -8,11 +8,15 @@ import UIKit -struct ADAMessage: Message, Decodable { +struct ADAMessage: Message, Decodable, Equatable { let id = UUID() let sender = Sender.ADA let text: String let arguments: [Argument] + static func == (lhs: ADAMessage, rhs: ADAMessage) -> Bool { + lhs.id == rhs.id + } + } diff --git a/ADAbot/ADAbot/Chat/Argument.swift b/ADAbot/ADAbot/Chat/Argument.swift index f9b6e45..1c857c6 100644 --- a/ADAbot/ADAbot/Chat/Argument.swift +++ b/ADAbot/ADAbot/Chat/Argument.swift @@ -8,10 +8,15 @@ import UIKit -struct Argument: Codable { +struct Argument: Codable, Equatable { let id = UUID() let name: String - let queries = [ArgumentQuery]() + let queries = [ArgumentQuery(argumentID: 1, queryID: 1, text: "Why was the lens considered to be good?"), + ArgumentQuery(argumentID: 1, queryID: 2, text: "What did users say about the lens being good?")] + + static func == (lhs: Argument, rhs: Argument) -> Bool { + lhs.id == rhs.id + } } diff --git a/ADAbot/ADAbot/Chat/ArgumentQuery.swift b/ADAbot/ADAbot/Chat/ArgumentQuery.swift index 3d34e74..e9b036a 100644 --- a/ADAbot/ADAbot/Chat/ArgumentQuery.swift +++ b/ADAbot/ADAbot/Chat/ArgumentQuery.swift @@ -10,8 +10,14 @@ import UIKit struct ArgumentQuery: Codable { + let id = UUID() let argumentID: Int let queryID: Int let text: String + var message: UserMessage { + get { + return UserMessage(query: self) + } + } } diff --git a/ADAbot/ADAbot/Chat/ChatManager.swift b/ADAbot/ADAbot/Chat/ChatManager.swift new file mode 100644 index 0000000..83cf0d7 --- /dev/null +++ b/ADAbot/ADAbot/Chat/ChatManager.swift @@ -0,0 +1,39 @@ +// +// ChatManager.swift +// ADAbot +// +// Created by Joel Oksanen on 25.2.2020. +// Copyright © 2020 Joel Oksanen. All rights reserved. +// + +import SwiftUI + +class ChatManager: ObservableObject { + @Published var sent = false + @Published var showingOptionsForMessage: ADAMessage? + + let connectionManager: ConnectionManager + + init(connectionManager: ConnectionManager) { + self.connectionManager = connectionManager + } + + func sendQuery(query: ArgumentQuery) { + sent = true + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + self.sent = false + self.connectionManager.addMessage(message: query.message) + self.showingOptionsForMessage = nil + } + } + + func showOptionsFor(_ message: ADAMessage) { + showingOptionsForMessage = message + } + + func showingOptionsFor(_ message: Message) -> Bool { + return message is ADAMessage && (message as! ADAMessage) == showingOptionsForMessage + } + +} + diff --git a/ADAbot/ADAbot/Chat/ChatView.swift b/ADAbot/ADAbot/Chat/ChatView.swift index 85ca0df..a10b339 100644 --- a/ADAbot/ADAbot/Chat/ChatView.swift +++ b/ADAbot/ADAbot/Chat/ChatView.swift @@ -9,7 +9,13 @@ import SwiftUI struct ChatView: View { - @ObservedObject var connectionManager = ConnectionManager() + @ObservedObject var connectionManager: ConnectionManager + @ObservedObject var chatManager: ChatManager + + init(connectionManager: ConnectionManager) { + self.connectionManager = connectionManager + self.chatManager = ChatManager(connectionManager: connectionManager) + } var body: some View { ZStack { @@ -19,11 +25,8 @@ struct ChatView: View { ScrollView { VStack(spacing: 0) { ForEach(connectionManager.messages, id: \.id) { message in - MessageView(message: message) - .padding(EdgeInsets(top: 0, leading: 20, bottom: 15, trailing: 20)) + MessageView(chatManager: self.chatManager, message: message) } - FeatureView(arguments: connectionManager.messages.last!.arguments) - .padding(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 0)) } .padding(EdgeInsets(top: 30, leading: 0, bottom: 30, trailing: 0)) } diff --git a/ADAbot/ADAbot/Chat/FeatureView.swift b/ADAbot/ADAbot/Chat/FeatureView.swift index 4042e7c..6351f7c 100644 --- a/ADAbot/ADAbot/Chat/FeatureView.swift +++ b/ADAbot/ADAbot/Chat/FeatureView.swift @@ -9,44 +9,70 @@ import SwiftUI struct FeatureView: View { + @ObservedObject var chatManager: ChatManager + static let bubbleColor = Color(red: 75/255, green: 90/255, blue: 116/255) let arguments: [Argument] - let bubbleColor = Color(red: 75/255, green: 90/255, blue: 116/255) + @State var showingQueryOptionsForArgument: Argument? var body: some View { - HStack(spacing: 0) { - Spacer() - - Text("ASK ABOUT") - .foregroundColor(self.bubbleColor) - .font(Font.custom("Gill Sans", size: 11)) - .fixedSize(horizontal: true, vertical: false) - .padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 10)) - - Capsule() - .foregroundColor(self.bubbleColor) - .frame(width: 1, height: 38) - - ScrollView(.horizontal, showsIndicators: false) { + VStack(spacing: 0) { + if (!chatManager.sent) { HStack(spacing: 0) { Spacer() - .frame(width: 10) - ForEach(self.arguments, id: \.id) { argument in - Text(argument.name) - .foregroundColor(Color.white) - .font(Font.custom("Helvetica Neue", size: 12)) - .fixedSize(horizontal: true, vertical: true) - .padding(EdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20)) - .background(Capsule().foregroundColor(self.bubbleColor)) - .padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 10)) + + Text("ASK ABOUT") + .foregroundColor(FeatureView.bubbleColor) + .font(Font.custom("Gill Sans", size: 11)) + .fixedSize(horizontal: true, vertical: false) + .padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 10)) + + Capsule() + .foregroundColor(FeatureView.bubbleColor) + .frame(width: 1, height: 38) + + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 0) { + Spacer() + .frame(width: 10) + ForEach(self.arguments, id: \.id) { argument in + FeatureBubble(argument: argument, + showingQueryOptionsForArgument: self.$showingQueryOptionsForArgument) + .onTapGesture { self.showingQueryOptionsForArgument = argument } + } + Spacer() + .frame(width: 10) + } } - Spacer() - .frame(width: 10) + .frame(maxWidth: 280) + .fixedSize(horizontal: true, vertical: false) + .zIndex(-1) } + .padding(EdgeInsets(top: 0, leading: 0, bottom: 15, trailing: 0)) + } + + if showingQueryOptionsForArgument != nil { + QueryOptionView(chatManager: chatManager, queries: showingQueryOptionsForArgument!.queries) } - .frame(maxWidth: 280) - .fixedSize(horizontal: true, vertical: false) - .zIndex(-1) } + .frame(width: UIScreen.main.bounds.width) + } +} + +struct FeatureBubble: View { + let argument: Argument + @Binding var showingQueryOptionsForArgument: Argument? + + var body: some View { + Text(argument.name) + .foregroundColor(self.showingQueryOptionsForArgument == argument ? Color.white : FeatureView.bubbleColor) + .font(Font.custom("Helvetica Neue", size: 12)) + .fixedSize(horizontal: true, vertical: true) + .padding(EdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20)) + .background(self.showingQueryOptionsForArgument == argument ? + AnyView(Capsule().foregroundColor(FeatureView.bubbleColor)) : + AnyView(Capsule().strokeBorder(FeatureView.bubbleColor)) + ) + .padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 10)) } } diff --git a/ADAbot/ADAbot/Chat/MessageView.swift b/ADAbot/ADAbot/Chat/MessageView.swift index 2d08815..aec1e13 100644 --- a/ADAbot/ADAbot/Chat/MessageView.swift +++ b/ADAbot/ADAbot/Chat/MessageView.swift @@ -9,6 +9,8 @@ import SwiftUI struct MessageView: View { + @ObservedObject var chatManager: ChatManager + let bubbleColors = [ Sender.ADA: Color(red: 242/255, green: 159/255, blue: 31/255), Sender.USER: Color(red: 35/255, green: 45/255, blue: 62/255) @@ -16,23 +18,60 @@ struct MessageView: View { let maxWidth: CGFloat = 300 let message: Message + let query: ArgumentQuery? + @State var sent: Bool + + init(chatManager: ChatManager, message: Message) { + self.chatManager = chatManager + self.message = message + self.query = nil + _sent = State(initialValue: true) + } + + init(chatManager: ChatManager, query: ArgumentQuery) { + self.chatManager = chatManager + self.message = query.message + self.query = query + _sent = State(initialValue: false) + } var body: some View { - HStack(spacing: 0) { - if message.sender == .USER { - Spacer() + VStack(spacing: 0) { + if !chatManager.sent || self.sent { + HStack(spacing: 0) { + if message.sender == .USER { + Spacer() + } + + Text(message.text) + .foregroundColor(Color.white) + .font(Font.custom("Helvetica Neue", size: 14)) + .fixedSize(horizontal: false, vertical: true) + .padding(EdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20)) + .background(MessageBubble(sender: message.sender).foregroundColor(sent ? bubbleColors[message.sender] : FeatureView.bubbleColor)) + .frame(minWidth: 0, maxWidth: maxWidth, alignment: message.sender == .ADA ? .leading : .trailing) + .onTapGesture { + if self.message.sender == .ADA { + self.chatManager.showOptionsFor(self.message as! ADAMessage) + } else if !self.sent { + withAnimation(Animation.easeInOut(duration: 0.3)) { + self.chatManager.sendQuery(query: self.query!) + self.sent = true + } + } + } + + if message.sender == .ADA { + Spacer() + } + } + .padding(EdgeInsets(top: 0, leading: 20, bottom: 15, trailing: 20)) } - Text(message.text) - .foregroundColor(Color.white) - .font(Font.custom("Helvetica Neue", size: 14)) - .padding(EdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20)) - .background(MessageBubble(sender: message.sender).foregroundColor(bubbleColors[message.sender])) - .frame(minWidth: 0, maxWidth: maxWidth, alignment: message.sender == .ADA ? .leading : .trailing) - - if message.sender == .ADA { - Spacer() + if chatManager.showingOptionsFor(message) { + FeatureView(chatManager: chatManager, arguments: message.arguments) } } + .frame(width: UIScreen.main.bounds.width) } } diff --git a/ADAbot/ADAbot/Chat/QueryOptionView.swift b/ADAbot/ADAbot/Chat/QueryOptionView.swift new file mode 100644 index 0000000..d15f4c6 --- /dev/null +++ b/ADAbot/ADAbot/Chat/QueryOptionView.swift @@ -0,0 +1,23 @@ +// +// QueryOptionView.swift +// ADAbot +// +// Created by Joel Oksanen on 25.2.2020. +// Copyright © 2020 Joel Oksanen. All rights reserved. +// + +import SwiftUI + +struct QueryOptionView: View { + @ObservedObject var chatManager: ChatManager + let queries: [ArgumentQuery] + + var body: some View { + VStack(spacing: 0) { + ForEach(queries, id: \.id) { query in + MessageView(chatManager: self.chatManager, query: query) + } + } + } +} + diff --git a/ADAbot/ADAbot/Chat/UserMessage.swift b/ADAbot/ADAbot/Chat/UserMessage.swift index cccac3d..b9c7b01 100644 --- a/ADAbot/ADAbot/Chat/UserMessage.swift +++ b/ADAbot/ADAbot/Chat/UserMessage.swift @@ -8,11 +8,26 @@ import UIKit -struct UserMessage: Message { +struct UserMessage: Message, Equatable { let id = UUID() let sender = Sender.USER let text: String let arguments = [Argument]() + let sent: Bool + + init(text: String) { + self.text = text + self.sent = true + } + + init(query: ArgumentQuery) { + self.text = query.text + self.sent = false + } + + static func == (lhs: UserMessage, rhs: UserMessage) -> Bool { + lhs.id == rhs.id + } } diff --git a/ADAbot/ADAbot/ConnectionManager.swift b/ADAbot/ADAbot/ConnectionManager.swift index 69d052a..7b60563 100644 --- a/ADAbot/ADAbot/ConnectionManager.swift +++ b/ADAbot/ADAbot/ConnectionManager.swift @@ -51,7 +51,10 @@ class ConnectionManager: ObservableObject { } } task.resume() - + } + + func addMessage(message: Message) { + messages.append(message) } } diff --git a/ADAbot/ADAbot/ContentView.swift b/ADAbot/ADAbot/ContentView.swift index 2ad81b5..0599447 100644 --- a/ADAbot/ADAbot/ContentView.swift +++ b/ADAbot/ADAbot/ContentView.swift @@ -9,11 +9,13 @@ import SwiftUI struct ContentView: View { + @ObservedObject var connectionManager = ConnectionManager() + var body: some View { VStack(spacing: 0) { - ProductView() + ProductView(connectionManager: connectionManager) .zIndex(10) - ChatView() + ChatView(connectionManager: connectionManager) .zIndex(0) } .edgesIgnoringSafeArea(.all) diff --git a/ADAbot/ADAbot/Product/ProductView.swift b/ADAbot/ADAbot/Product/ProductView.swift index 4b0a0b5..09eff76 100644 --- a/ADAbot/ADAbot/Product/ProductView.swift +++ b/ADAbot/ADAbot/Product/ProductView.swift @@ -9,7 +9,7 @@ import SwiftUI struct ProductView: View { - @ObservedObject var connectionManager = ConnectionManager() + @ObservedObject var connectionManager: ConnectionManager let height: CGFloat = 200 var body: some View { -- GitLab