taafee-mobile/lib/features/account/presentation_layer/screens/account.dart
2023-10-19 17:26:07 +03:00

420 lines
17 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:taafee_mobile/common/const/const.dart';
import 'package:taafee_mobile/common/extensions/widget_extension.dart';
import 'package:taafee_mobile/common/widgets/button.dart';
import 'package:taafee_mobile/common/widgets/text.dart';
import 'package:taafee_mobile/common/widgets/textfiled.dart';
import 'package:taafee_mobile/core/routing/routing_manager.dart';
import 'package:taafee_mobile/features/account/business_logic_layer/account_controller.dart';
import 'package:taafee_mobile/features/auth/business_logic_layer/auth_controller.dart';
import 'package:taafee_mobile/features/card/business_logic_layer/card_controller.dart';
import 'package:taafee_mobile/features/chat/business%20logic%20layer/chat_controller.dart';
import 'package:taafee_mobile/features/chat/data_layer/model/room.dart';
import 'package:taafee_mobile/features/chat/presentation_layer/widgets/circle_avatar.dart';
import 'package:taafee_mobile/features/favorite/business_logic_layer/favorite_controller.dart';
import 'package:taafee_mobile/features/home/business_logic_layer/home_controller.dart';
import '../../../../common/widgets/toast.dart';
import '../../../auth/data_layer/model/user.dart';
import '../widgets/account_widget.dart';
class AccountScreen extends StatelessWidget {
final AuthController authController = Get.find<AuthController>();
final HomeController homeController = Get.find<HomeController>();
final CardController cardController = Get.find<CardController>();
final AccountController accountController = Get.find<AccountController>();
final ChatController chatController = Get.find<ChatController>();
final FavoriteController favoriteController = Get.find<FavoriteController>();
final _formKey = GlobalKey<FormState>();
AccountScreen({super.key});
@override
Widget build(BuildContext context) {
accountController.getSelectedLanguageIcon();
// homeController.readUser();
return Scaffold(
backgroundColor: AppColors.backGroundColor,
body: SingleChildScrollView(
child: Column(
children: [
Container(
width: Get.width,
alignment: Alignment.centerRight,
margin: const EdgeInsets.symmetric(horizontal: 30, vertical: 15),
child: Obx(() {
return (!authController.isGuest.value)
? Row(
mainAxisAlignment: !homeController.isArabic.value
? MainAxisAlignment.end
: MainAxisAlignment.start,
children: [
SvgPicture.asset(
"assets/icons/log out.svg",
).paddingSymmetric(horizontal: 5),
MediumTextWidget(
"log_out".tr,
fontSize: 14,
),
const SizedBox(
width: 8,
),
Visibility(
visible: authController.logoutState.loading,
child: SizedBox(
width: 16,
height: 16,
child: const CircularProgressIndicator()
.center())),
],
).onTap(() {
authController.logout(
onSuccess: (value) async {
homeController.storage.savefirstTimeOpened();
RoutingManager.offAll(RouteName.login);
homeController.selectIndex.value = 0;
chatController.io.disconnect();
chatController.clear();
homeController.user.value = User.zero();
favoriteController.getFavoriteState.update((val) {
val!.value = [];
});
favoriteController.getFavoriteState.refresh();
},
);
})
: Row(
mainAxisAlignment: !homeController.isArabic.value
? MainAxisAlignment.end
: MainAxisAlignment.start,
children: [
SvgPicture.asset(
"assets/icons/log out.svg",
).paddingSymmetric(horizontal: 5),
MediumTextWidget(
"sign_in".tr,
fontSize: 14,
),
const SizedBox(
width: 8,
),
Visibility(
visible: authController.logoutState.loading,
child: SizedBox(
width: 16,
height: 16,
child: const CircularProgressIndicator()
.center())),
],
).onTap(() {
RoutingManager.offAll(RouteName.login);
homeController.storage.clearCache();
homeController.storage.savefirstTimeOpened();
});
}),
).paddingOnly(
top: Responsive.isTablet() ? 30 : 0,
right: Responsive.isTablet() ? 20 : 0,
),
CircleAvatarWidget(
isUserAvatar: true,
radius: Responsive.isTablet() ? 80 : 40,
).paddingOnly(bottom: 10),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Obx(
() => BoldTextWidget(
" ${homeController.user.value!.firstName} "
" ${homeController.user.value!.lastName} ",
fontSize: Responsive.isTablet() ? 22 : 14,
color: AppColors.textColor,
),
),
if (!authController.isGuest.value)
SvgPicture.asset(
"assets/icons/edit-2.svg",
).onTap(() {
RoutingManager.to(RouteName.editProfile);
}),
],
),
MediumTextWidget(
homeController.user.value!.email,
fontSize: Responsive.isTablet() ? 22 : 14,
).paddingOnly(bottom: 20),
AccountWidget(
icon: "my cards.svg",
title: "my_cards".tr,
).onTap(() async {
if (authController.isGuest.value) {
Get.defaultDialog(
title: '',
content: Column(
children: [
BoldTextWidget('you_have_to_sign_in'.tr),
const SizedBox(
height: 20,
),
ButtonWidget(
onTap: () {
RoutingManager.off(RouteName.login);
},
title: 'sign_in'.tr)
],
));
return;
}
RoutingManager.to(RouteName.myCards);
}),
AccountWidget(
icon: "about us.svg",
title: "about_us".tr,
).onTap(() {
RoutingManager.to(RouteName.aboutUs);
}),
AccountWidget(
icon: "phone.svg",
title: "contact_us".tr,
).onTap(() {
RoutingManager.to(RouteName.contactUs);
}),
AccountWidget(
icon: "privacy.svg",
title: "privacy_and_terms".tr,
).onTap(() {
RoutingManager.to(RouteName.privacy);
}),
AccountWidget(
icon: "privacy.svg",
title: "go_to_support".tr,
).onTap(() async {
await chatController.checkSupportRoomStatus(onSuccess: (room) {
room?.type = RoomType.support;
RoutingManager.to(RouteName.chatDetails, arguments: room);
}, onError: (err) {
Toast.showToast(err.toString().tr);
});
}),
Divider(
color: AppColors.dividerColor,
thickness: 1,
).paddingSymmetric(horizontal: 30),
SizedBox(
width: Get.width,
height: 67,
child: Row(
children: [
SvgPicture.asset(
"assets/icons/language.svg",
width: Responsive.isTablet() ? 20 : null,
).expanded(2),
RegularTextWidget(
"app_language".tr,
fontSize: Responsive.isTablet() ? 22 : 14,
).expanded(6),
const SizedBox(
width: 20,
),
if (Responsive.isTablet()) Container().expanded(7),
DropdownButton(
value: accountController.selectedLanguageSvg.value,
items: [
DropdownMenuItem(
value: 'english',
child: SizedBox(
width: 40,
height: 40,
child: SvgPicture.asset('assets/icons/english.svg'),
),
),
DropdownMenuItem(
value: 'arabic',
child: SizedBox(
width: 40,
height: 40,
child: SvgPicture.asset('assets/icons/arabic.svg'),
),
),
],
onChanged: (value) {
if (value == 'english') {
accountController.changeLanguage(Languages.english);
homeController.setUiLanguage(Languages.english.code);
}
if (value == 'arabic') {
accountController.changeLanguage(Languages.arabic);
homeController.setUiLanguage(Languages.arabic.code);
}
})
],
).paddingSymmetric(horizontal: 15),
).paddingSymmetric(
horizontal: Responsive.isTablet() ? Get.width * 0.15 : 0),
Divider(
color: AppColors.dividerColor,
thickness: 1,
).paddingSymmetric(horizontal: 30),
if (!authController.isGuest.value)
AccountWidget(
isShowCircleAvatar: false,
icon: "Logout.svg",
title: "log_out_from_other_devices".tr,
).onTap(() {
otherDevicesLogOutDialog(context);
}),
if (!authController.isGuest.value)
AccountWidget(
isShowCircleAvatar: false,
icon: "delete.svg",
title: "delete_account".tr,
color: Colors.red,
).onTap(() {
dialog(context);
})
],
),
),
).makeSafeArea();
}
Future<void> dialog(BuildContext context) async {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: Container(
color: Colors.white,
height: Get.height * .34,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BoldTextWidget(
"delete_your_account".tr,
fontSize: 18,
color: AppColors.textColor,
),
Form(
key: _formKey,
child: TextFieldWidget(
onChange: (value) {
authController.password = value;
},
keyboardType: TextInputType.text,
label: "enter_your_password".tr,
validate: (value) {
if (value == null || value.isEmpty) {
return "please_enter_the_password".tr;
}
if (value.length < 8) {
return "The_password_is_short".tr;
}
return null;
},
),
),
Obx(() {
return ButtonWidget(
isLoading: authController.deleteAccountState.loading,
width: Get.width * .35,
textColor: Colors.white,
color: AppColors.redColor,
onTap: () async {
if (_formKey.currentState!.validate()) {
await authController.deleteAccount(
onSuccess: (p0) {
RoutingManager.offAll(RouteName.login);
},
onError: (error) {
if (error.toString() == "invalid_credentials") {
Toast.showToast("invalid_credentials".tr);
}
if (error.toString() ==
"You Have no Internet Connection") {
Toast.showToast(
"you_have_no_internet_connection".tr);
}
},
);
}
},
title: "delete".tr,
).center();
})
],
),
),
);
});
}
Future<void> otherDevicesLogOutDialog(BuildContext context) async {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: Container(
color: Colors.white,
height: 150,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BoldTextWidget(
'${"log_out_from_other_devices".tr} ?',
fontSize: 18,
color: AppColors.textColor,
),
SizedBox(
width: 300,
child: Row(
children: [
ButtonWidget(
width: 100,
onTap: () {
RoutingManager.back();
},
title: 'cancel'.tr),
Container().expanded(1),
Obx(() {
return ButtonWidget(
hideTextOnLoading: true,
isLoading: authController
.terminateOtherSessionsState.loading,
width: 100,
textColor: Colors.white,
color: AppColors.redColor,
onTap: () async {
await authController.terminateOtherSessions(
onSuccess: (p0) {
RoutingManager.back();
},
onError: (error) {
if (error.toString() ==
"invalid_credentials") {
Toast.showToast("invalid_credentials".tr);
}
if (error.toString() ==
"You Have no Internet Connection") {
Toast.showToast(
"you_have_no_internet_connection".tr);
}
},
);
},
title: "log_out".tr,
).center();
}),
],
),
)
],
),
),
);
});
}
}