Files
fcs/lib/pages/signin/pinlogin_page.dart

268 lines
8.6 KiB
Dart
Raw Normal View History

2024-02-14 16:54:38 +06:30
import 'package:fcs/helpers/theme.dart';
2024-10-04 13:55:59 +06:30
import 'package:fcs/pages/main/model/language_model.dart';
import 'package:fcs/pages/main/model/main_model.dart';
2024-02-15 16:38:57 +06:30
import 'package:fcs/pages/main/util.dart';
2024-02-14 16:54:38 +06:30
import 'package:fcs/pages/widgets/local_button.dart';
import 'package:fcs/pages/widgets/local_text.dart';
import 'package:fcs/pages/widgets/progress.dart';
import 'package:flutter/material.dart';
import 'package:pin_input_text_field/pin_input_text_field.dart';
2024-10-04 13:55:59 +06:30
import 'package:provider/provider.dart';
import '../../helpers/shared_pref.dart';
import '../../localization/app_translations.dart';
2024-02-14 16:54:38 +06:30
class PinLoginPage extends StatefulWidget {
const PinLoginPage({super.key});
@override
State<PinLoginPage> createState() => _PinLoginPageState();
}
class _PinLoginPageState extends State<PinLoginPage> {
bool _isLoading = false;
2024-02-19 17:06:58 +06:30
String pin = "";
2024-02-21 17:03:25 +06:30
String prefixText = "FCS-";
2024-10-04 13:55:59 +06:30
2024-02-19 17:06:58 +06:30
final _formKey = GlobalKey<FormState>();
2024-02-14 17:19:55 +06:30
TextEditingController _fcsIdCtl = new TextEditingController();
2024-10-04 13:55:59 +06:30
@override
void initState() {
_init();
super.initState();
}
_init() async {
await SharedPref.setPinLockOn(true);
}
Future<bool> _onWillPop() async {
// Show the confirmation dialog
return (await showDialog(
context: context,
builder: (context) => AlertDialog(
title: Center(
child:
LocalText(context, 'btn.exit_confirm', color: primaryColor),
),
content: Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
TextButton(
style: TextButton.styleFrom(
backgroundColor: Colors.grey[300],
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5.0))),
child: Text(
AppTranslations.of(context)!.text('btn.cancel'),
style: Provider.of<LanguageModel>(context).isEng
? TextStyle(color: primaryColor)
: TextStyle(
fontFamily: 'Myanmar3', color: primaryColor),
),
onPressed: () {
Navigator.of(context).pop(false);
}),
SizedBox(
width: 0,
),
TextButton(
style: TextButton.styleFrom(
backgroundColor: primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5.0))),
child: Text(AppTranslations.of(context)!.text('btn.ok'),
style: Provider.of<LanguageModel>(context).isEng
? TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold)
: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontFamily: 'Myanmar3')),
onPressed: () {
Navigator.of(context).pop(true);
})
],
),
),
),
)) ??
false;
}
2024-02-14 16:54:38 +06:30
Widget build(BuildContext context) {
2024-02-14 17:19:55 +06:30
final fcsIdBox = TextFormField(
controller: _fcsIdCtl,
2024-02-21 17:03:25 +06:30
onChanged: (value) {
_fcsIdCtl.value = TextEditingValue(
text: value.toUpperCase(),
selection: _fcsIdCtl.selection,
);
},
2024-02-14 17:19:55 +06:30
autofocus: true,
2024-02-19 17:06:58 +06:30
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter FCS ID';
}
return null;
},
2024-02-14 17:19:55 +06:30
style: TextStyle(
fontSize: 15, color: Colors.black87, fontWeight: FontWeight.w500),
cursorColor: primaryColor,
keyboardType: TextInputType.text,
decoration: new InputDecoration(
prefixIcon: Text(
2024-02-21 17:14:59 +06:30
prefixText,
style: TextStyle(color: Colors.black),
),
2024-10-04 13:55:59 +06:30
prefixIconConstraints: BoxConstraints(minWidth: 0, minHeight: 0),
2024-02-14 17:19:55 +06:30
contentPadding: EdgeInsets.all(0),
labelStyle: newLabelStyle(color: Colors.black54, fontSize: 17),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor, width: 1.0)),
2024-02-21 17:03:25 +06:30
border: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor, width: 1.0)),
2024-02-14 17:19:55 +06:30
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor, width: 1.0)),
disabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor, width: 1.0)),
2024-02-19 17:06:58 +06:30
errorStyle: TextStyle(color: dangerColor),
2024-02-14 17:19:55 +06:30
),
);
final pinLoginLogo = Container(
width: 70,
height: 70,
child: FittedBox(
child: Image.asset(
"assets/logo.jpg",
),
fit: BoxFit.fitHeight,
),
);
2024-02-19 17:06:58 +06:30
final pinInputBox = FormField(
validator: (value) {
if (pin == "") {
return "Please enter PIN";
}
if (pin.length < 6) {
return "PIN must be 6 digit";
}
return null;
},
autovalidateMode: AutovalidateMode.onUserInteraction,
builder: (state) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
PinInputTextField(
cursor: Cursor(
color: primaryColor, enabled: true, width: 2, height: 23),
pinLength: 6,
decoration: BoxLooseDecoration(
strokeColorBuilder: PinListenColorBuilder(
primaryColor, Colors.grey.shade400),
errorTextStyle: TextStyle(color: dangerColor)),
textInputAction: TextInputAction.done,
autoFocus: false,
onChanged: _pinChange,
),
Padding(
padding: const EdgeInsets.only(top: 8),
child: pin == "" || pin.length < 6
? SizedBox(
height: 20,
child: Text(state.errorText ?? "",
style: TextStyle(color: dangerColor, fontSize: 12)),
)
: const SizedBox(height: 20),
)
],
);
});
2024-02-14 17:19:55 +06:30
final loginBtn = Padding(
padding: EdgeInsets.only(top: 30),
child: LocalButton(
textKey: "welcome.pinlogin",
2024-02-15 16:38:57 +06:30
callBack: _login,
2024-02-14 17:19:55 +06:30
),
);
2024-10-04 13:55:59 +06:30
// ignore: deprecated_member_use
return WillPopScope(
onWillPop: _onWillPop,
child: LocalProgress(
inAsyncCall: _isLoading,
child: new Scaffold(
body: Form(
key: _formKey,
child: ListView(
padding: EdgeInsets.only(top: 80, left: 15, right: 15, bottom: 20),
children: [
pinLoginLogo,
Padding(
padding: EdgeInsets.only(top: 20, bottom: 20),
child: Center(
child: LocalText(context, "welcome.pinlogin",
color: Colors.black, fontSize: 18),
),
2024-02-14 17:19:55 +06:30
),
2024-10-04 13:55:59 +06:30
LocalText(
context,
"welcome.pinlogin.fcsid",
color: Colors.black54,
fontSize: 15,
),
fcsIdBox,
Padding(
padding: EdgeInsets.only(top: 25, bottom: 20),
child: LocalText(
context,
"welcome.pinlogin.pin",
color: Colors.black54,
fontSize: 15,
)),
pinInputBox,
loginBtn,
],
),
)),
),
2024-02-14 17:19:55 +06:30
);
2024-02-14 16:54:38 +06:30
}
_pinChange(pin) {
setState(() {
this.pin = pin;
});
}
2024-02-19 17:06:58 +06:30
2024-02-15 16:38:57 +06:30
_login() async {
2024-02-19 17:06:58 +06:30
if (!_formKey.currentState!.validate()) {
return;
}
2024-02-21 17:03:25 +06:30
String fcsId = "$prefixText${_fcsIdCtl.text}";
2024-02-19 17:06:58 +06:30
2024-02-15 16:38:57 +06:30
setState(() {
_isLoading = true;
});
try {
2024-10-04 13:55:59 +06:30
await context.read<MainModel>().pinLogin(fcsID: fcsId, pin: pin);
Navigator.pushNamedAndRemoveUntil(context, "/home", (r) => false);
2024-02-15 16:38:57 +06:30
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
_isLoading = false;
});
}
}
2024-02-14 16:54:38 +06:30
}