mobdr/lib/ui/authentication/signin.dart

233 lines
10 KiB
Dart

import 'package:universal_io/io.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mobdr/network/api_provider.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:mobdr/ui/home.dart';
import 'package:mobdr/ui/authentication/verification.dart';
import 'package:mobdr/service/shared_prefs.dart';
class SigninPage extends StatefulWidget {
@override
_SigninPageState createState() => _SigninPageState();
}
class _SigninPageState extends State<SigninPage> {
bool _obscureText = true;
IconData _iconVisible = Icons.visibility_off;
late ApiProvider _apiProvider;
TextEditingController _etUserName = TextEditingController();
TextEditingController _etPinCode = TextEditingController();
Color _gradientTop = Color(0xFF039be6);
Color _gradientBottom = Color(0xFF0299e2);
Color _mainColor = Color(0xFF0181cc);
Color _underlineColor = Color(0xFFCCCCCC);
void _toggleObscureText() {
setState(() {
_obscureText = !_obscureText;
if (_obscureText == true) {
_iconVisible = Icons.visibility_off;
} else {
_iconVisible = Icons.visibility;
}
});
}
@override
void initState() {
super.initState();
_apiProvider = ApiProvider();
_etUserName = TextEditingController(text: SharedPrefs().login);
_etPinCode = TextEditingController(text: '');
// clear all user information except login
SharedPrefs().id_utilisateur = 0;
SharedPrefs().email = "";
SharedPrefs().expire = 0;
SharedPrefs().guid = "";
SharedPrefs().last_traduction = "";
SharedPrefs().nom = "";
SharedPrefs().prenom = "";
SharedPrefs().version = "";
SharedPrefs().photo = "";
// if the default language is not set
if (SharedPrefs().langage.isEmpty) {
// set to french
SharedPrefs().langage = "fr";
}
}
@override
void dispose() {
_etUserName.dispose();
_etPinCode.dispose();
_apiProvider.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: AnnotatedRegion<SystemUiOverlayStyle>(
value: Platform.isIOS
? SystemUiOverlayStyle.light
: SystemUiOverlayStyle(statusBarIconBrightness: Brightness.light),
child: Stack(
children: <Widget>[
// top blue background gradient
Container(
height: MediaQuery.of(context).size.height / 3.5,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [_gradientTop, _gradientBottom],
begin: Alignment.topCenter,
end: Alignment.bottomCenter)),
),
// set your logo here
Container(
margin: EdgeInsets.fromLTRB(
0, MediaQuery.of(context).size.height / 20, 0, 0),
alignment: Alignment.topCenter,
child:
Image.asset('assets/images/logo_dark.png', height: 120)),
ListView(
children: <Widget>[
// create form login
Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
elevation: 5,
margin: EdgeInsets.fromLTRB(32,
MediaQuery.of(context).size.height / 3.5 - 72, 32, 0),
color: Colors.white,
child: Container(
margin: EdgeInsets.fromLTRB(24, 0, 24, 20),
child: Column(
children: <Widget>[
SizedBox(
height: 40,
),
Center(
child: Text(
'SIGN IN',
style: TextStyle(
color: _mainColor,
fontSize: 18,
fontWeight: FontWeight.w900),
),
),
SizedBox(
height: 20,
),
TextField(
keyboardType: TextInputType.text,
controller: _etUserName,
decoration: InputDecoration(
focusedBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: Colors.grey[600]!)),
enabledBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: _underlineColor),
),
labelText: 'User name',
labelStyle:
TextStyle(color: Colors.grey[700])),
),
SizedBox(
height: 20,
),
TextField(
obscureText: _obscureText,
keyboardType: TextInputType.number,
controller: _etPinCode,
decoration: InputDecoration(
focusedBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: Colors.grey[600]!)),
enabledBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: _underlineColor),
),
labelText: 'Pin code',
labelStyle: TextStyle(color: Colors.grey[700]),
suffixIcon: IconButton(
icon: Icon(_iconVisible,
color: Colors.grey[700], size: 20),
onPressed: () {
_toggleObscureText();
}),
),
),
SizedBox(
height: 60,
),
SizedBox(
width: double.maxFinite,
child: TextButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty
.resolveWith<Color>(
(Set<MaterialState> states) => _mainColor,
),
overlayColor: MaterialStateProperty.all(
Colors.transparent),
shape: MaterialStateProperty.all(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
)),
),
onPressed: () async {
//Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => HomePage()), (Route<dynamic> route) => false);
var apiResponse = await _apiProvider.login(
_etUserName.text, _etPinCode.text, '');
if (apiResponse == 'OK') {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(
builder: (context) => HomePage()),
(Route<dynamic> route) => false);
} else if (apiResponse == 'SECURITY_CODE') {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => VerificationPage(
pp_userName: _etUserName.text,
pp_pinCode:
_etPinCode.text)));
} else {
Fluttertoast.showToast(
msg: apiResponse,
toastLength: Toast.LENGTH_SHORT);
}
},
child: Padding(
padding:
const EdgeInsets.symmetric(vertical: 5),
child: Text(
'LOGIN',
style: TextStyle(
fontSize: 16, color: Colors.white),
textAlign: TextAlign.center,
),
)),
),
],
)),
),
],
)
],
),
));
}
}