privacy policy added.

main_design2.1
Sikander Saleem 9 months ago
parent 94ff819c79
commit ccde4cd1d6

@ -57,7 +57,7 @@ class ApiManager {
Future<http.Response> post( Future<http.Response> post(
String url, { String url, {
Map<String, String> headers, Map<String, String> headers,
bool showToast = true, bool showToast = true,
@required Map<String, dynamic> body, @required Map<String, dynamic> body,
}) async { }) async {
headers ??= {}; headers ??= {};
@ -81,7 +81,7 @@ class ApiManager {
if (response.statusCode == 401) { if (response.statusCode == 401) {
showLoginDialog(); showLoginDialog();
} else { } else {
if(showToast){ if (showToast) {
if (jsonDecode(response.body) is Map<String, dynamic>) { if (jsonDecode(response.body) is Map<String, dynamic>) {
final message = jsonDecode(response.body)["message"]; final message = jsonDecode(response.body)["message"];
if (message != null && message.toString().isNotEmpty) { if (message != null && message.toString().isNotEmpty) {
@ -89,13 +89,13 @@ class ApiManager {
} }
} }
} }
} }
} catch (ex) {} } catch (ex) {}
return response; return response;
} }
Future<http.Response> postWithOutBody(String url, {Map<String, String> headers,showLoading = true}) async {
Future<http.Response> postWithOutBody(String url, {Map<String, String> headers, showLoading = true}) async {
headers ??= {}; headers ??= {};
headers.addAll(_headers); headers.addAll(_headers);

@ -90,7 +90,7 @@ class UserProvider extends ChangeNotifier {
Response response; Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.post(URLs.login, body: await user.toLoginJson()); response = await ApiManager.instance.post(URLs.login, body: await user.toLoginJson(),showToast: false);
_loading = false; _loading = false;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received

@ -1,3 +1,4 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -6,6 +7,7 @@ import 'package:test_sa/controllers/notification/firebase_notification_manger.da
import 'package:test_sa/controllers/providers/settings/app_settings.dart'; import 'package:test_sa/controllers/providers/settings/app_settings.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
@ -13,6 +15,7 @@ import 'package:test_sa/new_views/forget_password_module/forget_passwod_verify_o
import 'package:test_sa/new_views/forget_password_module/models/general_response_model.dart'; import 'package:test_sa/new_views/forget_password_module/models/general_response_model.dart';
import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart';
import 'package:test_sa/new_views/swipe_module/swipe_view.dart'; import 'package:test_sa/new_views/swipe_module/swipe_view.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../controllers/providers/api/user_provider.dart'; import '../../controllers/providers/api/user_provider.dart';
import '../../controllers/providers/settings/setting_provider.dart'; import '../../controllers/providers/settings/setting_provider.dart';
@ -39,10 +42,10 @@ class _LoginPageState extends State<LoginPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
bool rememberMe = false; bool rememberMe = false;
bool privacyPolicyChecked = false;
@override @override
void initState() { void initState() {
// TODO: implement initState
super.initState(); super.initState();
if (FirebaseNotificationManger.token == null) FirebaseNotificationManger.getToken(); if (FirebaseNotificationManger.token == null) FirebaseNotificationManger.getToken();
} }
@ -55,7 +58,7 @@ class _LoginPageState extends State<LoginPage> {
rememberMe = _settingProvider.rememberMe; rememberMe = _settingProvider.rememberMe;
if (rememberMe) { if (rememberMe) {
_user.userName = _settingProvider.username; _user.userName = _settingProvider.username;
userNameController.text=_user.userName??''; userNameController.text = _user.userName ?? '';
_user.password = _settingProvider.password; _user.password = _settingProvider.password;
} }
} }
@ -93,9 +96,11 @@ class _LoginPageState extends State<LoginPage> {
// Based on passwordVisible state choose the icon // Based on passwordVisible state choose the icon
_passwordVisible ? Icons.visibility : Icons.visibility_off, _passwordVisible ? Icons.visibility : Icons.visibility_off,
color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, color: context.isDark ? AppColor.neutral10 : AppColor.neutral20,
).paddingOnly(end: 12).onPress(() { setState(() { ).paddingOnly(end: 12).onPress(() {
_passwordVisible = !_passwordVisible; setState(() {
}); }), _passwordVisible = !_passwordVisible;
});
}),
obscureText: !_passwordVisible, obscureText: !_passwordVisible,
validator: (value) => Validator.isValidPassword(value) validator: (value) => Validator.isValidPassword(value)
? null ? null
@ -106,12 +111,37 @@ class _LoginPageState extends State<LoginPage> {
_user.password = value; _user.password = value;
}, },
), ),
8.height, 16.height,
Align(
alignment: AlignmentDirectional.centerEnd,
child: InkWell(
onTap: () async {
if (userNameController.text.isNotEmpty) {
GeneralResponseModel response = await _userProvider.sendForgetPasswordOtp(context: context, employeeId: userNameController.text);
if (response.isSuccess) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ForgetPasswordVerifyOtpView(
data: {'employeeId': userNameController.text, 'phoneNumber': response.data},
)));
// Navigator.push(context, ForgetPasswordVerifyOtpView.routeName);
} else {
context.showConfirmDialog(response?.message ?? context.translation.failedToCompleteRequest);
}
} else {
Fluttertoast.showToast(msg: context.translation.employeeIdIsRequired);
}
},
child: context.translation.forgotPassword.bodyText(context).custom(color: AppColor.primary50, fontWeight: FontWeight.w500),
),
),
Row( Row(
children: [ children: [
Checkbox( Checkbox(
value: rememberMe, value: rememberMe,
activeColor: AppColor.blueStatus(context), activeColor: AppColor.blueStatus(context),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onChanged: (value) { onChanged: (value) {
setState(() { setState(() {
rememberMe = value; rememberMe = value;
@ -120,26 +150,35 @@ class _LoginPageState extends State<LoginPage> {
"Remember Me".bodyText(context).custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral50).expanded, "Remember Me".bodyText(context).custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral50).expanded,
], ],
), ),
16.height, Row(
Align( crossAxisAlignment: CrossAxisAlignment.center,
alignment: AlignmentDirectional.centerEnd, children: [
child: InkWell( Checkbox(
onTap: () async { value: privacyPolicyChecked,
if(userNameController.text.isNotEmpty){ activeColor: AppColor.blueStatus(context),
GeneralResponseModel response = await _userProvider.sendForgetPasswordOtp(context: context, employeeId: userNameController.text); materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
if( response.isSuccess){ onChanged: (value) {
Navigator.push(context, MaterialPageRoute(builder: (context)=>ForgetPasswordVerifyOtpView(data: {'employeeId':userNameController.text,'phoneNumber':response.data},))); if (value == null) return;
// Navigator.push(context, ForgetPasswordVerifyOtpView.routeName); privacyPolicyChecked = value;
}else{ setState(() {});
context.showConfirmDialog(response?.message ?? context.translation.failedToCompleteRequest); }),
} RichText(
}else{ text: TextSpan(text: "I have read and agree to ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.primary50 : AppColor.neutral50), children: [
Fluttertoast.showToast(msg: context.translation.employeeIdIsRequired); TextSpan(
} text: "Privacy Policy",
}, style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline),
child: context.translation.forgotPassword.bodyText(context).custom(color: AppColor.primary50, fontWeight: FontWeight.w500), recognizer: TapGestureRecognizer()
), ..onTap = () async {
Uri uri = Uri.parse("https://cloudsolutions.com.sa/en/privacy-policy");
try {
launchUrl(uri);
} catch (ex) {}
}),
]),
).expanded,
],
), ),
16.height,
], ],
), ),
).center.expanded, ).center.expanded,
@ -152,6 +191,10 @@ class _LoginPageState extends State<LoginPage> {
Future<void> _login() async { Future<void> _login() async {
if (!_formKey.currentState.validate()) return; if (!_formKey.currentState.validate()) return;
if (privacyPolicyChecked == false) {
"You must agree privacy policy".showToast;
return;
}
_formKey.currentState.save(); _formKey.currentState.save();
int status = await _userProvider.login(context: context, user: _user); int status = await _userProvider.login(context: context, user: _user);
if (status >= 200 && status < 300 && _userProvider.user.isAuthenticated ?? false) { if (status >= 200 && status < 300 && _userProvider.user.isAuthenticated ?? false) {
@ -159,15 +202,13 @@ class _LoginPageState extends State<LoginPage> {
(await SharedPreferences.getInstance()).remove(ASettings.localAuth); (await SharedPreferences.getInstance()).remove(ASettings.localAuth);
await _settingProvider.setRememberMe(_user.userName, _user.password, rememberMe); await _settingProvider.setRememberMe(_user.userName, _user.password, rememberMe);
if(_userProvider.user.onlySwipe){ if (_userProvider.user.onlySwipe) {
Navigator.pushReplacementNamed(context, SwipeView.routeName); Navigator.pushReplacementNamed(context, SwipeView.routeName);
} } else {
else{ Navigator.pushReplacementNamed(context, LandPage.routeName);
Navigator.pushReplacementNamed(context, LandPage.routeName); }
}
} else { } else {
Fluttertoast.showToast(msg: _userProvider.user?.message ?? context.translation.failedToCompleteRequest); context.showConfirmDialog(_userProvider.user?.message ?? context.translation.failedToCompleteRequest);
} }
} }
} }

@ -45,8 +45,9 @@ class ConfirmDialog extends StatelessWidget {
) )
], ],
), ),
16.height,
message.heading5(context).custom(color: AppColor.black35), message.heading5(context).custom(color: AppColor.black35),
28.height, 16.height,
AppFilledButton( AppFilledButton(
label: okTitle ?? "OK", label: okTitle ?? "OK",
onPressed: onTap ?? () => Navigator.pop(context), onPressed: onTap ?? () => Navigator.pop(context),

@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.2.6+14 version: 1.2.7+15
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: ">=2.7.0 <3.0.0"

Loading…
Cancel
Save