Skip to content

Commit fd8842a

Browse files
authored
Add files via upload
1 parent 0e5bce9 commit fd8842a

12 files changed

+544
-0
lines changed

Diff for: api_consts.dart

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
String BASE_URL = 'https://api.openai.com/v1';
2+
String API_KEY = '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';

Diff for: api_service.dart

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import 'dart:io';
2+
import 'dart:convert';
3+
import 'dart:math';
4+
import 'package:http/http.dart' as http;
5+
import 'package:kuch_bhi_ai/constants/api_consts.dart';
6+
import 'package:kuch_bhi_ai/models/models_model.dart';
7+
8+
class ApiService {
9+
static Future<List<ModelsModel>> getModels() async {
10+
try {
11+
var response = await http.get(
12+
Uri.parse('$BASE_URL/models'),
13+
headers: {'Authorization': 'Bearer $API_KEY'},
14+
);
15+
Map jsonResponse = jsonDecode(response.body);
16+
17+
if (jsonResponse['error'] != null) {
18+
// print("jsonResponse['error'] ${jsonResponse['error']['message']}");
19+
throw HttpException(jsonResponse['error']['message']);
20+
}
21+
// print('jsonResponse $jsonResponse');
22+
List temp = [];
23+
for (var value in jsonResponse['data']) {
24+
temp.add(value);
25+
// log("temp ${value['id']}");
26+
}
27+
return ModelsModel.modelsFromSnapshot(temp);
28+
} catch (error) {
29+
print('error $error');
30+
rethrow;
31+
}
32+
}
33+
}

Diff for: assets_manager.dart

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class AssetsManager {
2+
static String imagePath = "assets/images";
3+
static String userImage = "$imagePath/person.png";
4+
static String botImage = "$imagePath/chat_logo.png";
5+
static String logo = "$imagePath/logo.jpg";
6+
}

Diff for: chat_screen.dart

+128
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
// ignore_for_file: prefer_const_constructors, prefer_const_literals_to_create_immutables
2+
3+
import 'package:flutter/material.dart';
4+
import 'package:flutter/src/widgets/container.dart';
5+
import 'package:flutter_spinkit/flutter_spinkit.dart';
6+
import 'package:kuch_bhi_ai/constants/constants.dart';
7+
import 'package:flutter/src/widgets/framework.dart';
8+
import 'package:kuch_bhi_ai/services/api_service.dart';
9+
import 'package:kuch_bhi_ai/widgets/chat_widget.dart';
10+
import 'package:kuch_bhi_ai/widgets/text_widget.dart';
11+
import 'package:kuch_bhi_ai/services/services.dart';
12+
13+
import '../services/assets_manager.dart';
14+
15+
class ChatScreen extends StatefulWidget {
16+
@override
17+
State<ChatScreen> createState() => _ChatScreenState();
18+
}
19+
20+
class _ChatScreenState extends State<ChatScreen> {
21+
bool _isTyping = true;
22+
late TextEditingController textEditingController;
23+
24+
@override
25+
void initState() {
26+
textEditingController = TextEditingController();
27+
super.initState();
28+
}
29+
30+
@override
31+
void dispose() {
32+
textEditingController.dispose();
33+
super.dispose();
34+
}
35+
36+
@override
37+
Widget build(BuildContext context) {
38+
return Scaffold(
39+
appBar: AppBar(
40+
elevation: 2,
41+
leading: Padding(
42+
padding: EdgeInsets.all(10),
43+
child: Image.asset(AssetsManager.logo),
44+
),
45+
title: Text(
46+
'Personal AI',
47+
style: TextStyle(color: Colors.white),
48+
),
49+
actions: [
50+
IconButton(
51+
onPressed: () async {
52+
await Services.showModalSheet(context: context);
53+
},
54+
icon: Icon(
55+
Icons.more_vert_rounded,
56+
color: Colors.white,
57+
),
58+
),
59+
],
60+
),
61+
body: SafeArea(
62+
child: Column(
63+
children: [
64+
Flexible(
65+
child: ListView.builder(
66+
itemCount: 6,
67+
itemBuilder: (context, index) {
68+
return ChatWidget(
69+
msg: chatMessages[index]['msg'].toString(),
70+
chatIndex: int.parse(
71+
chatMessages[index]['chatIndex'].toString()),
72+
);
73+
}),
74+
),
75+
if (_isTyping) ...[
76+
SpinKitThreeBounce(
77+
color: Colors.white,
78+
size: 18,
79+
),
80+
// SizedBox(
81+
// height: 15,
82+
// ),
83+
// Material(
84+
Container(
85+
color: kCardColor,
86+
child: Padding(
87+
padding: EdgeInsets.all(10),
88+
child: Row(
89+
children: [
90+
Expanded(
91+
child: TextField(
92+
style: TextStyle(color: Colors.white),
93+
controller: textEditingController,
94+
onSubmitted: (value) {
95+
//to do message
96+
},
97+
decoration: InputDecoration.collapsed(
98+
hintText: 'How can I help you',
99+
hintStyle: TextStyle(
100+
color: Colors.grey,
101+
),
102+
),
103+
),
104+
),
105+
IconButton(
106+
onPressed: () async {
107+
try {
108+
await ApiService.getModels();
109+
} catch (error) {
110+
print('error $error');
111+
}
112+
},
113+
icon: Icon(
114+
Icons.send,
115+
color: Colors.white,
116+
),
117+
)
118+
],
119+
),
120+
),
121+
),
122+
]
123+
],
124+
),
125+
),
126+
);
127+
}
128+
}

Diff for: chat_widget.dart

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// ignore_for_file: prefer_const_constructors, prefer_const_literals_to_create_immutables
2+
3+
import 'package:flutter/material.dart';
4+
import 'package:kuch_bhi_ai/constants/constants.dart';
5+
import 'package:kuch_bhi_ai/services/assets_manager.dart';
6+
import 'package:kuch_bhi_ai/widgets/text_widget.dart';
7+
8+
class ChatWidget extends StatelessWidget {
9+
ChatWidget({required this.msg, required this.chatIndex});
10+
final String msg;
11+
final int chatIndex;
12+
@override
13+
Widget build(BuildContext context) {
14+
return Column(
15+
children: [
16+
// Material(
17+
Container(
18+
color: chatIndex == 0 ? kScaffoldBackgroundColor : kCardColor,
19+
child: Padding(
20+
padding: EdgeInsets.all(8),
21+
child: Row(
22+
crossAxisAlignment: CrossAxisAlignment.start,
23+
children: [
24+
Image.asset(
25+
chatIndex == 0 ? AssetsManager.userImage : AssetsManager.logo,
26+
height: 20,
27+
width: 20,
28+
),
29+
SizedBox(
30+
width: 8,
31+
),
32+
Expanded(
33+
child: TextWidget(
34+
label: msg,
35+
),
36+
),
37+
chatIndex == 0
38+
? SizedBox.shrink()
39+
: Row(
40+
mainAxisAlignment: MainAxisAlignment.end,
41+
mainAxisSize: MainAxisSize.min,
42+
children: [
43+
Icon(
44+
Icons.thumb_up_alt_outlined,
45+
color: Colors.white,
46+
),
47+
SizedBox(
48+
width: 5,
49+
),
50+
Icon(
51+
Icons.thumb_down_alt_outlined,
52+
color: Colors.white,
53+
),
54+
],
55+
),
56+
],
57+
),
58+
),
59+
),
60+
],
61+
);
62+
}
63+
}

Diff for: constants.dart

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:kuch_bhi_ai/widgets/text_widget.dart';
3+
4+
const Color kScaffoldBackgroundColor = Color(0xFF343541);
5+
const Color kCardColor = Color(0xFF444654);
6+
7+
const List<String> kModels = [
8+
'Model1',
9+
'Model2',
10+
'Model3',
11+
'Model4',
12+
'Model5',
13+
'Model6',
14+
'Model1',
15+
'Model2',
16+
'Model3',
17+
'Model4',
18+
'Model5',
19+
'Model6',
20+
];
21+
22+
List<DropdownMenuItem<String>>? get getModelsItem {
23+
List<DropdownMenuItem<String>>? modelsItems =
24+
List<DropdownMenuItem<String>>.generate(
25+
kModels.length,
26+
(index) => DropdownMenuItem(
27+
value: kModels[index],
28+
child: TextWidget(
29+
label: kModels[index],
30+
fontSize: 15,
31+
),
32+
),
33+
);
34+
return modelsItems;
35+
}
36+
37+
final chatMessages = [
38+
{
39+
'msg': 'Hello',
40+
'chatIndex': 0,
41+
},
42+
{
43+
'msg': 'Hello, How can I assist you today ?',
44+
'chatIndex': 1,
45+
},
46+
{
47+
'msg': 'How are you ?',
48+
'chatIndex': 0,
49+
},
50+
{
51+
'msg':
52+
'Finding a specific job would require access to current job listings, which I don\'t have. However, I can provide you with some guidance on how to find a Flutter job.',
53+
'chatIndex': 1,
54+
},
55+
{
56+
'msg': 'Can i restart my career after a 4 year gap ?',
57+
'chatIndex': 0,
58+
},
59+
{
60+
'msg':
61+
'Absolutely, you can restart your career after a 4-year gap! Many people take breaks from their careers for various reasons such as caregiving, personal development, health reasons, or exploring new interests.',
62+
'chatIndex': 1,
63+
},
64+
];

Diff for: drop_down.dart

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:kuch_bhi_ai/constants/constants.dart';
3+
import 'package:kuch_bhi_ai/services/api_service.dart';
4+
import 'package:kuch_bhi_ai/widgets/text_widget.dart';
5+
6+
class ModelDropDownWidget extends StatefulWidget {
7+
@override
8+
State<ModelDropDownWidget> createState() => _ModelDropDownWidgetState();
9+
}
10+
11+
class _ModelDropDownWidgetState extends State<ModelDropDownWidget> {
12+
String currentModel = 'Model 1';
13+
@override
14+
Widget build(BuildContext context) {
15+
return FutureBuilder(
16+
future: ApiService.getModels(),
17+
builder: (context, snapshot) {
18+
if (snapshot.hasError) {
19+
return Center(
20+
child: TextWidget(
21+
label: snapshot.error.toString(),
22+
),
23+
);
24+
}
25+
return snapshot.data == null || snapshot.data!.isEmpty
26+
? SizedBox.shrink()
27+
: DropdownButton(
28+
dropdownColor: kScaffoldBackgroundColor,
29+
iconEnabledColor: Colors.white,
30+
items: getModelsItem,
31+
value: currentModel,
32+
onChanged: (value) {
33+
setState(() {
34+
currentModel = value.toString();
35+
});
36+
},
37+
);
38+
});
39+
}
40+
}

Diff for: main.dart

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import 'package:flutter/material.dart';
2+
3+
import 'constants/constants.dart';
4+
import 'screens/chat_screen.dart';
5+
6+
void main() {
7+
runApp(MyApp());
8+
}
9+
10+
class MyApp extends StatelessWidget {
11+
// This widget is the root of your application.
12+
@override
13+
Widget build(BuildContext context) {
14+
return MaterialApp(
15+
debugShowCheckedModeBanner: false,
16+
theme: ThemeData(
17+
scaffoldBackgroundColor: kScaffoldBackgroundColor,
18+
appBarTheme: AppBarTheme(
19+
color: kCardColor,
20+
),
21+
),
22+
home: ChatScreen(),
23+
);
24+
}
25+
}

Diff for: models_model.dart

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'dart:convert';
2+
import 'dart:io';
3+
import 'package:kuch_bhi_ai/constants/api_consts.dart';
4+
import 'package:http/http.dart' as http;
5+
6+
class ModelsModel {
7+
final String id;
8+
final int created;
9+
final String root;
10+
11+
ModelsModel({
12+
required this.id,
13+
required this.root,
14+
required this.created,
15+
});
16+
17+
factory ModelsModel.fromJson(Map<String, dynamic> json) => ModelsModel(
18+
id: json['id'],
19+
root: json['root'],
20+
created: json['created'],
21+
);
22+
23+
static List<ModelsModel> modelsFromSnapshot(List modelSnapshot) {
24+
return modelSnapshot.map((data) => ModelsModel.fromJson(data)).toList();
25+
}
26+
}

0 commit comments

Comments
 (0)