230 lines
10 KiB
Dart
230 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;
|
|
ApiProvider _apiProvider = ApiProvider(); // TODO: A voir si bien positionné
|
|
|
|
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() {
|
|
_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";
|
|
}
|
|
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_etUserName.dispose();
|
|
_etPinCode.dispose();
|
|
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,
|
|
),
|
|
)),
|
|
),
|
|
],
|
|
)),
|
|
),
|
|
],
|
|
)
|
|
],
|
|
),
|
|
));
|
|
}
|
|
}
|