· 6 years ago · Oct 11, 2019, 05:18 PM
1import 'dart:async';
2import 'dart:io' show Platform;
3
4import 'package:flutter/cupertino.dart';
5import 'package:badges/badges.dart';
6import 'package:affa_erp_second/login.dart';
7import 'package:affa_erp_second/constants.dart';
8import 'package:affa_erp_second/orderlist.dart';
9import 'package:affa_erp_second/search.dart';
10import 'package:affa_erp_second/passwordchange.dart';
11import 'package:affa_erp_second/notifications.dart';
12import 'package:flutter/material.dart';
13import 'package:shared_preferences/shared_preferences.dart';
14import 'package:affa_erp_second/model/OrdersCount.dart';
15import 'package:http/http.dart' as http;
16import 'dart:convert';
17import 'package:affa_erp_second/model/NotificationCount.dart';
18import 'package:affa_erp_second/model/DepartmentActivity.dart';
19import 'package:affa_erp_second/departmentorders.dart';
20import 'package:affa_erp_second/personelorders.dart';
21import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
22import 'constants.dart';
23import 'singleOrder.dart';
24import 'package:fluro/fluro.dart';
25import 'model/CheckDepartmentModel.dart';
26import 'model/User.dart';
27
28Future<void> main() async {
29 try {
30 SharedPreferences preferences = await SharedPreferences.getInstance();
31 String token = preferences.get('token');
32 String name = preferences.get('name');
33 String surname = preferences.get('surname');
34 String department = preferences.get('department');
35 String departmentId = preferences.get('departmentId');
36 String userId = preferences.get('id');
37 User user = User(
38 name: name,
39 surname: surname,
40 token: token,
41 departmentId: departmentId,
42 department: department,
43 userId: userId);
44
45 runApp(MyApp(user));
46 } catch (error) {
47 print('Locator setup has failed');
48 }
49}
50
51class MyApp extends StatelessWidget {
52 final User user;
53
54 MyApp(this.user);
55 @override
56 Widget build(BuildContext context) {
57 return MaterialApp(
58 debugShowCheckedModeBanner: false,
59 initialRoute: '/',
60 routes: {
61 '/': (context) =>
62 user.token == null ? LoginPage() : HomePage(user: user),
63 '/orderList': (context) => OrderList()
64 },
65 // ignore: missing_return
66 onGenerateRoute: (RouteSettings settings) {
67 List<String> params = settings.name.split("/");
68
69 if (params[0] == 'orderList') {
70 return MaterialPageRoute(
71 builder: (context) => OrderList(
72 user: user, orderType: params[2], orderStatus: params[1]),
73 );
74 }
75 },
76 );
77 }
78}
79
80class HomePage extends StatefulWidget {
81 final User user;
82
83 const HomePage({Key key, this.user}) : super(key: key);
84
85 @override
86 _HomePageState createState() => _HomePageState();
87}
88
89class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
90 String userName;
91 String userSurname;
92 String userDepartment;
93 String token;
94 String userID;
95 String departmentID;
96
97 var mainSectionHeaders = [
98 'Yeni təqdimatlar',
99 'Aktiv təqdimatlar',
100 'Təsdiqlənmiş təqdimatlar',
101 'Son tarixi bitmiş təqdimatlar',
102 'Sonlandırılmış təqdimatlar',
103 'Department sifarişləri'
104 ];
105
106 String orderStatus;
107 List<String> counts = [];
108 String notificationBadgeCount;
109 bool _isSwitched = false;
110 Role role;
111 Timer _timerLink;
112
113 @override
114 void initState() {
115 super.initState();
116 setUserData();
117
118 initDynamicLinks();
119
120 WidgetsBinding.instance.addObserver(this);
121
122 if (Platform.isAndroid) {
123 if (openedSecondTime == false) {
124// initDynamicLinks();
125 openedSecondTime = true;
126 }
127 }
128 }
129
130 @override
131 void dispose() {
132 WidgetsBinding.instance.removeObserver(this);
133 if (_timerLink != null) {
134 _timerLink.cancel();
135 }
136 super.dispose();
137 }
138
139 @override
140 void didChangeAppLifecycleState(AppLifecycleState state) {
141 if (state == AppLifecycleState.resumed) {
142 _timerLink = new Timer(const Duration(milliseconds: 1000), () {
143// if (Platform.isIOS) {
144// initDynamicLinks();
145// }
146 });
147 }
148 }
149
150 initDynamicLinks() async {
151 final PendingDynamicLinkData data =
152 await FirebaseDynamicLinks.instance.getInitialLink();
153 final Uri deepLink = data?.link;
154 if (deepLink != null) {
155 var firstIndex = deepLink.toString().indexOf("=");
156 var lastIndex = deepLink.toString().indexOf("&");
157 var orderID = deepLink.toString().substring(firstIndex + 1, lastIndex);
158 print("KEY: DIRECT");
159 checkDepartment(orderID).then((onValue) {
160 if (onValue) {
161 Navigator.push(
162 context,
163 MaterialPageRoute(
164 builder: (context) => SingleOrder(
165 widget.user.token,
166 orderID,
167 "new",
168 "normal",
169 widget.user.userId,
170 widget.user.departmentId,
171 role,
172 widget.user.name,
173 widget.user.surname),
174 ),
175 );
176 }
177 });
178 }
179
180 FirebaseDynamicLinks.instance.onLink(
181 onSuccess: (PendingDynamicLinkData dynamicLink) async {
182 final Uri deepLink = dynamicLink?.link;
183
184 if (deepLink != null) {
185 print("KEY: ON LINK");
186 var firstIndex = deepLink.toString().indexOf("=");
187 var lastIndex = deepLink.toString().indexOf("&");
188 var orderID = deepLink.toString().substring(firstIndex + 1, lastIndex);
189 checkDepartment(orderID).then((onValue) {
190 if (onValue) {
191 Navigator.push(
192 context,
193 MaterialPageRoute(
194 builder: (context) => SingleOrder(
195 widget.user.token,
196 orderID,
197 "new",
198 "normal",
199 widget.user.userId,
200 widget.user.departmentId,
201 role,
202 widget.user.name,
203 widget.user.surname),
204 ),
205 );
206 }
207 });
208 }
209 }, onError: (OnLinkErrorException e) async {
210 print("DYNAMIC LINK ERROR: ${e.message}");
211 });
212 }
213
214 setUserData() async {
215 final prefs = await SharedPreferences.getInstance();
216 setState(() {
217 token = prefs.getString("token");
218 userName = prefs.getString("name");
219 userSurname = prefs.getString("surname");
220 userDepartment = prefs.getString("department");
221 userID = prefs.getString("id");
222 departmentID = prefs.getString("departmentId");
223
224// if (widget.departmentID == "14") {
225// role = Role.SECRETARY_GENERAL;
226// } else if (widget.departmentID == "15") {
227// role = Role.SECRETARY_GENERAL;
228// } else if (widget.departmentID == "11") {
229// role = Role.COMMISSION;
230// } else {
231// role = Role.USER;
232// }
233
234 if (departmentID == "14") {
235 mainSectionHeaders.removeLast();
236 } else if (departmentID != "15") {
237 mainSectionHeaders[mainSectionHeaders.length - 1] =
238 "Mənim sifarişlərim";
239 }
240 });
241 }
242
243 Future<bool> checkDepartment(String orderID) async {
244 var api = apiCheckDepartment + orderID + "/$departmentID";
245 print(api);
246 var response = await http.get(api);
247 if (response.statusCode == 200) {
248 var object = CheckDepartment.fromJson(json.decode(response.body));
249 if (object.checkDepartmentResult[0].result == "ok") {
250 return true;
251 } else {
252 return false;
253 }
254 } else {
255 return false;
256 }
257 }
258
259 Future<OrdersCount> fetchOrderCounts() async {
260 var api = apiOrdersCount + widget.user.token;
261
262 print(api);
263 var response = await http.get(api);
264 if (response.statusCode == 200) {
265 counts = [];
266 var object = OrdersCount.fromJson(json.decode(response.body));
267 if (object.ordersCountResult[0].approvedOrders == "error") {
268 await showDialog(
269 context: context,
270 builder: (BuildContext context) {
271 return CupertinoAlertDialog(
272 title: new Text("Info"),
273 content: new Text("Hesabınıza giriş var!"),
274 actions: <Widget>[
275 // usually buttons at the bottom of the dialog
276 new FlatButton(
277 child: new Text("Ok"),
278 onPressed: () {
279 _clearPreferences(context);
280 Navigator.pushAndRemoveUntil(
281 context,
282 MaterialPageRoute(builder: (context) => LoginPage()),
283 (Route<dynamic> route) => false,
284 );
285 },
286 ),
287 ],
288 );
289 },
290 );
291 } else {
292 counts.add(object.ordersCountResult[0].newOrders);
293 counts.add(object.ordersCountResult[0].activeOrders);
294 counts.add(object.ordersCountResult[0].approvedOrders);
295 counts.add(object.ordersCountResult[0].declinedOrders);
296 counts.add(object.ordersCountResult[0].endedOrders);
297 if (departmentID != "14") {
298 counts.add("no");
299 }
300 }
301
302 return object;
303 } else {
304 throw Exception('Failed to load');
305 }
306 }
307
308 Future<NotificationCount> fetchNotificationCount() async {
309 String api = apiNotificationCount +
310 widget.user.userId +
311 "/" +
312 widget.user.departmentId;
313 print(api);
314 var response = await http.get(api);
315 if (response.statusCode == 200) {
316 return NotificationCount.fromJson(json.decode(response.body));
317 } else {
318 throw Exception('Failed to load');
319 }
320 }
321
322 Future<GetDepartmentActivity> fetchDepartmentActivity() async {
323 String api = apiGetDepartmentActivity + widget.user.departmentId;
324 print(api);
325 var response = await http.get(api);
326 if (response.statusCode == 200) {
327 var object = GetDepartmentActivity.fromJson(json.decode(response.body));
328 if (object.depActivityResult[0].active == "1") {
329 _isSwitched = true;
330 } else {
331 _isSwitched = false;
332 }
333 return object;
334 } else {
335 throw Exception('Failed to load');
336 }
337 }
338
339 Future setDepartmentActivity() async {
340 String api = apiSetDepartmentActivity + widget.user.token;
341 print(api);
342 var response = await http.get(api);
343 if (response.statusCode == 200) {
344 setState(() {
345 this.fetchDepartmentActivity();
346 });
347 } else {
348 throw Exception('Exception set department');
349 }
350 }
351
352 Future<Null> _refresh() {
353 return fetchOrderCounts().then((value) {
354 print(value);
355 });
356 }
357
358 @override
359 Widget build(BuildContext context) {
360 return Scaffold(
361 appBar: AppBar(
362 title: Image(
363 image: AssetImage('images/erp.png'),
364 ),
365 actions: <Widget>[
366 Align(
367 alignment: Alignment.centerLeft,
368 child: Transform.scale(
369 scale: 1.0,
370 child: FutureBuilder<GetDepartmentActivity>(
371 future: fetchDepartmentActivity(),
372 builder: (context, snapshot) {
373 return CupertinoSwitch(
374 onChanged: (bool value) {
375 setState(() {
376 setDepartmentActivity();
377 });
378 },
379 value: _isSwitched,
380 activeColor: Colors.green,
381 );
382 },
383 ),
384 ),
385 ),
386 Padding(
387 padding: EdgeInsets.only(right: 16),
388 child: Align(
389 alignment: Alignment.centerRight,
390 child: IconButton(
391 icon: FutureBuilder<NotificationCount>(
392 future: fetchNotificationCount(),
393 builder: (context, snapshot) {
394 if (snapshot.hasData) {
395 return Badge(
396 shape: BadgeShape.square,
397 borderRadius: 20,
398 badgeContent: Text(
399 snapshot.data.notificationCountResult[0].count,
400 style: TextStyle(
401 fontWeight: FontWeight.bold,
402 color: Colors.white),
403 ),
404 child: Icon(
405 Icons.notifications,
406 ),
407 );
408 } else if (snapshot.hasError) {
409 return Center(
410 child: Text("Internet əlaqəsini yoxlayın"),
411 );
412 }
413 return Center(
414 child: CupertinoActivityIndicator(),
415 );
416 }),
417 onPressed: () {
418 Navigator.push(
419 context,
420 MaterialPageRoute(
421 builder: (context) => NotificationsPage(token,
422 departmentID, userID, role, userName, userSurname),
423 ),
424 );
425 },
426 )),
427 )
428 ],
429 backgroundColor: primaryColor,
430 ),
431 body: RefreshIndicator(
432 key: RIKeys.riKey1,
433 onRefresh: _refresh,
434 child: Padding(
435 padding: EdgeInsets.all(8),
436 child: FutureBuilder<OrdersCount>(
437 future: fetchOrderCounts(),
438 builder: (context, snapshot) {
439 if (snapshot.hasData) {
440 return Container(
441 child: Center(
442 child: ListView.separated(
443 itemCount: counts.length,
444 itemBuilder: (context, index) {
445 return Container(
446 height: 37,
447 child: ListTile(
448 title: Align(
449 alignment: Alignment.topLeft,
450 child: Text(
451 mainSectionHeaders[index],
452 style: TextStyle(fontWeight: FontWeight.bold),
453 ),
454 ),
455 trailing: index != 5
456 ? Badge(
457 shape: BadgeShape.square,
458 borderRadius: 20,
459 badgeContent: Text(
460 counts[index],
461 style: TextStyle(
462 color: Colors.white,
463 fontWeight: FontWeight.bold),
464 ),
465 )
466 : Icon(Icons.keyboard_arrow_right),
467 onTap: () {
468 switch (index) {
469 case 0:
470 orderStatus = 'new';
471 break;
472 case 1:
473 orderStatus = 'active';
474 break;
475 case 2:
476 orderStatus = 'approved';
477 break;
478 case 3:
479 orderStatus = 'declined';
480 break;
481 case 4:
482 orderStatus = 'ended';
483 break;
484 }
485 if (index != 5) {
486// if (role == Role.SECRETARY_GENERAL) {
487// Navigator.push(
488// context,
489// MaterialPageRoute(
490// builder: (context) => OrderList(
491// orderStatus,
492// token,
493// userID,
494// departmentID,
495// userName,
496// userSurname,
497// 'normal'),
498// ),
499// );
500 Navigator.of(context)
501 .pushNamed('orderList/$orderStatus/normal');
502// } else {
503// Navigator.push(
504// context,
505// MaterialPageRoute(
506// builder: (context) => DepartmentOrderList(
507// orderStatus,
508// token,
509// userID,
510// departmentID,
511// userName,
512// userSurname,
513// 'normal_deputy'),
514// ),
515// );
516// }
517 } else {
518 if (departmentID == "15") {
519 Navigator.push(
520 context,
521 MaterialPageRoute(
522 builder: (context) => DepartmentOrder(
523 token,
524 userID,
525 departmentID,
526 role,
527 userName,
528 userSurname,
529 'deputy'),
530 ),
531 );
532 } else {
533 Navigator.push(
534 context,
535 MaterialPageRoute(
536 builder: (context) => PersonalOrders(
537 token,
538 userID,
539 departmentID,
540 role,
541 userName,
542 userSurname),
543 ),
544 );
545 }
546 }
547 },
548 ),
549 );
550 },
551 separatorBuilder: (context, index) {
552 return Divider();
553 },
554 )),
555 );
556 } else if (snapshot.hasError) {
557 return Center(
558 child: CircularProgressIndicator(),
559 );
560 }
561 return Center(
562 child: CircularProgressIndicator(),
563 );
564 },
565 ),
566 ),
567 ),
568 drawer: Drawer(
569 child: ListView(
570 padding: EdgeInsets.zero,
571 children: <Widget>[
572 UserAccountsDrawerHeader(
573 decoration: BoxDecoration(color: primaryColor),
574 accountName: Text(
575 (userName == null ? "" : userName) +
576 " " +
577 (userSurname == null ? "" : userSurname),
578 style: TextStyle(fontSize: 20),
579 ),
580 accountEmail: Text(userDepartment == null ? "" : userDepartment),
581 currentAccountPicture: CircleAvatar(
582 child: Text(''),
583// radius: 30,
584 backgroundImage:
585 NetworkImage(handlerUserProfileImageMain + userID),
586 backgroundColor: Colors.transparent,
587 ),
588 ),
589 ListTile(
590 title: Text('Axtarış'),
591 leading: Icon(Icons.search),
592 onTap: () {
593 Navigator.push(
594 context,
595 MaterialPageRoute(
596 builder: (context) => SearchPage(departmentID, token,
597 userID, role, userName, userSurname),
598 ),
599 );
600 },
601 ),
602 ListTile(
603 title: Text('Şifrəni dəyiş'),
604 leading: Icon(Icons.vpn_key),
605 onTap: () {
606 Navigator.push(
607 context,
608 MaterialPageRoute(
609 builder: (context) => ChangePassword(token)));
610 },
611 ),
612 ListTile(
613 title: Text('Çıxış et'),
614 leading: Icon(Icons.exit_to_app),
615 onTap: () async {
616 await showDialog(
617 context: context,
618 builder: (BuildContext context) {
619 return CupertinoAlertDialog(
620 title: Text("Çıxış"),
621 content: Text("Çıxış etmək istəyirsiz?"),
622 actions: [
623 FlatButton(
624 child: Text("No"),
625 onPressed: () {
626 Navigator.pop(context);
627 },
628 ),
629 FlatButton(
630 child: Text("Yes"),
631 onPressed: () {
632 _clearPreferences(context);
633 },
634 ),
635 ],
636 );
637 },
638 );
639 },
640 ),
641 ],
642 ),
643 ),
644 );
645 }
646}
647
648_clearPreferences(BuildContext context) async {
649 SharedPreferences prefs = await SharedPreferences.getInstance();
650 prefs.clear();
651 Navigator.pushAndRemoveUntil(
652 context,
653 MaterialPageRoute(builder: (context) => LoginPage()),
654 (Route<dynamic> route) => false,
655 );
656}