diff --git a/assets/images/contact_admin_screen/svg/mail_icon.svg b/assets/images/contact_admin_screen/svg/mail_icon.svg
new file mode 100644
index 0000000..bcbaeae
--- /dev/null
+++ b/assets/images/contact_admin_screen/svg/mail_icon.svg
@@ -0,0 +1,7 @@
+
diff --git a/assets/images/contact_admin_screen/svg/phone_icon.svg b/assets/images/contact_admin_screen/svg/phone_icon.svg
new file mode 100644
index 0000000..ac5ae1a
--- /dev/null
+++ b/assets/images/contact_admin_screen/svg/phone_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/language_screen/png/info_icon.png b/assets/images/language_screen/png/info_icon.png
new file mode 100644
index 0000000..fcd032b
Binary files /dev/null and b/assets/images/language_screen/png/info_icon.png differ
diff --git a/assets/images/language_screen/svg/info_icon.svg b/assets/images/language_screen/svg/info_icon.svg
new file mode 100644
index 0000000..127689b
--- /dev/null
+++ b/assets/images/language_screen/svg/info_icon.svg
@@ -0,0 +1,11 @@
+
diff --git a/lib/core/routes/route_name.dart b/lib/core/routes/route_name.dart
index 5429003..f544b36 100644
--- a/lib/core/routes/route_name.dart
+++ b/lib/core/routes/route_name.dart
@@ -46,8 +46,16 @@ class RouteName {
static const String confirmPinScreen = 'confirmPinScreen';
//Forgot Password
-
static const String forgotPasswordPhoneVerificationScreen =
'forgotPasswordPhoneVerificationScreen';
static const String forgotPasswordScreen = 'forgotPasswordScreen';
+
+ //contact Admin
+ static const String contactAdminScreen = 'contactAdminScreen';
+
+ //language change
+ static const String languageChangeScreen = 'languageChangeScreen';
+
+ //delete Account
+ static const String deleteAccountScreen = 'deleteAccountScreen';
}
diff --git a/lib/core/routes/routes.dart b/lib/core/routes/routes.dart
index 9004b4d..2364b92 100644
--- a/lib/core/routes/routes.dart
+++ b/lib/core/routes/routes.dart
@@ -8,9 +8,12 @@ import 'package:tanami_app/features/MainScreens/Portfolio/presentation/pages/por
import 'package:tanami_app/features/MainScreens/Wallet/presentation/pages/walletDetails.dart';
import 'package:tanami_app/features/biometric/presentation/pages/biometric_screen.dart';
+import 'package:tanami_app/features/contactAdmin/presentation/pages/contact_admin_screen.dart';
import 'package:tanami_app/features/countrySelection/presentation/pages/choose_country_screen.dart';
+import 'package:tanami_app/features/deleteAccount/presentation/pages/delete_account_screen.dart';
import 'package:tanami_app/features/forgotPassword/presentation/pages/restore_password_screen.dart';
+import 'package:tanami_app/features/languageChange/presentation/pages/language_change_screen.dart';
import 'package:tanami_app/features/otpVerification/presentation/pages/otp_screen.dart';
import 'package:tanami_app/features/register/presentation/pages/register_screen.dart';
import 'package:tanami_app/features/register/presentation/pages/register_step_screen.dart';
@@ -154,12 +157,33 @@ final goRouter = GoRouter(
},
),
GoRoute(
+
name: RouteName.walletDetails,
path: "${RouteName.walletDetails}/:type",
builder: (context, state) {
return WalletDetails(
type: state.pathParameters["type"]!,
);
+
+ name: RouteName.contactAdminScreen,
+ path: RouteName.contactAdminScreen,
+ builder: (context, state) {
+ return const ContactAdminScreen();
+ },
+ ),
+ GoRoute(
+ name: RouteName.languageChangeScreen,
+ path: RouteName.languageChangeScreen,
+ builder: (context, state) {
+ return const LanguageChaneScreen();
+ },
+ ),
+ GoRoute(
+ name: RouteName.deleteAccountScreen,
+ path: RouteName.deleteAccountScreen,
+ builder: (context, state) {
+ return const DeleteAccountScreen();
+
},
),
],
diff --git a/lib/core/styles/app_color.dart b/lib/core/styles/app_color.dart
index b0f4a31..8a54af0 100644
--- a/lib/core/styles/app_color.dart
+++ b/lib/core/styles/app_color.dart
@@ -73,4 +73,14 @@ class AppColor {
//KYC Card Color
static const Color kycCardTextColor = Color(0xFF074A23);
static const Color kycCardBgColor = Color(0x7F074A23);
+
+ //Contact Admin Color
+ static const Color contactAdminIconColor = Color(0xFF05391B);
+ static const Color contactAdminBgColor = Color(0xFFE2EEE2);
+
+ //Language Color
+ static const Color languageTextColor = Color(0xFF015698);
+
+ //Delete Account Color
+ static const Color descriptionText = Color(0xFFC6C6C6);
}
diff --git a/lib/core/styles/app_images.dart b/lib/core/styles/app_images.dart
index 51f1f1e..4099df1 100644
--- a/lib/core/styles/app_images.dart
+++ b/lib/core/styles/app_images.dart
@@ -92,4 +92,14 @@ class AppImages {
'assets/images/settings_screen/svg/reset_pin_icon.svg';
static const String contactIcon =
'assets/images/settings_screen/svg/contact_icon.svg';
+
+ //Contact
+ static const String byPhoneIcon =
+ 'assets/images/contact_admin_screen/svg/phone_icon.svg';
+ static const String byMailIcon =
+ 'assets/images/contact_admin_screen/svg/mail_icon.svg';
+
+ //Language
+ static const String infoIcon =
+ 'assets/images/language_screen/png/info_icon.png';
}
diff --git a/lib/core/styles/app_text.dart b/lib/core/styles/app_text.dart
index d097bc7..c6b8344 100644
--- a/lib/core/styles/app_text.dart
+++ b/lib/core/styles/app_text.dart
@@ -153,4 +153,32 @@ class AppText {
static const String faqText = "FAQ";
static const String logoutText = "Log Out";
static const String deleteAccountText = "Delete account";
+
+ //Contact Admin
+ static const String byPhoneText = "By phone";
+ static const String byEmailText = "By-mail";
+ static const String weAreHereToHelp = "We are here to help!";
+
+ //Language Screen
+ static const String arabicText = "اللغة العربية";
+ static const String chooseTheLanguageText = "Choose the language";
+ static const String changingTheLanguageWillReloadApp =
+ "Changing the language will reload the application";
+
+ //Delete Screen
+ static const String weAreSadToSeeYouGo = "We're sad to see you go :(";
+ static const String enterAdescription = "Enter a description...";
+ static const String toHelpUsImprovePleaseLetusKnowWhyYouWantToDeleteAccount =
+ "To help us improve, please let us know why you want to delete your account";
+ static const String charactersLeft = "characters left";
+ static const String iUnderstandAndAgreeThatmyDataWillBeDeleted =
+ "I understand and agree that my data will be deleted";
+ static const String noIWantToStay = "No, i want to stay";
+ static const String pleaseEnteraDescription = "Please enter a description";
+ static const String pleaseCheckThisField = "Please check this field";
+ static const String weHaveReceivedYourRequestToDeleteAccount =
+ "We have received your request to delete your account";
+ static const String theRequestWillBeProcessed =
+ "The request will be processed within 72 hours";
+ static const closeText = "Close";
}
diff --git a/lib/core/utils/url_launcher/url_launcher.dart b/lib/core/utils/url_launcher/url_launcher.dart
new file mode 100644
index 0000000..89d323d
--- /dev/null
+++ b/lib/core/utils/url_launcher/url_launcher.dart
@@ -0,0 +1,19 @@
+import 'package:url_launcher/url_launcher.dart';
+
+void launchPhone(String phoneNumber) async {
+ final url = 'tel:$phoneNumber';
+ if (await canLaunchUrl(Uri.parse(url))) {
+ await launchUrl(Uri.parse(url));
+ } else {
+ throw 'Could not launch $url';
+ }
+}
+
+void launchEmail(String email) async {
+ final url = 'mailto:$email';
+ if (await canLaunchUrl(Uri.parse(url))) {
+ await launchUrl(Uri.parse(url));
+ } else {
+ throw 'Could not launch $url';
+ }
+}
diff --git a/lib/features/MainScreens/Settings/presentation/widgets/general_settings_section.dart b/lib/features/MainScreens/Settings/presentation/widgets/general_settings_section.dart
index 5c6bb61..3d378c6 100644
--- a/lib/features/MainScreens/Settings/presentation/widgets/general_settings_section.dart
+++ b/lib/features/MainScreens/Settings/presentation/widgets/general_settings_section.dart
@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gap/gap.dart';
+import 'package:tanami_app/core/routes/route_name.dart';
+import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
@@ -37,7 +39,10 @@ class GeneralSettingsSection extends StatelessWidget {
],
),
const Gap(12),
- const SettingsListItem(
+ SettingsListItem(
+ onTapFunc: () {
+ goRouter.pushNamed(RouteName.languageChangeScreen);
+ },
icon: AppImages.languageIcon,
title: AppText.languageText,
trailing: AppText.englishText,
diff --git a/lib/features/MainScreens/Settings/presentation/widgets/privacy_settings_section.dart b/lib/features/MainScreens/Settings/presentation/widgets/privacy_settings_section.dart
index 91a64bf..e627b56 100644
--- a/lib/features/MainScreens/Settings/presentation/widgets/privacy_settings_section.dart
+++ b/lib/features/MainScreens/Settings/presentation/widgets/privacy_settings_section.dart
@@ -37,13 +37,15 @@ class PrivacySettingsSection extends StatelessWidget {
],
),
const Gap(12),
- const SettingsListItem(
+ SettingsListItem(
+ onTapFunc: () {},
icon: AppImages.resetPasswordIcon,
title: AppText.resetPasswordText,
trailing: "",
),
const Gap(8),
- const SettingsListItem(
+ SettingsListItem(
+ onTapFunc: () {},
icon: AppImages.resetPinIcon,
title: AppText.resetPinCodeText,
trailing: "",
diff --git a/lib/features/MainScreens/Settings/presentation/widgets/settings_bottom_section.dart b/lib/features/MainScreens/Settings/presentation/widgets/settings_bottom_section.dart
index 869f8e0..0ed36b8 100644
--- a/lib/features/MainScreens/Settings/presentation/widgets/settings_bottom_section.dart
+++ b/lib/features/MainScreens/Settings/presentation/widgets/settings_bottom_section.dart
@@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gap/gap.dart';
+import 'package:tanami_app/core/routes/route_name.dart';
+import 'package:tanami_app/core/routes/routes.dart';
import '../../../../../core/styles/app_color.dart';
import '../../../../../core/styles/app_text.dart';
@@ -24,14 +26,20 @@ class SettingsBottomSection extends StatelessWidget {
height: 56.h,
child: ButtonWidget().elevatedBtn(
txtClr: AppColor.plainWhite,
- function: () {},
+ function: () {
+ goRouter.goNamed(RouteName.loginScreen, pathParameters: {
+ "fromScreen": "registerStep",
+ });
+ },
text: AppText.logoutText,
clr: AppColor.primaryColor2,
),
),
const Gap(5),
ButtonWidget().textBtn(
- function: () {},
+ function: () {
+ goRouter.pushNamed(RouteName.deleteAccountScreen);
+ },
text: TextWidget().text14W700(
AppText.deleteAccountText,
clr: AppColor.hintTextColor,
diff --git a/lib/features/MainScreens/Settings/presentation/widgets/settings_list_tile_item.dart b/lib/features/MainScreens/Settings/presentation/widgets/settings_list_tile_item.dart
index 78b39e0..cdf93b8 100644
--- a/lib/features/MainScreens/Settings/presentation/widgets/settings_list_tile_item.dart
+++ b/lib/features/MainScreens/Settings/presentation/widgets/settings_list_tile_item.dart
@@ -8,12 +8,14 @@ class SettingsListItem extends StatelessWidget {
final String icon;
final String title;
final String trailing;
+ final Function() onTapFunc;
const SettingsListItem({
super.key,
required this.icon,
required this.title,
required this.trailing,
+ required this.onTapFunc,
});
@override
@@ -27,6 +29,7 @@ class SettingsListItem extends StatelessWidget {
color: AppColor.fillColor,
),
child: ListTile(
+ onTap: onTapFunc,
leading: SvgPicture.asset(icon),
title: Text(title,
style: GoogleFonts.dmSans(
diff --git a/lib/features/MainScreens/Settings/presentation/widgets/support_settings_section.dart b/lib/features/MainScreens/Settings/presentation/widgets/support_settings_section.dart
index 7e57a50..630e9ac 100644
--- a/lib/features/MainScreens/Settings/presentation/widgets/support_settings_section.dart
+++ b/lib/features/MainScreens/Settings/presentation/widgets/support_settings_section.dart
@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
+import 'package:tanami_app/core/routes/route_name.dart';
+import 'package:tanami_app/core/routes/routes.dart';
import 'package:tanami_app/core/styles/app_color.dart';
import 'package:tanami_app/core/styles/app_images.dart';
import 'package:tanami_app/core/styles/app_text.dart';
@@ -20,25 +22,31 @@ class SupportSettingsSection extends StatelessWidget {
clr: AppColor.hintTextColor,
),
const Gap(8),
- const SettingsListItem(
+ SettingsListItem(
+ onTapFunc: () {
+ goRouter.pushNamed(RouteName.contactAdminScreen);
+ },
icon: AppImages.contactIcon,
title: AppText.contactAdminText,
trailing: "",
),
const Gap(8),
- const SettingsListItem(
+ SettingsListItem(
+ onTapFunc: () {},
icon: AppImages.privacyIcon,
title: AppText.privacyPolicy,
trailing: "",
),
const Gap(8),
- const SettingsListItem(
+ SettingsListItem(
+ onTapFunc: () {},
icon: AppImages.privacyIcon,
title: AppText.termsAndCondition,
trailing: "",
),
const Gap(8),
- const SettingsListItem(
+ SettingsListItem(
+ onTapFunc: () {},
icon: AppImages.faqIcon,
title: AppText.faqText,
trailing: "",
diff --git a/lib/features/contactAdmin/presentation/pages/contact_admin_screen.dart b/lib/features/contactAdmin/presentation/pages/contact_admin_screen.dart
new file mode 100644
index 0000000..d681ba1
--- /dev/null
+++ b/lib/features/contactAdmin/presentation/pages/contact_admin_screen.dart
@@ -0,0 +1,26 @@
+import 'package:flutter/material.dart';
+import 'package:tanami_app/features/contactAdmin/presentation/widgets/bottom_section.dart';
+
+import '../../../../core/styles/app_text.dart';
+import '../../../../shared/components/appbar_widget.dart';
+import '../widgets/top_section.dart';
+
+class ContactAdminScreen extends StatelessWidget {
+ const ContactAdminScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: const AppBarWidget(
+ height: 75,
+ titleTxt: AppText.contactAdminText,
+ ),
+ body: ListView(
+ children: [
+ topSection(),
+ bottomSection(),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/features/contactAdmin/presentation/widgets/bottom_section.dart b/lib/features/contactAdmin/presentation/widgets/bottom_section.dart
new file mode 100644
index 0000000..ffdc161
--- /dev/null
+++ b/lib/features/contactAdmin/presentation/widgets/bottom_section.dart
@@ -0,0 +1,81 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:gap/gap.dart';
+import 'package:tanami_app/core/styles/app_color.dart';
+import 'package:tanami_app/core/styles/app_images.dart';
+import 'package:tanami_app/core/styles/app_text.dart';
+import 'package:tanami_app/core/utils/url_launcher/url_launcher.dart';
+
+import '../../../../shared/components/text_widget.dart';
+
+Widget bottomSection() {
+ return Padding(
+ padding: const EdgeInsets.all(22.0),
+ child: Column(
+ children: [
+ const Gap(50.0),
+ contactOption(
+ icon: AppImages.byPhoneIcon,
+ title: AppText.byPhoneText,
+ subtitle: '+973 12345678',
+ onTap: () {
+ launchPhone('+973 12345678');
+ },
+ ),
+ const Gap(16.0),
+ contactOption(
+ icon: AppImages.byMailIcon,
+ title: AppText.byEmailText,
+ subtitle: 'info@tanamicapital.com',
+ onTap: () {
+ launchEmail('info@tanamicapital.com');
+ },
+ ),
+ ],
+ ),
+ );
+}
+
+Widget contactOption({
+ required String icon,
+ required String title,
+ required String subtitle,
+ required VoidCallback onTap,
+}) {
+ return GestureDetector(
+ onTap: onTap,
+ child: Container(
+ padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 16.0),
+ decoration: BoxDecoration(
+ color: AppColor.contactAdminBgColor,
+ borderRadius: BorderRadius.circular(22.0),
+ ),
+ child: Row(
+ children: [
+ SvgPicture.asset(
+ icon,
+ ),
+ const Gap(16.0),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ TextWidget().text14W600(
+ title,
+ clr: AppColor.contactAdminIconColor,
+ ),
+ TextWidget().text14W400(
+ subtitle,
+ clr: AppColor.contactAdminIconColor,
+ ),
+ ],
+ ),
+ const Spacer(),
+ const Icon(
+ Icons.arrow_forward_ios,
+ color: AppColor.contactAdminIconColor,
+ ),
+ ],
+ ),
+ ),
+ );
+}
diff --git a/lib/features/contactAdmin/presentation/widgets/top_section.dart b/lib/features/contactAdmin/presentation/widgets/top_section.dart
new file mode 100644
index 0000000..6b051dc
--- /dev/null
+++ b/lib/features/contactAdmin/presentation/widgets/top_section.dart
@@ -0,0 +1,27 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:gap/gap.dart';
+
+import '../../../../core/styles/app_color.dart';
+import '../../../../core/styles/app_images.dart';
+import '../../../../core/styles/app_text.dart';
+import '../../../../shared/components/text_widget.dart';
+
+Widget topSection() {
+ return Column(
+ children: [
+ const Gap(85),
+ Center(
+ child: SvgPicture.asset(
+ AppImages.weclomeLogo,
+ ),
+ ),
+ const Gap(24),
+ TextWidget().text17W700(
+ AppText.weAreHereToHelp,
+ clr: AppColor.textLabelColor,
+ ),
+ const Gap(10),
+ ],
+ );
+}
diff --git a/lib/features/deleteAccount/presentation/bloc/delete_account_bloc.dart b/lib/features/deleteAccount/presentation/bloc/delete_account_bloc.dart
new file mode 100644
index 0000000..a8bd515
--- /dev/null
+++ b/lib/features/deleteAccount/presentation/bloc/delete_account_bloc.dart
@@ -0,0 +1,65 @@
+import 'package:bloc/bloc.dart';
+import 'package:flutter/material.dart';
+import 'package:tanami_app/features/deleteAccount/presentation/bloc/delete_account_event.dart';
+import 'package:tanami_app/features/deleteAccount/presentation/bloc/delete_account_state.dart';
+
+class DeleteAccountBloc extends Bloc {
+ final GlobalKey formKey = GlobalKey();
+ final TextEditingController descriptionTextField = TextEditingController();
+
+ GlobalKey getFormKey() {
+ return formKey;
+ }
+
+ DeleteAccountBloc() : super(DeleteAccountInitial()) {
+ descriptionTextField.addListener(_onFormFieldChanged);
+
+ on(_onLoginFormChanged);
+ on((event, emit) async {
+ if (!formKey.currentState!.validate()) {
+ return;
+ }
+ emit(DeleteAccountLoading());
+ try {
+ // Simulate API call
+ await Future.delayed(const Duration(seconds: 2));
+ // Replace the next line with actual API call
+ final isSuccess = _mockApiCheck();
+ if (isSuccess) {
+ emit(DeleteAccountSuccess());
+ } else {
+ emit(const DeleteAccountFailure("Failed."));
+ }
+ } catch (e) {
+ emit(DeleteAccountFailure(e.toString()));
+ }
+ });
+ }
+
+ bool _mockApiCheck() {
+ return true;
+ }
+
+ void _onFormFieldChanged() {
+ add(DeleteAccountFormChanged(
+ descriptionTextField.text,
+ ));
+ }
+
+ void _onLoginFormChanged(
+ DeleteAccountFormChanged event, Emitter emit) {
+ final areFieldsFilled = event.description.isNotEmpty;
+ emit(DeleteAccountFieldsState(areFieldsFilled));
+ }
+
+ // Method to reset text fields
+ void resetFields() {
+ descriptionTextField.clear();
+ }
+
+ @override
+ Future close() {
+ descriptionTextField.dispose();
+ return super.close();
+ }
+}
diff --git a/lib/features/deleteAccount/presentation/bloc/delete_account_event.dart b/lib/features/deleteAccount/presentation/bloc/delete_account_event.dart
new file mode 100644
index 0000000..0db45bf
--- /dev/null
+++ b/lib/features/deleteAccount/presentation/bloc/delete_account_event.dart
@@ -0,0 +1,30 @@
+import 'package:equatable/equatable.dart';
+
+abstract class DeleteAccountEvent extends Equatable {
+ const DeleteAccountEvent();
+
+ @override
+ List