login & register -> HomeScreen

This commit is contained in:
meylis98 2023-03-08 23:05:45 +05:00
parent 3a8ca71319
commit ae91f8de7d
9 changed files with 257 additions and 105 deletions

View File

@ -4,6 +4,8 @@ import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:sapaly_shop/constants/utils.dart';
import '../themes/app_theme.dart';
void httpErrorHandle({
required http.Response response,
required BuildContext context,
@ -14,12 +16,27 @@ void httpErrorHandle({
onSuccess();
break;
case 400:
showSnackBar(context, 'this_user_exists');
showSnackBar(
context,
content: 'this_user_exists',
backgroundColor: AppTheme.redColor,
textColor: AppTheme.whiteColor,
);
break;
case 500:
showSnackBar(context, 'error_occured');
showSnackBar(
context,
content: 'error_occured',
backgroundColor: AppTheme.redColor,
textColor: AppTheme.whiteColor,
);
break;
default:
showSnackBar(context, 'error_occured');
showSnackBar(
context,
content: 'error_occured',
backgroundColor: AppTheme.redColor,
textColor: AppTheme.whiteColor,
);
}
}

View File

@ -1,9 +1,107 @@
import 'package:adaptix/adaptix.dart';
import 'package:flutter/material.dart';
import 'package:sapaly_shop/constants/global_variables.dart';
import 'package:sapaly_shop/themes/app_theme.dart';
void showSnackBar(BuildContext context, String text) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(text),
),
);
void showSnackBar(BuildContext ctx,
{SnackBar Function(String? content)? snackBar,
String? content,
Color? textColor,
Icon? icon,
Color? backgroundColor,
Duration? duration}) {
ScaffoldMessenger.of(ctx).hideCurrentSnackBar();
ScaffoldMessenger.of(ctx).showSnackBar(snackBar == null
? SnackBar(
padding: EdgeInsets.symmetric(
vertical: 10.adaptedPx(),
horizontal:
7.adaptedPx() + GlobalVariables.horizontalPadding(ctx)),
duration: duration ?? const Duration(seconds: 2),
backgroundColor: backgroundColor ?? AppTheme.lightPrimaryColor,
content: Row(
children: [
if (icon != null) icon,
SizedBox(width: 10.adaptedPx()),
Text(
'$content',
style: TextStyle(
fontSize: 15.adaptedPx(),
color: textColor ?? Theme.of(ctx).backgroundColor,
),
),
],
),
)
: snackBar(content));
}
Future<bool> yesOrNoDialog(BuildContext context,
{String? content, Widget? widgetContent}) async {
return (await showDialog<bool>(
context: context,
builder: (ctx) {
return AlertDialog(
title: Text(MaterialLocalizations.of(context).alertDialogLabel),
titleTextStyle: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontFamily: 'Gilroy',
fontWeight: FontWeight.w500,
fontSize: 17.adaptedPx()),
titlePadding: EdgeInsets.all(18.adaptedPx()),
actions: [
Theme(
data: Theme.of(context).copyWith(
colorScheme: Theme.of(context).colorScheme.copyWith(
primary: Theme.of(context).colorScheme.secondary)),
child: TextButton(
onPressed: () {
Navigator.of(ctx).pop(true);
},
child: Text(
MaterialLocalizations.of(context).continueButtonLabel,
style: TextStyle(
fontSize: 12.adaptedPx(),
fontFamily: 'Gilroy',
),
)),
),
Theme(
data: Theme.of(context).copyWith(
colorScheme: Theme.of(context).colorScheme.copyWith(
primary: Theme.of(context).colorScheme.secondary)),
child: TextButton(
onPressed: () {
Navigator.of(ctx).pop(false);
},
child: Text(
MaterialLocalizations.of(context).cancelButtonLabel,
style: TextStyle(
fontSize: 12.adaptedPx(),
fontFamily: 'Gilroy',
),
)),
),
],
contentTextStyle:
Theme.of(context).textTheme.bodyLarge?.copyWith(height: 1.5),
content: Row(
children: [
if (widgetContent != null)
Expanded(child: widgetContent)
else
Expanded(
child: Text(
content ?? "",
style: Theme.of(context)
.primaryTextTheme
.bodyText2!
.copyWith(
fontFamily: 'Gilroy',
),
))
],
),
);
}) ??
false);
}

View File

@ -18,6 +18,7 @@ import '../../../constants/global_variables.dart';
import '../../../themes/app_theme.dart';
class HomeScreen extends StatefulWidget {
static const String routeName = '/home';
const HomeScreen({super.key});
@override

View File

@ -1,18 +1,73 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:provider/provider.dart';
import 'package:sapaly_shop/constants/global_variables.dart';
import 'package:sapaly_shop/constants/utils.dart';
import 'package:sapaly_shop/features/screens/home/home_screen.dart';
import 'package:sapaly_shop/models/auth/login/login_request_model.dart';
import 'package:sapaly_shop/models/auth/login/login_response_model.dart';
import 'package:sapaly_shop/models/auth/register/register_request_model.dart';
import 'package:sapaly_shop/models/auth/register/register_response_model.dart';
import 'package:sapaly_shop/providers/user_provider.dart';
import 'package:sapaly_shop/themes/app_theme.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../constants/error_handling.dart';
class AuthService {
Future<void> login({
required LoginRequestModel loginRequestModel,
required BuildContext context,
}) async {
try {
var response = await http.post(Uri.parse('$kBaseUrl/jwt/login'),
body: loginRequestModel.toMap(),
headers: {
'Accept': 'application/json',
});
if (response.statusCode == HttpStatus.ok) {
var data = response.body;
var loginResponse = LoginResponseModel.fromJson(data);
debugPrint('LOGIN ${loginResponse.user.email}');
}
httpErrorHandle(
response: response,
context: context,
onSuccess: () async {
SharedPreferences prefs = await SharedPreferences.getInstance();
Provider.of<UserProvider>(context, listen: false)
.setUser(response.body);
await prefs.setString(
'token', jsonDecode(response.body)['data']['token']);
Navigator.of(context).pushNamedAndRemoveUntil(
HomeScreen.routeName,
(route) => false,
);
showSnackBar(
context,
content: 'login_success',
backgroundColor: AppTheme.lightPrimaryColor,
textColor: AppTheme.whiteColor,
);
},
);
} catch (e) {
showSnackBar(
context,
content: e.toString(),
backgroundColor: AppTheme.redColor,
textColor: AppTheme.whiteColor,
);
debugPrint('Login ERROR ${e.toString()}');
}
}
// Register
Future<void> register({
required RegisterRequestModel registerRequestModel,
@ -28,53 +83,37 @@ class AuthService {
if (response.statusCode == HttpStatus.ok) {
var data = response.body;
var registerResponse = registerResponseModelFromJson(data);
debugPrint('REGISTER ${registerResponse.user.email}');
}
httpErrorHandle(
response: response,
context: context,
onSuccess: () {
onSuccess: () async {
SharedPreferences prefs = await SharedPreferences.getInstance();
Provider.of<UserProvider>(context, listen: false)
.setUser(response.body);
await prefs.setString(
'token', jsonDecode(response.body)['data']['token']);
Navigator.of(context).pushNamedAndRemoveUntil(
HomeScreen.routeName,
(route) => false,
);
showSnackBar(
context,
'successfully_created_now_login',
content: 'signup_success',
backgroundColor: AppTheme.lightPrimaryColor,
textColor: AppTheme.whiteColor,
);
},
);
} catch (e) {
showSnackBar(context, e.toString());
debugPrint('Register Repsponse $e');
}
}
Future<void> login({
required LoginRequestModel loginRequestModel,
required BuildContext context,
}) async {
try {
var response = await http.post(Uri.parse('$kBaseUrl/jwt/login'),
body: loginRequestModel.toMap(),
headers: {
'Accept': 'application/json',
});
if (response.statusCode == HttpStatus.ok) {
var data = response.body;
var loginResponse = LoginResponseModel.fromJson(data);
debugPrint('EMAIL ${loginResponse.user.email}');
}
httpErrorHandle(
response: response,
context: context,
onSuccess: () {
showSnackBar(
context,
'successfully_created_now_login',
);
},
showSnackBar(
context,
content: e.toString(),
backgroundColor: AppTheme.redColor,
textColor: AppTheme.whiteColor,
);
} catch (e) {
showSnackBar(context, e.toString());
debugPrint('Login Response ${e.toString()}');
debugPrint('Register ERROr ${e.toString()}');
}
}
}

View File

@ -1,18 +1,33 @@
import 'package:adaptix/adaptix.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sapaly_shop/features/screens/category/category_screen.dart';
import 'package:sapaly_shop/features/screens/dashboard/dashboard.dart';
import 'package:sapaly_shop/features/screens/drawer/sapaly_drawer.dart';
import 'package:sapaly_shop/features/screens/home/home_screen.dart';
import 'package:sapaly_shop/features/screens/auth/login/login_screen.dart';
import 'package:sapaly_shop/providers/user_provider.dart';
import 'package:sapaly_shop/router.dart';
import 'package:sapaly_shop/themes/app_theme.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'constants/global_variables.dart';
import 'models/settings_model.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
SharedPreferences prefs = await SharedPreferences.getInstance();
await SettingsModel.initLocalization(
prefs.getString('language') ?? kDefaultLanguage);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => SettingsModel(prefs)),
ChangeNotifierProvider(create: (_) => UserProvider()),
],
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {

View File

@ -0,0 +1,30 @@
import 'package:flutter/material.dart';
import 'package:sapaly_shop/models/auth/login/login_response_model.dart';
class UserProvider extends ChangeNotifier {
LoginResponseModel _user = LoginResponseModel(
token: '',
expires: '',
user: User(
id: 0,
email: '',
name: '',
lastName: '',
middleName: '',
phone: '',
phoneShort: '',
isActivated: true,
lastLogin: '',
isSuperuser: 0,
createdAt: '',
updatedAt: '',
phoneList: [],
),
);
LoginResponseModel get user => _user;
void setUser(String user) {
_user = LoginResponseModel.fromJson(user);
notifyListeners();
}
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:sapaly_shop/features/screens/home/home_screen.dart';
import 'features/screens/auth/login/login_screen.dart';
import 'features/widgets/empty_widget.dart';
@ -6,7 +7,14 @@ import 'features/widgets/empty_widget.dart';
Route<dynamic> generateRoute(RouteSettings routeSettings) {
switch (routeSettings.name) {
case LoginScreen.routeName:
return MaterialPageRoute(builder: (_) => LoginScreen());
return MaterialPageRoute(
builder: (_) => LoginScreen(),
);
case HomeScreen.routeName:
return MaterialPageRoute(
builder: (_) => const HomeScreen(),
);
default:
return MaterialPageRoute(
settings: routeSettings,

View File

@ -170,22 +170,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.5"
device_info_plus:
dependency: transitive
description:
name: device_info_plus
sha256: "1d6e5a61674ba3a68fb048a7c7b4ff4bebfed8d7379dbe8f2b718231be9a7c95"
url: "https://pub.dev"
source: hosted
version: "8.1.0"
device_info_plus_platform_interface:
dependency: transitive
description:
name: device_info_plus_platform_interface
sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64
url: "https://pub.dev"
source: hosted
version: "7.0.0"
fake_async:
dependency: transitive
description:
@ -390,30 +374,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.2"
os_detect:
dependency: transitive
description:
name: os_detect
sha256: faf3bcf39515e64da8ff76b2f2805b20a6ff47ae515393e535f8579ff91d6b7f
url: "https://pub.dev"
source: hosted
version: "2.0.1"
package_info_plus:
dependency: transitive
description:
name: package_info_plus
sha256: "8df5ab0a481d7dc20c0e63809e90a588e496d276ba53358afc4c4443d0a00697"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
path:
dependency: transitive
description:
@ -527,7 +487,7 @@ packages:
source: hosted
version: "4.2.4"
provider:
dependency: transitive
dependency: "direct main"
description:
name: provider
sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f
@ -699,14 +659,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.0"
upgrader:
dependency: "direct main"
description:
name: upgrader
sha256: "600eec301fd27b985a7cf223c0d8f70f1bca6290b959fa970e399bb4da6e8c8e"
url: "https://pub.dev"
source: hosted
version: "6.0.1"
url_launcher:
dependency: "direct main"
description:
@ -811,14 +763,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version:
dependency: transitive
description:
name: version
sha256: "3d4140128e6ea10d83da32fef2fa4003fccbf6852217bb854845802f04191f94"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
win32:
dependency: transitive
description:

View File

@ -44,13 +44,13 @@ dependencies:
cached_network_image: ^3.2.3
flutter_native_splash: ^2.2.0+1
flutter_launcher_icons: ^0.10.0
upgrader: ^6.0.1
badges: ^3.0.2
buttons_flutter: ^0.0.2+1
buttons_tabbar: ^1.3.6
shimmer: ^2.0.0
url_launcher: ^6.1.9
shared_preferences: ^2.0.17
provider: ^6.0.5
dev_dependencies:
flutter_test: