From ccde4cd1d6c9e22da3dbf13ef7238e11620df414 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 26 Feb 2025 11:01:26 +0300 Subject: [PATCH] privacy policy added. --- lib/controllers/api_routes/api_manager.dart | 8 +- .../providers/api/user_provider.dart | 2 +- lib/new_views/pages/login_page.dart | 107 ++++++++++++------ .../swipe_module/dialoge/confirm_dialog.dart | 3 +- pubspec.yaml | 2 +- 5 files changed, 82 insertions(+), 40 deletions(-) diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index a8703e87..be7f222e 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -57,7 +57,7 @@ class ApiManager { Future post( String url, { Map headers, - bool showToast = true, + bool showToast = true, @required Map body, }) async { headers ??= {}; @@ -81,7 +81,7 @@ class ApiManager { if (response.statusCode == 401) { showLoginDialog(); } else { - if(showToast){ + if (showToast) { if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; if (message != null && message.toString().isNotEmpty) { @@ -89,13 +89,13 @@ class ApiManager { } } } - } } catch (ex) {} return response; } - Future postWithOutBody(String url, {Map headers,showLoading = true}) async { + + Future postWithOutBody(String url, {Map headers, showLoading = true}) async { headers ??= {}; headers.addAll(_headers); diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 3cecab21..0eec54aa 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -90,7 +90,7 @@ class UserProvider extends ChangeNotifier { Response response; try { 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; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index 5101ea7c..4ec1e757 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.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/extensions/context_extension.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/widget_extensions.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/pages/land_page/land_page.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/settings/setting_provider.dart'; @@ -39,10 +42,10 @@ class _LoginPageState extends State { final GlobalKey _formKey = GlobalKey(); bool rememberMe = false; + bool privacyPolicyChecked = false; @override void initState() { - // TODO: implement initState super.initState(); if (FirebaseNotificationManger.token == null) FirebaseNotificationManger.getToken(); } @@ -55,7 +58,7 @@ class _LoginPageState extends State { rememberMe = _settingProvider.rememberMe; if (rememberMe) { _user.userName = _settingProvider.username; - userNameController.text=_user.userName??''; + userNameController.text = _user.userName ?? ''; _user.password = _settingProvider.password; } } @@ -93,9 +96,11 @@ class _LoginPageState extends State { // Based on passwordVisible state choose the icon _passwordVisible ? Icons.visibility : Icons.visibility_off, color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, - ).paddingOnly(end: 12).onPress(() { setState(() { - _passwordVisible = !_passwordVisible; - }); }), + ).paddingOnly(end: 12).onPress(() { + setState(() { + _passwordVisible = !_passwordVisible; + }); + }), obscureText: !_passwordVisible, validator: (value) => Validator.isValidPassword(value) ? null @@ -106,12 +111,37 @@ class _LoginPageState extends State { _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( children: [ Checkbox( value: rememberMe, activeColor: AppColor.blueStatus(context), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, onChanged: (value) { setState(() { rememberMe = value; @@ -120,26 +150,35 @@ class _LoginPageState extends State { "Remember Me".bodyText(context).custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral50).expanded, ], ), - 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( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Checkbox( + value: privacyPolicyChecked, + activeColor: AppColor.blueStatus(context), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + onChanged: (value) { + if (value == null) return; + privacyPolicyChecked = value; + setState(() {}); + }), + RichText( + text: TextSpan(text: "I have read and agree to ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.primary50 : AppColor.neutral50), children: [ + TextSpan( + text: "Privacy Policy", + style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline), + 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, @@ -152,6 +191,10 @@ class _LoginPageState extends State { Future _login() async { if (!_formKey.currentState.validate()) return; + if (privacyPolicyChecked == false) { + "You must agree privacy policy".showToast; + return; + } _formKey.currentState.save(); int status = await _userProvider.login(context: context, user: _user); if (status >= 200 && status < 300 && _userProvider.user.isAuthenticated ?? false) { @@ -159,15 +202,13 @@ class _LoginPageState extends State { (await SharedPreferences.getInstance()).remove(ASettings.localAuth); await _settingProvider.setRememberMe(_user.userName, _user.password, rememberMe); - if(_userProvider.user.onlySwipe){ - Navigator.pushReplacementNamed(context, SwipeView.routeName); - } - else{ - Navigator.pushReplacementNamed(context, LandPage.routeName); - - } + if (_userProvider.user.onlySwipe) { + Navigator.pushReplacementNamed(context, SwipeView.routeName); + } else { + Navigator.pushReplacementNamed(context, LandPage.routeName); + } } else { - Fluttertoast.showToast(msg: _userProvider.user?.message ?? context.translation.failedToCompleteRequest); + context.showConfirmDialog(_userProvider.user?.message ?? context.translation.failedToCompleteRequest); } } } diff --git a/lib/new_views/swipe_module/dialoge/confirm_dialog.dart b/lib/new_views/swipe_module/dialoge/confirm_dialog.dart index 18bdba4e..0abb06fd 100644 --- a/lib/new_views/swipe_module/dialoge/confirm_dialog.dart +++ b/lib/new_views/swipe_module/dialoge/confirm_dialog.dart @@ -45,8 +45,9 @@ class ConfirmDialog extends StatelessWidget { ) ], ), + 16.height, message.heading5(context).custom(color: AppColor.black35), - 28.height, + 16.height, AppFilledButton( label: okTitle ?? "OK", onPressed: onTap ?? () => Navigator.pop(context), diff --git a/pubspec.yaml b/pubspec.yaml index 2a07bf0e..87054baa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.2.6+14 +version: 1.2.7+15 environment: sdk: ">=2.7.0 <3.0.0"