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 a442173..b8b5540 100644
--- a/lib/core/routes/route_name.dart
+++ b/lib/core/routes/route_name.dart
@@ -43,8 +43,13 @@ 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';
}
diff --git a/lib/core/routes/routes.dart b/lib/core/routes/routes.dart
index aee7798..9698747 100644
--- a/lib/core/routes/routes.dart
+++ b/lib/core/routes/routes.dart
@@ -7,9 +7,11 @@ import 'package:tanami_app/features/MainScreens/Academy/presentation/pages/acade
import 'package:tanami_app/features/MainScreens/Portfolio/presentation/pages/portfolio_details_screen.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/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';
@@ -152,6 +154,20 @@ final goRouter = GoRouter(
return const RestorePasswordScreen();
},
),
+ GoRoute(
+ 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(
diff --git a/lib/core/styles/app_color.dart b/lib/core/styles/app_color.dart
index b0f4a31..201e717 100644
--- a/lib/core/styles/app_color.dart
+++ b/lib/core/styles/app_color.dart
@@ -73,4 +73,11 @@ 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);
}
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 da589a1..d6d5870 100644
--- a/lib/core/styles/app_text.dart
+++ b/lib/core/styles/app_text.dart
@@ -151,4 +151,15 @@ 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";
}
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_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/languageChange/presentation/bloc/choose_language_bloc.dart b/lib/features/languageChange/presentation/bloc/choose_language_bloc.dart
new file mode 100644
index 0000000..b5f007c
--- /dev/null
+++ b/lib/features/languageChange/presentation/bloc/choose_language_bloc.dart
@@ -0,0 +1,33 @@
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+import 'choose_language_event.dart';
+import 'choose_language_state.dart';
+
+class ChooseLanguageBloc
+ extends Bloc {
+ ChooseLanguageBloc() : super(ChooseLanguageInitial()) {
+ on(_onRadioSelected);
+ on(_onResetRadioSelection);
+ }
+
+ void _onRadioSelected(
+ ChooseLanguageSelected event, Emitter emit) {
+ emit(ChooseLanguageSelectionChanged(event.selectedIndex));
+ }
+
+ void _onResetRadioSelection(
+ ResetRadioSelection event, Emitter emit) {
+ emit(ChooseLanguageInitial());
+ }
+
+ void resetSelection() {
+ add(ResetRadioSelection());
+ }
+
+ int get selectedCountry {
+ if (state is ChooseLanguageSelectionChanged) {
+ return (state as ChooseLanguageSelectionChanged).selectedIndex;
+ }
+ return 0;
+ }
+}
diff --git a/lib/features/languageChange/presentation/bloc/choose_language_event.dart b/lib/features/languageChange/presentation/bloc/choose_language_event.dart
new file mode 100644
index 0000000..b94db09
--- /dev/null
+++ b/lib/features/languageChange/presentation/bloc/choose_language_event.dart
@@ -0,0 +1,19 @@
+import 'package:equatable/equatable.dart';
+
+abstract class ChooseLanguageEvent extends Equatable {
+ const ChooseLanguageEvent();
+
+ @override
+ List