@@ -39,6 +39,10 @@ class ChatGptPage extends LayoutWidget {
39
39
// TODO: implement backgroundColor
40
40
Color ? get backgroundColor => const Color (0xFF2b2b35 );
41
41
42
+ @override
43
+ // TODO: implement padding
44
+ EdgeInsetsGeometry ? get padding => null ;
45
+
42
46
@override
43
47
Widget contentDesktopWidget (BuildContext context) {
44
48
return ContentPage ();
@@ -56,69 +60,75 @@ class ContentPage extends BaseStlessWidget<ChatGptProvider> {
56
60
@override
57
61
Widget bodyWidget (
58
62
BuildContext context, ChatGptProvider viewModel, Widget ? child) {
59
- return Column (
63
+ return Row (
60
64
children: [
65
+ _buildLeftNavigation (context, viewModel),
61
66
Expanded (
62
- child: Stack (
63
- alignment: Alignment .topCenter,
64
- children: [
65
- _gptMessageWidget (context, viewModel),
66
- Visibility (
67
- visible: viewModel.showConversation,
68
- child: ConversationPage (
69
- onVisibleChanged: (visible) {
70
- viewModel.showConversation = visible;
71
- },
72
- ),
73
- ),
74
- Align (
75
- child: _toolsWidget (context, viewModel),
76
- alignment: Alignment .centerLeft,
77
- ),
78
- ],
79
- ),
80
- ),
81
- const SizedBox (
82
- height: 20 ,
83
- ),
84
- Container (
85
- margin: EdgeInsets .symmetric (horizontal: margin),
86
- alignment: Alignment .center,
87
- child: Column (children: [
88
- Visibility (
89
- visible: viewModel.showSettings,
90
- child: const Column (
67
+ child: Column (
68
+ children: [
69
+ SizedBox (height: 10 ,),
70
+ Expanded (
71
+ child: Stack (
72
+ alignment: Alignment .topCenter,
91
73
children: [
92
- OpenAiSetting (),
93
- SizedBox (
94
- height: 20 ,
74
+ _gptMessageWidget (context, viewModel),
75
+ Visibility (
76
+ visible: viewModel.showConversation,
77
+ child: ConversationPage (
78
+ onVisibleChanged: (visible) {
79
+ viewModel.showConversation = visible;
80
+ },
81
+ ),
95
82
),
96
83
],
97
84
),
98
85
),
99
- OutBorderTextFormField (
100
- hintText: 'Message ChatGPT...' ,
101
- controller: viewModel.controller,
102
- textInputAction: TextInputAction .send,
103
- textStyle: const TextStyle (color: Colors .white),
104
- focusColor: GlobalColors .success,
105
- onFieldSubmitted: (value) {
106
- viewModel.send (context);
107
- },
108
- suffixWidget: InkWell (
109
- child: Icon (
110
- Icons .send,
111
- color: viewModel.isLoading
112
- ? GlobalColors .border
113
- : GlobalColors .success,
86
+ const SizedBox (
87
+ height: 20 ,
88
+ ),
89
+ Container (
90
+ margin: EdgeInsets .symmetric (horizontal: margin),
91
+ alignment: Alignment .center,
92
+ child: Column (children: [
93
+ Visibility (
94
+ visible: viewModel.showSettings,
95
+ child: const Column (
96
+ children: [
97
+ OpenAiSetting (),
98
+ SizedBox (
99
+ height: 20 ,
100
+ ),
101
+ ],
102
+ ),
114
103
),
115
- onTap: () {
116
- viewModel.send (context);
117
- },
118
- ),
104
+ OutBorderTextFormField (
105
+ hintText: 'Message ChatGPT...' ,
106
+ controller: viewModel.controller,
107
+ textInputAction: TextInputAction .send,
108
+ textStyle: const TextStyle (color: Colors .white),
109
+ focusColor: GlobalColors .success,
110
+ onFieldSubmitted: (value) {
111
+ viewModel.send (context);
112
+ },
113
+ suffixWidget: InkWell (
114
+ child: Icon (
115
+ Icons .send,
116
+ color: viewModel.isLoading
117
+ ? GlobalColors .border
118
+ : GlobalColors .success,
119
+ ),
120
+ onTap: () {
121
+ viewModel.send (context);
122
+ },
123
+ ),
124
+ ),
125
+ SizedBox (
126
+ height: 10 ,
127
+ )
128
+ ]),
119
129
),
120
- ]) ,
121
- ),
130
+ ],
131
+ ))
122
132
],
123
133
);
124
134
}
@@ -235,6 +245,18 @@ class ContentPage extends BaseStlessWidget<ChatGptProvider> {
235
245
label: const Text (
236
246
'Save Image' ,
237
247
style: TextStyle (color: Colors .white),
248
+ )),
249
+ const Spacer (),
250
+ TextButton .icon (
251
+ onPressed: () async {},
252
+ icon: const Icon (
253
+ Icons .refresh,
254
+ color: GlobalColors .success,
255
+ size: 16 ,
256
+ ),
257
+ label: const Text (
258
+ 'Refresh' ,
259
+ style: TextStyle (color: Colors .white),
238
260
))
239
261
],
240
262
)
@@ -247,99 +269,77 @@ class ContentPage extends BaseStlessWidget<ChatGptProvider> {
247
269
);
248
270
}
249
271
250
- _toolsWidget (BuildContext ctx , ChatGptProvider viewModel) {
251
- UserEntity ? loginUser = ctx .watch <StoreProvider >().user;
272
+ _buildLeftNavigation (BuildContext context , ChatGptProvider viewModel) {
273
+ UserEntity ? loginUser = context .watch <StoreProvider >().user;
252
274
String avatar = loginUser != null ? (loginUser.avatar ?? '' ) : '' ;
253
275
254
- return Container (
255
- width: 80 ,
256
- padding: const EdgeInsets .symmetric (vertical: 30 ),
257
- decoration: BoxDecoration (
258
- color: const Color (0xFF45454e ),
259
- borderRadius: BorderRadius .circular (10 ),
260
- border: Border .all (color: GlobalColors .gray, width: 1 )),
261
- child: Column (
262
- mainAxisSize: MainAxisSize .min,
263
- children: [
264
- InkWell (
265
- child: SvgPicture .asset (
266
- 'assets/logo/logo_white.svg' ,
267
- width: 35 ,
268
- height: 35 ,
269
- ),
270
- onTap: () {
271
- Navigator .of (ctx).pop ();
272
- },
273
- ),
274
- const SizedBox (
275
- height: 10 ,
276
- ),
277
- const Divider (
278
- color: GlobalColors .border,
279
- indent: 20 ,
280
- endIndent: 20 ,
281
- ),
282
- const SizedBox (
283
- height: 10 ,
284
- ),
285
- IconButton (
286
- onPressed: () {
287
- ctx.read <ChatGptProvider >().startNewChat (ctx);
288
- },
289
- icon: const Icon (
290
- Icons .add_circle_outline,
291
- color: Colors .white,
292
- size: 30 ,
293
- )),
294
- const SizedBox (
295
- height: 10 ,
276
+ return NavigationRail (
277
+ elevation: 1 ,
278
+ backgroundColor: Color (0xFF45454e ),
279
+ leading: SizedBox (
280
+ height: 100 ,
281
+ child: InkWell (
282
+ child: SvgPicture .asset (
283
+ 'assets/logo/logo_white.svg' ,
284
+ width: 35 ,
285
+ height: 35 ,
296
286
),
297
- IconButton (
298
- onPressed: () {
299
- viewModel.toggleConversation (ctx);
300
- },
301
- icon: const Icon (
302
- Icons .history,
303
- color: Colors .white,
304
- size: 30 ,
305
- )),
306
- const SizedBox (
307
- height: 10 ,
308
- ),
309
- IconButton (
310
- onPressed: () {
311
- viewModel.toggleSetting (ctx);
287
+ onTap: () {
288
+ Navigator .of (context).pop ();
289
+ },
290
+ ),
291
+ ),
292
+ trailing: Expanded (
293
+ child: Column (
294
+ children: [
295
+ Spacer (),
296
+ InkWell (
297
+ child: CircleAvatar (
298
+ backgroundImage: (avatar != null && avatar.isNotEmpty
299
+ ? NetworkImage (avatar)
300
+ : const AssetImage ('assets/user/user-02.png' ))
301
+ as ImageProvider ,
302
+ radius: 20 ,
303
+ ),
304
+ onTap: () {
305
+ Navigator .of (context).pushNamed ('/profile' );
312
306
},
313
- icon: const Icon (
314
- Icons .settings,
315
- color: Colors .white,
316
- size: 30 ,
317
- )),
318
- const SizedBox (
319
- height: 10 ,
320
- ),
321
- const Divider (
322
- color: GlobalColors .border,
323
- indent: 20 ,
324
- endIndent: 20 ,
325
- ),
326
- const SizedBox (
327
- height: 10 ,
328
- ),
329
- InkWell (
330
- child: CircleAvatar (
331
- backgroundImage: (avatar != null && avatar.isNotEmpty
332
- ? NetworkImage (avatar)
333
- : const AssetImage ('assets/user/user-02.png' ))
334
- as ImageProvider ,
335
- radius: 20 ,
336
307
),
337
- onTap : () {
338
- Navigator . of (ctx). pushNamed ( '/profile' );
339
- },
340
- )
341
- ] ,
308
+ SizedBox (
309
+ height : 20 ,
310
+ )
311
+ ],
312
+ ) ,
342
313
),
314
+ extended: false ,
315
+ onDestinationSelected: (index) {
316
+ return _onDestinationSelected (context, index, viewModel);
317
+ },
318
+ destinations: viewModel.destinations,
319
+ labelType: NavigationRailLabelType .all,
320
+ selectedIndex: viewModel.selectedIndex,
321
+ unselectedLabelTextStyle: TextStyle (color: Colors .white),
322
+ selectedLabelTextStyle: TextStyle (color: GlobalColors .success),
323
+ selectedIconTheme: IconThemeData (color: GlobalColors .success),
324
+ unselectedIconTheme: IconThemeData (color: Colors .white),
325
+ useIndicator: false ,
343
326
);
344
327
}
328
+
329
+ void _onDestinationSelected (
330
+ BuildContext context, int index, ChatGptProvider viewModel) {
331
+ viewModel.selectedIndex = index;
332
+ if (index == 0 ) {
333
+ viewModel.hideSetting (context);
334
+ viewModel.hideConversation (context);
335
+ viewModel.startNewChat (context);
336
+
337
+ } else if (index == 1 ) {
338
+ viewModel.toggleConversation (context);
339
+ viewModel.hideSetting (context);
340
+ } else if (index == 6 ) {
341
+ viewModel.hideConversation (context);
342
+ viewModel.toggleSetting (context);
343
+ }
344
+ }
345
345
}
0 commit comments