No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

login_screen.dart 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:firebase_core/firebase_core.dart';
  4. import 'package:firebase_messaging/firebase_messaging.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:flutter/services.dart';
  7. import 'package:flutter_udid/flutter_udid.dart';
  8. import 'package:fluttertoast/fluttertoast.dart';
  9. import 'package:google_fonts/google_fonts.dart';
  10. import 'package:employee_selfservice_mobile/Screens/ForgotPassword/forgotPassword_screen.dart';
  11. import 'package:employee_selfservice_mobile/Screens/Login/background.dart';
  12. import 'package:employee_selfservice_mobile/Screens/Login/post_result_model.dart';
  13. import 'package:employee_selfservice_mobile/Screens/Splash/splash_screen.dart';
  14. import 'package:progress_dialog_null_safe/progress_dialog_null_safe.dart';
  15. import 'package:shared_preferences/shared_preferences.dart';
  16. import '../../firebase_options.dart';
  17. import '../Home/home_screen.dart';
  18. import 'inputWidget.dart';
  19. import 'dart:developer' as logDev;
  20. //import 'package:plain_notification_token/plain_notification_token.dart';
  21. class LoginView extends StatefulWidget {
  22. @override
  23. _LoginView createState() => _LoginView();
  24. }
  25. class _LoginView extends State<LoginView> {
  26. @override
  27. Widget build(BuildContext context) {
  28. return Scaffold(
  29. resizeToAvoidBottomInset: false,
  30. backgroundColor: Colors.white,
  31. body: Stack(
  32. children: <Widget>[
  33. Background(),
  34. LoginScreen(),
  35. ],
  36. ));
  37. }
  38. }
  39. class LoginScreen extends StatefulWidget {
  40. @override
  41. State<LoginScreen> createState() => _LoginScreenState();
  42. }
  43. class _LoginScreenState extends State<LoginScreen> {
  44. late LoginPostResult loginPostResult;
  45. String version = "1.0.0";
  46. String notif_token = "";
  47. late StreamSubscription onTokenRefreshSubscription;
  48. @override
  49. void initState() {
  50. super.initState();
  51. }
  52. @override
  53. Widget build(BuildContext context) {
  54. ProgressDialog loading = ProgressDialog(context);
  55. loading = ProgressDialog(context,
  56. type: ProgressDialogType.normal, isDismissible: false, showLogs: true);
  57. loading.style(
  58. message: 'Please Wait .....',
  59. borderRadius: 5,
  60. backgroundColor: Colors.white,
  61. progressWidget: CircularProgressIndicator(),
  62. elevation: 10.0,
  63. padding: EdgeInsets.all(10),
  64. insetAnimCurve: Curves.easeInOut,
  65. progress: 0.0,
  66. maxProgress: 100.0,
  67. progressTextStyle: TextStyle(
  68. color: Colors.black, fontSize: 10.0, fontWeight: FontWeight.w400),
  69. messageTextStyle: TextStyle(
  70. color: Colors.black, fontSize: 15.0, fontWeight: FontWeight.w600));
  71. return SingleChildScrollView(
  72. reverse: true,
  73. padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
  74. child: Column(
  75. children: <Widget>[
  76. Padding(
  77. padding:
  78. EdgeInsets.only(top: MediaQuery.of(context).size.height / 2.45),
  79. ),
  80. Column(
  81. children: <Widget>[
  82. Column(
  83. crossAxisAlignment: CrossAxisAlignment.center,
  84. children: <Widget>[
  85. Padding(
  86. padding: EdgeInsets.only(top: 0),
  87. child: Text(
  88. "Login",
  89. style: GoogleFonts.knewave(
  90. color: Colors.blueAccent, fontSize: 25),
  91. ),
  92. ),
  93. ],
  94. ),
  95. Column(
  96. crossAxisAlignment: CrossAxisAlignment.start,
  97. children: <Widget>[
  98. Padding(
  99. padding: EdgeInsets.only(left: 40, bottom: 5, top: 20),
  100. child: Text(
  101. "Email",
  102. style: TextStyle(fontSize: 16, color: Colors.black87),
  103. ),
  104. ),
  105. Stack(
  106. alignment: Alignment.bottomRight,
  107. children: <Widget>[
  108. InputWidgetEmail(20.0, 20.0),
  109. Padding(
  110. padding: EdgeInsets.only(right: 50),
  111. ),
  112. ],
  113. ),
  114. ],
  115. ),
  116. Column(
  117. crossAxisAlignment: CrossAxisAlignment.start,
  118. children: <Widget>[
  119. Padding(
  120. padding: EdgeInsets.only(left: 40, bottom: 5),
  121. child: Text(
  122. "Password",
  123. style: TextStyle(fontSize: 16, color: Colors.black87),
  124. ),
  125. ),
  126. Stack(
  127. alignment: Alignment.bottomRight,
  128. children: <Widget>[
  129. InputWidgetPassword(20.0, 20.0),
  130. Padding(
  131. padding: EdgeInsets.only(right: 15),
  132. child: Row(
  133. children: <Widget>[
  134. Expanded(
  135. child: Padding(
  136. padding: EdgeInsets.only(top: 0),
  137. )),
  138. InkWell(
  139. child: Container(
  140. padding: EdgeInsets.all(10),
  141. decoration: ShapeDecoration(
  142. shape: CircleBorder(),
  143. gradient: LinearGradient(
  144. colors: Gradients2,
  145. begin: Alignment.topLeft,
  146. end: Alignment.bottomRight),
  147. ),
  148. child: ImageIcon(
  149. AssetImage("assets/images/ic_forward.png"),
  150. size: 40,
  151. color: Colors.white,
  152. ),
  153. ),
  154. onTap: () async {
  155. String imei;
  156. try {
  157. imei = await FlutterUdid.udid;
  158. } on PlatformException {
  159. imei = 'Failed to get UDID.';
  160. }
  161. logDev.log(imei, name: "IMEI");
  162. if (!validateForm(context)) {
  163. return;
  164. } else {
  165. await loading.show();
  166. await Firebase.initializeApp(
  167. options: DefaultFirebaseOptions.currentPlatform,
  168. );
  169. final notif_token = await FirebaseMessaging.instance.getToken();
  170. logDev.log(notif_token.toString(), name: "NOTIFICATION TOKEN");
  171. LoginPostResult.connectToAPI(
  172. emailController.text.toString(),
  173. passwordController.text.toString(),
  174. notif_token!,
  175. version,
  176. platform(),
  177. imei)
  178. .then((valueResult) async {
  179. Map<String, dynamic> object = json.decode(valueResult);
  180. if (object.containsKey("result").toString() == "true") {
  181. String status = object['result']['status'].toString();
  182. if (status == "success") {
  183. Fluttertoast.showToast(
  184. msg: "Login Success",
  185. toastLength: Toast.LENGTH_SHORT,
  186. gravity: ToastGravity.CENTER,
  187. timeInSecForIosWeb: 1,
  188. textColor: Colors.white,
  189. fontSize: 16.0);
  190. var prefs = await SharedPreferences.getInstance();
  191. await prefs.setString('version', version);
  192. await prefs.setString('device', object['result']['device'].toString());
  193. await prefs.setString('session', object['result']['hash'].toString());
  194. await prefs.setString('name', object['result']['name'].toString());
  195. await prefs.setString('notif_token', notif_token);
  196. emailController.clear();
  197. passwordController.clear();
  198. await loading.hide();
  199. Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeView()));
  200. } else if (status == "failed") {
  201. String message = object['result']['message'].toString();
  202. Fluttertoast.showToast(
  203. msg: message,
  204. toastLength: Toast.LENGTH_SHORT,
  205. gravity: ToastGravity.CENTER,
  206. timeInSecForIosWeb: 1,
  207. textColor: Colors.white,
  208. fontSize: 16.0);
  209. await loading.hide();
  210. }
  211. } else {
  212. await loading.hide();
  213. alertDialogFailedResponse(context);
  214. }
  215. });
  216. }
  217. },
  218. )
  219. ],
  220. ),
  221. ),
  222. /*Padding(
  223. padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom)
  224. )*/
  225. ],
  226. ),
  227. ],
  228. ),
  229. Padding(
  230. padding: EdgeInsets.only(bottom: 10),
  231. ),
  232. InkWell(
  233. child:
  234. roundedRectButton("Forgot Password?", Gradients1, false),
  235. onTap: () {
  236. Navigator.push(
  237. context,
  238. MaterialPageRoute(
  239. builder: (context) => ForgotPasswordView()));
  240. })
  241. ],
  242. )
  243. ],
  244. ),
  245. );
  246. }
  247. }
  248. Widget roundedRectButton(
  249. String title, List<Color> gradient, bool isEndIconVisible) {
  250. return Builder(builder: (BuildContext mContext) {
  251. return Align(
  252. alignment: Alignment.centerLeft,
  253. child: Stack(
  254. children: <Widget>[
  255. Container(
  256. alignment: Alignment.centerRight,
  257. width: MediaQuery.of(mContext).size.width / 2.45,
  258. decoration: ShapeDecoration(
  259. shape: RoundedRectangleBorder(
  260. borderRadius: BorderRadius.only(
  261. topRight: Radius.circular(20.0),
  262. bottomRight: Radius.circular(20.0))),
  263. gradient: LinearGradient(
  264. colors: gradient,
  265. begin: Alignment.topLeft,
  266. end: Alignment.bottomRight),
  267. ),
  268. child: Text(title,
  269. style: TextStyle(
  270. decoration: TextDecoration.underline,
  271. color: Colors.white,
  272. fontSize: 15,
  273. fontWeight: FontWeight.w500)),
  274. padding: EdgeInsets.all(10),
  275. ),
  276. Visibility(
  277. visible: isEndIconVisible,
  278. child: Padding(
  279. padding: EdgeInsets.only(right: 10),
  280. child: ImageIcon(
  281. AssetImage("assets/images/ic_forward.png"),
  282. size: 30,
  283. color: Colors.white,
  284. )),
  285. ),
  286. ],
  287. ),
  288. );
  289. });
  290. }
  291. const List<Color> Gradients1 = [
  292. /*Color(0xFFFFFFFF),
  293. Color(0xFFFFFFFF),*/
  294. Color(0xFF03A0FE),
  295. Colors.pink,
  296. ];
  297. const List<Color> Gradients2 = [
  298. Color(0xFFFF9945),
  299. Color(0xFFFc6076),
  300. ];
  301. bool validateForm(BuildContext context) {
  302. bool result = true;
  303. if (emailController.text.toString().isEmpty) {
  304. /*final snackBar = SnackBar(content: Text("Email Required"));
  305. ScaffoldMessenger.of(context).showSnackBar(snackBar);*/
  306. Fluttertoast.showToast(
  307. msg: "Email Required",
  308. toastLength: Toast.LENGTH_SHORT,
  309. gravity: ToastGravity.CENTER,
  310. timeInSecForIosWeb: 1,
  311. textColor: Colors.white,
  312. fontSize: 16.0);
  313. result = false;
  314. } else if (!emailController.text.toString().contains("@")) {
  315. Fluttertoast.showToast(
  316. msg: "Incorrect email format",
  317. toastLength: Toast.LENGTH_SHORT,
  318. gravity: ToastGravity.CENTER,
  319. timeInSecForIosWeb: 1,
  320. textColor: Colors.white,
  321. fontSize: 16.0);
  322. result = false;
  323. } else if (passwordController.text.toString().isEmpty) {
  324. Fluttertoast.showToast(
  325. msg: "Password Required",
  326. toastLength: Toast.LENGTH_SHORT,
  327. gravity: ToastGravity.CENTER,
  328. timeInSecForIosWeb: 1,
  329. textColor: Colors.white,
  330. fontSize: 16.0);
  331. result = false;
  332. }
  333. return result;
  334. }
  335. alertDialogFailedResponse(BuildContext context){
  336. Widget okButton = TextButton(
  337. child: Text("Refresh"),
  338. onPressed: () {
  339. Navigator.of(context, rootNavigator: true).pop();
  340. Navigator.pushReplacement(context, MaterialPageRoute(
  341. builder: (context) => SplashScreen()));
  342. },
  343. );
  344. Widget noButton = TextButton(
  345. child: Text("Back"),
  346. onPressed: () {
  347. Navigator.of(context, rootNavigator: true).pop();
  348. Navigator.pop(context);
  349. },
  350. );
  351. // set up the AlertDialog
  352. AlertDialog alert = AlertDialog(
  353. title: Text("Employee Self Service"),
  354. content: Text("Server Response Error"),
  355. actions: [
  356. noButton,
  357. okButton,
  358. ],
  359. );
  360. // show the dialog
  361. showDialog(
  362. context: context,
  363. barrierDismissible: false,
  364. builder: (BuildContext context) {
  365. return alert;
  366. },
  367. );
  368. }