From 1b328edfd8feb8cb0c9deeb00e5abf9e51cdbd04 Mon Sep 17 00:00:00 2001 From: 1998code <54872601+1998code@users.noreply.github.com> Date: Thu, 16 May 2024 13:43:45 +0800 Subject: [PATCH 1/2] Sync UI from VertexAI for Firebase --- .../Screens/ConversationScreen.swift | 4 +++- .../Screens/FunctionCallingScreen.swift | 5 +++- .../Screens/PhotoReasoningScreen.swift | 13 ++++++++++ .../Screens/SummarizeScreen.swift | 24 ++++++++++++------- .../GenerativeAIUIComponents/InputField.swift | 4 ++-- .../MultimodalInputField.swift | 4 ++-- 6 files changed, 39 insertions(+), 15 deletions(-) diff --git a/Examples/GenerativeAISample/ChatSample/Screens/ConversationScreen.swift b/Examples/GenerativeAISample/ChatSample/Screens/ConversationScreen.swift index d9c9b62..0d87124 100644 --- a/Examples/GenerativeAISample/ChatSample/Screens/ConversationScreen.swift +++ b/Examples/GenerativeAISample/ChatSample/Screens/ConversationScreen.swift @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import GenerativeAIUIComponents import GoogleGenerativeAI +import GenerativeAIUIComponents import SwiftUI struct ConversationScreen: View { @@ -94,6 +94,8 @@ struct ConversationScreen: View { } private func sendOrStop() { + focusedField = nil + if viewModel.busy { viewModel.stop() } else { diff --git a/Examples/GenerativeAISample/FunctionCallingSample/Screens/FunctionCallingScreen.swift b/Examples/GenerativeAISample/FunctionCallingSample/Screens/FunctionCallingScreen.swift index 4848ec5..b68ddbc 100644 --- a/Examples/GenerativeAISample/FunctionCallingSample/Screens/FunctionCallingScreen.swift +++ b/Examples/GenerativeAISample/FunctionCallingSample/Screens/FunctionCallingScreen.swift @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import GenerativeAIUIComponents import GoogleGenerativeAI +import GenerativeAIUIComponents import SwiftUI struct FunctionCallingScreen: View { @@ -65,6 +65,9 @@ struct FunctionCallingScreen: View { } } }) + .onTapGesture { + focusedField = nil + } } InputField("Message...", text: $userPrompt) { Image(systemName: viewModel.busy ? "stop.circle.fill" : "arrow.up.circle.fill") diff --git a/Examples/GenerativeAISample/GenerativeAIMultimodalSample/Screens/PhotoReasoningScreen.swift b/Examples/GenerativeAISample/GenerativeAIMultimodalSample/Screens/PhotoReasoningScreen.swift index 98f3275..9302147 100644 --- a/Examples/GenerativeAISample/GenerativeAIMultimodalSample/Screens/PhotoReasoningScreen.swift +++ b/Examples/GenerativeAISample/GenerativeAIMultimodalSample/Screens/PhotoReasoningScreen.swift @@ -20,9 +20,17 @@ import SwiftUI struct PhotoReasoningScreen: View { @StateObject var viewModel = PhotoReasoningViewModel() + enum FocusedField: Hashable { + case message + } + + @FocusState + var focusedField: FocusedField? + var body: some View { VStack { MultimodalInputField(text: $viewModel.userInput, selection: $viewModel.selectedItems) + .focused($focusedField, equals: .message) .onSubmit { onSendTapped() } @@ -47,11 +55,16 @@ struct PhotoReasoningScreen: View { } } .navigationTitle("Multimodal sample") + .onAppear { + focusedField = .message + } } // MARK: - Actions private func onSendTapped() { + focusedField = nil + Task { await viewModel.reason() } diff --git a/Examples/GenerativeAISample/GenerativeAITextSample/Screens/SummarizeScreen.swift b/Examples/GenerativeAISample/GenerativeAITextSample/Screens/SummarizeScreen.swift index 8fbb89f..748c1ad 100644 --- a/Examples/GenerativeAISample/GenerativeAITextSample/Screens/SummarizeScreen.swift +++ b/Examples/GenerativeAISample/GenerativeAITextSample/Screens/SummarizeScreen.swift @@ -28,19 +28,23 @@ struct SummarizeScreen: View { var body: some View { VStack { - Text("Enter some text, then tap on _Go_ to summarize it.") - HStack(alignment: .top) { - TextField("Enter text summarize", text: $userInput, axis: .vertical) - .textFieldStyle(.roundedBorder) - .onSubmit { + VStack(alignment: .leading) { + Text("Enter some text, then tap on _Go_ to summarize it.") + .padding(.horizontal, 6) + HStack(alignment: .top) { + TextField("Enter text summarize", text: $userInput, axis: .vertical) + .focused($focusedField, equals: .message) + .textFieldStyle(.roundedBorder) + .onSubmit { + onSummarizeTapped() + } + Button("Go") { onSummarizeTapped() } - Button("Go") { - onSummarizeTapped() + .padding(.top, 4) } - .padding(.top, 4) } - .padding([.horizontal, .bottom]) + .padding(.horizontal, 16) List { HStack(alignment: .top) { @@ -61,6 +65,8 @@ struct SummarizeScreen: View { } private func onSummarizeTapped() { + focusedField = nil + Task { await viewModel.summarize(inputText: userInput) } diff --git a/Examples/GenerativeAISample/GenerativeAIUIComponents/Sources/GenerativeAIUIComponents/InputField.swift b/Examples/GenerativeAISample/GenerativeAIUIComponents/Sources/GenerativeAIUIComponents/InputField.swift index 3f12ea6..67941c3 100644 --- a/Examples/GenerativeAISample/GenerativeAIUIComponents/Sources/GenerativeAIUIComponents/InputField.swift +++ b/Examples/GenerativeAISample/GenerativeAIUIComponents/Sources/GenerativeAIUIComponents/InputField.swift @@ -60,10 +60,10 @@ public struct InputField