From fd33a67b47e91023149ed3cb31d17f0e204c82f7 Mon Sep 17 00:00:00 2001 From: Patrick Alvin Alcala Date: Mon, 26 Jan 2026 13:41:51 +0800 Subject: [PATCH] Updated pages --- lib/main.dart | 19 ++- lib/pages/index_page.dart | 4 +- lib/pages/login_page.dart | 82 +++++------ lib/pages/validate_detail_page.dart | 29 ++++ lib/pages/validate_page.dart | 206 ++++++++++++++++++---------- 5 files changed, 226 insertions(+), 114 deletions(-) create mode 100644 lib/pages/validate_detail_page.dart diff --git a/lib/main.dart b/lib/main.dart index c0df62f..ca91559 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,8 +6,8 @@ import 'package:ocbo_esign_mobile/blocs/user/user_bloc.dart'; import 'package:ocbo_esign_mobile/pages/approval_page.dart'; import 'package:ocbo_esign_mobile/pages/index_page.dart'; import 'package:ocbo_esign_mobile/pages/login_page.dart'; +import 'package:ocbo_esign_mobile/pages/validate_detail_page.dart'; import 'package:ocbo_esign_mobile/pages/validate_page.dart'; -import 'package:ocbo_esign_mobile/pages/validation_result_page.dart'; Future main() async { await dotenv.load(fileName: ".env"); @@ -50,7 +50,22 @@ final _router = GoRouter( ), ), // GoRoute(name: 'validate', path: '/validate', builder: (context, state) => const ValidatePage()), - GoRoute(name: 'result', path: '/result', builder: (context, state) => const ValidationResultPage()), + // GoRoute(name: 'details', path: '/details', builder: (context, state) => const ValidateDetailPage()), + GoRoute( + name: 'details', + path: '/details', + builder: (context, state) => const ValidateDetailPage(), + pageBuilder: (BuildContext context, GoRouterState state) => CustomTransitionPage( + key: state.pageKey, + child: const ValidateDetailPage(), + transitionsBuilder: (context, animation, secondaryAnimation, child) { + return SlideTransition( + position: Tween(begin: Offset(0.0, 1.0), end: Offset.zero).animate(animation), + child: child, + ); + }, + ), + ), ], ); diff --git a/lib/pages/index_page.dart b/lib/pages/index_page.dart index 7b447e8..7a84d23 100644 --- a/lib/pages/index_page.dart +++ b/lib/pages/index_page.dart @@ -83,9 +83,9 @@ class IndexPage extends StatelessWidget { ], ), const MaxGap(516), - Opacity( + const Opacity( opacity: 0.7, - child: const ImageWidget(imagePath: 'assets/pat-alcala.webp', size: 74, measureByHeight: false), + child: ImageWidget(imagePath: 'assets/pat-alcala.webp', size: 74, measureByHeight: false), ), const Gap(4), const TextWidget( diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 041cdfb..dfa7526 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -34,23 +34,23 @@ class _LoginPageState extends State { }); } - Future _checkConnection() async { - try { - final connection = await getApi('check-connection', null, null); - return connection["result"]; - } catch (e) { - return false; - } - } + // Future _checkConnection() async { + // try { + // final connection = await getApi('check-connection', null, null); + // return connection["result"]; + // } catch (e) { + // return false; + // } + // } - Future _getPassword(String employeeid) async { - try { - final response = await getApi('get-password', employeeid, null); - return (response["result"]); - } catch (e) { - return "0"; - } - } + // Future _getPassword(String employeeid) async { + // try { + // final response = await getApi('get-password', employeeid, null); + // return (response["result"]); + // } catch (e) { + // return "0"; + // } + // } Future _securePassword(String password) async { final firstHash = sha1.string(password); @@ -60,23 +60,23 @@ class _LoginPageState extends State { return thirdHash.toString(); } - void _login() async { - final connected = await _checkConnection(); + // void _login() async { + // final connected = await _checkConnection(); - if (connected) { - final employeeid = _approverId; - final dbpassword = await _getPassword(employeeid); - final hashPassword = await _securePassword(_passwordController.text); + // if (connected) { + // final employeeid = _approverId; + // final dbpassword = await _getPassword(employeeid); + // final hashPassword = await _securePassword(_passwordController.text); - if (context.mounted) { - if (dbpassword == hashPassword) { - _setLogin(); - } else { - _showDialog(); - } - } - } - } + // if (context.mounted) { + // if (dbpassword == hashPassword) { + // _setLogin(); + // } else { + // _showDialog(); + // } + // } + // } + // } void _setLogin() { blocSetUser(context, _approver); @@ -134,16 +134,16 @@ class _LoginPageState extends State { const Gap(8), InputWidget(controller: _passwordController, password: true), const Gap(24), - ValueListenableBuilder( - valueListenable: passwordNotifier, - builder: (context, password, child) { - return ButtonWidget( - text: password.isNotEmpty ? 'Login' : 'Required password', - onPressed: password.isNotEmpty ? _login : _ignoreButton, - disabled: password.isEmpty, - ); - }, - ), + // ValueListenableBuilder( + // valueListenable: passwordNotifier, + // builder: (context, password, child) { + // return ButtonWidget( + // text: password.isNotEmpty ? 'Login' : 'Required password', + // onPressed: password.isNotEmpty ? _login : _ignoreButton, + // disabled: password.isEmpty, + // ); + // }, + // ), ], ), ), diff --git a/lib/pages/validate_detail_page.dart b/lib/pages/validate_detail_page.dart new file mode 100644 index 0000000..2fddca8 --- /dev/null +++ b/lib/pages/validate_detail_page.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +class ValidateDetailPage extends StatelessWidget { + const ValidateDetailPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + resizeToAvoidBottomInset: false, + body: Container( + alignment: Alignment.center, + height: MediaQuery.of(context).size.height, + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color.fromRGBO(37, 25, 44, 1), + Color.fromRGBO(22, 33, 44, 1), + Color.fromRGBO(22, 33, 44, 1), + Color.fromRGBO(22, 33, 44, 1), + Color.fromRGBO(25, 46, 41, 1), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/validate_page.dart b/lib/pages/validate_page.dart index ad8909e..04942b6 100644 --- a/lib/pages/validate_page.dart +++ b/lib/pages/validate_page.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:gap/gap.dart'; +import 'package:go_router/go_router.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:ocbo_esign_mobile/functions/get_api.dart'; -import 'package:ocbo_esign_mobile/widgets/box_widget.dart'; +import 'package:ocbo_esign_mobile/widgets/button_widget.dart'; import 'package:ocbo_esign_mobile/widgets/text_widget.dart'; import 'package:vibration/vibration.dart'; @@ -25,24 +25,74 @@ class BarcodeScannerScreen extends StatefulWidget { class _BarcodeScannerScreenState extends State { late String qrResult = ''; + late String qrResultSub = ''; + final Color redColorShade = const Color.fromARGB(26, 225, 82, 103); + final Color redColor = const Color.fromARGB(255, 229, 89, 115); + final Color greenColorShade = const Color.fromRGBO(69, 191, 73, 0.1); + final Color greenColor = const Color.fromRGBO(76, 206, 81, 1); void readQr(String value) async { if (value.contains('OCBO e-Sign')) { - final response = await getApi('check-qr', value, null); - final result = response["result"]; + final qr = value.substring(35); + final response = await getApi('check-qr', qr, null); + final result = response["result"].toString(); if (result != '') { setState(() { qrResult = result; }); + } else { + setState(() { + qrResult = 'non-exist'; + }); } } else { setState(() { qrResult = 'invalid'; }); + + Future.delayed(Duration(seconds: 3), () { + setState(() { + qrResult = ''; + }); + }); } } + // void tryQR() async { + // final value = "Use OCBO e-Sign Validator - scanid=0918d59e"; + + // if (value.contains('OCBO e-Sign')) { + // final qr = value.substring(35); + // final response = await getApi('check-qr', qr, null); + // final result = response["result"].toString(); + + // if (result != '') { + // setState(() { + // qrResult = result; + // }); + // } else { + // setState(() { + // qrResult = 'result'; + // }); + // } + // } else { + // setState(() { + // qrResult = 'invalid'; + // }); + + // Future.delayed(Duration(seconds: 3), () { + // setState(() { + // qrResult = ''; + // }); + // }); + // } + // } + + void gotoDetails() { + context.push('/details'); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -114,91 +164,109 @@ class _BarcodeScannerScreenState extends State { ), ), const Gap(24), + // ButtonWidget(text: 'Try API', disabled: false, onPressed: tryQR), if (qrResult.isNotEmpty) Column( children: [ - if (qrResult != 'invalid') - Row( + if (qrResult == 'invalid') + Column( + crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( - padding: EdgeInsets.all(0), - width: 90, - height: 90, + width: MediaQuery.of(context).size.width - 160, + padding: const EdgeInsets.fromLTRB(8, 16, 8, 26), decoration: BoxDecoration( - color: const Color.fromRGBO(69, 191, 73, 0.1), - border: Border.all(color: const Color.fromRGBO(69, 191, 73, 1), width: 2), - borderRadius: BorderRadius.circular(99), // Optional: rounded corners + border: BoxBorder.all(color: redColor), + color: redColorShade, + borderRadius: BorderRadius.circular(12), ), - child: Icon(Icons.check, color: const Color.fromRGBO(69, 191, 73, 1), size: 48), - ), - const Gap(24), - - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextWidget( - text: 'Valid', - bold: true, - size: 22, - color: Color.fromRGBO(69, 191, 73, 1), - ), - const Gap(16), - const TextWidget( - text: 'QR is a valid OCBO e-Sign', - bold: false, - size: 14, - color: Color.fromRGBO(69, 191, 73, 1), - ), - ], - ), - const Gap(24), - BoxWidget( - title: '', - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: Column( children: [ - const TextWidget(text: 'Name', bold: true, size: 14), - const Gap(8), - TextWidget(text: qrResult, bold: false, size: 14), + TextWidget(text: 'Invalid', bold: true, size: 24, color: redColor), + const Gap(16), + Container( + width: 90, + height: 90, + decoration: BoxDecoration( + color: redColorShade, + border: Border.all(color: redColor, width: 2), + borderRadius: BorderRadius.circular(99), + ), + child: Icon(Icons.close, color: redColor, size: 48), + ), ], ), ), + const Gap(16), + TextWidget(text: 'Not valid OCBO e-Sign QR', bold: true, size: 20, color: redColor), + ], + ) + else if (qrResult != 'non-exist') + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: MediaQuery.of(context).size.width - 160, + padding: const EdgeInsets.fromLTRB(8, 16, 8, 26), + decoration: BoxDecoration( + border: BoxBorder.all(color: redColor), + color: redColorShade, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + children: [ + TextWidget(text: 'Unregistered', bold: true, size: 24, color: redColor), + const Gap(16), + Container( + width: 90, + height: 90, + decoration: BoxDecoration( + color: redColorShade, + border: Border.all(color: redColor, width: 2), + borderRadius: BorderRadius.circular(99), + ), + child: Icon(Icons.close, color: redColor, size: 48), + ), + ], + ), + ), + const Gap(16), + TextWidget(text: 'OCBO e-Sign QR is not registered', bold: true, size: 20, color: redColor), ], ) else - Row( + Column( children: [ Container( - padding: EdgeInsets.all(0), - width: 90, - height: 90, + width: MediaQuery.of(context).size.width - 160, + padding: const EdgeInsets.fromLTRB(8, 16, 8, 26), decoration: BoxDecoration( - color: const Color.fromRGBO(206, 74, 77, 0.1), - border: Border.all(color: const Color.fromRGBO(206, 74, 77, 1), width: 2), - borderRadius: BorderRadius.circular(99), + border: BoxBorder.all(color: greenColor), + color: greenColorShade, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + children: [ + TextWidget(text: 'Valid', bold: true, size: 24, color: greenColor), + const Gap(16), + Container( + padding: EdgeInsets.all(0), + width: 90, + height: 90, + decoration: BoxDecoration( + color: greenColorShade, + border: Border.all(color: greenColor, width: 2), + borderRadius: BorderRadius.circular(99), + ), + child: Icon(Icons.check, color: greenColor, size: 48), + ), + ], ), - child: Icon(Icons.close, color: const Color.fromRGBO(206, 74, 77, 1), size: 48), ), const Gap(24), - - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const TextWidget( - text: 'Invalid', - bold: true, - size: 22, - color: Color.fromRGBO(206, 74, 77, 1), - ), - const Gap(16), - const TextWidget( - text: 'QR is a not valid OCBO e-Sign', - bold: false, - size: 14, - color: Color.fromRGBO(206, 74, 77, 1), - ), - ], - ), + TextWidget(text: qrResult, bold: true, size: 20, color: greenColor), + const Gap(24), + ButtonWidget(text: "Show Details", disabled: false, onPressed: gotoDetails), ], ), ],