Skip to content

Commit

Permalink
API update
Browse files Browse the repository at this point in the history
  • Loading branch information
yasminezegaoui committed Sep 26, 2024
1 parent dc21b4f commit 8781940
Show file tree
Hide file tree
Showing 17 changed files with 562 additions and 103 deletions.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,33 @@ import 'package:flutter/material.dart';
class MyTextField extends StatelessWidget {
final String? hintText;
final bool obscureText;
const MyTextField({super.key, this.hintText, required this.obscureText});
final String? errorText;
final TextEditingController? controller;

const MyTextField({
super.key,
this.hintText,
required this.obscureText,
this.controller,
this.errorText
});

@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 35),
child: TextField(
controller: controller,
obscureText: obscureText,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(
color: Colors.white,
width: 0
)
),
),
errorText: errorText,
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(
Expand Down
19 changes: 19 additions & 0 deletions lib/data/local storage/secure_storage.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// ignore_for_file: prefer_const_constructors

import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'dart:developer' as developer;

class SecureStorage {
final FlutterSecureStorage storage = FlutterSecureStorage();

writeSecureData(String key, value) async{
await storage.write(key: key, value: value);
}

readSecureData(String key) async{
String value = await storage.read(key: key) ?? 'No data found!';
developer.log('Data read from secure storage: $value');

}

}
4 changes: 3 additions & 1 deletion lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// ignore_for_file: prefer_const_constructors

import 'package:auth_screen_ui_challenge/core/configs/theme/app_theme.dart';
import 'package:auth_screen_ui_challenge/presentation/home%20screen/pages/home.dart';
import 'package:auth_screen_ui_challenge/presentation/registration&login/login/pages/login.dart';
import 'package:auth_screen_ui_challenge/presentation/registration&login/sign%20up/pages/sign_up.dart';
import 'package:auth_screen_ui_challenge/presentation/welcome%20screen/pages/welcome_screen.dart';
Expand All @@ -21,7 +22,8 @@ class MyApp extends StatelessWidget {
home: WelcomeScreen(),
routes: {
'/login': (context) => const Login(),
'/register': (context) => const SignUp()
'/register': (context) => const SignUp(),
'/home': (context) => const Home()
},
);
}
Expand Down
36 changes: 36 additions & 0 deletions lib/presentation/home screen/pages/home.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// ignore_for_file: prefer_const_constructors

import 'package:auth_screen_ui_challenge/core/configs/theme/app_colors.dart';
import 'package:flutter/material.dart';

class Home extends StatelessWidget {
const Home({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'Home',
style: TextStyle(
color: Colors.white
),
),
centerTitle: true,
backgroundColor: AppColors.primary,
),
body: Center(
child: Text(
'you\'ve logged in successfuly:)',
style: TextStyle(
fontSize: 30,
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
color: Colors.black87
),
textAlign: TextAlign.center,
),
),
);
}
}
69 changes: 69 additions & 0 deletions lib/presentation/registration&login/login/API/login_api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// ignore_for_file: use_build_context_synchronously, prefer_const_constructors, prefer_const_literals_to_create_immutables

import 'dart:developer' as developer;
import 'package:auth_screen_ui_challenge/core/configs/theme/app_colors.dart';
import 'package:auth_screen_ui_challenge/data/local%20storage/secure_storage.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';

class LoginApi {
final SecureStorage secureStorage = SecureStorage();

static Future<Object?> login(String email, password, BuildContext context) async{

try{
Response response = await post(
Uri.parse('https://reqres.in/api/login'),
body: {
'email': email,
'password': password
}
);

if(response.statusCode == 200){
final String token = response.body;
SecureStorage().writeSecureData('auth_token', token);
SecureStorage().readSecureData('auth_token');


return Navigator.of(context).pushNamedAndRemoveUntil(
'/home',
(route) => false
);
}else{
return showDialog(
context: context,
builder: (context) => CupertinoAlertDialog(
title: Text('Login Failed'),
content: Text('The email or password is incorrect'),
actions: [
CupertinoDialogAction(
onPressed: () => Navigator.of(context).pushNamedAndRemoveUntil(
'/register',
(route) => false
),
textStyle: TextStyle(
color: Colors.red
),
child: Text('Register'),
),
CupertinoDialogAction(
textStyle: TextStyle(
color: AppColors.primary
),
child: Text('Try again'),
onPressed: () => Navigator.of(context).pop(),
),
],
)
);
}

}catch(e){
developer.log(e.toString());
}
return null;
}

}
28 changes: 25 additions & 3 deletions lib/presentation/registration&login/login/pages/login.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
// ignore_for_file: prefer_const_constructors, prefer_const_literals_to_create_immutables

import 'package:auth_screen_ui_challenge/common/my_container.dart';
import 'package:auth_screen_ui_challenge/common/my_text_field.dart';
import 'package:auth_screen_ui_challenge/common/widgets/my_container.dart';
import 'package:auth_screen_ui_challenge/common/widgets/my_text_field.dart';
import 'package:auth_screen_ui_challenge/core/configs/theme/app_colors.dart';
import 'package:auth_screen_ui_challenge/presentation/registration&login/login/API/login_api.dart';
import 'package:flutter/material.dart';

class Login extends StatefulWidget {
Expand All @@ -13,6 +14,23 @@ class Login extends StatefulWidget {
}

class _LoginState extends State<Login> {
late TextEditingController emailController;
late TextEditingController passwordController;

@override
void initState() {
emailController = TextEditingController();
passwordController = TextEditingController();
super.initState();
}

@override
void dispose() {
emailController.dispose();
passwordController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
Expand Down Expand Up @@ -76,13 +94,15 @@ class _LoginState extends State<Login> {
SizedBox(height: 65,),

MyTextField(
controller: emailController,
hintText: 'Email',
obscureText: false,
),

SizedBox(height: 25,),

MyTextField(
controller: passwordController,
hintText: 'Password',
obscureText: true,
),
Expand Down Expand Up @@ -115,7 +135,9 @@ class _LoginState extends State<Login> {
Padding(
padding: const EdgeInsets.symmetric(horizontal: 35),
child: ElevatedButton(
onPressed: (){},
onPressed: () async{
LoginApi.login(emailController.text.toString(), passwordController.text.toString(), context);
},
child:Padding(
padding: const EdgeInsets.symmetric(horizontal: 113, vertical: 12),
child: Text(
Expand Down
66 changes: 66 additions & 0 deletions lib/presentation/registration&login/sign up/API/sign_up_api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// ignore_for_file: empty_catches, unused_local_variable
// ignore_for_file: use_build_context_synchronously, prefer_const_constructors, prefer_const_literals_to_create_immutables

import 'package:auth_screen_ui_challenge/core/configs/theme/app_colors.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'dart:developer' as developer;

class SignUpApi {

static Future<Object?> signUp(String email, password, BuildContext context) async{

try{
Response response = await post(
Uri.parse('https://reqres.in/api/register'),
body: {
'email': email,
'password': password
}
);

if(response.statusCode == 200){
return showDialog(
context: context,
builder: (context) => CupertinoAlertDialog(
title: Text('Registration is done'),
content: Text('go to login page and login to your account'),
actions: [
CupertinoDialogAction(
onPressed: () => Navigator.of(context).pushNamedAndRemoveUntil(
'/login',
(route) => false
),
textStyle: TextStyle(
color: AppColors.primary
),
child: Text('Login'),
),
],
)
);
}else{
return showDialog(
context: context,
builder: (context) => CupertinoAlertDialog(
title: Text('account doesn\'t exist'),
content: Text('the email or the password are uncorrect'),
actions: [
CupertinoDialogAction(
textStyle: TextStyle(
color: AppColors.primary
),
child: Text('Try again'),
onPressed: () => Navigator.of(context).pop(),
),
],
)
);
}
}catch(e){
developer.log(e.toString());
}
return null;
}
}
42 changes: 39 additions & 3 deletions lib/presentation/registration&login/sign up/pages/sign_up.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
// ignore_for_file: prefer_const_constructors, prefer_const_literals_to_create_immutables

import 'package:auth_screen_ui_challenge/common/my_container.dart';
import 'package:auth_screen_ui_challenge/common/my_text_field.dart';
import 'package:auth_screen_ui_challenge/common/widgets/my_container.dart';
import 'package:auth_screen_ui_challenge/common/widgets/my_text_field.dart';
import 'package:auth_screen_ui_challenge/core/configs/theme/app_colors.dart';
import 'package:auth_screen_ui_challenge/presentation/registration&login/sign%20up/API/sign_up_api.dart';
import 'package:flutter/material.dart';

class SignUp extends StatefulWidget {
Expand All @@ -13,6 +14,28 @@ class SignUp extends StatefulWidget {
}

class _SignUpState extends State<SignUp> {

late TextEditingController emailController;
late TextEditingController passwordController;
late TextEditingController confirmController;
late bool isCorrect = false;

@override
void initState() {
emailController = TextEditingController();
passwordController = TextEditingController();
confirmController = TextEditingController();
super.initState();
}

@override
void dispose() {
emailController.dispose();
passwordController.dispose();
confirmController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
Expand Down Expand Up @@ -76,20 +99,24 @@ class _SignUpState extends State<SignUp> {
SizedBox(height: 65,),

MyTextField(
controller: emailController,
hintText: 'Email',
obscureText: false,
),

SizedBox(height: 25,),

MyTextField(
controller: passwordController,
hintText: 'Password',
obscureText: true,
),

SizedBox(height: 25,),

MyTextField(
controller: confirmController,
errorText: isCorrect ? 'your input doesn\'t match your password' : null ,
hintText: 'Confirm Password',
obscureText: true,
),
Expand All @@ -99,7 +126,16 @@ class _SignUpState extends State<SignUp> {
Padding(
padding: const EdgeInsets.symmetric(horizontal: 35),
child: ElevatedButton(
onPressed: (){},
onPressed: () async{
setState(() {
if(confirmController.text == passwordController.text){
isCorrect = false;
}else{
isCorrect = true;
}
});
await SignUpApi.signUp(emailController.text.toString(), passwordController.text.toString(), context);
},
child:Padding(
padding: const EdgeInsets.symmetric(horizontal: 108, vertical: 12),
child: Text(
Expand Down
Loading

0 comments on commit 8781940

Please sign in to comment.