login & register -> HomeScreen
This commit is contained in:
parent
3a8ca71319
commit
ae91f8de7d
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()}');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
58
pubspec.lock
58
pubspec.lock
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue