Skip to content

Commit e735686

Browse files
authored
Merge pull request #97 from rootstrap/module/gemini_chat
Module/gemini chat
2 parents bc32c03 + 721e110 commit e735686

File tree

15 files changed

+234
-51
lines changed

15 files changed

+234
-51
lines changed

.idea/flutter-base.iml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/libraries/Dart_SDK.xml

Lines changed: 21 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/android/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
buildscript {
2-
ext.kotlin_version = '1.6.10'
2+
ext.kotlin_version = '1.9.24'
33
repositories {
44
google()
55
mavenCentral()
@@ -9,6 +9,7 @@ buildscript {
99
classpath 'com.android.tools.build:gradle:7.1.2'
1010
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1111
}
12+
1213
}
1314

1415
allprojects {

app/android/google-services.json

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"project_info": {
3+
"project_number": "584649509078",
4+
"project_id": "geminichattest",
5+
"storage_bucket": "geminichattest.appspot.com"
6+
},
7+
"client": [
8+
{
9+
"client_info": {
10+
"mobilesdk_app_id": "1:584649509078:android:243d74b8c6b25cb59e6177",
11+
"android_client_info": {
12+
"package_name": "com.geminichattest.app"
13+
}
14+
},
15+
"oauth_client": [],
16+
"api_key": [
17+
{
18+
"current_key": "AIzaSyBqzWUBK45noZd2z44zhX7legtKHqL9RR8"
19+
}
20+
],
21+
"services": {
22+
"appinvite_service": {
23+
"other_platform_oauth_client": []
24+
}
25+
}
26+
},
27+
{
28+
"client_info": {
29+
"mobilesdk_app_id": "1:584649509078:android:a2efac4373986aea9e6177",
30+
"android_client_info": {
31+
"package_name": "com.rootstrap.base.flutter_base_rootstrap"
32+
}
33+
},
34+
"oauth_client": [],
35+
"api_key": [
36+
{
37+
"current_key": "AIzaSyBqzWUBK45noZd2z44zhX7legtKHqL9RR8"
38+
}
39+
],
40+
"services": {
41+
"appinvite_service": {
42+
"other_platform_oauth_client": []
43+
}
44+
}
45+
}
46+
],
47+
"configuration_version": "1"
48+
}

app/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
1717
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
1818
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
19+
FA329E38D52E8B060250C4D4 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FBDB3CFFD502B8FF4C001C4A /* GoogleService-Info.plist */; };
1920
/* End PBXBuildFile section */
2021

2122
/* Begin PBXCopyFilesBuildPhase section */
@@ -57,6 +58,7 @@
5758
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5859
D7CB58670CA60602A18EE27E /* Pods-Runner.debug dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug dev.xcconfig"; sourceTree = "<group>"; };
5960
E119DC735666E9662370C55A /* Pods-Runner.release dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release dev.xcconfig"; sourceTree = "<group>"; };
61+
FBDB3CFFD502B8FF4C001C4A /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = "<group>"; };
6062
/* End PBXFileReference section */
6163

6264
/* Begin PBXFrameworksBuildPhase section */
@@ -108,6 +110,7 @@
108110
97C146EF1CF9000F007C117D /* Products */,
109111
55E3773A8035648ECA5506A9 /* Pods */,
110112
BF7702CA177D02242960463B /* Frameworks */,
113+
FBDB3CFFD502B8FF4C001C4A /* GoogleService-Info.plist */,
111114
);
112115
sourceTree = "<group>";
113116
};
@@ -211,6 +214,7 @@
211214
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
212215
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
213216
66CB0DDB28E28FBC00FAD317 /* qa.xcconfig in Resources */,
217+
FA329E38D52E8B060250C4D4 /* GoogleService-Info.plist in Resources */,
214218
);
215219
runOnlyForDeploymentPostprocessing = 0;
216220
};

app/lib/main/env/main_dev.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@ import 'package:flutter/material.dart';
33
import 'package:app/main/env/env_config.dart';
44
import 'package:app/main/init.dart';
55

6+
import '../../firebase_options.dart';
7+
68
void main() async {
79
WidgetsFlutterBinding.ensureInitialized();
810
FlavorConfig(
911
flavor: Flavor.dev,
1012
values: FlavorValues(baseUrl: "https://demo_dev/web_api.json"),
1113
);
14+
await Firebase.initializeApp(
15+
options: DefaultFirebaseOptions.currentPlatform,
16+
);
1217
//Add your firebase configuration here
1318
/*await Firebase.initializeApp(
1419
options: const FirebaseOptions(

app/lib/presentation/navigation/routers.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:app/presentation/ui/pages/geminichat/geminichat_page.dart';
12
import 'package:app/presentation/ui/pages/home/home_page.dart';
23
import 'package:app/presentation/ui/pages/login/login_page.dart';
34
import 'package:app/presentation/ui/pages/sign_up/sign_up_page.dart';
@@ -28,6 +29,11 @@ class Routers {
2829
path: "/home",
2930
builder: (context, state) => const HomePage(),
3031
),
32+
GoRoute(
33+
name: "chat",
34+
path: "/chat",
35+
builder: (context, state) => const GeminiChatPage(),
36+
),
3137
],
3238
);
3339
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import 'package:firebase_vertexai/firebase_vertexai.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
4+
import 'package:flutter_chat_types/flutter_chat_types.dart' as types;
5+
import 'package:uuid/uuid.dart';
6+
7+
class GeminiChatPage extends StatefulWidget {
8+
const GeminiChatPage({super.key});
9+
10+
@override
11+
State<GeminiChatPage> createState() => _GeminiChatState();
12+
}
13+
14+
class _GeminiChatState extends State<GeminiChatPage> {
15+
bool _loading = false;
16+
List<types.Message> _messages = [];
17+
var model;
18+
final _agent = const types.User(id: "testidAgent", firstName: "Chatty");
19+
final _user = const types.User(id: "testidUser", firstName: "");
20+
21+
@override
22+
void initState() {
23+
super.initState();
24+
25+
model = FirebaseVertexAI.instance.generativeModel(
26+
model: 'gemini-1.5-pro',
27+
generationConfig:
28+
GenerationConfig(temperature: 0, responseMimeType: 'text/plain'));
29+
}
30+
31+
void _addMessage(types.Message message) {
32+
setState(() {
33+
_messages.insert(0, message);
34+
});
35+
}
36+
37+
void _handleSendPressed(types.PartialText text) {
38+
final textMessage = types.TextMessage(
39+
author: _user,
40+
text: text.text,
41+
id: const Uuid().v4(),
42+
);
43+
44+
_addMessage(textMessage);
45+
46+
_sendVertexMessage(text);
47+
}
48+
49+
Future<void> _sendVertexMessage(types.PartialText meesageToSend) async {
50+
_loading = true;
51+
52+
final messageContent = Content.multi(
53+
[
54+
TextPart(meesageToSend.text),
55+
],
56+
);
57+
58+
var response = await model.generateContent([messageContent]);
59+
var text = response.text;
60+
61+
if (text != null) {
62+
final textMessage = types.TextMessage(
63+
author: _agent,
64+
text: text,
65+
id: const Uuid().v4(),
66+
);
67+
68+
_addMessage(textMessage);
69+
}
70+
71+
setState(() {
72+
_loading = false;
73+
});
74+
}
75+
76+
@override
77+
Widget build(BuildContext context) => Scaffold(
78+
body: Chat(
79+
showUserAvatars: true,
80+
showUserNames: true,
81+
typingIndicatorOptions:
82+
TypingIndicatorOptions(typingUsers: _loading ? [_agent] : []),
83+
messages: _messages,
84+
onSendPressed: _handleSendPressed,
85+
user: _user),
86+
);
87+
}

app/lib/presentation/ui/pages/geminichat/geminichat_view.dart

Whitespace-only changes.

app/lib/presentation/ui/pages/home/home_view.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:app/main/init.dart';
2+
import 'package:app/presentation/navigation/routers.dart';
23
import 'package:common/core/failure/failure.dart';
34
import 'package:common/core/resource.dart';
45
import 'package:example_domain/models/product.dart';
@@ -11,9 +12,11 @@ import 'package:app/presentation/ui/custom/app_theme_switch.dart';
1112
import 'package:app/presentation/ui/custom/failure_widget.dart';
1213

1314
import 'package:flutter_bloc/flutter_bloc.dart';
15+
import 'package:go_router/go_router.dart';
1416

1517
class HomeView extends StatelessWidget {
1618
AuthService get _authService => getIt();
19+
GoRouter get _goRouter => Routers.authRouter;
1720

1821
const HomeView({Key? key}) : super(key: key);
1922

@@ -26,6 +29,10 @@ class HomeView extends StatelessWidget {
2629
onPressed: () => _authService.onLogout(),
2730
icon: const Icon(Icons.logout),
2831
),
32+
IconButton(
33+
onPressed: () => _goRouter.go('/chat'),
34+
icon: const Icon(Icons.chat_bubble),
35+
),
2936
const AppThemeSwitch(),
3037
],
3138
),

0 commit comments

Comments
 (0)