diff --git a/lib/attraction_details/attraction_details_view.dart b/lib/attraction_details/view/attraction_details_view.dart similarity index 95% rename from lib/attraction_details/attraction_details_view.dart rename to lib/attraction_details/view/attraction_details_view.dart index fbb1a5b..f462033 100644 --- a/lib/attraction_details/attraction_details_view.dart +++ b/lib/attraction_details/view/attraction_details_view.dart @@ -1,37 +1,15 @@ -import 'package:citycards_customer/attraction_details/share_bottomsheet.dart'; +import 'package:citycards_customer/attraction_details/view_model/attraction_details_view_model.dart'; +import 'package:citycards_customer/attraction_details/widgets/share_bottomsheet.dart'; import 'package:citycards_customer/common_packages/app_bar.dart'; import 'package:citycards_customer/common_packages/custom_text.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../core/route_constants.dart'; +import '../../core/route_constants.dart'; class AttractionDetailsView extends StatelessWidget { - const AttractionDetailsView({super.key}); + AttractionDetailsView({super.key}); - - Future _makePhoneCall(String phoneNumber) async { - final Uri url = Uri(scheme: 'tel', path: phoneNumber); - if (await canLaunchUrl(url)) { - await launchUrl(url); - } else { - throw 'Could not launch $url'; - } - } - - Future _sendEmail(String emailAddress) async { - final Uri url = Uri( - scheme: 'mailto', - path: emailAddress, - query: 'subject=Hello City Cards&body=Hi there,', // optional - ); - if (await canLaunchUrl(url)) { - await launchUrl(url); - } else { - throw 'Could not launch $url'; - } - } + final AttractionDetailsViewModel viewModel = AttractionDetailsViewModel(); @override Widget build(BuildContext context) { @@ -186,7 +164,8 @@ class AttractionDetailsView extends StatelessWidget { ), SizedBox(height: 16.h), InkWell( - onTap: () => _makePhoneCall('+10123456789'), + onTap: () => + viewModel.makePhoneCall('+10123456789', context), borderRadius: BorderRadius.circular(8.r), child: Container( padding: EdgeInsets.symmetric( @@ -239,7 +218,8 @@ class AttractionDetailsView extends StatelessWidget { ), SizedBox(height: 16.h), InkWell( - onTap: () => _sendEmail('CityCards24@gmail.com'), + onTap: () => + viewModel.sendEmail('CityCards24@gmail.com', context), borderRadius: BorderRadius.circular(8.r), child: Container( padding: EdgeInsets.symmetric( diff --git a/lib/attraction_details/view_model/attraction_details_view_model.dart b/lib/attraction_details/view_model/attraction_details_view_model.dart new file mode 100644 index 0000000..f3b186d --- /dev/null +++ b/lib/attraction_details/view_model/attraction_details_view_model.dart @@ -0,0 +1,34 @@ +import 'package:url_launcher/url_launcher.dart'; +import 'package:flutter/material.dart'; + +class AttractionDetailsViewModel { + // 📞 Call method + Future makePhoneCall(String phoneNumber, BuildContext context) async { + final Uri url = Uri(scheme: 'tel', path: phoneNumber); + + if (await canLaunchUrl(url)) { + await launchUrl(url); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Could not launch $phoneNumber')), + ); + } + } + + // 📧 Email method + Future sendEmail(String emailAddress, BuildContext context) async { + final Uri url = Uri( + scheme: 'mailto', + path: emailAddress, + query: 'subject=Hello City Cards&body=Hi there,', + ); + + if (await canLaunchUrl(url)) { + await launchUrl(url); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Could not launch mail app')), + ); + } + } +} diff --git a/lib/attraction_details/share_bottomsheet.dart b/lib/attraction_details/widgets/share_bottomsheet.dart similarity index 100% rename from lib/attraction_details/share_bottomsheet.dart rename to lib/attraction_details/widgets/share_bottomsheet.dart diff --git a/lib/attractions/views/attractions_page_view.dart b/lib/attractions/views/attractions_page_view.dart index d4d54c5..3db0df3 100644 --- a/lib/attractions/views/attractions_page_view.dart +++ b/lib/attractions/views/attractions_page_view.dart @@ -15,6 +15,9 @@ class AttractionsPage extends StatelessWidget { @override Widget build(BuildContext context) { + + + return BlocProvider( create: (_) { final bloc = AttractionsBloc(AttractionsRepository()); diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart index 315771e..2d9dc8d 100644 --- a/lib/core/app_router.dart +++ b/lib/core/app_router.dart @@ -1,6 +1,6 @@ import 'package:citycards_customer/Profile/profile_page_view.dart'; import 'package:citycards_customer/add_details/add_details_view.dart'; -import 'package:citycards_customer/attraction_details/attraction_details_view.dart'; +import 'package:citycards_customer/attraction_details/view/attraction_details_view.dart'; import 'package:citycards_customer/buy_a_pass/view/buy_pass_view.dart'; import 'package:citycards_customer/checkout/view/checkout_view.dart'; import 'package:citycards_customer/common_bloc/language_selection_bloc.dart'; diff --git a/lib/core/inside_bottom_navigator.dart b/lib/core/inside_bottom_navigator.dart index 4ba084c..bf952a1 100644 --- a/lib/core/inside_bottom_navigator.dart +++ b/lib/core/inside_bottom_navigator.dart @@ -5,7 +5,7 @@ import 'package:citycards_customer/postcard/views/add_filter_step_page_view.dart import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import '../attraction_details/attraction_details_view.dart'; +import '../attraction_details/view/attraction_details_view.dart'; import '../attractions/views/attractions_page_view.dart'; import '../buy_a_pass/view/buy_pass_view.dart'; import '../checkout/view/checkout_view.dart'; diff --git a/lib/offer_pass_detail/offer_pass_detail_view.dart b/lib/offer_pass_detail/offer_pass_detail_view.dart index b09ad77..488c17f 100644 --- a/lib/offer_pass_detail/offer_pass_detail_view.dart +++ b/lib/offer_pass_detail/offer_pass_detail_view.dart @@ -1,4 +1,4 @@ -import 'package:citycards_customer/attraction_details/share_bottomsheet.dart'; +import 'package:citycards_customer/attraction_details/widgets/share_bottomsheet.dart'; import 'package:citycards_customer/common_packages/app_bar.dart'; import 'package:citycards_customer/common_packages/custom_bullet_points.dart'; import 'package:flutter/material.dart';