Nessuna descrizione
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

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