import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:gap/gap.dart'; import 'package:hashlib/hashlib.dart'; import 'package:ocbo_esign_validator/functions/get_api.dart'; import 'package:ocbo_esign_validator/widgets/box_widget.dart'; import 'package:ocbo_esign_validator/widgets/button_widget.dart'; import 'package:ocbo_esign_validator/widgets/image_widget.dart'; import 'package:ocbo_esign_validator/widgets/input_widget.dart'; import 'package:ocbo_esign_validator/widgets/text_widget.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final _passwordController = TextEditingController(); final _approver = dotenv.env['HEAD']!; final _approverId = dotenv.env['HEADID']!; late ValueNotifier passwordNotifier; @override void initState() { super.initState(); passwordNotifier = ValueNotifier(_passwordController.text); _passwordController.addListener(() { passwordNotifier.value = _passwordController.text; }); } 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 _securePassword(String password) async { final firstHash = sha1.string(password); final secondHash = sha384.string(firstHash.toString()); final thirdHash = sha1.string(secondHash.toString()); return thirdHash.toString(); } void _login() async { final connected = await _checkConnection(); if (connected) { final employeeid = _approverId; final dbpassword = await _getPassword(employeeid); final hashPassword = await _securePassword(_passwordController.text); if (dbpassword == hashPassword) { log('yeah'); } else { log('no'); } } } void _ignoreButton() {} @override void dispose() { _passwordController.dispose(); passwordNotifier.dispose(); super.dispose(); } @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(39, 26, 47, 1), Color.fromRGBO(22, 33, 44, 1), Color.fromRGBO(22, 33, 44, 1), Color.fromRGBO(24, 45, 40, 1), ], ), ), child: Column( children: [ const Gap(88), const ImageWidget(imagePath: 'assets/logo.png', size: 100, measureByHeight: true), const Gap(58), BoxWidget( title: 'Login', content: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const TextWidget(text: 'Name', bold: true, size: 16), const Gap(8), TextWidget(text: _approver, bold: false, size: 16), const Gap(16), const TextWidget(text: 'Password', bold: true, size: 16), 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, ); }, ), ], ), ), ], ), ), ); } }