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 get props => []; +} + +class ChooseLanguageSelected extends ChooseLanguageEvent { + final int selectedIndex; + + const ChooseLanguageSelected([this.selectedIndex = 0]); + + @override + List get props => [selectedIndex]; +} + +class ResetRadioSelection extends ChooseLanguageEvent {} diff --git a/lib/features/languageChange/presentation/bloc/choose_language_state.dart b/lib/features/languageChange/presentation/bloc/choose_language_state.dart new file mode 100644 index 0000000..ede1c9f --- /dev/null +++ b/lib/features/languageChange/presentation/bloc/choose_language_state.dart @@ -0,0 +1,19 @@ +import 'package:equatable/equatable.dart'; + +abstract class ChooseLanguageState extends Equatable { + const ChooseLanguageState(); + + @override + List get props => []; +} + +class ChooseLanguageInitial extends ChooseLanguageState {} + +class ChooseLanguageSelectionChanged extends ChooseLanguageState { + final int selectedIndex; + + const ChooseLanguageSelectionChanged(this.selectedIndex); + + @override + List get props => [selectedIndex]; +} diff --git a/lib/features/languageChange/presentation/pages/language_change_layout.dart b/lib/features/languageChange/presentation/pages/language_change_layout.dart new file mode 100644 index 0000000..803319d --- /dev/null +++ b/lib/features/languageChange/presentation/pages/language_change_layout.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.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/shared/components/appbar_widget.dart'; +import 'package:tanami_app/shared/components/text_widget.dart'; +import '../widgets/bottom_section.dart'; +import '../widgets/language_change_list.dart'; + +class LanguageChangeLayout extends StatelessWidget { + const LanguageChangeLayout({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + bottomNavigationBar: bottomSection(), + appBar: const AppBarWidget( + height: 75, + titleTxt: AppText.languageText, + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const CountrySelectionList(), + const Gap(24), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + width: 24, + height: 24, + AppImages.infoIcon, + ), + const Gap(8), + SizedBox( + width: 0.8.sw, + child: TextWidget().text12W500( + AppText.changingTheLanguageWillReloadApp, + clr: AppColor.languageTextColor, + ), + ) + ], + ) + ], + ), + ), + ); + } +} diff --git a/lib/features/languageChange/presentation/pages/language_change_screen.dart b/lib/features/languageChange/presentation/pages/language_change_screen.dart new file mode 100644 index 0000000..6b836c2 --- /dev/null +++ b/lib/features/languageChange/presentation/pages/language_change_screen.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:tanami_app/features/languageChange/presentation/bloc/choose_language_bloc.dart'; + +import 'language_change_layout.dart'; + +class LanguageChaneScreen extends StatelessWidget { + const LanguageChaneScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + resizeToAvoidBottomInset: true, + body: MultiBlocProvider( + // Define the providers for the OnboardingBloc and other blocs + providers: [ + BlocProvider( + // Create an instance of the OnboardingBloc + create: (context) => ChooseLanguageBloc(), + ), + ], + child: const LanguageChangeLayout(), + ), + ); + } +} diff --git a/lib/features/languageChange/presentation/widgets/bottom_section.dart b/lib/features/languageChange/presentation/widgets/bottom_section.dart new file mode 100644 index 0000000..8d0ebce --- /dev/null +++ b/lib/features/languageChange/presentation/widgets/bottom_section.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:gap/gap.dart'; + +import '../../../../core/routes/routes.dart'; +import '../../../../core/styles/app_color.dart'; +import '../../../../core/styles/app_text.dart'; +import '../../../../shared/components/button_widget.dart'; +import '../../../../shared/components/text_widget.dart'; + +Widget bottomSection() { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 10, + ), + width: 1.sw, + height: 56.h, + child: ButtonWidget().elevatedBtn( + txtClr: AppColor.plainWhite, + function: () { + goRouter.pop(); + }, + text: AppText.submitText, + clr: AppColor.primaryColor2, + ), + ), + ButtonWidget().textBtn( + function: () { + goRouter.pop(); + }, + text: TextWidget().text14W700(AppText.backText, + clr: AppColor.textLabelColor, + textDecoration: TextDecoration.underline)), + const Gap(20), + ], + ); +} diff --git a/lib/features/languageChange/presentation/widgets/language_change_list.dart b/lib/features/languageChange/presentation/widgets/language_change_list.dart new file mode 100644 index 0000000..9a54e29 --- /dev/null +++ b/lib/features/languageChange/presentation/widgets/language_change_list.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:tanami_app/core/styles/app_color.dart'; +import 'package:tanami_app/core/styles/app_text.dart'; +import 'package:tanami_app/shared/components/text_widget.dart'; + +import '../bloc/choose_language_bloc.dart'; +import '../bloc/choose_language_event.dart'; +import '../bloc/choose_language_state.dart'; + +class CountrySelectionList extends StatelessWidget { + const CountrySelectionList({super.key}); + + @override + Widget build(BuildContext context) { + final radioBloc = context.read(); + return BlocBuilder( + builder: (context, state) { + int selectedIndex = 0; + if (state is ChooseLanguageSelectionChanged) { + selectedIndex = state.selectedIndex; + } + + return Column( + children: List.generate(languageList.length, (int index) { + return Row( + children: [ + Radio( + activeColor: AppColor.radioActiveColor, + value: index, + groupValue: selectedIndex, + onChanged: (int? value) { + if (value != null) { + radioBloc.add(ChooseLanguageSelected(value)); + } + }, + ), + TextWidget().text14W500(languageList[index], + clr: AppColor.charcoalColor), + ], + ); + }), + ); + }, + ); + } +} + +List languageList = [ + AppText.englishText, + AppText.arabicText, +]; diff --git a/pubspec.lock b/pubspec.lock index 441a282..c56e58d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1222,13 +1222,13 @@ packages: source: hosted version: "10.3.0" url_launcher: - dependency: transitive + dependency: "direct main" description: name: url_launcher - sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.6" + version: "6.3.0" url_launcher_android: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5dfe525..f6efa91 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,6 +78,9 @@ dependencies: sms_autofill: ^2.3.1 carousel_slider: ^4.2.1 + #Url Launcher + url_launcher: ^6.3.0 + dev_dependencies: flutter_test: sdk: flutter @@ -109,6 +112,10 @@ flutter: - assets/images/biometric_screen/svg/ - assets/images/dialog/ - assets/images/dialog/svg/ + - assets/images/contact_admin_screen/ + - assets/images/contact_admin_screen/svg/ - assets/images/settings_screen/ - assets/images/settings_screen/png/ - assets/images/settings_screen/svg/ + - assets/images/language_screen/ + - assets/images/language_screen/png/