kevin420

Untitled

Jan 26th, 2021
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 7.44 KB | None | 0 0
  1. //main
  2.  
  3. // import 'package:esport_tournamnet/ui/core.dart';
  4. import 'package:esport_tournamnet/ui/screen/HomePage.dart';
  5. import 'package:esport_tournamnet/ui/screen/Login.dart';
  6. import 'package:flutter/material.dart';
  7.  
  8. import 'package:flutter_secure_storage/flutter_secure_storage.dart';
  9. import 'dart:convert' show json, base64, ascii;
  10.  
  11. const SERVER_IP = 'http://10.0.2.2:1337';
  12. final storage = FlutterSecureStorage();
  13.  
  14. void main() {
  15.   runApp(MyApp());
  16. }
  17.  
  18. class MyApp extends StatelessWidget {
  19.   // This widget is the root of your application.
  20.  
  21.   Future<String> get jwtOrEmpty async {
  22.     var jwt = await storage.read(key: "jwt");
  23.     if (jwt == null) return "";
  24.     return jwt;
  25.   }
  26.  
  27.   @override
  28.   Widget build(BuildContext context) {
  29.     return MaterialApp(
  30.       title: 'Flutter Demo',
  31.       debugShowCheckedModeBanner: false,
  32.       theme: ThemeData.dark(),
  33.       home: FutureBuilder(
  34.           future: jwtOrEmpty,
  35.           builder: (context, snapshot) {
  36.             if (!snapshot.hasData) return CircularProgressIndicator();
  37.             if (snapshot.data != "") {
  38.               var str = snapshot.data;
  39.               var jwt = str.split(".");
  40.  
  41.               if (jwt.length != 3) {
  42.                 return LoginPage();
  43.               } else {
  44.                 var payload = json.decode(ascii.decode(base64.decode(base64.normalize(jwt[1]))));
  45.                 if (DateTime.fromMillisecondsSinceEpoch(payload["exp"] * 1000).isAfter(DateTime.now())) {
  46.                   return HomePage(str, payload);
  47.                   // return HomePage();
  48.                 } else {
  49.                   return LoginPage();
  50.                 }
  51.               }
  52.             } else {
  53.               return LoginPage();
  54.             }
  55.           }),
  56.     );
  57.   }
  58. }
  59.  
  60.  
  61. //LoginPage
  62.  
  63. import 'package:esport_tournamnet/main.dart';
  64. // import 'package:esport_tournamnet/ui/core.dart';
  65. import 'package:esport_tournamnet/ui/screen/HomePage.dart';
  66. import 'package:flutter/material.dart';
  67. import 'package:http/http.dart' as http;
  68.  
  69. class LoginPage extends StatelessWidget {
  70.   final TextEditingController _emailController = TextEditingController();
  71.   final TextEditingController _usernameController = TextEditingController();
  72.   final TextEditingController _passwordController = TextEditingController();
  73.  
  74.   void displayDialog(context, title, text) => showDialog(
  75.         context: context,
  76.         builder: (context) => AlertDialog(title: Text(title), content: Text(text)),
  77.       );
  78.  
  79.   Future<String> attemptLogIn(String email, String password) async {
  80.     var res = await http.post(
  81.       "$SERVER_IP/auth/local/",
  82.       body: {"identifier": email, "password": password},
  83.     );
  84.     if (res.statusCode == 200) {
  85.       print(res.headers);
  86.       return res.body;
  87.     }
  88.     print(res.body);
  89.     print("$SERVER_IP/auth/local/");
  90.     return null;
  91.   }
  92.  
  93.   Future<int> attemptSignUp(String email, String password, String username) async {
  94.     var res = await http.post(
  95.       '$SERVER_IP/users/',
  96.       body: {"email": email, "password": password, "username": username},
  97.     );
  98.     return res.statusCode;
  99.   }
  100.  
  101.   @override
  102.   Widget build(BuildContext context) {
  103.     return Scaffold(
  104.         appBar: AppBar(
  105.           title: Text("Log In"),
  106.         ),
  107.         body: Padding(
  108.           padding: const EdgeInsets.all(8.0),
  109.           child: Column(
  110.             children: <Widget>[
  111.               TextField(
  112.                 controller: _usernameController,
  113.                 decoration: InputDecoration(labelText: 'username'),
  114.               ),
  115.               TextField(
  116.                 controller: _emailController,
  117.                 decoration: InputDecoration(labelText: 'email'),
  118.               ),
  119.               TextField(
  120.                 controller: _passwordController,
  121.                 obscureText: true,
  122.                 decoration: InputDecoration(labelText: 'Password'),
  123.               ),
  124.               FlatButton(
  125.                   onPressed: () async {
  126.                     var email = _emailController.text;
  127.                     var password = _passwordController.text;
  128.  
  129.                     var jwt = await attemptLogIn(email, password);
  130.                     if (jwt != null) {
  131.                       storage.write(key: "jwt", value: jwt);
  132.                       Navigator.push(
  133.                         context,
  134.                         // MaterialPageRoute(builder: (context) => HomePage()),
  135.                         MaterialPageRoute(builder: (context) => HomePage.fromBase64(jwt)),
  136.                       );
  137.                     } else {
  138.                       displayDialog(context, "An Error Occurred", "No account was found matching that username and password");
  139.                     }
  140.                   },
  141.                   child: Text("Log In")),
  142.               FlatButton(
  143.                   onPressed: () async {
  144.                     var email = _emailController.text;
  145.                     var password = _passwordController.text;
  146.                     var username = _usernameController.text;
  147.                     print(_usernameController.text + ' ' + _emailController.text + ' ' + _passwordController.text);
  148.  
  149.                     if (username.length < 4)
  150.                       displayDialog(context, "Invalid email", "The email should be at least 4 characters long");
  151.                     else if (password.length < 4)
  152.                       displayDialog(context, "Invalid Password", "The password should be at least 4 characters long");
  153.                     else {
  154.                       var res = await attemptSignUp(email, password, username);
  155.                       if (res == 201) {
  156.                         displayDialog(context, "Success", "The user was created. Log in now.");
  157.                         print('The user was created. Log in now.');
  158.                       } else if (res == 409)
  159.                         displayDialog(context, "That email is already registered",
  160.                             "Please try to sign up using another email or log in if you already have an account.");
  161.                       else {
  162.                         displayDialog(context, "Error", "An unknown error occurred.");
  163.                       }
  164.                     }
  165.                   },
  166.                   child: Text("Sign Up"))
  167.             ],
  168.           ),
  169.         ));
  170.   }
  171. }
  172.  
  173.  
  174. //HomePage
  175.  
  176. // import 'package:esport_tournamnet/main.dart';
  177. import 'package:flutter/material.dart';
  178. import 'dart:convert' show json, base64, ascii;
  179.  
  180. import 'package:http/http.dart' as http;
  181.  
  182. class HomePage extends StatelessWidget {
  183.   HomePage(this.jwt, this.payload);
  184.  
  185.   factory HomePage.fromBase64(String jwt) => HomePage(jwt, json.decode(ascii.decode(base64.decode(base64.normalize(jwt.split(".")[1])))));
  186.  
  187.   final String jwt;
  188.   final Map<String, dynamic> payload;
  189.   @override
  190.   Widget build(BuildContext context) {
  191.     return Scaffold(
  192.       body: Center(
  193.         child: FutureBuilder(
  194.           future: http.read('http://10.0.2.2:1337/auth/local/', headers: {"jwt": jwt}),
  195.           builder: (context, shapshot) {
  196.             return shapshot.hasData
  197.                 ? Column(
  198.                     children: <Widget>[
  199.                       // Text("${payload['username']}, here's the data:"),
  200.                       Text(shapshot.data, style: Theme.of(context).textTheme.headline4)
  201.                     ],
  202.                   )
  203.                 : shapshot.hasError
  204.                     ? Text("An error occurred")
  205.                     : CircularProgressIndicator();
  206.           },
  207.         ),
  208.       ),
  209.     );
  210.   }
  211. }
  212.  
Add Comment
Please, Sign In to add comment