diff --git a/lib/api/authentication_api_client.dart b/lib/api/authentication_api_client.dart index 66e8787..886688b 100644 --- a/lib/api/authentication_api_client.dart +++ b/lib/api/authentication_api_client.dart @@ -1,3 +1,15 @@ -class AuthenticationApiClient{ - -} \ No newline at end of file +import 'package:tangheem/classes/consts.dart'; +import 'package:tangheem/models/authentication_user_model.dart'; +import 'api_client.dart'; + +class AuthenticationApiClient { + static final AuthenticationApiClient _instance = AuthenticationApiClient._internal(); + AuthenticationApiClient._internal(); + factory AuthenticationApiClient() => _instance; + + Future authenticateUser(String email, String password) async { + String url = "${ApiConsts.authentication}Login"; + var postParams = {"email": email, "password": password}; + return await ApiClient().postJsonForObject((json) => AuthenticationUserModel.fromJson(json), url, postParams); + } +} diff --git a/lib/api/tangheem_user_api_client.dart b/lib/api/tangheem_user_api_client.dart index f5a6d6e..8215e16 100644 --- a/lib/api/tangheem_user_api_client.dart +++ b/lib/api/tangheem_user_api_client.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:tangheem/api/api_client.dart'; +import 'api_client.dart'; import 'package:tangheem/classes/consts.dart'; import 'package:tangheem/models/aya_model.dart'; import 'package:tangheem/models/surah_model.dart'; diff --git a/lib/api/user_api_client.dart b/lib/api/user_api_client.dart index da6f121..b11e9c6 100644 --- a/lib/api/user_api_client.dart +++ b/lib/api/user_api_client.dart @@ -1 +1,8 @@ -class UserApiClient {} +import 'package:tangheem/classes/consts.dart'; +import 'api_client.dart'; + +class UserApiClient { + static final UserApiClient _instance = UserApiClient._internal(); + UserApiClient._internal(); + factory UserApiClient() => _instance; +} diff --git a/lib/models/authentication_user_model.dart b/lib/models/authentication_user_model.dart index 2be1ec1..55aac41 100644 --- a/lib/models/authentication_user_model.dart +++ b/lib/models/authentication_user_model.dart @@ -1,13 +1,36 @@ class AuthenticationUserModel { + int statusCode; + String message; + Result result; + + AuthenticationUserModel({this.statusCode, this.message, this.result}); + + AuthenticationUserModel.fromJson(Map json) { + statusCode = json['statusCode']; + message = json['message']; + result = json['result'] != null ? new Result.fromJson(json['result']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['statusCode'] = this.statusCode; + data['message'] = this.message; + if (this.result != null) { + data['result'] = this.result.toJson(); + } + return data; + } +} + +class Result { int totalItemsCount; int statusCode; String message; Data data; - AuthenticationUserModel( - {this.totalItemsCount, this.statusCode, this.message, this.data}); + Result({this.totalItemsCount, this.statusCode, this.message, this.data}); - AuthenticationUserModel.fromJson(Map json) { + Result.fromJson(Map json) { totalItemsCount = json['totalItemsCount']; statusCode = json['statusCode']; message = json['message']; @@ -52,4 +75,4 @@ class Data { data['userName'] = this.userName; return data; } -} \ No newline at end of file +} diff --git a/lib/ui/screens/login_screen.dart b/lib/ui/screens/login_screen.dart index ebed07f..682a43d 100644 --- a/lib/ui/screens/login_screen.dart +++ b/lib/ui/screens/login_screen.dart @@ -1,10 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:tangheem/api/authentication_api_client.dart'; import 'package:tangheem/classes/colors.dart'; import 'package:tangheem/classes/utils.dart'; +import 'package:tangheem/models/authentication_user_model.dart'; import 'package:tangheem/ui/screens/forgot_password_screen.dart'; import 'package:tangheem/ui/screens/registration_screen.dart'; import 'package:tangheem/widgets/common_textfield_widget.dart'; +import 'package:tangheem/extensions/email_validator.dart'; class LoginScreen extends StatefulWidget { static const String routeName = "/login"; @@ -18,10 +21,12 @@ class LoginScreen extends StatefulWidget { } class _LoginScreenState extends State { - TextEditingController _usernameController = TextEditingController(); + TextEditingController _emailController = TextEditingController(); TextEditingController _passwordController = TextEditingController(); bool _isRemember = true; + AuthenticationUserModel _authenticationUser; + @override void initState() { super.initState(); @@ -32,6 +37,18 @@ class _LoginScreenState extends State { super.dispose(); } + void performLogin(String email, String password) async { + Utils.showLoading(context); + try { + _authenticationUser = await AuthenticationApiClient().authenticateUser(email, password); + Utils.showToast("Login successfully"); + } catch (ex, tr) { + Utils.handleException(ex, null); + } finally { + Utils.hideLoading(context); + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -65,7 +82,8 @@ class _LoginScreenState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - CommonTextFieldWidget(hint: "اسم المستخدم", controller: _usernameController, prefixIcon: "assets/icons/user.svg"), + // todo @discuss wiht haroon to change hint to email, because auth depends on email + CommonTextFieldWidget(hint: "اسم المستخدم", controller: _emailController, prefixIcon: "assets/icons/user.svg"), SizedBox(height: 16), CommonTextFieldWidget(hint: "كلمة المرور", controller: _passwordController, isPassword: true, prefixIcon: "assets/icons/password.svg"), SizedBox(height: 16), @@ -74,15 +92,18 @@ class _LoginScreenState extends State { height: 50, child: TextButton( onPressed: () { - if (_usernameController.text.length < 1) { - Utils.showToast("Username is empty."); + if (_emailController.text.length < 1) { + Utils.showToast("Email is empty."); + return; + } else if (!_emailController.text.isValidEmail()) { + Utils.showToast("Invalid email."); return; } if (_passwordController.text.length < 1) { Utils.showToast("Password is empty."); return; } - Utils.showToast("Login successfully"); + performLogin(_emailController.text, _passwordController.text); }, style: TextButton.styleFrom( primary: Colors.white,