import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'dart:io'; //import 'MyHomePage.dart'; import 'pages/ListItemMenu.dart'; import 'classes/alert.dart'; import 'variable/globals.dart' as globals; import 'package:permission_handler/permission_handler.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: LoginDemo(), ); } } class LoginDemo extends StatefulWidget { @override _LoginDemoState createState() => _LoginDemoState(); } class _LoginDemoState extends State with ShowAlertDialog { TextEditingController inputPseudo = TextEditingController(); TextEditingController inputPassword = TextEditingController(); Future _login(BuildContext context) async { var url = Uri.parse("${globals.api}/token"); var pseudo = inputPseudo.text; var password = inputPassword.text; print("get login"); print(pseudo.isNotEmpty); print(password.isNotEmpty); if ((pseudo.isNotEmpty) && (password.isNotEmpty)) { print(url); try { //String credentials = "${pseudo}:${password}"; //Codec stringToBase64 = utf8.fuse(base64); //String encoded = stringToBase64.encode(credentials); var response = await http.post(url, // headers: { // HttpHeaders.authorizationHeader: 'Basic $encoded', //} headers: { 'accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded', }, body: { "username": "${pseudo}", "password": "${password}" }); print(response.statusCode); if ((response.statusCode == 200) || (response.statusCode == 201)) { SharedPreferences prefs = await SharedPreferences.getInstance(); var cookies = response.headers["set-cookie"].toString().split(";"); for (var cookie in cookies) { var cookiesMany = cookie.split(","); for (var cookie2 in cookiesMany) { switch (cookie2.split("=")[0]) { case "access_token": { prefs.setString("access_token", cookie2.split("=")[1]); } break; default: break; } } } Navigator.push( context, MaterialPageRoute(builder: (_) => ListItemMenu())); } else { var text = ""; switch (response.statusCode) { case 400: { text = "RequĂȘte mal construite"; } break; case 406: { text = "Mot de passe incorrect"; } break; case 404: { text = "Utilisateur inconnu"; } break; case 403: { text = "Utilisateur desactive"; } break; case 410: { text = "Token invalide"; } break; case 500: { text = "Probleme interne du serveur"; } break; default: { text = "Probleme d'authentification inconnu"; } break; } showAlertDialog(context, "Erreur serveur", text); } } catch (e) { showAlertDialog(context, "Erreur", "${e}"); } } else { showAlertDialog(context, "Erreur", "Champ vide"); } } void start() async { SharedPreferences prefs = await SharedPreferences.getInstance(); var access_token = prefs.getString("access_token") ?? ""; print("Get access token"); if (access_token.isNotEmpty) { print("Appel HTTP"); var urlToken = Uri.parse("${globals.api}/token"); var responseToken = await http.get(urlToken, headers: {HttpHeaders.cookieHeader: 'access_token: ${access_token}'}); print(responseToken.statusCode); if (responseToken.statusCode == 200) { print("route to item list"); Navigator.push( context, MaterialPageRoute(builder: (_) => ListItemMenu())); } else { prefs.remove("access_token"); } } } @override void initState() { _checkLocationPermission(); start(); super.initState(); } Future _checkLocationPermission() async { PermissionStatus status = await Permission.location.status; if (status.isGranted) { print("Location permission granted"); } else if (status.isDenied) { print("Location permission denied"); _requestLocationPermission(); } else if (status.isPermanentlyDenied) { print("Location permission permanently denied"); openAppSettings(); } } // Request location permission Future _requestLocationPermission() async { PermissionStatus status = await Permission.location.request(); if (status.isGranted) { print("Location permission granted"); } else if (status.isDenied) { print("Location permission denied"); } else if (status.isPermanentlyDenied) { print("Location permission permanently denied"); openAppSettings(); } } // Open app settings to allow user to grant permission manually Future _openAppSettings() async { bool opened = await openAppSettings(); if (opened) { print("App settings opened"); } else { print("Failed to open app settings"); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( title: Text("Login Page"), backgroundColor: Colors.blue, foregroundColor: Colors.white, ), body: SingleChildScrollView( child: Column( children: [ Padding( padding: const EdgeInsets.only(top: 60.0), child: Center( child: Container( width: 200, height: 150, decoration: BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(50.0)), child: Image.asset('./images/flutter.png')), ), ), Padding( //padding: const EdgeInsets.only(left:15.0,right: 15.0,top:0,bottom: 0), padding: EdgeInsets.symmetric(horizontal: 15), child: TextField( controller: inputPseudo, decoration: InputDecoration( border: OutlineInputBorder(), labelText: 'Pseudo', hintText: 'Enter pseudo existent'), ), ), Padding( padding: const EdgeInsets.only( left: 15.0, right: 15.0, top: 15, bottom: 0), //padding: EdgeInsets.symmetric(horizontal: 15), child: TextField( controller: inputPassword, obscureText: true, decoration: InputDecoration( border: OutlineInputBorder(), labelText: 'Password', hintText: 'Enter secure password'), ), ), TextButton( onPressed: () { //TODO FORGOT PASSWORD SCREEN GOES HERE }, child: Text( 'Forgot Password', style: TextStyle(color: Colors.blue, fontSize: 15), ), ), Container( height: 50, width: 250, decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(20)), child: TextButton( onPressed: () { _login(context); }, child: Text( 'Login', style: TextStyle(color: Colors.white, fontSize: 25), ), ), ), SizedBox( height: 130, ), Text('New User? Create Account') ], ), ), ); } }