import 'dart:developer'; import 'package:flutter/material.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/blocs/qr/functions/bloc_setqr.dart'; import 'package:ocbo_esign_mobile/functions/get_api.dart'; import 'package:ocbo_esign_mobile/widgets/button_widget.dart'; import 'package:ocbo_esign_mobile/widgets/text_widget.dart'; import 'package:vibration/vibration.dart'; class ValidatePage extends StatelessWidget { const ValidatePage({super.key}); @override Widget build(BuildContext context) { return const MaterialApp(debugShowCheckedModeBanner: false, home: BarcodeScannerScreen()); } } class BarcodeScannerScreen extends StatefulWidget { const BarcodeScannerScreen({super.key}); @override State createState() => _BarcodeScannerScreenState(); } 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 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 != null) { setState(() { qrResult = result; }); } else { setState(() { qrResult = 'non-exist'; }); Future.delayed(Duration(seconds: 3), () { setState(() { qrResult = ''; }); }); } } else { setState(() { qrResult = 'invalid'; }); Future.delayed(Duration(seconds: 3), () { setState(() { qrResult = ''; }); }); } } void updateBlockQr() async { await blocSetQr(context, qrResult); } void gotoDetails() { updateBlockQr(); context.push('/details'); } @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), ], ), ), child: Center( child: Padding( padding: const EdgeInsets.only(top: 64, left: 16, right: 16), child: Column( children: [ Container( padding: EdgeInsets.only(top: 8, bottom: 8, left: 20, right: 20), decoration: BoxDecoration( color: const Color.fromRGBO(9, 13, 16, 0.725), borderRadius: BorderRadius.circular(32), ), child: const TextWidget(text: 'Scan OCBO e-Sign QR Code', size: 14, bold: true), ), const Gap(24), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(36), border: BoxBorder.all(color: const Color.fromARGB(64, 227, 227, 227)), // boxShadow: [ // const BoxShadow( // color: Color.fromRGBO(5, 5, 8, 0.526), // blurRadius: 6, // offset: Offset(4, 4), // left and up // ), // const BoxShadow( // color: Color.fromRGBO(92, 71, 97, 0.526), // blurRadius: 6, // offset: Offset(-4, -4), // right and down // ), // ], ), height: 330, width: 340, child: ClipRRect( borderRadius: BorderRadius.circular(36), // Adjust the radius as needed child: MobileScanner( fit: BoxFit.cover, onDetect: (BarcodeCapture capture) async { final List barcodes = capture.barcodes; if (barcodes.isNotEmpty && barcodes.first.rawValue != null) { readQr(barcodes.first.rawValue!); if (await Vibration.hasVibrator()) { Vibration.vibrate(duration: 100); } } }, ), ), ), const Gap(24), ButtonWidget(text: 'Try API', disabled: false, onPressed: tryQR), if (qrResult.isNotEmpty) Column( children: [ if (qrResult == 'invalid') 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: '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 Column( children: [ Container( width: MediaQuery.of(context).size.width - 160, padding: const EdgeInsets.fromLTRB(8, 16, 8, 26), decoration: BoxDecoration( 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), ), ], ), ), const Gap(24), TextWidget(text: qrResult, bold: true, size: 20, color: greenColor), const Gap(24), ButtonWidget(text: "Show Details", disabled: false, onPressed: gotoDetails), ], ), ], ), ], ), ), ), ), ); } }