privacy policy added.

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

@ -57,7 +57,7 @@ class ApiManager {
Future<http.Response> post(
String url, {
Map<String, String> headers,
bool showToast = true,
bool showToast = true,
@required Map<String, dynamic> 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<String, dynamic>) {
final message = jsonDecode(response.body)["message"];
if (message != null && message.toString().isNotEmpty) {
@ -89,13 +89,13 @@ class ApiManager {
}
}
}
}
} catch (ex) {}
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.addAll(_headers);

@ -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

@ -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<LoginPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
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<LoginPage> {
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<LoginPage> {
// 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<LoginPage> {
_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<LoginPage> {
"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<LoginPage> {
Future<void> _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<LoginPage> {
(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);
}
}
}

@ -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),

@ -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"

Loading…
Cancel
Save