Created
July 24, 2025 07:17
-
-
Save ahanafi/28a30bef50b2da8866c398fe00163f51 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:async'; | |
import 'package:ayo_indonesia_mobile_apps/components/loading_dialog_widget.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/default_profile/default_profile.dart'; | |
import 'package:ayo_indonesia_mobile_apps/configs/shared_prefence_manager.dart'; | |
import 'package:ayo_indonesia_mobile_apps/constants/injector.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/membership/venue_membership_list.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/main_response_api/main_response_api.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_field_list.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_list.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_coach.dart'; | |
import 'package:ayo_indonesia_mobile_apps/new_components/avatar/rounded_user_avatar.dart'; | |
import 'package:ayo_indonesia_mobile_apps/new_components/avatar/rounded_team_avatar.dart'; | |
import 'package:ayo_indonesia_mobile_apps/repositories/venue/venue_membership_repository.dart'; | |
import 'package:ayo_indonesia_mobile_apps/repositories/venue/venue_cart_repository.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/checkout/membership/schedule/choose_schedule_bundling_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/checkout/membership/schedule/choose_schedule_recurring_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/event/open_play/detail/open_play_detail_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/event/sparring/detail/sparring_detail_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/event/sparring/detail/sparring_individual_detail_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/venue_list_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/team_profile/team_profile.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/profile/profile_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/detail/about_venue_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/report_block_bottom.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/rating_detail_modal_bottom.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/bottomsheet/event/sport_selector_modal.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/bottomsheet/event/sport_selector_venue_detail_modal.dart'; | |
import 'package:syncfusion_flutter_sliders/sliders.dart'; | |
import 'package:cached_network_image/cached_network_image.dart'; | |
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; | |
import 'package:ayo_indonesia_mobile_apps/lang/app_locale.dart'; | |
import 'package:dio/dio.dart'; | |
import 'package:dotted_line/dotted_line.dart'; | |
import 'package:assorted_layout_widgets/assorted_layout_widgets.dart'; | |
import 'package:clipboard/clipboard.dart'; | |
////import 'package:facebook_app_events/facebook_app_events.dart'; | |
import 'package:flutter/foundation.dart'; | |
import 'package:flutter/gestures.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter_screenutil/flutter_screenutil.dart'; | |
import 'package:flutter_bloc/flutter_bloc.dart'; | |
import 'package:flutter_svg/flutter_svg.dart'; | |
import 'package:geolocator/geolocator.dart'; | |
import 'package:google_maps_flutter/google_maps_flutter.dart'; | |
import 'package:intl/intl.dart'; | |
import 'package:latlong2/latlong.dart' as DLatLng; | |
import 'package:url_launcher/url_launcher.dart'; | |
import 'package:percent_indicator/linear_percent_indicator.dart'; | |
import 'package:timeago/timeago.dart' as timeago; | |
import 'package:scroll_to_index/scroll_to_index.dart'; | |
import 'package:ayo_indonesia_mobile_apps/blocs/venue/cancel_policy/cancel_policy_bloc.dart'; | |
import 'package:ayo_indonesia_mobile_apps/blocs/venue/detail/venue_detail_bloc.dart'; | |
import 'package:ayo_indonesia_mobile_apps/blocs/category/category_bloc.dart'; | |
import 'package:ayo_indonesia_mobile_apps/blocs/category/category_event.dart'; | |
import 'package:ayo_indonesia_mobile_apps/blocs/category/category_state.dart'; | |
import 'package:ayo_indonesia_mobile_apps/blocs/venue/favorite/venue_favorite_bloc.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/calendar/ayo_custom_datepicker.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/custom_flutter_toast.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/custom_flutter_toast_navigator.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/custom_flutter_toast_without_close.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/custom_wrapper.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/dash_line.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/share/general_share_modal.dart'; | |
import 'package:ayo_indonesia_mobile_apps/components/skeleton.dart'; | |
import 'package:ayo_indonesia_mobile_apps/configs/base_url_config.dart'; | |
import 'package:ayo_indonesia_mobile_apps/constants/color.dart'; | |
import 'package:ayo_indonesia_mobile_apps/constants/text_font_const.dart'; | |
import 'package:ayo_indonesia_mobile_apps/constants/venue_booking_constant.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/cancel_policy/venue_cancel_policy.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/highlight_review_venue.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/other_venue_list.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/sport.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_detail.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_voucher.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_event_new.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_community.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/category/category.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_cart.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/venue/venue_review_list.dart'; | |
import 'package:ayo_indonesia_mobile_apps/models/community/community_venue_review.dart'; | |
import 'package:ayo_indonesia_mobile_apps/repositories/venue/venue_repository.dart'; | |
import 'package:ayo_indonesia_mobile_apps/repositories/venue/venue_voucher_repository.dart'; | |
import 'package:ayo_indonesia_mobile_apps/repositories/category/category_repository.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/checkout/voucher/venue_voucher_list_content.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/detail/components/image_banner_slider.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/detail/components/other_venue_card.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/detail/review/venue_review_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/detail/venue_option_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/home/schedule/new_choose_schedule_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/activity/venue_activity_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/community/venue_community_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/checkout/review_order_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/favorite/venue_favorite_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/team_profile/review_open_play/review_open_play_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/utilities/dynamic_link_helper.dart'; | |
import 'package:ayo_indonesia_mobile_apps/utilities/helpers.dart'; | |
import 'package:provider/provider.dart'; | |
import 'package:ayo_indonesia_mobile_apps/services/connection_service.dart'; | |
import 'package:flutter_localization/flutter_localization.dart'; | |
import '../../../components/bottomsheet/match_cam_general_info.dart'; | |
import '../../team_profile_new/team_profile.dart'; | |
import 'membership/package_screen.dart'; | |
import 'package:ayo_indonesia_mobile_apps/screens/venue/checkout/membership/new_schedule/new_choose_schedule_bundling_screen.dart'; | |
class VenueDetailScreen extends StatelessWidget { | |
static const routeName = '/venue/detail'; | |
const VenueDetailScreen({Key key}) : super(key: key); | |
@override | |
Widget build(BuildContext context) { | |
Map args = ModalRoute.of(context).settings.arguments; | |
int venueId = args['venue_id'] ?? 0; | |
String integrationType = args['integration_type'] ?? 'GENERAL'; | |
return MultiBlocProvider( | |
providers: [ | |
BlocProvider<VenueDetailBloc>( | |
create: (context) => VenueDetailBloc(), | |
), | |
BlocProvider<VenueCancelPolicyBloc>( | |
create: (context) => VenueCancelPolicyBloc(), | |
), | |
BlocProvider<CategoryBloc>( | |
create: (context) { | |
return CategoryBloc(repository: CategoryRepositoryImpl()); | |
}, | |
), | |
BlocProvider<VenueFavoriteBloc>( | |
create: (context) => VenueFavoriteBloc(), | |
), | |
], | |
child: ContentVenueDetailScreen( | |
venueId: venueId, integrationType: integrationType, context: context), | |
); | |
} | |
} | |
class ContentVenueDetailScreen extends StatefulWidget { | |
final int venueId; | |
final BuildContext context; | |
final String sport; | |
final String integrationType; | |
ContentVenueDetailScreen( | |
{Key key, this.venueId, this.integrationType, this.sport, this.context}) | |
: super(key: key); | |
@override | |
_ContentVenueDetailScreenState createState() => | |
_ContentVenueDetailScreenState(); | |
} | |
class _ContentVenueDetailScreenState extends State<ContentVenueDetailScreen> { | |
bool isLoading = false; | |
final eventDate = new DateFormat('d MMM yyyy, HH:mm · '); | |
final reviewDate = new DateFormat('d MMM yyyy'); | |
int newSportFilter = 0; | |
List<Map<String, dynamic>> sportImageList = []; | |
List<Map<String, dynamic>> shortFacilities = []; | |
Future<VenueCartModel> _cartTotalFuture; | |
double horizontalPadding = 16; | |
ScrollController scrollController = ScrollController(); | |
ScrollController parentScrollController = ScrollController(); | |
TabController _tabController; | |
int currentTabIndex = 0; | |
bool isShowScrollToTop = false; | |
int venueRatingStar = 0; | |
String customVenueRatingStar = ''; | |
List<String> splitRating; | |
int ratingNotFull = 0; | |
AutoScrollController calendarController = AutoScrollController(); | |
List listNewCalendar = []; | |
List membershipTypes = ['langganan', 'bundling']; | |
String membershipType = ''; | |
DateTime ruleDate = DateTime.now(); | |
DateTime _date = DateTime.now(); | |
String _selectedDateSave = DateFormat('yyyy-MM-dd').format(DateTime.now()); | |
DateTime startDate = DateTime.now(); | |
bool newVenueJumpDate = false; | |
DateTime _focusedDay = DateTime.now(); | |
DateTime currentPage = DateTime.now(); | |
DateTime dateNow = DateTime.now(); | |
DateTime _selectedDay; | |
String _sortCommunityRadio = 'is_most_members'; | |
bool _isApplySortCommunityButtonShown = false; | |
String _currentSortCommunityRadio = 'is_most_members'; | |
List<String> sportCategoryName = []; | |
bool allSport = false; | |
bool myPref = true; | |
List<int> sports = []; | |
List<CategoryData> sportCategory = []; | |
int totalFilter = 0; | |
bool isMode2 = false; | |
bool isLoadActivity = false; | |
bool isLoadCoach = false; | |
bool isLoadMembership = false; | |
bool isLoadCommunity = false; | |
MaxVoucher maxVoucher = null; | |
String sortCommunity = 'is_most_members'; | |
List<dynamic> categoryActivityDatas; | |
List<String> categoryName = []; | |
List<int> categoryId = []; | |
String filterDateActivity = ''; | |
int filterDateX = 0; | |
// load more community | |
List<VenueCommunityData> venueCommunityData = []; | |
bool hasMoreCommunity = true; | |
int currentTotalCommunity = 100; | |
// load more membership | |
List<VenueMembership> venueMembershipData = []; | |
bool hasMoreMembership = true; | |
int currentTotalMembership = 10; | |
// load more coach | |
List<VenueCoach> venueCoachData = []; | |
bool hasMoreCoach = true; | |
int currentTotalCoach = 10; | |
// load more activity | |
List<VenueEventDataNew> venueActivityData = []; | |
bool hasMoreActivity = true; | |
int currentTotalActivity = 10; | |
// activity | |
bool filterCoaching = false; | |
bool filterBookedViaAyo = false; | |
bool filterSuperhost = false; | |
bool filterOfficialByVenue = false; | |
String selectedLevel = 'Semua Level'; | |
SfRangeValues integerSelectedLevelList = SfRangeValues(0, 4); | |
SfRangeValues finalLevelList = SfRangeValues(0, 4); | |
int startLevel = 0; | |
int endLevel = 4; | |
List selectedLevelList = []; | |
List<Map<String, dynamic>> filterLevelList = []; | |
List levelList = ['Newbie', 'Beginner', 'Intermediate', 'Advanced', 'Pro']; | |
bool _isApplyFilterButtonClicked = false; | |
bool _isApplyFilterButtonShown = false; | |
List timeList = [ | |
'00:00', | |
'01:00', | |
'02:00', | |
'03:00', | |
'04:00', | |
'05:00', | |
'06:00', | |
'07:00', | |
'08:00', | |
'09:00', | |
'10:00', | |
'11:00', | |
'12:00', | |
'13:00', | |
'14:00', | |
'15:00', | |
'16:00', | |
'17:00', | |
'18:00', | |
'19:00', | |
'20:00', | |
'21:00', | |
'22:00', | |
'23:00' | |
]; | |
String selectedTimeStart = '00:00'; | |
String selectedTimeEnd = '23:00'; | |
SfRangeValues integerSelectedTimeList = SfRangeValues(0, 23); | |
SfRangeValues finalTimeList = SfRangeValues(0, 23); | |
int filterStartTime = 0; | |
int filterEndTime = 23; | |
List selectedTimeList = []; | |
List<Map<String, dynamic>> filterTimeList = []; | |
List timeFilterSelected = []; | |
List<Map<dynamic, String>> sortCommunityOptions = [ | |
{'name': 'Anggota terbanyak', 'value': 'is_most_members'}, | |
{'name': 'Komunitas terbaru', 'value': 'is_newest_community'}, | |
]; | |
List<Map<String, dynamic>> tab = [ | |
{ | |
'name': 'Booking', | |
'value': 'booking', | |
'is_active': true, | |
}, | |
{ | |
'name': 'Aktivitas', | |
'value': 'aktivitas', | |
'is_active': false, | |
}, | |
{ | |
'name': 'Coach', | |
'value': 'coach', | |
'is_active': false, | |
}, | |
{ | |
'name': 'Membership', | |
'value': 'membership', | |
'is_active': false, | |
}, | |
{ | |
'name': 'Komunitas', | |
'value': 'komunitas', | |
'is_active': false, | |
}, | |
]; | |
String activeTab = 'booking'; | |
int venueOpenPlayRatingStar = 0; | |
String customVenueOpenPlayRatingStar = ''; | |
List<String> splitRatingOpenPlay; | |
int ratingNotFullOpenPlay = 0; | |
String reviewName = 'Sewa Lapangan'; | |
String reviewValue = 'field'; | |
/// Categories keys | |
final List<GlobalKey> jewelleryCategories = [ | |
GlobalKey(), | |
GlobalKey(), | |
GlobalKey(), | |
]; | |
final tabs = [ | |
'Ringkasan', | |
'Fasilitas', | |
'Aktivitas', | |
'Komunitas', | |
'Ulasan', | |
'Refund & Reschedule', | |
]; | |
bool isMembershipLoading = true; | |
List<CategoryData> category = []; | |
CategoryBloc categoryBloc; | |
String sportCategoryValue = 'Sepak Bola'; | |
List<int> sportCategoryId = [1, 2, 3]; | |
int sportCategoryIdValue = 0; | |
String selectedSport = 'Pilih Cabor'; | |
String selectedSportImage = ''; | |
int productVariantId = 0; | |
String productVariantName = ''; | |
var sportSelectorController = TextEditingController(); | |
var citySelectorController = TextEditingController(); | |
String headerImage = ''; | |
VenueCartRepository venueCartRepository = VenueCartRepository(); | |
static ////final facebookAppEvents = FacebookAppEvents(); | |
bool _venueTimeExpand = false; | |
bool _isDetailLoaded = false; | |
String venueName = ""; | |
String venueAddress = ""; | |
String description = ""; | |
String venueRules = ""; | |
int basePrice = 0; | |
int reschedulePolicy = 0; | |
CancelPolicy cancelPolicy; | |
DateTime selectedDateValue = DateTime.now(); | |
String shareUrl; | |
bool isVenueFavorite = false; | |
bool isVenueFavoriteAdd = false; | |
OperationTime currentDayOperationTime; | |
int venueIds = 0; | |
int totalCart = 0; | |
int finalTotalCart = 0; | |
int isDisableShowNearbyVenue = 0; | |
void showButtonCheckScrollToTop() { | |
setState(() { | |
isShowScrollToTop = true; | |
}); | |
} | |
void hideButtonCheckScrollToTop() { | |
setState(() { | |
isShowScrollToTop = false; | |
}); | |
} | |
void _updateTotalCart() async { | |
VenueCartModel venueCartResponse = await venueCartRepository.getCartTotal( | |
widget.context, | |
); | |
setState(() { | |
if (venueCartResponse.data != null) { | |
totalCart = venueCartResponse.data.totalCart; | |
} else { | |
totalCart = 0; | |
} | |
}); | |
} | |
int currentTotalmemberships = 0; | |
// * VOUCHER | |
VenueVoucherRepository venueVoucherRepository = VenueVoucherRepository(); | |
VenueMembershipRepository venueMembershipTncRepository = | |
VenueMembershipRepository(); | |
List<VenueVoucherData> vouchers = []; | |
VenueMembershipRepository venueMembershipRepository = | |
VenueMembershipRepository(); | |
List<VenueMembership> memberships = []; | |
VenueReview venueReviews; | |
List<Widget> bannerList = [ | |
Container( | |
width: double.infinity, | |
height: 350, | |
color: Colors.black38, | |
), | |
Container( | |
width: double.infinity, | |
height: 350, | |
color: Colors.grey, | |
), | |
Container( | |
width: double.infinity, | |
height: 350, | |
color: Colors.red, | |
), | |
]; | |
bool _showAppbar = false; | |
ScrollController _scrollBottomBarController; | |
bool isScrollingDown = false; | |
List package = ['langganan']; | |
bool isBundlingPackageExist = false; | |
bool isLanggananPackageExist = false; | |
void showAppBar() { | |
setState(() { | |
isScrollingDown = false; | |
_showAppbar = true; | |
}); | |
} | |
void hideAppBar() { | |
setState(() { | |
isScrollingDown = true; | |
_showAppbar = false; | |
}); | |
} | |
VenueRepository venueRepository = VenueRepository(); | |
VenueDetailBloc venueDetailBloc; | |
VenueDetailBloc highlightReviewVenueDetailBloc; | |
VenueDetailBloc reviewVenueBloc; | |
VenueDetailBloc otherVenuesBloc; | |
VenueDetailBloc eventVenuesBloc; | |
VenueDetailBloc coachVenuesBloc; | |
VenueDetailBloc membershipVenuesBloc; | |
VenueDetailBloc communitiesBloc; | |
VenueCancelPolicyBloc venueCancelPolicyBloc; | |
List<Map<String, dynamic>> groupedOperationTimes = []; | |
int pickedSportId = 0; | |
final SharedPreferencesManager _sharedPreferencesManager = | |
locator<SharedPreferencesManager>(); | |
Future<int> _checkPickedSport(category) async { | |
pickedSportId = category.id; | |
LoadingDialogWidget.show(context); | |
MainResponseApi responseApi = await venueCartRepository.checkCartSports( | |
widget.context, | |
sportId: pickedSportId, | |
venueId: widget.venueId); | |
if (responseApi.statusCode == 200) { | |
LoadingDialogWidget.hide(context); | |
return 0; // true means match existing sport in db | |
} else { | |
if (responseApi.statusCode == 202) { | |
LoadingDialogWidget.hide(context); | |
changeVenueAsk(context, category); | |
return 2; | |
} else { | |
LoadingDialogWidget.hide(context); | |
return 0; | |
} | |
// else { | |
// LoadingDialogWidget.hide(context); | |
// customFlutterToast( | |
// context: context, | |
// msg: responseApi.message.toString(), | |
// customToastType: CustomToastType.ERROR, | |
// ); | |
// // Navigator.of(context).pushNamedAndRemoveUntil( | |
// // ReviewOrderVenueScreen.routeName, | |
// // ModalRoute.withName(widget.removeUntilRoute), | |
// // arguments: { | |
// // 'remove_until_route': widget.removeUntilRoute, | |
// // }, | |
// // ); | |
// return 1; | |
// } | |
} | |
} | |
Future<int> _checkPickedSportCoach(category) async { | |
pickedSportId = category.sportId; | |
LoadingDialogWidget.show(context); | |
MainResponseApi responseApi = await venueCartRepository.checkCartSports( | |
widget.context, | |
sportId: pickedSportId, | |
venueId: widget.venueId); | |
if (responseApi.statusCode == 200) { | |
LoadingDialogWidget.hide(context); | |
return 0; // true means match existing sport in db | |
} else { | |
if (responseApi.statusCode == 202) { | |
LoadingDialogWidget.hide(context); | |
changeVenueAsk(context, category); | |
return 2; | |
} else { | |
LoadingDialogWidget.hide(context); | |
return 0; | |
} | |
} | |
} | |
final Dio _dio = Dio(); | |
String _getVenueDescriptions(List<AditionalInformation> descPoints) { | |
String venueDescriptions = ''; | |
for (var i = 0; i < descPoints.length; i++) { | |
venueDescriptions += descPoints[i].content; | |
if (i < descPoints.length - 1) venueDescriptions += ', '; | |
} | |
return venueDescriptions; | |
} | |
String _getCancelPolicyDescription(int percentage) { | |
String cancelDescription = ''; | |
if (cancelPolicy.name == VenueBookingConstant.cancelPolicyFlexible || | |
cancelPolicy.name == VenueBookingConstant.cancelPolicyMedium) { | |
int daysUntilFullRefund = | |
cancelPolicy.name == VenueBookingConstant.cancelPolicyFlexible | |
? 1 | |
: cancelPolicy.name == VenueBookingConstant.cancelPolicyMedium | |
? 5 | |
: 0; | |
DateTime comparisonDateTime = | |
selectedDateValue.subtract(Duration(hours: daysUntilFullRefund * 24)); | |
cancelDescription = '${context.formatString( | |
AppLocale.pembatalanBooking, | |
[], | |
)} '; | |
if (percentage < 100) { | |
if (cancelPolicy.name == VenueBookingConstant.cancelPolicyFlexible) { | |
cancelDescription += context.formatString( | |
AppLocale.kebijakanPembatalanFlexUnderOneHundred, | |
[], | |
); | |
} else { | |
cancelDescription += context.formatString( | |
AppLocale.kebijakanPembatalanNonFlexUnderOneHundred, | |
[daysUntilFullRefund], | |
); | |
} | |
} else { | |
if (cancelPolicy.name == VenueBookingConstant.cancelPolicyFlexible) { | |
cancelDescription += context.formatString( | |
AppLocale.kebijakanPembatalanFlexOneHundred, | |
[], | |
); | |
} else { | |
cancelDescription += context.formatString( | |
AppLocale.kebijakanPembatalanNonFlexOneHundred, | |
[daysUntilFullRefund], | |
); | |
} | |
} | |
} else if (cancelPolicy.name == VenueBookingConstant.cancelPolicyFirm) { | |
if (percentage > 0) { | |
DateTime comparisonDateTime = selectedDateValue | |
.subtract(Duration(hours: (percentage == 100) ? 7 * 24 : 1 * 24)); | |
cancelDescription = 'Pembatalan reservasi hingga ' + | |
Helpers.getLocalDayName(comparisonDateTime) + | |
', ' + | |
Helpers.getLocalDateFormat(comparisonDateTime); | |
} else { | |
cancelDescription = 'Pembatalan reservasi pada ' + | |
Helpers.getLocalDayName(selectedDateValue) + | |
', ' + | |
Helpers.getLocalDateFormat(selectedDateValue) + | |
' tidak dapat dilakukan'; | |
} | |
} else if (cancelPolicy.name == VenueBookingConstant.cancelPolicyStrict) { | |
cancelDescription += | |
context.formatString(AppLocale.booking_tidak_dapat_dibatalkan, []); | |
} | |
return cancelDescription; | |
} | |
void changeVenueAsk(context, category) { | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
builder: (context) { | |
return ClipRRect( | |
borderRadius: BorderRadius.only( | |
topLeft: Radius.circular(16), | |
topRight: Radius.circular(16), | |
), | |
child: Container( | |
padding: EdgeInsets.fromLTRB(24, 8, 24, 24), | |
color: Colors.white, | |
child: Wrap( | |
runAlignment: WrapAlignment.center, | |
children: <Widget>[ | |
SingleChildScrollView( | |
child: Container( | |
padding: EdgeInsets.only( | |
bottom: MediaQuery.of(context).viewInsets.bottom), | |
child: Column( | |
mainAxisAlignment: MainAxisAlignment.start, | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
SizedBox(height: 10), | |
Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisAlignment: MainAxisAlignment.start, | |
children: <Widget>[ | |
Text( | |
context.formatString( | |
AppLocale.ganti_venue, []) + | |
'?', | |
textAlign: TextAlign.center, | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 20, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500), | |
) | |
], | |
), | |
SizedBox(height: 12), | |
Text( | |
context.formatString( | |
AppLocale.keranjang_aktif_venue, []), | |
style: TextFontConst.RUBIK_REGULAR_16 | |
.copyWith(color: ColorBase.black80), | |
), | |
SizedBox(height: 24), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.stretch, | |
children: [ | |
Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
Expanded( | |
child: GestureDetector( | |
onTap: () { | |
Navigator.pop(context); | |
}, | |
child: Container( | |
height: 38, | |
padding: EdgeInsets.all(5), | |
decoration: BoxDecoration( | |
color: Colors.transparent, | |
borderRadius: | |
BorderRadius.circular(12), | |
border: Border.all( | |
color: ColorBase.primaryRed)), | |
child: Center( | |
child: Text( | |
context.formatString( | |
AppLocale.batal, []), | |
style: TextFontConst | |
.RUBIK_MEDIUM_RED_14 | |
.copyWith(height: 1), | |
), | |
), | |
), | |
), | |
), | |
SizedBox(width: 10), | |
Expanded( | |
child: GestureDetector( | |
onTap: () async { | |
deleteCurrentCart(category); | |
}, | |
child: Container( | |
height: 38, | |
padding: EdgeInsets.all(5), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: | |
BorderRadius.circular(12), | |
), | |
child: Center( | |
child: Text( | |
context.formatString( | |
AppLocale.ya_ganti_venue, []), | |
style: TextFontConst | |
.RUBIK_MEDIUM_WHITE_14 | |
.copyWith(height: 1), | |
), | |
), | |
), | |
), | |
), | |
], | |
) | |
], | |
), | |
], | |
), | |
), | |
), | |
], | |
), | |
), | |
); | |
}); | |
} | |
changePage(DateTime datetime) { | |
setState(() { | |
Future.delayed( | |
Duration(microseconds: 500), | |
() { | |
currentPage = datetime; | |
int scrollTarget = 0; | |
DateTime currentNormalDate = DateTime.now(); | |
if (newVenueJumpDate == true) { | |
currentNormalDate = dateNow; | |
} | |
jumpToDate(scrollTarget); | |
_selectedDay = datetime; | |
_selectedDateSave = DateFormat('yyyy-MM-dd').format(_selectedDay); | |
String dayName = | |
DateFormat('EEEE').format(currentPage).toString().toLowerCase(); | |
_focusedDay = currentPage; | |
}, | |
); | |
}); | |
} | |
void jumpToDate(scrollTarget) { | |
if (scrollTarget > listNewCalendar.length) { | |
_generateCalendar(reload: true, newVenueJumpDate: newVenueJumpDate); | |
jumpToDate(scrollTarget); | |
} else { | |
calendarController.scrollToIndex(scrollTarget, | |
preferPosition: AutoScrollPosition.middle); | |
} | |
} | |
void _generateCalendar({bool reload, bool newVenueJumpDate}) { | |
setState(() { | |
if (reload == null) { | |
reload = false; | |
} | |
if ((int.parse(DateFormat('yyyyMMdd').format(startDate)) > | |
int.parse(DateFormat('yyyyMMdd').format(ruleDate))) && | |
newVenueJumpDate == false) { | |
} else { | |
if (reload && newVenueJumpDate == false) { | |
if ((int.parse(DateFormat('yyyyMMdd').format(startDate)) <= | |
int.parse(DateFormat('yyyyMMdd').format(ruleDate)))) { | |
DateTime dateAdd = | |
DateTime.parse(DateFormat('yyyy-MM-dd').format(startDate)); | |
listNewCalendar.add(dateAdd); | |
startDate = startDate.add(Duration(days: 1)); | |
} | |
} else { | |
for (var i = 0; i < 14; i++) { | |
DateTime dateAdd = | |
DateTime.parse(DateFormat('yyyy-MM-dd').format(startDate)); | |
listNewCalendar.add(dateAdd); | |
startDate = startDate.add(Duration(days: 1)); | |
} | |
print('_generateCalendar ruleDate: $listNewCalendar'); | |
} | |
} | |
}); | |
} | |
void chooseField(category) async { | |
setState(() { | |
sportCategoryValue = category.name; | |
sportCategoryIdValue = category.id; | |
selectedSport = category.name; | |
sportSelectorController.text = category.name; | |
selectedSportImage = category.exploreImage; | |
_sharedPreferencesManager.putBool('is_new_select_schedule', true); | |
Navigator.of(context) | |
.pushNamed(NewChooseScheduleScreen.routeName, arguments: { | |
'venue_id': widget.venueId, | |
'integration_type': widget.integrationType, | |
'sport_name': selectedSport, | |
'sport_id': sportCategoryIdValue, | |
}); | |
}); | |
} | |
void chooseFieldCoach(category, fieldAdditionalServiceId) async { | |
setState(() { | |
sportCategoryValue = category.name; | |
sportCategoryIdValue = category.sportId; | |
selectedSport = category.name; | |
sportSelectorController.text = category.name; | |
selectedSportImage = category.svgFillPath; | |
productVariantId = category.id; | |
productVariantName = category.coachName; | |
_sharedPreferencesManager.putBool('is_new_select_schedule', true); | |
Navigator.of(context) | |
.pushNamed(NewChooseScheduleScreen.routeName, arguments: { | |
'venue_id': widget.venueId, | |
'integration_type': widget.integrationType, | |
'sport_name': selectedSport, | |
'sport_id': sportCategoryIdValue, | |
'filter_coach_id': productVariantId, | |
'filter_coach_name': productVariantName, | |
'field_additional_service_id': fieldAdditionalServiceId | |
}); | |
}); | |
} | |
void deleteCurrentCart(category) async { | |
var mobileToken = _sharedPreferencesManager | |
.getString(SharedPreferencesManager.keyMobileToken) | |
.toString() | |
.replaceAll("null", ""); | |
var query = | |
'?mobile_token=' + mobileToken + '&signature=' + '&type=OPEN_PLAY'; | |
var apiUrl = '${BaseUrlConfig.baseUrlApi}/venue-user/cart/0/delete' + query; | |
Uri uri = Uri.parse(apiUrl); | |
var response = await Provider.of<ConnectionService>(context, listen: false) | |
.returnConnection() | |
.get(uri); | |
Navigator.pop(context); | |
chooseField(category); | |
} | |
void generateGroupedOperationTimes(VenueDetail venue) { | |
setState(() { | |
Map<int, Map<String, dynamic>> tempGroups = {}; | |
groupedOperationTimes.clear(); | |
int tempIdx = 0; | |
String prevOperationHours = ''; | |
for (var i = 0; i < venue.defaultOperationTimes.length; i++) { | |
String currentStartTime = ''; | |
String currentEndTime = ''; | |
String currentOperationalHours = ''; | |
if (venue.defaultOperationTimes[i].status == 'active') { | |
currentStartTime = venue.defaultOperationTimes[i].startTime.substring( | |
0, venue.defaultOperationTimes[i].startTime.length - 3); | |
currentEndTime = venue.defaultOperationTimes[i].endTime | |
.substring(0, venue.defaultOperationTimes[i].endTime.length - 3); | |
currentOperationalHours = currentStartTime + ' - ' + currentEndTime; | |
} else { | |
currentOperationalHours = 'Tutup'; | |
} | |
if (prevOperationHours == '') | |
prevOperationHours = currentOperationalHours; | |
if (currentOperationalHours != prevOperationHours) { | |
tempIdx++; | |
prevOperationHours = currentOperationalHours; | |
} | |
if (!tempGroups.containsKey(tempIdx)) { | |
tempGroups[tempIdx] = { | |
'hours': currentOperationalHours, | |
'days': [], | |
}; | |
tempGroups[tempIdx]['days'].add(venue.defaultOperationTimes[i].day); | |
} else { | |
tempGroups[tempIdx]['days'].add(venue.defaultOperationTimes[i].day); | |
} | |
} | |
groupedOperationTimes.addAll(List.from(tempGroups.values)); | |
}); | |
} | |
void SaveVenueDetailClick() async { | |
await venueRepository.SaveVenueDetailClick(widget.context, | |
venueId: widget.venueId); | |
} | |
@override | |
void initState() { | |
super.initState(); | |
shareUrl = ''; | |
categoryBloc = BlocProvider.of<CategoryBloc>(context); | |
categoryBloc.add(FetchVenueCategoryByVenue(widget.venueId, context)); | |
SaveVenueDetailClick(); | |
_loadMembership(); | |
for (var i = 0; i < 14; i++) { | |
DateTime dateAdd = | |
DateTime.parse(DateFormat('yyyy-MM-dd').format(startDate)); | |
listNewCalendar.add(dateAdd); | |
startDate = startDate.add(Duration(days: 1)); | |
} | |
Future.delayed(const Duration(milliseconds: 230), () { | |
setState(() { | |
filterLevelList.addAll([ | |
{ | |
'label': context.formatString(AppLocale.semuaLevel, []), | |
'value': true | |
}, | |
{'label': 'Newbie', 'value': false}, | |
{'label': 'Beginner', 'value': false}, | |
{'label': 'Intermediate', 'value': false}, | |
{'label': 'Advanced', 'value': false}, | |
{'label': 'Pro', 'value': false}, | |
]); | |
}); | |
}); | |
venueDetailBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchVenueDetail( | |
widget.venueId, | |
widget.context, | |
)); | |
highlightReviewVenueDetailBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchHighlightReviewVenue( | |
widget.venueId, | |
widget.context, | |
)); | |
reviewVenueBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchReviewVenue( | |
widget.venueId, | |
widget.context, | |
)); | |
reviewVenueBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchReviewOpenPlayVenue( | |
widget.venueId, | |
widget.context, | |
)); | |
otherVenuesBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchOtherVenues( | |
widget.venueId, | |
widget.context, | |
)); | |
_scrollBottomBarController = new ScrollController(); | |
_scrollBottomBarController.addListener(() { | |
if (_scrollBottomBarController.position.pixels >= 200 && | |
_scrollBottomBarController.position.pixels <= 400) { | |
if (isScrollingDown) { | |
showAppBar(); | |
showButtonCheckScrollToTop(); | |
} | |
} else if (_scrollBottomBarController.position.pixels >= 400) { | |
showAppBar(); | |
showButtonCheckScrollToTop(); | |
isMode2 = true; | |
} else { | |
if (!isScrollingDown) { | |
hideAppBar(); | |
hideButtonCheckScrollToTop(); | |
isMode2 = false; | |
} | |
} | |
if (_scrollBottomBarController.position.pixels == | |
_scrollBottomBarController.position.maxScrollExtent && | |
!isLoading) { | |
if (activeTab == 'komunitas' && hasMoreCommunity) { | |
_getMoreDataCommunity(); | |
} | |
if (activeTab == 'membership' && hasMoreMembership) { | |
_getMoreDataMembership(); | |
} | |
if (activeTab == 'coach' && hasMoreCoach) { | |
_getMoreDataCoach(); | |
} | |
if (activeTab == 'aktivitas' && hasMoreActivity) { | |
_getMoreDataActivity(); | |
} | |
} | |
}); | |
parentScrollController.addListener(() { | |
// | |
// | |
}); | |
Future.delayed(const Duration(milliseconds: 0), () { | |
// getMembershipData(); | |
getTotalVoucher(); | |
}); | |
_cartTotalFuture = venueCartRepository.getCartTotal( | |
widget.context, | |
); | |
_updateTotalCart(); | |
_markers = <MarkerId, Marker>{}; | |
_mapController = Completer(); | |
} | |
_getMoreDataCommunity() { | |
if (!isLoading) { | |
setState(() { | |
isLoading = true; | |
}); | |
venueRepository | |
.getCommunities( | |
widget.venueId, | |
currentTotalCommunity, | |
100, | |
sports, | |
sortCommunity, | |
widget.context, | |
) | |
.then((val) { | |
setState(() { | |
if (val.data.communities.length > 0) { | |
currentTotalCommunity += 100; | |
hasMoreCommunity = true; | |
venueCommunityData.addAll(val.data.communities); | |
} else { | |
hasMoreCommunity = false; | |
} | |
isLoading = false; | |
}); | |
}); | |
} | |
} | |
_getMoreDataMembership() { | |
if (!isLoading) { | |
setState(() { | |
isLoading = true; | |
}); | |
venueMembershipRepository | |
.membershipList( | |
widget.context, | |
venueId: widget.venueId, | |
types: membershipTypes, | |
visibilities: ['public'], | |
start_from: currentTotalMembership, | |
limit: 10, | |
) | |
.then((val) { | |
setState(() { | |
if (val.data.length > 0) { | |
currentTotalMembership += 10; | |
hasMoreMembership = true; | |
venueMembershipData.addAll(val.data); | |
} else { | |
hasMoreMembership = false; | |
} | |
isLoading = false; | |
}); | |
}); | |
} | |
} | |
_getMoreDataCoach() { | |
if (!isLoading) { | |
setState(() { | |
isLoading = true; | |
}); | |
venueRepository | |
.getCoachVenues( | |
widget.venueId, | |
currentTotalCoach, | |
10, | |
sports, | |
widget.context, | |
) | |
.then((val) { | |
setState(() { | |
if (val.data.length > 0) { | |
currentTotalCoach += 10; | |
hasMoreCoach = true; | |
venueCoachData.addAll(val.data); | |
} else { | |
hasMoreCoach = false; | |
} | |
isLoading = false; | |
}); | |
}); | |
} | |
} | |
_getMoreDataActivity() { | |
if (!isLoading) { | |
setState(() { | |
isLoading = true; | |
}); | |
venueRepository | |
.getEventVenues( | |
widget.venueId, | |
currentTotalActivity, | |
10, | |
categoryName, | |
filterCoaching, | |
filterBookedViaAyo, | |
filterSuperhost, | |
filterOfficialByVenue, | |
selectedLevelList, | |
timeFilterSelected, | |
filterDateActivity, | |
widget.context, | |
) | |
.then((val) { | |
setState(() { | |
if (val.data.events.length > 0) { | |
currentTotalActivity += 10; | |
hasMoreActivity = true; | |
venueActivityData.addAll(val.data.events); | |
} else { | |
hasMoreActivity = false; | |
} | |
isLoading = false; | |
}); | |
}); | |
} | |
} | |
void getTotalVoucher() async { | |
try { | |
VenueVoucherModel response = await venueVoucherRepository | |
.profileList(widget.context, venueId: widget.venueId); | |
if (response.statusCode == 200) { | |
vouchers.clear(); | |
vouchers.addAll(response.data); | |
} | |
} catch (Exception) {} | |
} | |
void getMembershipData() async { | |
try { | |
venueMembershipRepository | |
.membershipList( | |
context, | |
venueId: widget.venueId, | |
start_from: 0, | |
types: ['langganan', 'bundling'], | |
visibilities: ['public'], | |
limit: 50, | |
) | |
.then((val) { | |
setState(() { | |
memberships.clear(); | |
if (val.data.length > 0) { | |
val.data.forEach((VenueMembership package) { | |
if (package.type == 'bundling') { | |
isBundlingPackageExist = true; | |
} | |
if (package.type == 'langganan') { | |
isLanggananPackageExist = true; | |
} | |
}); | |
if (isBundlingPackageExist) { | |
package = ['bundling']; | |
} else { | |
package = ['langganan']; | |
} | |
memberships.addAll(val.data); | |
package.clear(); | |
package.add(memberships[0].type); | |
} else {} | |
// isLoading = false; | |
setState(() { | |
isMembershipLoading = false; | |
}); | |
}); | |
}); | |
} catch (Exception) {} | |
} | |
String _markerIdVal({bool increment = false}) { | |
String val = 'marker_id_$_markerIdCounter'; | |
if (increment) _markerIdCounter++; | |
return val; | |
} | |
static Future<void> openMap(double latitude, double longitude) async { | |
String googleUrl = | |
'https://www.google.com/maps/search/?api=1&query=$latitude,$longitude'; | |
await launch(googleUrl, forceSafariVC: false); | |
} | |
// * MAPS | |
bool _isMapActive = false; | |
Map<MarkerId, Marker> _markers; | |
Marker marker; | |
int _markerIdCounter = 0; | |
Completer<GoogleMapController> _mapController; | |
double lat; | |
double lng; | |
void _onMapCreated(GoogleMapController controller) async { | |
_mapController.complete(controller); | |
LatLng position = LatLng(lat, lng); | |
if ([position] != null) { | |
MarkerId markerId = MarkerId(_markerIdVal()); | |
Marker marker = Marker( | |
markerId: markerId, | |
position: position, | |
draggable: false, | |
icon: await BitmapDescriptor.fromAssetImage( | |
ImageConfiguration(devicePixelRatio: 2.5), | |
'assets/images/ayo-pin-2.png'), | |
); | |
setState(() { | |
_markers[markerId] = marker; | |
}); | |
Future.delayed(Duration(seconds: 1), () async { | |
GoogleMapController controller = await _mapController.future; | |
controller.animateCamera( | |
CameraUpdate.newCameraPosition( | |
CameraPosition( | |
target: position, | |
zoom: 10.0, | |
), | |
), | |
); | |
}); | |
} | |
} | |
double distanceToVenue = 0.0; | |
void calculateDistanceToVenue() async { | |
Position position = await Geolocator.getCurrentPosition( | |
desiredAccuracy: LocationAccuracy.high); | |
setState(() { | |
// * CALCULATE DISTANCE | |
var distance = DLatLng.Distance(); | |
final km = distance.as( | |
DLatLng.LengthUnit.Kilometer, | |
DLatLng.LatLng(lat, lng), | |
DLatLng.LatLng(position.latitude, position.longitude)); | |
distanceToVenue = km; | |
}); | |
} | |
@override | |
void dispose() { | |
_scrollBottomBarController.dispose(); | |
_scrollBottomBarController.removeListener(() {}); | |
super.dispose(); | |
} | |
@override | |
void setState(fn) { | |
if (mounted) { | |
super.setState(fn); | |
} | |
} | |
@override | |
Widget build(BuildContext context) { | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
double screenWidth = MediaQuery.of(context).size.width; | |
return Container( | |
color: Colors.white, | |
child: SafeArea( | |
top: false, | |
child: CustomWrapper( | |
floatingActionButton: Visibility( | |
visible: (totalCart > 0 || | |
_sharedPreferencesManager.getInt("total_cart") > 0 || | |
isShowScrollToTop) | |
? true | |
: false, | |
child: AnimatedOpacity( | |
opacity: 1, | |
curve: Curves.easeOutBack, | |
duration: Duration(milliseconds: 500), | |
child: Padding( | |
padding: const EdgeInsets.only(bottom: 0.0), | |
child: isShowScrollToTop | |
? FloatingActionButton( | |
onPressed: () { | |
_scrollBottomBarController.animateTo( | |
0.0, | |
duration: const Duration(milliseconds: 300), | |
curve: Curves.ease, | |
); | |
}, | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/scroll-to-top.svg', | |
fit: BoxFit.contain, | |
width: 20, | |
height: 20, | |
), | |
backgroundColor: ColorBase.primaryWhite, | |
) | |
: FloatingActionButton( | |
backgroundColor: Colors.white, | |
child: Stack( | |
clipBehavior: Clip.none, | |
children: [ | |
Positioned( | |
right: finalTotalCart > 9 ? -7 : -5, | |
top: finalTotalCart > 9 ? -7 : -5, | |
child: FutureBuilder<VenueCartModel>( | |
future: _cartTotalFuture, | |
builder: (BuildContext context, | |
AsyncSnapshot snapshot) { | |
switch (snapshot.connectionState) { | |
case ConnectionState.none: | |
return Skeleton(width: 12, height: 12); | |
case ConnectionState.waiting: | |
return Skeleton(width: 12, height: 12); | |
case ConnectionState.active: | |
return Skeleton(width: 12, height: 12); | |
case ConnectionState.done: | |
if (snapshot.data == null) { | |
return Center( | |
child: CircularProgressIndicator(), | |
); | |
} else { | |
VenueCartData venueCartData = | |
snapshot.data.data; | |
totalCart = venueCartData.totalCart; | |
if (venueCartData.totalCart > 0 && | |
_sharedPreferencesManager | |
.getInt("total_cart") == | |
venueCartData.totalCart) { | |
finalTotalCart = | |
venueCartData.totalCart; | |
} else if (_sharedPreferencesManager | |
.getInt("total_cart") == | |
0) { | |
finalTotalCart = | |
venueCartData.totalCart; | |
} else { | |
finalTotalCart = | |
_sharedPreferencesManager | |
.getInt("total_cart"); | |
} | |
venueIds = venueCartData.venueId; | |
return GestureDetector( | |
onTap: () {}, | |
child: Container( | |
width: | |
finalTotalCart > 9 ? 16 : 12, | |
height: | |
finalTotalCart > 9 ? 16 : 12, | |
padding: EdgeInsets.all(2), | |
child: Text( | |
finalTotalCart.toString(), | |
textAlign: TextAlign.center, | |
style: TextFontConst | |
.RUBIK_MEDIUM | |
.copyWith( | |
fontSize: ScreenUtil() | |
.scaleText * | |
8, | |
color: Colors.white, | |
height: | |
finalTotalCart > 9 | |
? 1.3 | |
: 1), | |
), | |
decoration: BoxDecoration( | |
shape: BoxShape.circle, | |
color: ColorBase.primaryRed), | |
), | |
); | |
} | |
} | |
}, | |
), | |
), | |
SvgPicture.asset('assets/icons/cart.svg'), | |
], | |
), | |
onPressed: () { | |
if (totalCart > 0 || | |
_sharedPreferencesManager.getInt("total_cart") > | |
0) { | |
Navigator.of(context) | |
.pushNamed(ReviewOrderVenueScreen.routeName, arguments: {}).then( | |
(_) => setState(() { | |
_refreshData(); | |
})); | |
} | |
}, | |
), | |
), | |
), | |
), | |
bottomNavigationBar: _isDetailLoaded | |
? _buildBottomBarWidget() | |
: _buildBottomBarWidgetLoading(), | |
body: Stack( | |
children: [ | |
Container( | |
child: SingleChildScrollView( | |
controller: _scrollBottomBarController, | |
child: Container( | |
color: Colors.white, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
BlocListener<CategoryBloc, CategoryState>( | |
bloc: categoryBloc, | |
listener: (ctx, state) { | |
if (state is VenueCategoryLoadedState) { | |
if (state.categories.length > 0) { | |
setState(() { | |
sportImageList.clear(); | |
for (var i = 0; | |
i < state.categories.length; | |
i++) { | |
sportImageList.add({ | |
'id': state.categories[i].id, | |
'image': state.categories[i].svgPath, | |
'fill_image': | |
state.categories[i].svgFillPath, | |
'outline_image': | |
state.categories[i].svgOutlinePath, | |
'name': state.categories[i].name, | |
}); | |
} | |
category.addAll(state.categories); | |
if (widget.sport != null) { | |
for (var i = 0; | |
i < category.length; | |
i++) { | |
if (category[i].name == widget.sport) { | |
category[i].isPicked = true; | |
sportCategoryValue = category[i].name; | |
sportCategoryIdValue = category[i].id; | |
selectedSport = category[i].name; | |
sportSelectorController.text = | |
category[i].name; | |
} | |
} | |
_refreshData(); | |
} else { | |
_refreshData(); | |
} | |
}); | |
} | |
} | |
}, | |
child: SizedBox(), | |
), | |
BlocListener<VenueCancelPolicyBloc, | |
VenueCancelPolicyState>( | |
bloc: venueCancelPolicyBloc, | |
listenWhen: (previous, current) { | |
if (current is VenueCancelPolicyLoading || | |
current is VenueCancelPolicyFailure || | |
current is VenueCancelPolicyLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
listener: (ctx, state) { | |
if (state is VenueCancelPolicyLoaded) { | |
setState(() { | |
cancelPolicy = state.cancelPolicy; | |
}); | |
} | |
}, | |
child: SizedBox(height: 0), | |
), | |
BlocConsumer<VenueDetailBloc, VenueDetailState>( | |
bloc: venueDetailBloc, | |
listener: (ctx, state) { | |
if (state is ReviewVenueLoaded) { | |
venueRatingStar = int.parse(state | |
.venueReview.summary.venueRating | |
.toString() | |
.substring(0, 1)); | |
customVenueRatingStar = double.parse( | |
state.venueReview.summary.venueRating) | |
.toStringAsFixed(1); | |
splitRating = customVenueRatingStar.split('.'); | |
ratingNotFull = | |
int.parse(splitRating[1]) != 0 ? 1 : 0; | |
} | |
if (state is VenueDetailLoaded) { | |
setState(() { | |
_isDetailLoaded = true; | |
venueName = state.venueDetail.name; | |
maxVoucher = state.venueDetail.maxVoucher; | |
venueAddress = Helpers.capitalizeString( | |
state.venueDetail.city.toLowerCase()); | |
description = | |
state.venueDetail.description != null | |
? state.venueDetail.description | |
: ''; | |
isVenueFavorite = | |
state.venueDetail.isVenueFavorite == 1 | |
? true | |
: false; | |
venueRules = | |
state.venueDetail.venueRules != null | |
? state.venueDetail.venueRules | |
: ''; | |
basePrice = state.venueDetail.basePrice; | |
lat = | |
double.parse(state.venueDetail.latitude); | |
lng = | |
double.parse(state.venueDetail.longitude); | |
isDisableShowNearbyVenue = state | |
.venueDetail.isDisableShowNearbyVenue; | |
calculateDistanceToVenue(); | |
generateGroupedOperationTimes( | |
state.venueDetail); | |
reschedulePolicy = | |
state.venueDetail.reschedulePolicy; | |
for (var i = 0; | |
i < | |
state.venueDetail.operationTimes | |
.length; | |
i++) { | |
if (state.venueDetail.operationTimes[i] | |
.isToday == | |
1) | |
currentDayOperationTime = | |
state.venueDetail.operationTimes[i]; | |
} | |
for (var i = 0; | |
i < state.venueDetail.facilities.length; | |
i++) { | |
if (state.venueDetail.facilities[i].title | |
.length <= | |
7) | |
shortFacilities.add({ | |
'title': state | |
.venueDetail.facilities[i].title, | |
'image': state | |
.venueDetail.facilities[i].image, | |
}); | |
} | |
if (shortFacilities.length < 3) { | |
for (var i = 0; | |
i < state.venueDetail.facilities.length; | |
i++) { | |
if (state.venueDetail.facilities[i].title | |
.length > | |
7) | |
shortFacilities.add({ | |
'title': state | |
.venueDetail.facilities[i].title, | |
'image': state | |
.venueDetail.facilities[i].image, | |
}); | |
} | |
} | |
categoryActivityDatas = | |
state.venueDetail.sports; | |
venueCancelPolicyBloc = BlocProvider.of< | |
VenueCancelPolicyBloc>(context) | |
..add(FetchVenueCancelPolicy( | |
state.venueDetail.id, | |
widget.context, | |
)); | |
}); | |
Future.delayed( | |
const Duration(milliseconds: 1000), | |
() async { | |
Uri x = | |
await DynamicLinkHelper.createDynamicLink( | |
widget.context, | |
dataId: widget.venueId, | |
extraData: { | |
'venue_code': state.venueDetail.venueCode, | |
'venue_name': | |
venueName.replaceAll(' ', '-'), | |
}, | |
linkType: 'venue', | |
); | |
setState(() { | |
shareUrl = x.toString(); | |
}); | |
}); | |
} | |
}, | |
buildWhen: (previous, current) { | |
if (current is VenueDetailLoading || | |
current is VenueDetailFailure || | |
current is VenueDetailLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (state is VenueDetailLoaded) { | |
return _buildVenueDetailContent( | |
venueDetail: state.venueDetail); | |
} else if (state is VenueDetailFailure) { | |
return Text( | |
'gagal: ' + state.errorMessage.toString()); | |
} else { | |
return _buildVenueDetailContent( | |
isLoading: true); | |
} | |
}, | |
), | |
if (activeTab == 'booking') | |
Container( | |
padding: EdgeInsets.only(top: 22, bottom: 12), | |
margin: EdgeInsets.symmetric(horizontal: 16), | |
child: Divider( | |
color: ColorBase.black10, | |
), | |
), | |
BlocBuilder<VenueDetailBloc, VenueDetailState>( | |
bloc: eventVenuesBloc, | |
buildWhen: (previous, current) { | |
if (activeTab == 'aktivitas') { | |
if (current is EventVenuesLoading || | |
current is EventVenuesFailure || | |
current is EventVenuesLoaded) { | |
return true; | |
} | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (activeTab == 'aktivitas') { | |
if (state is EventVenuesLoaded) { | |
venueActivityData = state.eventVenueList; | |
// load more | |
if (venueActivityData.length < 10) { | |
hasMoreActivity = false; | |
} | |
if (filterDateX > 0) { | |
calendarController.scrollToIndex( | |
filterDateX, | |
preferPosition: AutoScrollPosition.middle, | |
); | |
} | |
return _buildEventVenueContent( | |
eventVenueList: state.eventVenueList); | |
} else { | |
return _buildEventVenueContent( | |
isLoading: true); | |
} | |
} else { | |
return SizedBox(width: 0); | |
} | |
}, | |
), | |
BlocBuilder<VenueDetailBloc, VenueDetailState>( | |
bloc: coachVenuesBloc, | |
buildWhen: (previous, current) { | |
if (current is CoachVenuesLoading || | |
current is CoachVenuesFailure || | |
current is CoachVenuesLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (activeTab == 'coach') { | |
if (state is CoachVenuesLoaded) { | |
venueCoachData = state.coachVenueList; | |
// load more | |
if (venueCoachData.length < 10) { | |
hasMoreCoach = false; | |
} | |
return _buildCoachVenueContent( | |
coachVenueList: state.coachVenueList); | |
} else { | |
return _buildCoachVenueContent( | |
isLoading: true); | |
} | |
} else { | |
return SizedBox(width: 0); | |
} | |
}, | |
), | |
BlocBuilder<VenueDetailBloc, VenueDetailState>( | |
bloc: membershipVenuesBloc, | |
buildWhen: (previous, current) { | |
if (current is MembershipVenuesLoading || | |
current is MembershipVenuesFailure || | |
current is MembershipVenuesLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (activeTab == 'membership') { | |
if (state is MembershipVenuesLoaded) { | |
venueMembershipData = | |
state.membershipVenueList; | |
// load more | |
if (venueMembershipData.length < 10) { | |
hasMoreMembership = false; | |
} | |
return _buildMembershipVenueContent( | |
membershipVenueList: | |
state.membershipVenueList); | |
} else { | |
return _buildMembershipVenueContent( | |
isLoading: true); | |
} | |
} else if (activeTab == 'booking') { | |
if (state is MembershipVenuesLoaded) { | |
memberships = state.membershipVenueList; | |
return SizedBox(width: 0); | |
} | |
} else { | |
return SizedBox(width: 0); | |
} | |
}, | |
), | |
BlocBuilder<VenueDetailBloc, VenueDetailState>( | |
bloc: communitiesBloc, | |
buildWhen: (previous, current) { | |
if (current is CommunitiesLoading || | |
current is CommunitiesFailure || | |
current is CommunitiesLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (activeTab == 'komunitas') { | |
if (state is CommunitiesLoaded) { | |
venueCommunityData = state.communityVenueList; | |
// load more | |
if (venueCommunityData.length < 10) { | |
hasMoreCommunity = false; | |
} | |
return _buildCommunity( | |
communityVenueList: | |
state.communityVenueList); | |
} else { | |
return _buildCommunity(isLoading: true); | |
} | |
} else { | |
return SizedBox(width: 0); | |
} | |
}, | |
), | |
], | |
), | |
), | |
), | |
), | |
Align( | |
child: AnimatedContainer( | |
// height: _showAppbar ? 80.0 : 0.0, | |
height: (screenHeight * 13 / 100 < 80) | |
? 80.0 | |
: screenHeight * 13 / 100, | |
duration: Duration(milliseconds: 500), | |
child: Container( | |
width: double.infinity, | |
height: (screenHeight * 13 / 100 < 80) | |
? 80.0 | |
: screenHeight * 13 / 100, | |
color: _showAppbar | |
? ColorBase.primaryWhite | |
: Colors.transparent, | |
child: AppBar( | |
leading: _showAppbar | |
? IconButton( | |
icon: Icon( | |
Icons.keyboard_arrow_left, | |
color: ColorBase.black100, | |
), | |
onPressed: () { | |
Navigator.pop(context); | |
}, | |
) | |
: GestureDetector( | |
onTap: () { | |
Navigator.pop(context); | |
}, | |
child: Container( | |
margin: EdgeInsets.only(left: 16, right: 8), | |
height: 32, | |
width: 32, | |
child: Image.asset( | |
'assets/images/ver3/navigation-bg-white.png', | |
)), | |
), | |
titleSpacing: 0, | |
backgroundColor: _showAppbar | |
? ColorBase.primaryWhite | |
: Colors.transparent, | |
elevation: 0.0, | |
title: (_showAppbar) | |
? Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
venueName, | |
style: TextStyle( | |
color: ColorBase.primaryBlack, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 18, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
) | |
: SizedBox(height: 0), | |
actions: [ | |
if (shareUrl != '') | |
Padding( | |
padding: EdgeInsets.only(right: 12), | |
child: GestureDetector( | |
onTap: () { | |
GeneralShareModal( | |
context: context, | |
shareTitle: context.formatString( | |
AppLocale.bagikanVenue, | |
[], | |
), | |
url: shareUrl, | |
whatsappBody: ''); | |
}, | |
child: _showAppbar | |
? Container( | |
height: 20, | |
width: 20, | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/share.svg', | |
fit: BoxFit.contain, | |
color: ColorBase.primaryBlack, | |
), | |
) | |
: Container( | |
height: 32, | |
width: 32, | |
child: Image.asset( | |
'assets/images/ver3/share-bg-white.png', | |
)), | |
), | |
), | |
GestureDetector( | |
onTap: () { | |
if (isVenueFavorite) { | |
BlocProvider.of<VenueFavoriteBloc>(context).add( | |
DeleteVenueFavoriteEvent( | |
widget.venueId, context)); | |
setState(() { | |
isVenueFavorite = false; | |
isVenueFavoriteAdd = false; | |
}); | |
} else { | |
BlocProvider.of<VenueFavoriteBloc>(context).add( | |
AddVenueFavoriteEvent( | |
widget.venueId, context)); | |
setState(() { | |
isVenueFavorite = true; | |
isVenueFavoriteAdd = true; | |
customFlutterToastNavigator( | |
context: context, | |
msg: context.formatString( | |
AppLocale.tambahVenueFavorit, | |
[], | |
), | |
customToastTypeNavigator: | |
CustomToastTypeNavigator.INFO, | |
venueId: widget.venueId); | |
}); | |
} | |
}, | |
child: _showAppbar | |
? isVenueFavorite | |
? Container( | |
margin: EdgeInsets.only(right: 12), | |
height: 20, | |
width: 20, | |
child: Image.asset( | |
'assets/images/ver3/heart-filled.png', | |
)) | |
: Container( | |
height: 20, | |
width: 20, | |
margin: EdgeInsets.only(right: 12), | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/heart-line.svg', | |
fit: BoxFit.contain, | |
color: ColorBase.primaryBlack, | |
), | |
) | |
: Container( | |
margin: EdgeInsets.only(right: 12), | |
height: 32, | |
width: 32, | |
child: Image.asset( | |
isVenueFavorite | |
? 'assets/images/ver3/heart-filled-bg-white.png' | |
: 'assets/images/ver3/heart-line-bg-white.png', | |
)), | |
), | |
GestureDetector( | |
onTap: () { | |
ReportBlockBottomSheetWidget( | |
subject: "Venue", | |
context: context, | |
refId: widget.venueId, | |
refType: "VENUE", | |
confirmMessage: "Venue " + | |
venueName + | |
" ${context.formatString( | |
AppLocale.blokirSubtitle, | |
[], | |
)}", | |
); | |
// _actionModal(context, screenWidth, screenHeight); | |
}, | |
child: _showAppbar | |
? Container( | |
height: 20, | |
width: 20, | |
margin: EdgeInsets.only(right: 12), | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/flag.svg', | |
fit: BoxFit.contain, | |
color: ColorBase.primaryBlack, | |
), | |
) | |
: Container( | |
margin: EdgeInsets.only(right: 12), | |
height: 32, | |
width: 32, | |
child: Image.asset( | |
'assets/images/ver3/flag-bg-white.png', | |
)), | |
), | |
SizedBox(width: 10), | |
], | |
), | |
), | |
), | |
alignment: Alignment.topCenter, | |
), | |
if (isMode2) | |
Positioned( | |
top: AppBar().preferredSize.height + 26, | |
child: Container( | |
padding: EdgeInsets.only( | |
top: 12, left: 0, right: 0, bottom: 0), | |
color: ColorBase.primaryWhite, | |
width: screenWidth, | |
child: Container( | |
decoration: BoxDecoration( | |
border: Border( | |
bottom: BorderSide( | |
color: ColorBase.black10, | |
), | |
), | |
), | |
child: SingleChildScrollView( | |
scrollDirection: Axis.horizontal, | |
child: Row( | |
children: [ | |
Padding( | |
padding: EdgeInsets.only(top: 0, left: 0), | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.center, | |
children: [ | |
for (int x = 0; x < tab.length; x++) | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
for (var i = 0; | |
i < tab.length; | |
i++) { | |
tab[i]['is_active'] = false; | |
} | |
tab[x]['is_active'] = true; | |
activeTab = tab[x]['value']; | |
}); | |
_scrollBottomBarController.animateTo( | |
0.0, | |
duration: const Duration( | |
milliseconds: 300), | |
curve: Curves.ease, | |
); | |
}, | |
child: Container( | |
alignment: Alignment.center, | |
// width: (screenWidth / 4), | |
padding: EdgeInsets.only( | |
bottom: 8, left: 32, right: 32), | |
decoration: BoxDecoration( | |
color: Colors.transparent, | |
border: Border( | |
bottom: BorderSide( | |
width: 1, | |
color: tab[x]['is_active'] | |
? ColorBase.black100 | |
: Colors | |
.transparent))), | |
child: Text( | |
tab[x]['name'] == 'Berhasil' | |
? context.formatString( | |
AppLocale.berhasil, | |
[], | |
) | |
: tab[x]['name'] == 'Pending' | |
? context.formatString( | |
AppLocale.pending, | |
[], | |
) | |
: tab[x]['name'], | |
textAlign: TextAlign.center, | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: tab[x]['is_active'] | |
? FontWeight.w500 | |
: FontWeight.w400, | |
color: tab[x]['is_active'] | |
? ColorBase.black100 | |
: ColorBase.black60, | |
), | |
), | |
), | |
), | |
], | |
), | |
), | |
], | |
), | |
), | |
), | |
), | |
), | |
], | |
), | |
), | |
)); | |
} | |
Widget _buildRescheduleRefundContent({bool isLoading = false}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
return Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
child: isLoading | |
? Skeleton( | |
width: 75, | |
height: 24, | |
) | |
: Row( | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.reschedule_pembatalan, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 12), | |
Container( | |
width: screenWidth - 32, | |
padding: EdgeInsets.all(8), | |
decoration: BoxDecoration( | |
color: Color(0xFFF1F1F1), | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all(color: ColorBase.black40)), | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
height: 14, | |
width: 14, | |
child: SvgPicture.asset( | |
'assets/images/info-black.svg', | |
fit: BoxFit.contain, | |
color: ColorBase.black80, | |
), | |
), | |
SizedBox(width: 8), | |
Container( | |
width: screenWidth - 86, | |
child: Text( | |
context.formatString( | |
AppLocale.rescheduleRefundWarningNew, | |
[], | |
), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
color: ColorBase.black80, | |
), | |
maxLines: 10, | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 12), | |
Container( | |
width: screenWidth - 32, | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
height: 18, | |
width: 18, | |
child: Center( | |
child: ClipOval( | |
child: Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver2/arrow-grey-new.png', | |
fit: BoxFit.cover), | |
), | |
), | |
), | |
), | |
SizedBox(width: 12), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: screenWidth - 16 * 4 - 30, | |
child: Text( | |
(reschedulePolicy > 0) | |
? context.formatString( | |
AppLocale.kebijakanRefundScheduleDef, | |
[reschedulePolicy.toString()], | |
) | |
: context.formatString( | |
AppLocale.kebijakanRefundScheduleDefNo, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
), | |
), | |
), | |
SizedBox(height: 6), | |
], | |
), | |
], | |
), | |
), | |
Container( | |
width: screenWidth - 32, | |
child: Padding( | |
padding: EdgeInsets.symmetric(vertical: 12), | |
child: DottedLine(dashColor: ColorBase.black10), | |
), | |
), | |
for (var i = 0; i < 1; i++) | |
Container( | |
width: screenWidth - 32, | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
height: 18, | |
width: 18, | |
child: Center( | |
child: ClipOval( | |
child: Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
cancelPolicy.policies[i].color == '00C48C' | |
? 'assets/images/ver2/arrow-green-new.png' | |
: cancelPolicy.policies[i].color == 'FCB145' | |
? 'assets/images/ver2/arrow-yellow-new.png' | |
: 'assets/images/ver2/arrow-red-new.png', | |
fit: BoxFit.cover), | |
), | |
), | |
), | |
), | |
SizedBox(width: 12), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: screenWidth - 16 * 4 - 30, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
_getCancelPolicyDescription( | |
cancelPolicy.policies[i].percentage), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
), | |
), | |
if (cancelPolicy.name == | |
VenueBookingConstant.cancelPolicyStrict) | |
SizedBox(height: 12), | |
if (cancelPolicy.name == | |
VenueBookingConstant.cancelPolicyStrict) | |
Text( | |
context.formatString( | |
AppLocale.tidak_berlaku_refund, []), | |
style: TextStyle( | |
color: ColorBase.primaryRed, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 6), | |
if (cancelPolicy.policies[i].percentage > 0) | |
Text( | |
cancelPolicy.policies[i].percentage.toString() + | |
'% Refund', | |
style: TextStyle( | |
color: Color(int.parse( | |
"0xff${cancelPolicy.policies[i].color}")), | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
), | |
], | |
), | |
), | |
SizedBox(height: 12), | |
GestureDetector( | |
onTap: () { | |
_cancelPolicyModal(context, screenWidth); | |
}, | |
child: Container( | |
height: 34, | |
width: screenWidth - 32, | |
alignment: Alignment.center, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
width: 1, | |
style: BorderStyle.solid)), | |
child: Text( | |
context.formatString( | |
AppLocale.lihatSelengkapnya, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
), | |
), | |
], | |
); | |
} | |
Widget _buildOtherVenuesContent( | |
{bool isLoading = false, List<OtherVenue> otherVenueList}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
return Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: screenWidth - 32, | |
child: Padding( | |
padding: EdgeInsets.symmetric(vertical: 16), | |
child: DottedLine(dashColor: ColorBase.black10), | |
), | |
), | |
Container( | |
child: isLoading | |
? Skeleton( | |
width: 75, | |
height: 24, | |
) | |
: Row( | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.venueTerdekatSectionTitle, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 16), | |
if (!isLoading) | |
Container( | |
margin: EdgeInsets.only(bottom: 12), | |
child: SingleChildScrollView( | |
scrollDirection: Axis.horizontal, | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
for (int i = 0; i < otherVenueList.length; i++) | |
_buildGridVenueItem( | |
context, | |
otherVenueList[i], | |
context.formatString( | |
AppLocale.mulai, | |
[], | |
)), | |
], | |
), | |
), | |
), | |
if (!isLoading) | |
GestureDetector( | |
onTap: () { | |
Navigator.pushNamed(context, VenueListScreen.routeName); | |
}, | |
child: Container( | |
height: 34, | |
width: screenWidth - 32, | |
margin: EdgeInsets.symmetric(horizontal: 16), | |
padding: EdgeInsets.all(8), | |
alignment: Alignment.center, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
width: 1, | |
style: BorderStyle.solid)), | |
child: Text( | |
context.formatString( | |
AppLocale.cekVenueLainnya, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
), | |
), | |
if (!isLoading) SizedBox(height: 16), | |
], | |
); | |
} | |
Widget _buildGridVenueItem(context, OtherVenue venue, String mulai) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
return GestureDetector( | |
onTap: () { | |
Navigator.of(context).pushNamed(VenueDetailScreen.routeName, | |
arguments: {'venue_id': venue.id}); | |
}, | |
child: Container( | |
margin: EdgeInsets.only(right: 8, top: 4, bottom: 4), | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
color: Colors.white, | |
boxShadow: [ | |
BoxShadow( | |
color: Color.fromRGBO(37, 40, 43, 0.08), | |
offset: Offset(0.0, 1.0), | |
blurRadius: 6.0, | |
), | |
], | |
), | |
width: 148, | |
height: 286, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Stack( | |
alignment: Alignment.topCenter, | |
children: [ | |
Container( | |
width: double.infinity, | |
height: 116, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
color: ColorBase.black10, | |
), | |
child: ClipRRect( | |
borderRadius: | |
BorderRadius.vertical(top: Radius.circular(8)), | |
child: CachedNetworkImage( | |
imageUrl: BaseUrlConfig.baseAssetUrl + venue.image, | |
placeholder: (context, url) => Skeleton(), | |
errorWidget: (context, url, error) => Container( | |
height: 20, | |
width: 20, | |
child: SvgPicture.asset( | |
'assets/icons/image-broken.svg', | |
height: 20, | |
width: 20, | |
), | |
), | |
fit: BoxFit.cover, | |
), | |
), | |
), | |
Positioned( | |
top: 4, | |
left: 4, | |
child: Container( | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(4), | |
color: Color.fromRGBO(37, 40, 43, 0.80), | |
), | |
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 2), | |
child: Row( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
Container( | |
height: 10, | |
width: 10, | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/location-new.svg', | |
fit: BoxFit.cover, | |
color: ColorBase.primaryWhite, | |
), | |
), | |
SizedBox( | |
width: 2, | |
), | |
Container( | |
// width: 134, | |
// padding: EdgeInsets.symmetric(horizontal: 8), | |
child: Text( | |
'${Helpers.shortCityname(Helpers.capitalizeString(venue.city.toLowerCase()))}', | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 9, | |
color: ColorBase.primaryWhite, | |
// height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
maxLines: 2, | |
overflow: TextOverflow.ellipsis, | |
), | |
), | |
SizedBox( | |
width: 2, | |
) | |
], | |
), | |
), | |
), | |
], | |
), | |
SizedBox(height: 8), | |
Container( | |
height: 154, | |
child: Column( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.max, | |
children: [ | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
// SizedBox(height: 8), | |
Container( | |
width: 134, | |
padding: EdgeInsets.symmetric(horizontal: 8), | |
child: Text( | |
venue.name, | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
maxLines: 2, | |
overflow: TextOverflow.ellipsis, | |
), | |
), | |
SizedBox(height: 6), | |
Row( | |
children: [ | |
if (double.parse(venue.currentRating.toString()) < | |
4 && | |
venue.totalReview.toInt() < 10) ...[ | |
SizedBox( | |
height: 16, | |
), | |
] else ...[ | |
if (double.parse(venue.currentRating.toString()) > | |
0) | |
SizedBox( | |
width: 8, | |
), | |
if (double.parse(venue.currentRating.toString()) > | |
0) | |
Image( | |
image: AssetImage('assets/images/rating.png'), | |
height: 12, | |
width: 12, | |
), | |
if (double.parse(venue.currentRating.toString()) > | |
0) | |
Text( | |
' ${double.parse(venue.currentRating.toString()).toStringAsFixed(1)}', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 12, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
color: ColorBase.secondaryOrange, | |
), | |
), | |
if (double.parse(venue.totalReview.toString()) > 0) | |
Text( | |
' (${venue.totalReview.toString()})', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 12, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
color: ColorBase.black60, | |
), | |
), | |
if (!(double.parse(venue.currentRating.toString()) > | |
0)) | |
SizedBox( | |
height: 16, | |
) | |
], | |
], | |
), | |
SizedBox( | |
height: 8, | |
), | |
SizedBox(height: 8), | |
if (venue.isDpAllowed == 1) | |
Container( | |
padding: const EdgeInsets.symmetric(horizontal: 7.0), | |
child: Wrap( | |
runSpacing: 4.0, | |
// clipBehavior: Clip.hardEdge, | |
// spacing: 2.0, | |
direction: Axis.horizontal, | |
children: [ | |
if (venue.isDpAllowed == 1) | |
Padding( | |
padding: const EdgeInsets.symmetric( | |
horizontal: 1.0), | |
child: Image.asset( | |
'assets/images/ver3/venue_dp.png', | |
width: 47, | |
height: 16, | |
), | |
), | |
if (venue.popularity > venue.popularityAvg) | |
Padding( | |
padding: const EdgeInsets.symmetric( | |
horizontal: 1.0), | |
child: Image.asset( | |
'assets/images/ver3/popular-tag.png', | |
width: 47, | |
height: 16, | |
), | |
), | |
if (venue.cancelPolicyId == 1) | |
Padding( | |
padding: const EdgeInsets.symmetric( | |
horizontal: 1.0), | |
child: Image.asset( | |
'assets/images/ver3/refund-tag.png', | |
width: 69, | |
height: 16, | |
), | |
), | |
], | |
), | |
) | |
], | |
), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: 130, | |
padding: EdgeInsets.symmetric(horizontal: 8), | |
child: Text( | |
venue.lowestStrikePrice > venue.basePrice | |
? 'Rp${venue.lowestStrikePrice != null ? Helpers.formatRupiah(venue.lowestStrikePrice.toString()) : 0}' | |
: '', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 11, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
decoration: TextDecoration.lineThrough, | |
color: ColorBase.black60, | |
), | |
overflow: TextOverflow.clip, | |
maxLines: 1, | |
), | |
), | |
Padding( | |
padding: const EdgeInsets.symmetric(horizontal: 8.0), | |
child: Row( | |
children: [ | |
Text( | |
'${mulai} ', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 11, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
), | |
), | |
Container( | |
// margin: EdgeInsets.only(left: 2), | |
// width: 84, | |
// padding: EdgeInsets.symmetric(horizontal: 8), | |
child: Text( | |
'Rp${venue.basePrice != null ? Helpers.formatRupiah(venue.basePrice.toString()) : 0},-', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 12, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
), | |
], | |
), | |
), | |
], | |
) | |
], | |
), | |
), | |
SizedBox( | |
height: 8, | |
), | |
], | |
), | |
), | |
); | |
} | |
Widget _buildCommunity( | |
{bool isLoading = false, List<VenueCommunityData> communityVenueList}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
return isLoading | |
? Container( | |
width: screenWidth - 32, | |
margin: EdgeInsets.only(left: 16, top: 6), | |
child: | |
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Skeleton(width: (screenWidth - 40) * 0.5, height: 30), | |
SizedBox(width: 8), | |
Skeleton(width: (screenWidth - 40) * 0.5, height: 30), | |
], | |
), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 50), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 50), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 50), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 50), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 50), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 50), | |
]), | |
) | |
: Container( | |
padding: EdgeInsets.symmetric(horizontal: 12), | |
constraints: BoxConstraints(minHeight: screenHeight * 0.6), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
child: | |
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
Container( | |
margin: EdgeInsets.only(bottom: 16), | |
child: Row( | |
children: [ | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
_isApplySortCommunityButtonShown = false; | |
_currentSortCommunityRadio = _sortCommunityRadio; | |
}); | |
sortCommunityModal(context); | |
}, | |
child: Container( | |
padding: | |
EdgeInsets.symmetric(horizontal: 8, vertical: 4), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryWhite, | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Row( | |
children: [ | |
Text( | |
sortCommunity == 'is_most_members' | |
? context.formatString( | |
AppLocale.anggotaTerbanyak, []) | |
: context.formatString( | |
AppLocale.komunitasTerbaru, []), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
SizedBox(width: 4), | |
Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver3/chevron-down.png', | |
fit: BoxFit.contain, | |
), | |
), | |
], | |
)), | |
), | |
SizedBox(width: 8), | |
GestureDetector( | |
onTap: () async { | |
setState(() { | |
SportSelectorVenueDetailModal( | |
categoryName: sportCategoryName, | |
categoryId: sports, | |
theContext: context, | |
allSPort: allSport, | |
myPref: myPref, | |
updateSport: updateSport, | |
venueName: venueName, | |
venueId: widget.venueId); | |
}); | |
}, | |
child: Container( | |
padding: | |
EdgeInsets.symmetric(horizontal: 8, vertical: 4), | |
decoration: BoxDecoration( | |
color: newSportFilter > 0 | |
? ColorBase.black10 | |
: ColorBase.primaryWhite, | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
Text( | |
newSportFilter > 0 | |
? context | |
.formatString(AppLocale.olahraga, []) | |
: context.formatString( | |
AppLocale.semua_olahraga, []), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
if (newSportFilter > 0) SizedBox(width: 4), | |
if (newSportFilter > 0) | |
ConstrainedBox( | |
constraints: BoxConstraints( | |
minHeight: 12, | |
minWidth: 12, | |
maxWidth: 30, | |
), | |
child: Container( | |
padding: EdgeInsets.symmetric( | |
vertical: 2, horizontal: 4), | |
decoration: BoxDecoration( | |
color: ColorBase.black100, | |
shape: BoxShape.rectangle, | |
borderRadius: BorderRadius.circular(4)), | |
child: Text( | |
newSportFilter.toString(), | |
style: TextStyle( | |
color: Colors.white, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 9, | |
fontWeight: FontWeight.w500, | |
), | |
textAlign: TextAlign.center, | |
), | |
), | |
), | |
SizedBox(width: 4), | |
Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver3/chevron-down.png', | |
fit: BoxFit.contain, | |
), | |
), | |
], | |
)), | |
), | |
], | |
), | |
), | |
if (!isLoading) | |
if (communityVenueList.length > 0) | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
for (int xx = 0; xx < communityVenueList.length; xx++) | |
GestureDetector( | |
onTap: () { | |
Navigator.pushNamed( | |
context, TeamProfileNew.routeName, arguments: { | |
'team_slug': communityVenueList[xx].slug, | |
'team_id': communityVenueList[xx].id | |
}); | |
}, | |
child: Container( | |
width: screenWidth - 32, | |
margin: EdgeInsets.only(bottom: 12), | |
padding: EdgeInsets.all(12), | |
decoration: BoxDecoration( | |
color: Colors.transparent, | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all(color: ColorBase.black10)), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
ClipOval( | |
child: Container( | |
width: 48, | |
height: 48, | |
padding: EdgeInsets.all(2), | |
decoration: BoxDecoration( | |
color: Colors.white), | |
child: RoundedTeamAvatar( | |
width: 48, | |
type: "team", | |
isThumbnail: false, | |
avatar: BaseUrlConfig.baseAssetUrl + | |
communityVenueList[xx].logoPath, | |
)), | |
), | |
SizedBox(width: 12), | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
SizedBox(height: 4), | |
Container( | |
width: screenWidth * 0.7, | |
child: Text( | |
communityVenueList[xx].name, | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
color: ColorBase.black100, | |
height: 1.4), | |
overflow: TextOverflow.ellipsis, | |
maxLines: 1, | |
), | |
), | |
Row( | |
children: [ | |
Container( | |
width: 16, | |
height: 16, | |
child: SvgPicture.network( | |
BaseUrlConfig.baseAssetUrl + | |
communityVenueList[xx] | |
.svgPath, | |
color: ColorBase.black80)), | |
SizedBox(width: 6), | |
Text( | |
communityVenueList[xx] | |
.categoryName, | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
12), | |
), | |
SizedBox(width: 4), | |
Text( | |
' · ', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
12), | |
), | |
SizedBox(width: 4), | |
Text( | |
'${context.formatString( | |
AppLocale.totalAnggota, | |
[ | |
communityVenueList[xx] | |
.totalMember | |
], | |
)}', | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
10, | |
fontWeight: FontWeight.w400, | |
color: ColorBase.black80, | |
height: 1.4), | |
), | |
], | |
) | |
], | |
) | |
], | |
), | |
], | |
), | |
), | |
), | |
], | |
), | |
if (!isLoading) | |
if (communityVenueList.length == 0) | |
Container( | |
padding: EdgeInsets.symmetric(horizontal: 16), | |
width: screenWidth, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
SizedBox( | |
height: | |
MediaQuery.of(context).size.height * 0.05), | |
Image( | |
image: AssetImage( | |
'assets/images/ver3/empty_search.png'), | |
height: ScreenUtil().scaleText * 72, | |
fit: BoxFit.fitHeight, | |
), | |
SizedBox( | |
height: 16, | |
), | |
Text( | |
newSportFilter > 0 | |
? context.formatString( | |
AppLocale.hasil_tidak_ditemukan, []) | |
: context.formatString( | |
AppLocale.belum_ada_komunitas, []), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 16, | |
fontFamily: 'Rubik', | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox( | |
height: 4, | |
), | |
Text( | |
newSportFilter > 0 | |
? context.formatString( | |
AppLocale.tenangKamuBisaResetFilter, []) | |
: context.formatString( | |
AppLocale.saatIniBelumAdaKomunitas, []), | |
textAlign: TextAlign.center, | |
style: TextStyle( | |
fontWeight: FontWeight.w400, | |
fontSize: ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik', | |
color: ColorBase.black80, | |
), | |
), | |
SizedBox( | |
height: 16, | |
), | |
if (newSportFilter > 0) | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
sportCategoryName = []; | |
}); | |
}, | |
child: Container( | |
width: 144, | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, vertical: 8), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: Row( | |
crossAxisAlignment: | |
CrossAxisAlignment.center, | |
mainAxisAlignment: MainAxisAlignment.center, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.resetFilter, []), | |
style: TextStyle( | |
color: ColorBase.primaryWhite, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
], | |
)), | |
), | |
]), | |
), | |
]), | |
); | |
} | |
Widget _buildReviewContent( | |
{bool isLoading = false, VenueReview venueReview}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
MediaQueryData queryData = MediaQuery.of(context); | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
return Container( | |
decoration: BoxDecoration( | |
color: Colors.white, | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
if (!isLoading) | |
SingleChildScrollView( | |
physics: NeverScrollableScrollPhysics(), | |
controller: parentScrollController, | |
child: Column( | |
children: [ | |
Padding( | |
padding: const EdgeInsets.symmetric(horizontal: 0.0), | |
child: Container( | |
padding: EdgeInsets.only(top: 8, bottom: horizontalPadding), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryWhite, | |
), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
RichText( | |
textAlign: TextAlign.start, | |
text: TextSpan( | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 26, | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
children: <TextSpan>[ | |
TextSpan( | |
text: double.parse(venueReview | |
.summary.venueRating | |
.toString()) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 26, | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
TextSpan( | |
text: '/5.0', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 12, | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
), | |
), | |
Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
SizedBox( | |
width: 8, | |
), | |
for (var i = 0; i < venueRatingStar; i++) | |
Container( | |
height: 16, | |
width: 16, | |
margin: EdgeInsets.symmetric( | |
vertical: 12, horizontal: 2), | |
child: Image.asset( | |
'assets/images/ver2/star-rating-1.0.png')), | |
if (int.parse(splitRating[1]) != 0) | |
Container( | |
height: 16, | |
width: 16, | |
margin: EdgeInsets.symmetric( | |
vertical: 12, horizontal: 2), | |
child: Image.asset( | |
'assets/images/ver2/star-rating-0.${splitRating[1]}.png')), | |
for (var i = 0; | |
i < 5 - venueRatingStar - ratingNotFull; | |
i++) | |
Container( | |
height: 16, | |
width: 16, | |
margin: EdgeInsets.symmetric( | |
vertical: 12, horizontal: 2), | |
child: Image.asset( | |
'assets/images/ver2/star-rating-0.0.png')), | |
], | |
), | |
SizedBox(width: 4), | |
Row( | |
children: [ | |
Container( | |
margin: | |
EdgeInsets.symmetric(vertical: 12), | |
child: Text( | |
'${venueReview.summary.text.replaceAll(',', ' ·')}', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
), | |
), | |
) | |
], | |
) | |
], | |
), | |
], | |
), | |
SizedBox(height: 12), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: screenWidth, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.kebersihan, | |
[], | |
), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 14, | |
color: ColorBase.black80, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
Text( | |
double.parse(venueReview.summary.hygiene) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 6), | |
LinearPercentIndicator( | |
padding: EdgeInsets.only(left: 0), | |
width: screenWidth - 32, | |
lineHeight: 4.0, | |
percent: double.parse( | |
venueReview.summary.hygiene.toString()) / | |
5.0, | |
progressColor: ColorBase.primaryRed, | |
backgroundColor: ColorBase.black10, | |
barRadius: Radius.circular(8), | |
linearStrokeCap: LinearStrokeCap.roundAll, | |
), | |
SizedBox(height: 14), | |
Container( | |
width: screenWidth, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.kondisiLapangan, | |
[], | |
), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 14, | |
color: ColorBase.black80, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
Text( | |
double.parse( | |
venueReview.summary.fieldCondition) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 6), | |
LinearPercentIndicator( | |
padding: EdgeInsets.only(left: 0), | |
width: screenWidth - 32, | |
lineHeight: 4.0, | |
percent: double.parse(venueReview | |
.summary.fieldCondition | |
.toString()) / | |
5.0, | |
// progressColor: ColorBase.black100, | |
// backgroundColor: Color.fromRGBO(188, 96, 112, 1), | |
progressColor: ColorBase.primaryRed, | |
barRadius: Radius.circular(8), | |
backgroundColor: ColorBase.black10, | |
linearStrokeCap: LinearStrokeCap.roundAll, | |
), | |
SizedBox(height: 14), | |
Container( | |
width: screenWidth, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.komunikasi, | |
[], | |
), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 14, | |
color: ColorBase.black80, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
Text( | |
double.parse( | |
venueReview.summary.communication) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 6), | |
LinearPercentIndicator( | |
padding: EdgeInsets.only(left: 0), | |
width: screenWidth - 32, | |
lineHeight: 4.0, | |
percent: double.parse(venueReview | |
.summary.communication | |
.toString()) / | |
5.0, | |
// progressColor: ColorBase.black100, | |
// backgroundColor: Color.fromRGBO(188, 96, 112, 1), | |
progressColor: ColorBase.primaryRed, | |
backgroundColor: ColorBase.black10, | |
barRadius: Radius.circular(8), | |
linearStrokeCap: LinearStrokeCap.roundAll, | |
), | |
], | |
), | |
], | |
), | |
), | |
), | |
Container( | |
// padding: EdgeInsets.symmetric(horizontal: 16), | |
margin: EdgeInsets.only(top: 16), | |
// height: | |
// (reviews.length == 0)? queryData.size.height - 273 | |
// queryData.size.height - 510 | |
// :queryData.size.height -72 | |
width: double.infinity, | |
color: Colors.white, | |
child: (venueReview.reviews.length == 0) | |
? Container( | |
width: double.infinity, | |
child: Column( | |
children: [ | |
SizedBox( | |
height: | |
MediaQuery.of(context).size.height / 12), | |
Image( | |
image: AssetImage( | |
'assets/images/general-empty.png'), | |
), | |
Text( | |
context | |
.formatString(AppLocale.belumAdaReview, []), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 16, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
) | |
: Container( | |
height: queryData.size.height - 560, | |
child: ListView.builder( | |
// physics: AlwaysScrollableScrollPhysics(), | |
scrollDirection: Axis.horizontal, | |
padding: EdgeInsets.all(2), | |
itemCount: venueReview.reviews.length + 1, | |
controller: scrollController, | |
itemBuilder: (BuildContext context, int index) { | |
// | |
// | |
if (index == venueReview.reviews.length) { | |
return SizedBox(width: 0); | |
} | |
return _reviewItem( | |
context, venueReview.reviews[index]); | |
}, | |
), | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 8), | |
isLoading | |
? Skeleton(width: screenWidth - 32, height: 34) | |
: GestureDetector( | |
onTap: () { | |
Navigator.of(context).pushNamed(VenueReviewScreen.routeName, | |
arguments: { | |
'venue_id': widget.venueId, | |
'venue_name': venueName | |
}); | |
}, | |
child: Container( | |
height: 34, | |
width: screenWidth - 32, | |
alignment: Alignment.center, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
width: 1, | |
style: BorderStyle.solid)), | |
child: Text( | |
context.formatString( | |
AppLocale.lihatSemuaUlasan, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
), | |
), | |
Container( | |
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 20), | |
child: Divider(color: ColorBase.black10), | |
), | |
]), | |
); | |
} | |
Widget _buildOpenPlayReviewContent( | |
{bool isLoading = false, CommunityReview communityReview}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
MediaQueryData queryData = MediaQuery.of(context); | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
return Container( | |
decoration: BoxDecoration( | |
color: Colors.white, | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
if (!isLoading) | |
SingleChildScrollView( | |
physics: NeverScrollableScrollPhysics(), | |
controller: parentScrollController, | |
child: Column( | |
children: [ | |
Padding( | |
padding: const EdgeInsets.symmetric(horizontal: 0.0), | |
child: Container( | |
padding: EdgeInsets.only(top: 8, bottom: horizontalPadding), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryWhite, | |
), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
RichText( | |
textAlign: TextAlign.start, | |
text: TextSpan( | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 26, | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
children: <TextSpan>[ | |
TextSpan( | |
text: double.parse(communityReview | |
.summary.openPlayRating | |
.toString()) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 26, | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
TextSpan( | |
text: '/5.0', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 12, | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
), | |
), | |
Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
SizedBox( | |
width: 8, | |
), | |
for (var i = 0; | |
i < venueOpenPlayRatingStar; | |
i++) | |
Container( | |
height: 16, | |
width: 16, | |
margin: EdgeInsets.symmetric( | |
vertical: 12, horizontal: 2), | |
child: Image.asset( | |
'assets/images/ver2/star-rating-1.0.png')), | |
if (int.parse(splitRatingOpenPlay[1]) != 0) | |
Container( | |
height: 16, | |
width: 16, | |
margin: EdgeInsets.symmetric( | |
vertical: 12, horizontal: 2), | |
child: Image.asset( | |
'assets/images/ver2/star-rating-0.${splitRatingOpenPlay[1]}.png')), | |
for (var i = 0; | |
i < | |
5 - | |
venueOpenPlayRatingStar - | |
ratingNotFullOpenPlay; | |
i++) | |
Container( | |
height: 16, | |
width: 16, | |
margin: EdgeInsets.symmetric( | |
vertical: 12, horizontal: 2), | |
child: Image.asset( | |
'assets/images/ver2/star-rating-0.0.png')), | |
], | |
), | |
SizedBox(width: 4), | |
Row( | |
children: [ | |
Container( | |
margin: | |
EdgeInsets.symmetric(vertical: 12), | |
child: Text( | |
'${communityReview.summary.allCountRating} rating · ${communityReview.summary.allCountReview} ' + | |
context.formatString( | |
AppLocale.ulasan, | |
[], | |
), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
), | |
), | |
) | |
], | |
) | |
], | |
), | |
], | |
), | |
SizedBox(height: 12), | |
Container( | |
// height: 34, | |
width: screenWidth - 32, | |
padding: | |
EdgeInsets.symmetric(horizontal: 12, vertical: 8), | |
alignment: Alignment.center, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
width: 1, | |
style: BorderStyle.solid)), | |
child: Row( | |
children: [ | |
ClipOval( | |
child: RoundedUserAvatar( | |
width: 32, | |
type: "user", | |
avatar: BaseUrlConfig.baseAssetUrl + | |
communityReview.team.logoPath)), | |
SizedBox(width: 8), | |
Column( | |
mainAxisAlignment: MainAxisAlignment.start, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
communityReview.team.name, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
Text( | |
'Official Host', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
]), | |
], | |
), | |
), | |
SizedBox(height: 20), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: (screenWidth * 0.5) - 32, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.ketepatan_waktu, | |
[], | |
), | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black80, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
Text( | |
double.parse(communityReview | |
.summary | |
.openPlayPunctualityAvg) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 6), | |
LinearPercentIndicator( | |
padding: EdgeInsets.only(left: 0), | |
width: (screenWidth * 0.5) - 32, | |
lineHeight: 4.0, | |
percent: double.parse(communityReview | |
.summary.openPlayPunctualityAvg | |
.toString()) / | |
5.0, | |
progressColor: ColorBase.primaryRed, | |
backgroundColor: ColorBase.black10, | |
barRadius: Radius.circular(8), | |
linearStrokeCap: | |
LinearStrokeCap.roundAll, | |
), | |
]), | |
Column( | |
children: [ | |
Container( | |
width: (screenWidth * 0.5) - 32, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.sportivitas, | |
[], | |
), | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black80, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
Text( | |
double.parse(communityReview.summary | |
.openPlaySportiveAvg) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 6), | |
LinearPercentIndicator( | |
padding: EdgeInsets.only(left: 0), | |
width: (screenWidth * 0.5) - 32, | |
lineHeight: 4.0, | |
percent: double.parse(communityReview | |
.summary.openPlaySportiveAvg | |
.toString()) / | |
5.0, | |
progressColor: ColorBase.primaryRed, | |
barRadius: Radius.circular(8), | |
backgroundColor: ColorBase.black10, | |
linearStrokeCap: LinearStrokeCap.roundAll, | |
), | |
], | |
) | |
], | |
), | |
SizedBox(height: 16), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Column(children: [ | |
Container( | |
width: (screenWidth * 0.5) - 32, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.komunikasi, | |
[], | |
), | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black80, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
Text( | |
double.parse(communityReview.summary | |
.openPlayCommunicationAvg) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 6), | |
LinearPercentIndicator( | |
padding: EdgeInsets.only(left: 0), | |
width: (screenWidth * 0.5) - 32, | |
lineHeight: 4.0, | |
percent: double.parse(communityReview | |
.summary.openPlayCommunicationAvg | |
.toString()) / | |
5.0, | |
progressColor: ColorBase.primaryRed, | |
backgroundColor: ColorBase.black10, | |
barRadius: Radius.circular(8), | |
linearStrokeCap: LinearStrokeCap.roundAll, | |
), | |
]), | |
Column(children: [ | |
Container( | |
width: (screenWidth * 0.5) - 32, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.pembagianWaktu, | |
[], | |
), | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black80, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
Text( | |
double.parse(communityReview | |
.summary.openPlayPlayTimeAvg) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
height: 1.4, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 6), | |
LinearPercentIndicator( | |
padding: EdgeInsets.only(left: 0), | |
width: (screenWidth * 0.5) - 32, | |
lineHeight: 4.0, | |
percent: double.parse(communityReview | |
.summary.openPlayPlayTimeAvg | |
.toString()) / | |
5.0, | |
progressColor: ColorBase.primaryRed, | |
backgroundColor: ColorBase.black10, | |
barRadius: Radius.circular(8), | |
linearStrokeCap: LinearStrokeCap.roundAll, | |
), | |
]) | |
], | |
), | |
], | |
), | |
], | |
), | |
), | |
), | |
Container( | |
margin: EdgeInsets.only(top: 16), | |
width: double.infinity, | |
color: Colors.white, | |
child: (communityReview.reviews.length == 0) | |
? Container( | |
width: double.infinity, | |
child: Column( | |
children: [ | |
SizedBox( | |
height: | |
MediaQuery.of(context).size.height / 12), | |
Image( | |
image: AssetImage( | |
'assets/images/general-empty.png'), | |
), | |
Text( | |
context | |
.formatString(AppLocale.belumAdaReview, []), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 16, | |
fontFamily: 'Rubik', | |
), | |
), | |
], | |
), | |
) | |
: Container( | |
height: queryData.size.height - 560, | |
child: ListView.builder( | |
scrollDirection: Axis.horizontal, | |
padding: EdgeInsets.all(2), | |
itemCount: communityReview.reviews.length + 1, | |
controller: scrollController, | |
itemBuilder: (BuildContext context, int index) { | |
if (index == communityReview.reviews.length) { | |
return SizedBox(width: 0); | |
} | |
return _reviewOpenPlayItem( | |
context, communityReview.reviews[index]); | |
}, | |
), | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 8), | |
GestureDetector( | |
onTap: () { | |
Navigator.pushNamed(context, ReviewOpenPlayScreen.routeName, | |
arguments: { | |
'slug': communityReview.team.slug, | |
'team_id': communityReview.team.id | |
}); | |
}, | |
child: Container( | |
height: 34, | |
width: screenWidth - 32, | |
alignment: Alignment.center, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
width: 1, | |
style: BorderStyle.solid)), | |
child: Text( | |
context.formatString( | |
AppLocale.lihatSelengkapnya, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
), | |
), | |
Container( | |
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 20), | |
child: Divider(color: ColorBase.black10), | |
), | |
]), | |
); | |
} | |
Widget _reviewItem(BuildContext context, Review review) { | |
final mediaQuery = MediaQuery.of(context); | |
final screenWidth = mediaQuery.size.width; | |
return Container( | |
width: screenWidth - 80, | |
decoration: BoxDecoration( | |
color: Colors.white, | |
borderRadius: BorderRadius.circular(8), | |
boxShadow: [ | |
BoxShadow( | |
color: Color(0x1425282B), | |
offset: Offset(0.0, 1), | |
blurRadius: 6, | |
spreadRadius: 0), | |
], | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
padding: const EdgeInsets.all(16.0), | |
margin: EdgeInsets.only(bottom: 16, right: 16), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Column( | |
mainAxisAlignment: MainAxisAlignment.start, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
GestureDetector( | |
onTap: () { | |
RatingDetailModalWidget( | |
context: context, | |
label: 'Rating', | |
totalRating: double.parse(review.rating), | |
ratingLabelList: [ | |
'Kebersihan', | |
'Kondisi Lapangan', | |
'Komunikasi' | |
], | |
ratingValueList: [ | |
double.parse(review.hygiene.toString()), | |
double.parse(review.fieldCondition.toString()), | |
double.parse(review.communication.toString()) | |
], | |
); | |
}, | |
child: Column( | |
mainAxisAlignment: MainAxisAlignment.start, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
Row( | |
children: [ | |
ClipOval( | |
child: RoundedUserAvatar( | |
width: 30, | |
type: "user", | |
avatar: BaseUrlConfig.baseAssetUrl + | |
review.user.avatar)), | |
SizedBox(width: 8), | |
Column( | |
mainAxisAlignment: MainAxisAlignment.start, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
review.user.name, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
Text( | |
'${context.formatString( | |
AppLocale.diulas, | |
[], | |
)}: ${reviewDate.format(DateTime.parse(review.date))}', | |
style: TextStyle( | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
]), | |
], | |
), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
Container( | |
padding: EdgeInsets.symmetric( | |
vertical: 4, horizontal: 8), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryWhite, | |
border: Border.all( | |
color: ColorBase.black10, width: 1), | |
borderRadius: BorderRadius.circular(8)), | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: | |
CrossAxisAlignment.center, | |
children: [ | |
SvgPicture.asset( | |
'assets/images/dashboard-rating-yellow.svg', | |
width: 16.5, | |
height: 15.8, | |
), | |
SizedBox(width: 4), | |
Text( | |
double.parse(review.rating) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w500), | |
), | |
])), | |
], | |
), | |
], | |
), | |
SizedBox(height: 18), | |
Container( | |
width: screenWidth - 32, | |
child: Text( | |
review.description != null ? review.description : '-', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
maxLines: review.isDescriptionShowedAll ? 50 : 3, | |
overflow: TextOverflow.ellipsis, | |
), | |
), | |
SizedBox(height: 4), | |
Text( | |
review.fieldName.toLowerCase().contains('lapangan') | |
? review.fieldName | |
: context.formatString(AppLocale.lapangan, []) + | |
' : ${review.fieldName}', | |
style: TextStyle( | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
]), | |
), | |
// SizedBox(height: 10), | |
// if (review.reply != null) | |
// Stack( | |
// children: [ | |
// Row( | |
// mainAxisAlignment: MainAxisAlignment.start, | |
// crossAxisAlignment: CrossAxisAlignment.center, | |
// children: [ | |
// GestureDetector( | |
// child: Container( | |
// margin: EdgeInsets.only(top: 8), | |
// padding: EdgeInsets.symmetric(vertical: 4), | |
// decoration: BoxDecoration( | |
// color: ColorBase.primaryWhite, | |
// borderRadius: BorderRadius.circular(8)), | |
// child: Row( | |
// children: [ | |
// Text( | |
// review.isReviewRepliedShowed | |
// ? 'Tutup Balasan' | |
// : 'Lihat Balasan', | |
// style: TextStyle( | |
// color: ColorBase.black80, | |
// fontWeight: FontWeight.w400, | |
// fontFamily: 'Rubik', | |
// fontSize: 12, | |
// )), | |
// SizedBox(width: 4), | |
// Icon( | |
// review.isReviewRepliedShowed | |
// ? Icons.keyboard_arrow_up_outlined | |
// : Icons.keyboard_arrow_down_outlined, | |
// size: 20, | |
// color: ColorBase.black80, | |
// ) | |
// ], | |
// )), | |
// onTap: () { | |
// setState(() { | |
// if (review.isReviewRepliedShowed) { | |
// review.isReviewRepliedShowed = false; | |
// } else { | |
// review.isReviewRepliedShowed = true; | |
// } | |
// }); | |
// }) | |
// ], | |
// ) | |
// ], | |
// ), | |
if (review.isReviewRepliedShowed) | |
Container( | |
child: Column( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString(AppLocale.balasanDari, []) + | |
' ${venueName}:', | |
style: TextStyle( | |
color: ColorBase.black60, | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 12, | |
fontFamily: 'Rubik')), | |
SizedBox(height: 4), | |
Text(review.reply, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w400, | |
fontSize: ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik')), | |
], | |
)) | |
], | |
) | |
], | |
), | |
); | |
} | |
Widget _reviewOpenPlayItem(BuildContext context, OpenPlayReview review) { | |
final mediaQuery = MediaQuery.of(context); | |
final screenWidth = mediaQuery.size.width; | |
return Container( | |
width: screenWidth - 80, | |
decoration: BoxDecoration( | |
color: Colors.white, | |
borderRadius: BorderRadius.circular(8), | |
boxShadow: [ | |
BoxShadow( | |
color: Color(0x1425282B), | |
offset: Offset(0.0, 1), | |
blurRadius: 6, | |
spreadRadius: 0), | |
], | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
padding: const EdgeInsets.all(16.0), | |
margin: EdgeInsets.only(bottom: 16, right: 16), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Column( | |
mainAxisAlignment: MainAxisAlignment.start, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
GestureDetector( | |
onTap: () { | |
RatingDetailModalWidget( | |
context: context, | |
label: 'Rating', | |
totalRating: double.parse(review.rating), | |
ratingLabelList: [ | |
'Ketepatan Waktu', | |
'Sportifitas', | |
'Komunikasi', | |
'Pembagian Waktu' | |
], | |
ratingValueList: [ | |
double.parse(review.ratingPunctuality.toString()), | |
double.parse(review.ratingSportive.toString()), | |
double.parse(review.ratingCommunication.toString()), | |
double.parse(review.ratingPlayTime.toString()) | |
], | |
); | |
}, | |
child: Column( | |
mainAxisAlignment: MainAxisAlignment.start, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
Row( | |
children: [ | |
ClipOval( | |
child: RoundedUserAvatar( | |
width: 30, | |
type: "user", | |
avatar: BaseUrlConfig.baseAssetUrl + | |
review.userAvatar)), | |
SizedBox(width: 8), | |
Column( | |
mainAxisAlignment: MainAxisAlignment.start, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
review.userName.length > 15 | |
? review.userName.substring(0, 15) + | |
'...' | |
: review.userName, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
Text( | |
'${context.formatString( | |
AppLocale.diulas, | |
[], | |
)}: ${reviewDate.format(DateTime.parse(review.date))}', | |
style: TextStyle( | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
]), | |
], | |
), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
Container( | |
padding: EdgeInsets.symmetric( | |
vertical: 4, horizontal: 8), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryWhite, | |
border: Border.all( | |
color: ColorBase.black10, width: 1), | |
borderRadius: BorderRadius.circular(8)), | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
crossAxisAlignment: | |
CrossAxisAlignment.center, | |
children: [ | |
SvgPicture.asset( | |
'assets/images/dashboard-rating-yellow.svg', | |
width: 16.5, | |
height: 15.8, | |
), | |
SizedBox(width: 4), | |
Text( | |
double.parse(review.rating) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w500), | |
), | |
])), | |
], | |
), | |
], | |
), | |
SizedBox(height: 18), | |
Container( | |
width: screenWidth - 32, | |
child: Text( | |
review.description != null ? review.description : '-', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
maxLines: 3, | |
overflow: TextOverflow.ellipsis, | |
), | |
), | |
SizedBox(height: 4), | |
if (review.coachName != null && review.coachName != '') | |
Text( | |
'Coaching Session With ' + review.coachName, | |
style: TextStyle( | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
]), | |
), | |
], | |
) | |
], | |
), | |
); | |
} | |
Widget _buildEventVenueContent( | |
{bool isLoading = false, List<VenueEventDataNew> eventVenueList}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
return Container( | |
padding: EdgeInsets.symmetric(horizontal: 16), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
Container( | |
child: Row( | |
children: [ | |
GestureDetector( | |
onTap: () async { | |
filterActivityModal(context, screenHeight); | |
}, | |
child: Container( | |
width: 32, | |
height: 32, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Container( | |
color: ColorBase.primaryWhite, | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/filter-inactive.svg', | |
width: 32, | |
height: 32, | |
), | |
), | |
)), | |
SizedBox(width: 6), | |
Container( | |
color: ColorBase.black40, | |
height: 24, | |
width: 1, | |
), | |
SizedBox(width: 6), | |
Container( | |
width: screenWidth - 77, | |
height: 50.0, | |
child: ListView( | |
controller: calendarController, | |
physics: BouncingScrollPhysics(), | |
scrollDirection: Axis.horizontal, | |
children: <Widget>[ | |
AutoScrollTag( | |
index: 100, | |
key: ValueKey(100), | |
controller: calendarController, | |
child: Padding( | |
padding: const EdgeInsets.symmetric(vertical: 4.0), | |
child: GestureDetector( | |
onTap: () { | |
setState(() { | |
filterDateActivity = ''; | |
}); | |
_loadActivity(); | |
}, | |
child: Container( | |
padding: EdgeInsets.only(top: 6), | |
margin: EdgeInsets.only(left: 16, right: 3), | |
alignment: Alignment.center, | |
child: RichText( | |
textAlign: TextAlign.center, | |
text: TextSpan( | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik', | |
color: filterDateActivity == '' | |
? ColorBase.black100 | |
: ColorBase.black60, | |
fontWeight: FontWeight.w400, | |
height: 0.8), | |
children: [ | |
TextSpan( | |
text: '${context.formatString( | |
AppLocale.semuaTanggal, | |
[], | |
)}\n'), | |
TextSpan( | |
text: '•', | |
style: TextStyle( | |
fontSize: 20, | |
color: filterDateActivity == '' | |
? ColorBase.black100 | |
: ColorBase | |
.primaryWhite), // titik lebih besar sedikit | |
), | |
], | |
), | |
)), | |
), | |
), | |
), | |
if (listNewCalendar != null) | |
if (listNewCalendar.length > 0) | |
for (int x = 0; x < listNewCalendar.length; x++) | |
AutoScrollTag( | |
index: x, | |
key: ValueKey(x), | |
controller: calendarController, | |
child: Padding( | |
padding: | |
const EdgeInsets.symmetric(vertical: 4.0), | |
child: GestureDetector( | |
onTap: () async { | |
setState(() { | |
filterDateActivity = | |
DateFormat('yyyy-MM-dd') | |
.format(listNewCalendar[x]); | |
filterDateX = x; | |
}); | |
_loadActivity(); | |
}, | |
child: Container( | |
width: ScreenUtil().scaleText * 55, | |
padding: EdgeInsets.only(top: 6), | |
margin: EdgeInsets.only( | |
left: x == 0 ? 16 : 3, right: 3), | |
alignment: Alignment.center, | |
child: RichText( | |
textAlign: TextAlign.center, | |
text: TextSpan( | |
style: TextStyle( | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik', | |
color: filterDateActivity == | |
DateFormat('yyyy-MM-dd') | |
.format( | |
listNewCalendar[x]) | |
? ColorBase.black100 | |
: ColorBase.black60, | |
fontWeight: FontWeight.w400, | |
height: 0.8), | |
children: [ | |
TextSpan( | |
text: '${isToday(listNewCalendar[x]) ? context.formatString( | |
AppLocale.today, | |
[], | |
) : DateFormat('EEE', 'id_ID').format(listNewCalendar[x]) == 'Sen' ? context.formatString(AppLocale.sen, []) + ' ' + DateFormat('d', 'id_ID').format(listNewCalendar[x]) : DateFormat('EEE', 'id_ID').format(listNewCalendar[x]) == 'Sel' ? context.formatString(AppLocale.sel, []) + ' ' + DateFormat('d', 'id_ID').format(listNewCalendar[x]) : DateFormat('EEE', 'id_ID').format(listNewCalendar[x]) == 'Rab' ? context.formatString(AppLocale.rab, []) + ' ' + DateFormat('d', 'id_ID').format(listNewCalendar[x]) : DateFormat('EEE', 'id_ID').format(listNewCalendar[x]) == 'Kam' ? context.formatString(AppLocale.kam, []) + ' ' + DateFormat('d', 'id_ID').format(listNewCalendar[x]) : DateFormat('EEE', 'id_ID').format(listNewCalendar[x]) == 'Jum' ? context.formatString(AppLocale.jum, []) + ' ' + DateFormat('d', 'id_ID').format(listNewCalendar[x]) : DateFormat('EEE', 'id_ID').format(listNewCalendar[x]) == 'Sab' ? context.formatString(AppLocale.sab, []) + ' ' + DateFormat('d', 'id_ID').format(listNewCalendar[x]) : DateFormat('EEE', 'id_ID').format(listNewCalendar[x]) == 'Min' ? context.formatString(AppLocale.min, []) + ' ' + DateFormat('d', 'id_ID').format(listNewCalendar[x]) : DateFormat('EEE', 'id_ID').format(listNewCalendar[x]) + ' ' + DateFormat('d', 'id_ID').format(listNewCalendar[x])}\n'), | |
TextSpan( | |
text: '•', | |
style: TextStyle( | |
fontSize: 20, | |
color: filterDateActivity == | |
DateFormat('yyyy-MM-dd') | |
.format( | |
listNewCalendar[ | |
x]) | |
? ColorBase.black100 | |
: ColorBase | |
.primaryWhite), // titik lebih besar sedikit | |
), | |
], | |
), | |
)), | |
), | |
), | |
) | |
], | |
), | |
), | |
], | |
), | |
), | |
isLoading | |
? Container( | |
height: screenHeight, | |
width: screenWidth - 32, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Skeleton(width: screenWidth - 32, height: 40), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
]), | |
) | |
: Column( | |
children: [ | |
if (!isLoading) | |
if (eventVenueList.length > 0) | |
Container( | |
constraints: | |
BoxConstraints(minHeight: screenHeight * 0.5), | |
child: SingleChildScrollView( | |
child: Column(children: [ | |
for (int x = 0; x < eventVenueList.length; x++) | |
Stack(children: [ | |
Padding( | |
padding: EdgeInsets.only( | |
right: 0, | |
top: eventVenueList[x].isCoaching == 1 | |
? 12 | |
: 6, | |
bottom: 0), | |
child: Container( | |
width: screenWidth - 32, | |
child: Column( | |
children: [ | |
GestureDetector( | |
onTap: () { | |
if (eventVenueList[x] | |
.sparringId == | |
0) { | |
if (eventVenueList[x] | |
.authorId | |
.toString() == | |
_sharedPreferencesManager | |
.getString("user_id")) { | |
Navigator.pushNamed( | |
context, | |
OpenPlayDetailScreen | |
.routeName, | |
arguments: { | |
'id': eventVenueList[x] | |
.openPlayId, | |
'prev_screen': | |
'dashboard', | |
'open_play_as': 'host' | |
}); | |
} else { | |
Navigator.pushNamed( | |
context, | |
OpenPlayDetailScreen | |
.routeName, | |
arguments: { | |
'id': eventVenueList[x] | |
.openPlayId | |
}); | |
} | |
} else { | |
if (eventVenueList[x] | |
.authorId | |
.toString() == | |
_sharedPreferencesManager | |
.getString("user_id")) { | |
if (eventVenueList[x] | |
.matchCategory != | |
'') { | |
Navigator.pushNamed( | |
context, | |
SparringIndividualDetailScreen | |
.routeName, | |
arguments: { | |
'id': | |
eventVenueList[x] | |
.sparringId, | |
'sparring_type': | |
'open', | |
'prev_screen': | |
'dashboard', | |
'is_from_dashboard': | |
true, | |
'match_status': | |
eventVenueList[x] | |
.status ?? | |
'pending', | |
}); | |
} else if (eventVenueList[x] | |
.awayTeamName != | |
'') { | |
Navigator.pushNamed( | |
context, | |
SparringDetailScreen | |
.routeName, | |
arguments: { | |
'id': | |
eventVenueList[x] | |
.sparringId, | |
'sparring_type': | |
'open', | |
'prev_screen': | |
'dashboard', | |
'from_team_id': | |
eventVenueList[x] | |
.communityId, | |
'match_status': | |
'in_progress', | |
'is_invite': false, | |
}); | |
} else { | |
Navigator.pushNamed( | |
context, | |
SparringDetailScreen | |
.routeName, | |
arguments: { | |
'id': | |
eventVenueList[x] | |
.sparringId, | |
'sparring_type': | |
'open', | |
'prev_screen': | |
'dashboard', | |
}); | |
} | |
} else { | |
if (eventVenueList[x] | |
.matchCategory != | |
'') { | |
Navigator.pushNamed( | |
context, | |
SparringIndividualDetailScreen | |
.routeName, | |
arguments: { | |
'id': | |
eventVenueList[x] | |
.sparringId, | |
'sparring_type': | |
'open', | |
'prev_screen': 'home', | |
}); | |
} else { | |
Navigator.pushNamed( | |
context, | |
SparringDetailScreen | |
.routeName, | |
arguments: { | |
'id': | |
eventVenueList[x] | |
.sparringId, | |
'sparring_type': | |
'open', | |
'prev_screen': 'home', | |
}); | |
} | |
} | |
} | |
}, | |
child: Container( | |
// height: eventVenueList[x].sparringId == 0 ? 262 : 196, | |
width: screenWidth - 32, | |
padding: EdgeInsets.symmetric( | |
horizontal: 16, vertical: 12), | |
margin: | |
EdgeInsets.only(bottom: 16), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
borderRadius: | |
BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
width: 1), | |
), | |
child: Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Row(children: [ | |
Container( | |
padding: | |
EdgeInsets.symmetric( | |
horizontal: 0, | |
vertical: 2), | |
child: Row( | |
mainAxisSize: | |
MainAxisSize.min, | |
children: [ | |
Text( | |
eventVenueList[x] | |
.sparringId != | |
0 && | |
eventVenueList[x] | |
.matchCategory == | |
'single' | |
? context.formatString( | |
AppLocale | |
.sparring, | |
[]) + | |
' · ' + | |
context.formatString( | |
AppLocale | |
.tunggal, | |
[]) | |
: eventVenueList[x].sparringId != | |
0 && | |
eventVenueList[x].matchCategory == | |
'double' | |
? context.formatString(AppLocale.sparring, []) + | |
' · ' + | |
context.formatString( | |
AppLocale.ganda, | |
[]) | |
: eventVenueList[x].sparringId != 0 && eventVenueList[x].matchCategory == '' | |
? context.formatString(AppLocale.sparring, []) + ' · ' + context.formatString(AppLocale.tim, []) | |
: context.formatString(AppLocale.main_bareng, []), | |
style: TextStyle( | |
fontWeight: | |
FontWeight | |
.w400, | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
14, | |
color: ColorBase | |
.black60, | |
fontFamily: | |
'Rubik', | |
), | |
), | |
]), | |
), | |
]), | |
SizedBox( | |
height: 4, | |
), | |
if (eventVenueList[x] | |
.sparringId != | |
0) | |
Row( | |
children: [ | |
// sparring community | |
if (eventVenueList[x] | |
.matchCategory == | |
'') | |
ClipOval( | |
child: Image( | |
image: | |
NetworkImage( | |
BaseUrlConfig | |
.baseAssetUrl + | |
eventVenueList[ | |
x] | |
.logoPath, | |
), | |
height: 40, | |
width: 40, | |
errorBuilder: (BuildContext | |
context, | |
Object | |
exception, | |
StackTrace | |
stackTrace) { | |
return Image | |
.asset( | |
'assets/images/avatar.png', | |
height: 40, | |
width: 40, | |
); | |
}, | |
), | |
), | |
// individual single | |
if (eventVenueList[x] | |
.matchCategory == | |
'single') | |
Container( | |
height: 40, | |
width: 40, | |
margin: EdgeInsets | |
.all(2), | |
child: RoundedUserAvatar( | |
width: 40, | |
avatar: BaseUrlConfig | |
.baseAssetUrl + | |
eventVenueList[ | |
x] | |
.userOnePhoto, | |
isThumbnail: | |
true)), | |
// individual double | |
if (eventVenueList[x] | |
.matchCategory == | |
'double') | |
Stack( | |
children: [ | |
Container( | |
width: 70, | |
height: 44, | |
), | |
Positioned( | |
left: 0, | |
child: ClipOval( | |
child: Container( | |
height: | |
40, | |
width: 40, | |
decoration: BoxDecoration( | |
border: Border.all( | |
color: ColorBase | |
.primaryWhite), | |
shape: BoxShape | |
.circle), | |
margin: EdgeInsets | |
.all( | |
2), | |
child: RoundedUserAvatar( | |
width: | |
40, | |
avatar: BaseUrlConfig.baseAssetUrl + | |
eventVenueList[x] | |
.userOnePhoto, | |
isThumbnail: | |
true)), | |
), | |
), | |
Positioned( | |
right: 0, | |
child: ClipOval( | |
child: Container( | |
height: | |
40, | |
width: 40, | |
decoration: BoxDecoration( | |
border: Border.all( | |
color: ColorBase | |
.primaryWhite), | |
shape: BoxShape | |
.circle), | |
margin: EdgeInsets | |
.all( | |
2), | |
child: RoundedUserAvatar( | |
width: | |
40, | |
avatar: BaseUrlConfig.baseAssetUrl + | |
eventVenueList[x] | |
.userTwoPhoto, | |
isThumbnail: | |
true)), | |
), | |
), | |
], | |
), | |
SizedBox( | |
width: 6, | |
), | |
Container( | |
padding: EdgeInsets | |
.symmetric( | |
horizontal: 8, | |
vertical: 6), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius | |
.circular( | |
4), | |
color: Color( | |
int.parse( | |
'0xffF1F1F1'))), | |
child: Text( | |
'VS', | |
style: TextStyle( | |
color: ColorBase | |
.black80, | |
fontFamily: | |
'Rubik', | |
fontWeight: | |
FontWeight | |
.w600, | |
fontStyle: | |
FontStyle | |
.italic, | |
fontSize: ScreenUtil() | |
.scaleText * | |
10, | |
), | |
), | |
), | |
SizedBox( | |
width: 6, | |
), | |
(eventVenueList[x] | |
.awayTeamName != | |
'') | |
? ClipOval( | |
child: Image( | |
image: | |
NetworkImage( | |
BaseUrlConfig | |
.baseAssetUrl + | |
eventVenueList[x] | |
.logoAwayTeam, | |
), | |
height: 40, | |
width: 40, | |
errorBuilder: (BuildContext | |
context, | |
Object | |
exception, | |
StackTrace | |
stackTrace) { | |
return Image | |
.asset( | |
'assets/images/avatar.png', | |
height: | |
40, | |
width: 40, | |
); | |
}, | |
), | |
) | |
: (eventVenueList[x] | |
.matchCategory == | |
'single' && | |
eventVenueList[x] | |
.awayUserOnePhoto != | |
'') | |
? Container( | |
height: 40, | |
width: 40, | |
margin: EdgeInsets | |
.all(2), | |
child: RoundedUserAvatar( | |
width: | |
40, | |
avatar: BaseUrlConfig.baseAssetUrl + | |
eventVenueList[x] | |
.awayUserOnePhoto, | |
isThumbnail: | |
true)) | |
: (eventVenueList[x].matchCategory == | |
'double' && | |
eventVenueList[x].awayUserOnePhoto != | |
'') | |
? Stack( | |
children: [ | |
Container( | |
width: | |
70, | |
height: | |
44, | |
), | |
Positioned( | |
left: | |
0, | |
child: | |
ClipOval( | |
child: Container(height: 40, width: 40, decoration: BoxDecoration(border: Border.all(color: ColorBase.primaryWhite), shape: BoxShape.circle), margin: EdgeInsets.all(2), child: RoundedUserAvatar(width: 40, avatar: BaseUrlConfig.baseAssetUrl + eventVenueList[x].awayUserOnePhoto, isThumbnail: true)), | |
), | |
), | |
Positioned( | |
right: | |
0, | |
child: | |
ClipOval( | |
child: Container(height: 40, width: 40, decoration: BoxDecoration(border: Border.all(color: ColorBase.primaryWhite), shape: BoxShape.circle), margin: EdgeInsets.all(2), child: RoundedUserAvatar(width: 40, avatar: BaseUrlConfig.baseAssetUrl + eventVenueList[x].awayUserTwoPhoto, isThumbnail: true)), | |
), | |
), | |
], | |
) | |
: (eventVenueList[x].matchCategory == | |
'double') | |
? Stack( | |
children: [ | |
Container( | |
width: 70, | |
height: 44, | |
), | |
Positioned( | |
left: 0, | |
child: ClipOval( | |
child: Container( | |
height: 40, | |
width: 40, | |
decoration: BoxDecoration(border: Border.all(color: ColorBase.primaryWhite), shape: BoxShape.circle), | |
margin: EdgeInsets.all(2), | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/empty-avatar.svg', | |
height: ScreenUtil().scaleText * 40, | |
width: ScreenUtil().scaleText * 40, | |
), | |
), | |
), | |
), | |
Positioned( | |
right: 0, | |
child: ClipOval( | |
child: Container( | |
height: 40, | |
width: 40, | |
decoration: BoxDecoration(color: Colors.white, border: Border.all(color: ColorBase.primaryWhite), shape: BoxShape.circle), | |
margin: EdgeInsets.all(2), | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/empty-avatar.svg', | |
height: ScreenUtil().scaleText * 40, | |
width: ScreenUtil().scaleText * 40, | |
), | |
), | |
), | |
), | |
], | |
) | |
: ClipOval( | |
child: | |
Image.asset( | |
'assets/images/ver3/empty_away_logo.png', | |
height: 40, | |
width: 40, | |
), | |
), | |
], | |
), | |
if (eventVenueList[x] | |
.sparringId != | |
0) | |
SizedBox( | |
height: 4, | |
), | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment | |
.start, | |
children: [ | |
Text( | |
eventVenueList[x] | |
.sparringId == | |
0 | |
? eventVenueList[x] | |
.eventName | |
: (eventVenueList[x] | |
.awayTeamName != | |
'') | |
? eventVenueList[x] | |
.name + | |
' X ' + | |
eventVenueList[ | |
x] | |
.awayTeamName | |
: (eventVenueList[x].awayTeamName == | |
'' && | |
eventVenueList[x].matchCategory == | |
'') | |
? eventVenueList[ | |
x] | |
.name | |
: eventVenueList[x].awayUserTwoName != | |
"" | |
? (eventVenueList[x].userOneName.length > 15 ? eventVenueList[x].userOneName.substring(0, 15) + '...' : eventVenueList[x].userOneName) + | |
' & ' + | |
(eventVenueList[x].userTwoName.length > 15 | |
? eventVenueList[x].userTwoName.substring(0, 15) + '...' | |
: eventVenueList[x].userTwoName) + | |
' · ' + | |
(eventVenueList[x].awayUserOneName.length > 15 ? eventVenueList[x].awayUserOneName.substring(0, 15) + '...' : eventVenueList[x].awayUserOneName) + | |
' & ' + | |
(eventVenueList[x].awayUserTwoName.length > 15 ? eventVenueList[x].awayUserTwoName.substring(0, 15) + '...' : eventVenueList[x].awayUserTwoName) | |
: eventVenueList[x].awayUserOneName != "" | |
? (eventVenueList[x].userOneName.length > 15 ? eventVenueList[x].userOneName.substring(0, 15) + '...' : eventVenueList[x].userOneName) + ' · ' + (eventVenueList[x].awayUserOneName.length > 15 ? eventVenueList[x].awayUserOneName.substring(0, 15) + '...' : eventVenueList[x].awayUserOneName) | |
: eventVenueList[x].userTwoName != "" | |
? (eventVenueList[x].userOneName.length > 15 ? eventVenueList[x].userOneName.substring(0, 15) + '...' : eventVenueList[x].userOneName) + ' & ' + (eventVenueList[x].userTwoName.length > 15 ? eventVenueList[x].userTwoName.substring(0, 15) + '...' : eventVenueList[x].userTwoName) | |
: eventVenueList[x].userOneName.length > 15 | |
? eventVenueList[x].userOneName.substring(0, 15) + '...' | |
: eventVenueList[x].userOneName, | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
14, | |
fontWeight: | |
FontWeight.w500, | |
color: ColorBase | |
.black100, | |
height: 1.4, | |
), | |
maxLines: 2, | |
overflow: TextOverflow | |
.ellipsis, | |
), | |
SizedBox(height: 4), | |
Row( | |
mainAxisSize: | |
MainAxisSize.min, | |
children: [ | |
Container( | |
width: 16, | |
height: 16, | |
child: SvgPicture | |
.network( | |
'${BaseUrlConfig.baseAssetUrl}' + | |
Helpers.findValueOnArray( | |
array: | |
sportImageList, | |
findKey: | |
'id', | |
findValue: | |
eventVenueList[x] | |
.categoryId, | |
keyValue: | |
'image'), | |
fit: BoxFit | |
.cover, | |
color: ColorBase | |
.black80, | |
), | |
), | |
SizedBox( | |
width: 4, | |
), | |
Text( | |
eventVenueList[x] | |
.level != | |
null && | |
eventVenueList[x] | |
.level | |
.length > | |
0 | |
? eventVenueList[x] | |
.level | |
.length == | |
5 | |
? '${eventVenueList[x].categoryName} · ' + | |
(eventVenueList[x].openPlayGender != null | |
? eventVenueList[x].openPlayGender == 'pria' | |
? context.formatString(AppLocale.laki_laki, []) + ', ' | |
: context.formatString(AppLocale.perempuan, []) + ', ' | |
: '') + | |
context.formatString(AppLocale.semua_level, []) | |
: '${eventVenueList[x].categoryName} · ' + | |
(eventVenueList[x].openPlayGender != null | |
? eventVenueList[x].openPlayGender == 'pria' | |
? context.formatString(AppLocale.laki_laki, []) + ', ' | |
: context.formatString(AppLocale.perempuan, []) + ', ' | |
: '') + | |
'${Helpers.skillFormat(context: context, skillArray: eventVenueList[x].level, isShowMoreThan3: false)}' | |
: '${eventVenueList[x].categoryName} · ' + | |
(eventVenueList[x].openPlayGender != null | |
? eventVenueList[x].openPlayGender == 'pria' | |
? context.formatString(AppLocale.laki_laki, []) + ', ' | |
: context.formatString(AppLocale.perempuan, []) + ', ' | |
: '') + | |
context.formatString(AppLocale.semua_level, []), | |
style: TextStyle( | |
fontWeight: | |
FontWeight | |
.w400, | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
color: ColorBase | |
.black80, | |
fontFamily: | |
'Rubik', | |
), | |
), | |
]), | |
SizedBox(height: 4), | |
if (eventVenueList[x] | |
.sparringId == | |
0) | |
Row( | |
mainAxisSize: | |
MainAxisSize | |
.min, | |
crossAxisAlignment: | |
CrossAxisAlignment | |
.start, | |
children: [ | |
SvgPicture.asset( | |
'assets/images/ver3/svg/calendar_mini.svg', | |
width: 16, | |
height: 16), | |
SizedBox( | |
width: 4), | |
Container( | |
width: | |
screenWidth - | |
90, | |
child: (eventVenueList[x].onlinePrice + | |
eventVenueList[x].offlinePrice == | |
0) | |
? Text( | |
context.formatString( | |
AppLocale.tanpa_biaya, | |
[]), | |
style: | |
TextStyle( | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
color: | |
ColorBase.black80, | |
), | |
overflow: | |
TextOverflow.ellipsis, | |
) | |
: Text( | |
eventVenueList[x].paymentMethod == | |
'mixed' | |
? '${eventDate.format(DateTime.parse(eventVenueList[x].date))}Rp' + | |
Helpers.formatRupiah((eventVenueList[x].onlinePrice + eventVenueList[x].offlinePrice).toString()) | |
: eventVenueList[x].paymentMethod == 'online' | |
? '${eventDate.format(DateTime.parse(eventVenueList[x].date))}Rp' + Helpers.formatRupiah(eventVenueList[x].onlinePrice.toString()) | |
: '${eventDate.format(DateTime.parse(eventVenueList[x].date))}Rp' + Helpers.formatRupiah(eventVenueList[x].offlinePrice.toString()), | |
style: | |
TextStyle( | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
height: | |
1.4, | |
color: | |
ColorBase.black80, | |
), | |
), | |
), | |
]), | |
if (eventVenueList[x] | |
.sparringId != | |
0) | |
Row( | |
mainAxisSize: | |
MainAxisSize | |
.min, | |
crossAxisAlignment: | |
CrossAxisAlignment | |
.start, | |
children: [ | |
SvgPicture.asset( | |
'assets/images/ver3/svg/calendar_mini.svg', | |
width: 16, | |
height: 16), | |
SizedBox( | |
width: 4), | |
Container( | |
width: | |
screenWidth - | |
90, | |
margin: EdgeInsets | |
.only( | |
top: | |
2), | |
child: Text( | |
'${eventDate.format(DateTime.parse(eventVenueList[x].date))}Rp' + | |
Helpers.formatRupiah( | |
(eventVenueList[x].totalPrice).toString()), | |
style: | |
TextStyle( | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
12, | |
color: ColorBase | |
.black80, | |
), | |
overflow: | |
TextOverflow | |
.ellipsis, | |
)) | |
]), | |
SizedBox(height: 10), | |
Row(children: [ | |
if (eventVenueList[x] | |
.use_venue_booking == | |
1) | |
Container( | |
padding: EdgeInsets | |
.symmetric( | |
horizontal: | |
6, | |
vertical: | |
4), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius | |
.circular( | |
4), | |
color: ColorBase | |
.secondaryGreen), | |
child: Row( | |
mainAxisSize: | |
MainAxisSize | |
.min, | |
children: [ | |
Text( | |
'Booked via AYO', | |
style: | |
TextStyle( | |
fontWeight: | |
FontWeight | |
.w500, | |
fontSize: | |
ScreenUtil().scaleText * | |
10, | |
color: ColorBase | |
.primaryWhite, | |
fontFamily: | |
'Rubik', | |
), | |
), | |
]), | |
), | |
if (eventVenueList[x] | |
.isSuperhost == | |
1) | |
Container( | |
padding: EdgeInsets | |
.symmetric( | |
horizontal: | |
6, | |
vertical: | |
4), | |
child: Row( | |
mainAxisSize: | |
MainAxisSize | |
.min, | |
children: [ | |
Container( | |
height: ScreenUtil() | |
.scaleText * | |
20, | |
child: Image | |
.asset( | |
'assets/images/ver3/super_host_tag_half.png', | |
fit: BoxFit | |
.fitHeight, | |
), | |
), | |
], | |
), | |
), | |
if (eventVenueList[x] | |
.is_official_by_venue == | |
1) | |
Container( | |
padding: EdgeInsets | |
.symmetric( | |
horizontal: | |
6, | |
vertical: | |
4), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius | |
.circular( | |
4), | |
color: const Color( | |
0xFF7A5AF8)), | |
child: Row( | |
mainAxisSize: | |
MainAxisSize | |
.min, | |
children: [ | |
Text( | |
'Official by Venue', | |
style: | |
TextStyle( | |
fontWeight: | |
FontWeight | |
.w500, | |
fontSize: | |
ScreenUtil().scaleText * | |
10, | |
color: ColorBase | |
.primaryWhite, | |
fontFamily: | |
'Rubik', | |
), | |
), | |
]), | |
), | |
// full slot | |
if ((eventVenueList[x] | |
.noOfParticipants == | |
eventVenueList[ | |
x] | |
.maximumPlayer) && | |
eventVenueList[x] | |
.sparringId == | |
0) | |
Container( | |
height: ScreenUtil() | |
.scaleText * | |
20, | |
margin: | |
EdgeInsets.only( | |
left: 4), | |
decoration: BoxDecoration( | |
color: Color( | |
0xFFFEE9DA), | |
borderRadius: | |
BorderRadius.circular( | |
ScreenUtil().scaleText * | |
4)), | |
padding: EdgeInsets | |
.symmetric( | |
vertical: 4, | |
horizontal: | |
8), | |
child: Text( | |
context | |
.formatString( | |
AppLocale | |
.penuh, | |
[]), | |
style: TextStyle( | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
10, | |
color: Color( | |
0xFFF97316), | |
fontWeight: | |
FontWeight | |
.w500), | |
), | |
), | |
if (eventVenueList[x].use_venue_booking == 1 || | |
eventVenueList[x] | |
.is_official_by_venue == | |
1 || | |
eventVenueList[x] | |
.isSuperhost == | |
1) | |
SizedBox(width: 6), | |
if (eventVenueList[x] | |
.dpCost > | |
0) | |
Container( | |
padding: EdgeInsets | |
.symmetric( | |
horizontal: | |
6, | |
vertical: | |
4), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius | |
.circular( | |
4), | |
color: Color( | |
int.parse( | |
'0xffF1F1F1'))), | |
child: Row( | |
mainAxisSize: | |
MainAxisSize | |
.min, | |
children: [ | |
Text( | |
context | |
.formatString( | |
AppLocale | |
.wajibDp, | |
[], | |
), | |
style: | |
TextStyle( | |
fontWeight: | |
FontWeight | |
.w500, | |
fontSize: | |
ScreenUtil().scaleText * | |
10, | |
color: ColorBase | |
.black80, | |
fontFamily: | |
'Rubik', | |
), | |
), | |
]), | |
), | |
]), | |
SizedBox(height: 12), | |
if (eventVenueList[x] | |
.sparringId == | |
0) | |
_eventParticipantAvatarItem( | |
context, | |
eventVenueList[x], | |
x), | |
if (eventVenueList[x] | |
.sparringId == | |
0) | |
SizedBox(height: 12), | |
if (eventVenueList[x] | |
.communityId != | |
0) | |
Padding( | |
padding: | |
const EdgeInsets | |
.symmetric( | |
vertical: | |
16.0), | |
child: DottedLine( | |
dashColor: ColorBase | |
.black10, | |
), | |
), | |
if (eventVenueList[x] | |
.communityId != | |
0) | |
GestureDetector( | |
onTap: () { | |
if (eventVenueList[ | |
x] | |
.is_official_by_venue == | |
0) { | |
Navigator.of( | |
context) | |
.pushNamed( | |
ProfileScreen | |
.routeName, | |
arguments: { | |
'userId': | |
eventVenueList[x] | |
.authorId | |
}); | |
} | |
}, | |
child: Row( | |
children: [ | |
Container( | |
height: 24, | |
width: 24, | |
margin: | |
EdgeInsets | |
.all(2), | |
child: ClipOval( | |
child: CachedNetworkImage( | |
width: | |
24.0, | |
height: | |
24.0, | |
imageUrl: BaseUrlConfig.baseAssetUrl + eventVenueList[x].communityName != | |
'' | |
? eventVenueList[x] | |
.communityLogo | |
: eventVenueList[x] | |
.authorAvatar, | |
placeholder: | |
(context, url) => | |
CircularProgressIndicator(), | |
errorWidget: (context, url, error) => DefaultProfile( | |
fontSize: ScreenUtil().scaleText * | |
12, | |
name: | |
eventVenueList[x].communityName, | |
subSize: 5, | |
size: 24))), | |
), | |
SizedBox( | |
width: 6), | |
Text( | |
context.formatString( | |
AppLocale | |
.dibuat_oleh, | |
[]), | |
style: | |
TextStyle( | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
color: ColorBase | |
.black80, | |
height: 1.4, | |
fontWeight: | |
FontWeight | |
.w400, | |
), | |
), | |
Row( | |
children: [ | |
Text( | |
eventVenueList[x].communityName != | |
'' | |
? eventVenueList[x].communityName.length > | |
10 | |
? eventVenueList[x].communityName.substring(0, 10) + | |
'...' | |
: eventVenueList[x] | |
.communityName | |
: eventVenueList[x].authorFirstName.length > | |
10 | |
? eventVenueList[x].authorFirstName.substring(0, 10) + | |
'...' | |
: eventVenueList[x].authorFirstName, | |
style: | |
TextStyle( | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
12, | |
color: ColorBase | |
.black100, | |
height: | |
1.4, | |
fontWeight: | |
FontWeight | |
.w500, | |
), | |
), | |
], | |
), | |
], | |
), | |
), | |
], | |
), | |
], | |
), | |
), | |
), | |
], | |
), | |
), | |
), | |
if (eventVenueList[x].isCoaching == 1) | |
Positioned( | |
child: Container( | |
height: ScreenUtil().scaleText * 26, | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/coaching-tag.svg'), | |
)) | |
]), | |
]), | |
)), | |
if (!isLoading) | |
if (eventVenueList.length == 0) | |
Container( | |
padding: EdgeInsets.symmetric(horizontal: 16), | |
width: screenWidth, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
SizedBox( | |
height: MediaQuery.of(context).size.height * | |
0.05), | |
Image( | |
image: AssetImage( | |
'assets/images/ver3/empty_search.png'), | |
height: ScreenUtil().scaleText * 72, | |
fit: BoxFit.fitHeight, | |
), | |
SizedBox( | |
height: 16, | |
), | |
Text( | |
(filterDateActivity != '' || | |
categoryName.length > 0 || | |
filterCoaching || | |
filterBookedViaAyo || | |
filterSuperhost || | |
filterOfficialByVenue || | |
selectedLevelList.length > 0 || | |
timeFilterSelected.length > 0) | |
? context.formatString( | |
AppLocale.hasil_tidak_ditemukan, []) | |
: context.formatString( | |
AppLocale.belum_ada_aktivitas, []), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 16, | |
fontFamily: 'Rubik', | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox( | |
height: 4, | |
), | |
Text( | |
(filterDateActivity != '' || | |
categoryName.length > 0 || | |
filterCoaching || | |
filterBookedViaAyo || | |
filterSuperhost || | |
filterOfficialByVenue || | |
filterOfficialByVenue || | |
selectedLevelList.length > 0 || | |
timeFilterSelected.length > 0) | |
? context.formatString( | |
AppLocale.tenangKamuBisaResetFilter, []) | |
: context.formatString( | |
AppLocale.aktivitasYangDilaksanakan, | |
[]), | |
textAlign: TextAlign.center, | |
style: TextStyle( | |
fontWeight: FontWeight.w400, | |
fontSize: ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik', | |
color: ColorBase.black80, | |
), | |
), | |
SizedBox( | |
height: 16, | |
), | |
if (filterDateActivity != '' || | |
categoryName.length > 0 || | |
filterCoaching || | |
filterBookedViaAyo || | |
filterSuperhost || | |
filterOfficialByVenue || | |
selectedLevelList.length > 0 || | |
timeFilterSelected.length > 0) | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
filterDateActivity = ''; | |
categoryName = []; | |
filterCoaching = false; | |
filterBookedViaAyo = false; | |
filterSuperhost = false; | |
filterOfficialByVenue = false; | |
selectedLevelList = []; | |
timeFilterSelected = []; | |
selectedTimeStart = '00:00'; | |
selectedTimeEnd = '23:00'; | |
integerSelectedTimeList = | |
SfRangeValues(0, 23); | |
finalTimeList = SfRangeValues(0, 23); | |
filterStartTime = 0; | |
filterEndTime = 23; | |
selectedLevel = 'Semua Level'; | |
integerSelectedLevelList = | |
SfRangeValues(0, 4); | |
finalLevelList = SfRangeValues(0, 4); | |
startLevel = 0; | |
endLevel = 4; | |
_loadActivity(); | |
}); | |
}, | |
child: Container( | |
width: 144, | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, vertical: 8), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: Row( | |
crossAxisAlignment: | |
CrossAxisAlignment.center, | |
mainAxisAlignment: | |
MainAxisAlignment.center, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.resetFilter, []), | |
style: TextStyle( | |
color: ColorBase.primaryWhite, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
], | |
)), | |
), | |
SizedBox(height: screenHeight * 0.3), | |
]), | |
), | |
], | |
) | |
]), | |
); | |
} | |
bool isToday(DateTime date) { | |
final now = DateTime.now(); | |
return date.year == now.year && | |
date.month == now.month && | |
date.day == now.day; | |
} | |
Widget _buildCoachVenueContent( | |
{bool isLoading = false, List<VenueCoach> coachVenueList}) { | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
double screenWidth = MediaQuery.of(context).size.width; | |
return Container( | |
padding: EdgeInsets.symmetric(horizontal: 16), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
isLoading | |
? Container( | |
width: screenWidth - 32, | |
padding: EdgeInsets.symmetric(vertical: 12), | |
margin: EdgeInsets.only(bottom: 16), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Skeleton(width: 100, height: 40), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
]), | |
) | |
: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
GestureDetector( | |
onTap: () async { | |
setState(() { | |
SportSelectorVenueDetailModal( | |
categoryName: sportCategoryName, | |
categoryId: sports, | |
theContext: context, | |
allSPort: allSport, | |
myPref: myPref, | |
updateSport: updateSport, | |
venueName: venueName, | |
venueId: widget.venueId); | |
}); | |
}, | |
child: IntrinsicWidth( | |
child: Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, vertical: 4), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryWhite, | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
Text( | |
newSportFilter > 0 | |
? context | |
.formatString(AppLocale.olahraga, []) | |
: context.formatString( | |
AppLocale.semua_olahraga, []), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
if (newSportFilter > 0) SizedBox(width: 4), | |
if (newSportFilter > 0) | |
ConstrainedBox( | |
constraints: BoxConstraints( | |
minHeight: 12, | |
minWidth: 12, | |
maxWidth: 30, | |
), | |
child: Container( | |
margin: EdgeInsets.only(top: 2), | |
padding: EdgeInsets.symmetric( | |
vertical: 2, horizontal: 4), | |
decoration: BoxDecoration( | |
color: ColorBase.black100, | |
shape: BoxShape.rectangle, | |
borderRadius: | |
BorderRadius.circular(4)), | |
child: Text( | |
newSportFilter.toString(), | |
style: TextStyle( | |
color: Colors.white, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 9, | |
fontWeight: FontWeight.w500, | |
), | |
textAlign: TextAlign.center, | |
), | |
), | |
), | |
SizedBox(width: 4), | |
Container( | |
margin: EdgeInsets.only(top: 2), | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver3/chevron-down.png', | |
fit: BoxFit.contain, | |
), | |
), | |
], | |
)), | |
)), | |
SizedBox(height: 12), | |
if (!isLoading) | |
if (coachVenueList.length > 0) | |
Container( | |
constraints: | |
BoxConstraints(minHeight: screenHeight * 0.5), | |
child: SingleChildScrollView( | |
child: Column(children: [ | |
for (int x = 0; x < coachVenueList.length; x++) | |
Container( | |
width: screenWidth - 32, | |
margin: EdgeInsets.only(bottom: 12), | |
padding: EdgeInsets.symmetric( | |
horizontal: 16, vertical: 12), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, width: 1), | |
), | |
child: Column( | |
children: [ | |
Row( | |
children: [ | |
Container( | |
height: 48, | |
width: 48, | |
decoration: BoxDecoration( | |
color: Color( | |
int.parse('0xff01646B')), | |
shape: BoxShape.circle, | |
), | |
child: Center( | |
child: ClipOval( | |
child: Image( | |
image: NetworkImage( | |
BaseUrlConfig.baseAssetUrl + | |
coachVenueList[x].image, | |
), | |
height: 48, | |
width: 48, | |
errorBuilder: | |
(BuildContext context, | |
Object exception, | |
StackTrace stackTrace) { | |
return Image.asset( | |
'assets/images/ver3/default_user.png', | |
height: 48, | |
width: 48, | |
); | |
}, | |
))), | |
), | |
SizedBox(width: 12), | |
Column( | |
mainAxisAlignment: | |
MainAxisAlignment.start, | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Text( | |
coachVenueList[x].name, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500, | |
fontSize: | |
ScreenUtil().scaleText * | |
15, | |
), | |
), | |
SizedBox(height: 4), | |
Container( | |
child: Row( | |
children: [ | |
for (int i = 0; | |
i < | |
coachVenueList[x] | |
.sports | |
.length; | |
i++) | |
Row( | |
children: [ | |
if (i <= 2) | |
Container( | |
width: 16, | |
height: 16, | |
child: SvgPicture.network( | |
BaseUrlConfig | |
.baseAssetUrl + | |
coachVenueList[x] | |
.sports[ | |
i] | |
.svgPath, | |
color: ColorBase | |
.black80)), | |
if (i <= 2) | |
SizedBox(width: 4), | |
if (i <= 2) | |
Text( | |
i == 2 | |
? coachVenueList[x] | |
.sports[ | |
i] | |
.name | |
.substring(0, | |
2) + | |
'..' | |
: coachVenueList[ | |
x] | |
.sports[ | |
i] | |
.name, | |
style: | |
TextStyle( | |
color: ColorBase | |
.black80, | |
fontFamily: | |
'Rubik', | |
fontWeight: | |
FontWeight | |
.w400, | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
)), | |
if (i <= 2) | |
SizedBox(width: 4), | |
if (i < 2 && | |
coachVenueList[x] | |
.sports | |
.length > | |
1) | |
Text( | |
' · ', | |
style: TextStyle( | |
color: ColorBase | |
.black80, | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12), | |
), | |
if (i < 2 && | |
coachVenueList[x] | |
.sports | |
.length > | |
1) | |
SizedBox(width: 4), | |
], | |
), | |
], | |
)), | |
]), | |
], | |
), | |
Container( | |
margin: EdgeInsets.only( | |
top: 12, bottom: 16), | |
child: Text( | |
coachVenueList[x].description, | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w400, | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
), | |
maxLines: 2, | |
overflow: TextOverflow.ellipsis, | |
), | |
), | |
Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.mulaiDari, | |
[], | |
), | |
style: TextStyle( | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontFamily: 'Rubik', | |
fontWeight: | |
FontWeight.w400, | |
color: | |
ColorBase.black80)), | |
SizedBox(height: 4), | |
Container( | |
constraints: BoxConstraints( | |
maxWidth: screenWidth * 0.5, | |
), | |
child: RichText( | |
maxLines: 1, | |
overflow: | |
TextOverflow.ellipsis, | |
text: TextSpan( | |
style: TextStyle( | |
fontSize: 14, | |
color: ColorBase | |
.secondaryRed, | |
fontWeight: | |
FontWeight.w500, | |
), | |
children: [ | |
TextSpan( | |
text: 'Rp' + | |
Helpers.formatRupiah( | |
coachVenueList[ | |
x] | |
.price | |
.toString()), | |
style: TextStyle( | |
color: ColorBase | |
.black100, | |
fontFamily: | |
'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
14, | |
fontWeight: | |
FontWeight | |
.w500, | |
height: 1.4), | |
), | |
TextSpan( | |
text: | |
'/${context.formatString(AppLocale.peserta, []).toLowerCase()}/${context.formatString(AppLocale.sesi, [])}', | |
style: TextStyle( | |
color: ColorBase | |
.black60, | |
fontFamily: | |
'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight | |
.w400, | |
height: 1.4), | |
), | |
], | |
), | |
), | |
), | |
]), | |
Container( | |
child: GestureDetector( | |
onTap: () async { | |
if (coachVenueList[x] | |
.sports | |
.length == | |
1) { | |
int result = | |
await _checkPickedSportCoach( | |
coachVenueList[x] | |
.sports[0]); | |
if (result == 0) { | |
chooseFieldCoach( | |
coachVenueList[x] | |
.sports[0], | |
coachVenueList[x] | |
.fieldAdditionalServiceId); | |
} else {} | |
} else { | |
_coachSportSelectorModal( | |
context, | |
screenWidth, | |
screenHeight, | |
coachVenueList[x].sports, | |
coachVenueList[x] | |
.fieldAdditionalServiceId); | |
} | |
}, | |
child: Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 16), | |
height: 32, | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: | |
BorderRadius.circular(8), | |
), | |
child: Center( | |
child: Text( | |
context.formatString( | |
AppLocale.pilih_jadwal, | |
[], | |
), | |
style: TextStyle( | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontFamily: 'Rubik', | |
fontWeight: | |
FontWeight.w500, | |
color: ColorBase | |
.primaryWhite)), | |
), | |
), | |
), | |
), | |
], | |
) | |
], | |
), | |
), | |
]), | |
)), | |
if (!isLoading) | |
if (coachVenueList.length == 0) | |
Container( | |
padding: EdgeInsets.symmetric(horizontal: 16), | |
width: screenWidth, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
SizedBox( | |
height: MediaQuery.of(context).size.height * | |
0.05), | |
Image( | |
image: AssetImage( | |
'assets/images/ver3/empty_search.png'), | |
height: ScreenUtil().scaleText * 72, | |
fit: BoxFit.fitHeight, | |
), | |
SizedBox( | |
height: 16, | |
), | |
Text( | |
newSportFilter > 0 | |
? context.formatString( | |
AppLocale.hasil_tidak_ditemukan, []) | |
: context.formatString( | |
AppLocale.belumAdaCoachTersedia, []), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 16, | |
fontFamily: 'Rubik', | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox( | |
height: 4, | |
), | |
Text( | |
newSportFilter > 0 | |
? context.formatString( | |
AppLocale.tenangKamuBisaResetFilter, []) | |
: context.formatString( | |
AppLocale.belumAdaCoachTersediaDesc, | |
[]), | |
textAlign: TextAlign.center, | |
style: TextStyle( | |
fontWeight: FontWeight.w400, | |
fontSize: ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik', | |
color: ColorBase.black80, | |
), | |
), | |
SizedBox( | |
height: 16, | |
), | |
if (membershipType != '') | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
newSportFilter = 0; | |
}); | |
}, | |
child: Container( | |
width: 144, | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, vertical: 8), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: Row( | |
crossAxisAlignment: | |
CrossAxisAlignment.center, | |
mainAxisAlignment: | |
MainAxisAlignment.center, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.resetFilter, []), | |
style: TextStyle( | |
color: ColorBase.primaryWhite, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
], | |
)), | |
), | |
SizedBox(height: screenHeight * 0.3), | |
]), | |
), | |
], | |
) | |
]), | |
); | |
} | |
Widget _buildHorizontalMembershipVenueContent( | |
{bool isLoading = false, List<VenueMembership> membershipVenueList}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
return Container( | |
decoration: BoxDecoration( | |
color: Colors.white, | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
Column( | |
children: [ | |
Container( | |
child: SingleChildScrollView( | |
scrollDirection: Axis.horizontal, | |
child: Row(children: [ | |
for (int x = 0; x < membershipVenueList.length; x++) | |
Container( | |
width: screenWidth * 0.7, | |
margin: EdgeInsets.only(right: 12), | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
padding: EdgeInsets.only( | |
top: 12, left: 14, right: 14, bottom: 14), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
membershipVenueList[x].name, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
Text( | |
membershipVenueList[x].type == 'langganan' | |
? '· ' + | |
context.formatString(AppLocale.langganan, [ | |
membershipVenueList[x].minSlot.toString() | |
]) + | |
' ' + | |
context.formatString( | |
AppLocale.slot_per_minggu, []) | |
: '· ' + | |
context.formatString( | |
AppLocale.paket_pembelian, [ | |
membershipVenueList[x].minSlot.toString() | |
]) + | |
' ' + | |
context.formatString( | |
AppLocale.jadwal_sekaligus, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
Text( | |
membershipVenueList[x].type == 'langganan' | |
? '· ' + | |
context.formatString( | |
AppLocale.perpanjang_setiap, []) + | |
' ' + | |
(membershipVenueList[x].slotCycle / 30) | |
.round() | |
.toString() + | |
' ' + | |
context.formatString(AppLocale.bulan, []) | |
: ' ', | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
Container( | |
width: screenWidth - 32, | |
child: Padding( | |
padding: EdgeInsets.symmetric(vertical: 12), | |
child: DottedLine(dashColor: ColorBase.black10), | |
), | |
), | |
SizedBox(height: 2), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
if (membershipVenueList[x].discountAmount > 0) | |
Container( | |
margin: EdgeInsets.only(top: 4, right: 0), | |
height: 12, | |
width: 12, | |
child: Image.asset( | |
'assets/images/ver3/fire-discount.png', | |
fit: BoxFit.contain, | |
), | |
), | |
if (membershipVenueList[x].discountAmount > 0) | |
SizedBox(width: 4), | |
if (membershipVenueList[x].discountAmount > 0) | |
Container( | |
margin: EdgeInsets.only(top: 2), | |
child: RichText( | |
text: TextSpan( | |
style: TextStyle( | |
fontSize: 11, | |
color: ColorBase.secondaryRed, | |
fontWeight: FontWeight.w500, | |
), | |
children: [ | |
TextSpan( | |
text: membershipVenueList[x] | |
.discountType == | |
'percentage' | |
? 'Disc.' + | |
' ' + | |
membershipVenueList[x] | |
.discountAmount | |
.toString() + | |
'%' | |
: 'Disc.' + | |
' Rp' + | |
Helpers.formatRupiah( | |
membershipVenueList[ | |
x] | |
.discountAmount | |
.toString()) | |
.toString(), | |
style: TextStyle( | |
color: ColorBase.secondaryRed, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 11, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
TextSpan( | |
text: | |
'/${context.formatString(AppLocale.sesi, [])}', | |
style: TextStyle( | |
color: ColorBase.secondaryRed, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
], | |
), | |
), | |
), | |
], | |
), | |
GestureDetector( | |
onTap: () { | |
LoadingDialogWidget.show(context); | |
venueMembershipTncRepository | |
.membershipTnc( | |
context, | |
venueId: widget.venueId, | |
membershipId: membershipVenueList[x].id, | |
) | |
.then((val) { | |
LoadingDialogWidget.hide(context); | |
setState(() { | |
_membershipTnCModal( | |
context, | |
screenWidth, | |
screenHeight, | |
membershipVenueList[x], | |
membershipVenueList[x].id, | |
membershipVenueList[x] | |
.activeFields[0] | |
.fieldId, | |
membershipVenueList[x].type, | |
membershipVenueList[x].name, | |
val.data.tncs, | |
val.data.packageName, | |
membershipVenueList[x].slotRule); | |
}); | |
}); | |
}, | |
child: Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, vertical: 4), | |
decoration: BoxDecoration( | |
color: Color(0xFFF5E6E9), | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: Color(0xFFF5E6E9), | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Text( | |
context.formatString(AppLocale.beli, []), | |
style: TextStyle( | |
color: ColorBase.primaryRed, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
), | |
), | |
], | |
) | |
], | |
), | |
), | |
]), | |
)), | |
GestureDetector( | |
onTap: () { | |
for (var i = 0; i < tab.length; i++) { | |
tab[i]['is_active'] = false; | |
} | |
tab[3]['is_active'] = true; | |
activeTab = 'membership'; | |
_scrollBottomBarController.animateTo( | |
0.0, | |
duration: const Duration(milliseconds: 300), | |
curve: Curves.ease, | |
); | |
}, | |
child: Container( | |
height: 40, | |
margin: EdgeInsets.only(top: 20), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
borderRadius: BorderRadius.circular(12), | |
border: Border.all(color: ColorBase.black10, width: 1), | |
), | |
child: Center( | |
child: Text( | |
context.formatString(AppLocale.lihatSemuaPaket, | |
[membershipVenueList.length]), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
), | |
), | |
), | |
], | |
) | |
]), | |
); | |
} | |
Widget _buildMembershipVenueContent( | |
{bool isLoading = false, List<VenueMembership> membershipVenueList}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
return Container( | |
padding: EdgeInsets.symmetric(horizontal: 16), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
border: Border.all( | |
color: ColorBase.primaryWhite, | |
width: 0, | |
style: BorderStyle.none)), | |
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
isLoading | |
? Container( | |
width: screenWidth - 32, | |
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), | |
margin: EdgeInsets.only(bottom: 16), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all(color: ColorBase.black10, width: 1), | |
), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Skeleton(width: 50, height: 20), | |
SizedBox(width: 8), | |
Skeleton(width: 50, height: 20), | |
], | |
), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
SizedBox(height: 8), | |
Skeleton(width: screenWidth - 32, height: 100), | |
]), | |
) | |
: Column( | |
children: [ | |
Container( | |
child: Row( | |
children: [ | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
if (membershipType == 'langganan') { | |
membershipTypes = ['langganan', 'bundling']; | |
membershipType = ''; | |
} else { | |
membershipTypes = ['langganan']; | |
membershipType = 'langganan'; | |
} | |
actionFilterMembership(); | |
}); | |
}, | |
child: Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, vertical: 4), | |
decoration: BoxDecoration( | |
color: membershipType == 'langganan' | |
? ColorBase.black10 | |
: ColorBase.primaryWhite, | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Text( | |
context.formatString(AppLocale.langganan, []), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
), | |
), | |
SizedBox(width: 8), | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
if (membershipType == 'bundling') { | |
membershipTypes = ['langganan', 'bundling']; | |
membershipType = ''; | |
} else { | |
membershipTypes = ['bundling']; | |
membershipType = 'bundling'; | |
} | |
actionFilterMembership(); | |
}); | |
}, | |
child: Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, vertical: 4), | |
decoration: BoxDecoration( | |
color: membershipType == 'bundling' | |
? ColorBase.black10 | |
: ColorBase.primaryWhite, | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Text( | |
context.formatString(AppLocale.bundling, []), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 12), | |
if (!isLoading) | |
if (membershipVenueList.length > 0) | |
Container( | |
constraints: | |
BoxConstraints(minHeight: screenHeight * 0.5), | |
child: SingleChildScrollView( | |
child: Column(children: [ | |
for (int x = 0; | |
x < membershipVenueList.length; | |
x++) | |
Stack( | |
children: [ | |
Positioned( | |
top: 0, | |
right: 0, | |
child: Container( | |
padding: const EdgeInsets.symmetric( | |
horizontal: 8, vertical: 4), | |
decoration: BoxDecoration( | |
color: const Color(0xFFF2EFFE), | |
borderRadius: const BorderRadius.only( | |
topRight: Radius.circular(12), | |
bottomLeft: Radius.circular(12), | |
), | |
), | |
child: Text( | |
membershipVenueList[x].type == | |
'langganan' | |
? context.formatString( | |
AppLocale.langganan, | |
[]).toUpperCase() | |
: context.formatString( | |
AppLocale.bundling, | |
[]).toUpperCase(), | |
style: TextStyle( | |
color: Color(0xFF7A5AF8), | |
fontWeight: FontWeight.w500, | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
letterSpacing: 0.5, | |
fontStyle: FontStyle.italic, | |
), | |
), | |
), | |
), | |
Container( | |
margin: EdgeInsets.only(bottom: 12), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
padding: EdgeInsets.only( | |
top: 20, | |
left: 14, | |
right: 14, | |
bottom: 14), | |
child: Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Text( | |
membershipVenueList[x].name, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
Text( | |
membershipVenueList[x].type == | |
'langganan' | |
? '· ' + | |
context.formatString( | |
AppLocale.langganan, [ | |
membershipVenueList[x] | |
.minSlot | |
.toString() | |
]) + | |
' ' + | |
context.formatString( | |
AppLocale | |
.slot_per_minggu, | |
[]) | |
: '· ' + | |
context.formatString( | |
AppLocale | |
.paket_pembelian, | |
[ | |
membershipVenueList[x] | |
.minSlot | |
.toString() | |
]) + | |
' ' + | |
context.formatString( | |
AppLocale | |
.jadwal_sekaligus, | |
[]), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
Text( | |
membershipVenueList[x].type == | |
'langganan' | |
? '· ' + | |
context.formatString( | |
AppLocale | |
.perpanjang_setiap, | |
[]) + | |
' ' + | |
(membershipVenueList[x] | |
.slotCycle / | |
30) | |
.round() | |
.toString() + | |
' ' + | |
context.formatString( | |
AppLocale.bulan, []) | |
: ' ', | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
Container( | |
width: screenWidth - 32, | |
child: Padding( | |
padding: EdgeInsets.symmetric( | |
vertical: 12), | |
child: DottedLine( | |
dashColor: ColorBase.black10), | |
), | |
), | |
SizedBox(height: 6), | |
Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Row( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
if (membershipVenueList[x] | |
.discountAmount > | |
0) | |
Container( | |
margin: EdgeInsets.only( | |
top: 4, right: 0), | |
height: 12, | |
width: 12, | |
child: Image.asset( | |
'assets/images/ver3/fire-discount.png', | |
fit: BoxFit.contain, | |
), | |
), | |
if (membershipVenueList[x] | |
.discountAmount > | |
0) | |
SizedBox(width: 2), | |
if (membershipVenueList[x] | |
.discountAmount > | |
0) | |
RichText( | |
text: TextSpan( | |
style: TextStyle( | |
fontSize: 12, | |
color: ColorBase | |
.secondaryRed, | |
fontWeight: | |
FontWeight.w500, | |
), | |
children: [ | |
TextSpan( | |
text: membershipVenueList[ | |
x] | |
.discountType == | |
'percentage' | |
? 'Disc.' + | |
' ' + | |
membershipVenueList[ | |
x] | |
.discountAmount | |
.toString() + | |
'%' | |
: context.formatString( | |
AppLocale | |
.diskon, | |
[]) + | |
' Rp' + | |
Helpers.formatRupiah(membershipVenueList[x] | |
.discountAmount | |
.toString()) | |
.toString(), | |
style: TextStyle( | |
color: ColorBase | |
.secondaryRed, | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight | |
.w500, | |
height: 1.4), | |
), | |
TextSpan( | |
text: | |
'/${context.formatString(AppLocale.sesi, [])}', | |
style: TextStyle( | |
color: ColorBase | |
.secondaryRed, | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight | |
.w400, | |
height: 1.4), | |
), | |
], | |
), | |
), | |
], | |
), | |
GestureDetector( | |
onTap: () { | |
LoadingDialogWidget.show( | |
context); | |
venueMembershipTncRepository | |
.membershipTnc( | |
context, | |
venueId: widget.venueId, | |
membershipId: | |
membershipVenueList[x] | |
.id, | |
) | |
.then((val) { | |
LoadingDialogWidget.hide( | |
context); | |
setState(() { | |
_membershipTnCModal( | |
context, | |
screenWidth, | |
screenHeight, | |
membershipVenueList[ | |
x], | |
membershipVenueList[x] | |
.id, | |
membershipVenueList[x] | |
.activeFields[0] | |
.fieldId, | |
membershipVenueList[x] | |
.type, | |
membershipVenueList[x] | |
.name, | |
val.data.tncs, | |
val.data.packageName, | |
membershipVenueList[x] | |
.slotRule); | |
}); | |
}); | |
}, | |
child: Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, | |
vertical: 4), | |
decoration: BoxDecoration( | |
color: | |
ColorBase.primaryRed, | |
borderRadius: | |
BorderRadius.circular( | |
8), | |
border: Border.all( | |
color: ColorBase | |
.primaryRed, | |
style: | |
BorderStyle.solid, | |
width: 1)), | |
child: Text( | |
context.formatString( | |
AppLocale | |
.beliPaketVenueDetail, | |
[]), | |
style: TextStyle( | |
color: ColorBase | |
.primaryWhite, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight.w500, | |
height: 1.4), | |
), | |
), | |
), | |
], | |
) | |
], | |
), | |
), | |
], | |
), | |
]), | |
)), | |
if (!isLoading) | |
if (membershipVenueList.length == 0) | |
Container( | |
padding: EdgeInsets.symmetric(horizontal: 16), | |
width: screenWidth, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.center, | |
children: [ | |
SizedBox( | |
height: MediaQuery.of(context).size.height * | |
0.05), | |
Image( | |
image: AssetImage( | |
'assets/images/ver3/empty_search.png'), | |
height: ScreenUtil().scaleText * 72, | |
fit: BoxFit.fitHeight, | |
), | |
SizedBox( | |
height: 16, | |
), | |
Text( | |
membershipType == 'langganan' | |
? context.formatString( | |
AppLocale.belumAdaPaketLangganan, []) | |
: membershipType == 'bundling' | |
? context.formatString( | |
AppLocale.belumAdaPaketBundling, []) | |
: context.formatString( | |
AppLocale.belumAdaMembership, []), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 16, | |
fontFamily: 'Rubik', | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox( | |
height: 4, | |
), | |
Text( | |
membershipType == 'langganan' | |
? context.formatString( | |
AppLocale.belumAdaPaketLanggananDesc, | |
[]) | |
: membershipType == 'bundling' | |
? context.formatString( | |
AppLocale.belumAdaPaketBundlingDesc, | |
[]) | |
: context.formatString( | |
AppLocale.saatIniBelumAdaMembership, | |
[]), | |
textAlign: TextAlign.center, | |
style: TextStyle( | |
fontWeight: FontWeight.w400, | |
fontSize: ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik', | |
color: ColorBase.black80, | |
), | |
), | |
SizedBox(height: screenHeight * 0.3), | |
]), | |
), | |
], | |
) | |
]), | |
); | |
} | |
Widget _buildVenueDetailContent( | |
{VenueDetail venueDetail, bool isLoading = false}) { | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
double screenWidth = MediaQuery.of(context).size.width; | |
return Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Stack( | |
children: [ | |
isLoading == true | |
? ImageBannerSliderWidget( | |
isLoading: true, | |
pageIndicatorMargin: 0, | |
height: screenHeight * 0.430271676, | |
autoPlay: true, | |
) | |
: ImageBannerSliderWidget( | |
images: venueDetail.images, | |
venueName: venueDetail.name, | |
isLoading: false, | |
pageIndicatorMargin: 0, | |
height: screenHeight * 0.430271676, | |
autoPlay: true, | |
), | |
Stack( | |
alignment: Alignment.topCenter, | |
children: [ | |
Container( | |
// padding: EdgeInsets.symmetric(vertical: 18, horizontal: 16), | |
margin: EdgeInsets.only( | |
left: 0, right: 0, top: screenHeight * 0.39), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
boxShadow: [ | |
BoxShadow( | |
color: Color.fromRGBO(0, 0, 0, 0.07), | |
offset: Offset(0.0, 3.0), | |
blurRadius: 7.0, | |
), | |
], | |
), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
padding: | |
EdgeInsets.only(top: 18, left: 16, right: 16), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
isLoading | |
? Skeleton(width: 250, height: 24) | |
: Text(venueDetail.name, | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 22, | |
color: ColorBase.black100, | |
fontWeight: FontWeight.w500, | |
)), | |
SizedBox(height: 8), | |
isLoading | |
? Row( | |
children: [ | |
Skeleton( | |
width: 14, | |
height: 14, | |
marginRight: 4), | |
Skeleton( | |
width: 50, | |
height: 16, | |
marginRight: 4), | |
Skeleton( | |
width: 50, | |
height: 16, | |
marginRight: 4), | |
], | |
) | |
: Row( | |
children: [ | |
if (double.parse(venueDetail | |
.currentRating | |
.toString()) < | |
4 && | |
venueDetail.totalReview.toInt() < | |
10) ...[ | |
SizedBox(), | |
] else ...[ | |
if (double.parse( | |
venueDetail.currentRating) > | |
0) | |
Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 6, vertical: 4), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius.circular(6), | |
color: ColorBase.primaryBlack, | |
), | |
child: Row(children: [ | |
Padding( | |
padding: const EdgeInsets | |
.symmetric(horizontal: 0), | |
child: Image.asset( | |
'assets/images/ver3/white-star.png', | |
width: 12, | |
height: 12, | |
), | |
), | |
SizedBox(width: 4), | |
Text( | |
double.parse(venueDetail | |
.currentRating) | |
.toStringAsFixed(1), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
color: ColorBase | |
.primaryWhite, | |
fontWeight: | |
FontWeight.w400, | |
)), | |
]), | |
), | |
SizedBox(width: 6), | |
], | |
if (!isLoading && | |
venueDetail.isVerified == 1 && | |
venueDetail.totalReview == 0) | |
Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 4, vertical: 2), | |
decoration: BoxDecoration( | |
color: ColorBase.black100, | |
borderRadius: | |
BorderRadius.circular(4), | |
border: Border.all( | |
color: ColorBase.black100, | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Text( | |
context.formatString( | |
AppLocale.venueBaru, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.primaryWhite, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
10, | |
fontWeight: FontWeight.w500), | |
), | |
), | |
if (venueDetail.isVerified != 1) | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
Navigator.of(context).pushNamed( | |
VenueReviewScreen.routeName, | |
arguments: { | |
'venue_id': | |
widget.venueId, | |
'venue_name': venueName | |
}); | |
}); | |
}, | |
child: Text( | |
'${venueDetail.totalReview} ${context.formatString( | |
AppLocale.ulasan, | |
[], | |
)}', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
12, | |
decoration: | |
TextDecoration.underline), | |
), | |
), | |
SizedBox(width: 4), | |
Text( | |
' · ', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12), | |
), | |
SizedBox(width: 4), | |
GestureDetector( | |
onTap: () { | |
openMap( | |
double.parse( | |
venueDetail.latitude), | |
double.parse( | |
venueDetail.longitude)); | |
}, | |
child: Row( | |
crossAxisAlignment: | |
CrossAxisAlignment.center, | |
children: [ | |
Text( | |
'${Helpers.shortCityname(Helpers.capitalizeString(venueDetail.city.toLowerCase()))}', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
decoration: TextDecoration | |
.underline), | |
), | |
Container( | |
margin: | |
EdgeInsets.only(top: 2), | |
height: 10, | |
width: 10, | |
child: Image.asset( | |
'assets/images/ver3/huge-icon-arrow-right.png', | |
)), | |
], | |
)), | |
if (venueDetail.isDpAvailable != 0) | |
Text( | |
' · ', | |
style: | |
TextFontConst.RUBIK_REGULAR_12, | |
), | |
if (venueDetail.isDpAvailable != 0) | |
Row( | |
children: [ | |
Container( | |
height: 18, | |
width: 30, | |
child: Image.asset( | |
'assets/images/dp-primary-red.png', | |
fit: BoxFit.contain, | |
), | |
), | |
SizedBox(width: 4), | |
Text( | |
context.formatString( | |
AppLocale.bisaDpDulu, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
12, | |
), | |
), | |
], | |
), | |
], | |
), | |
SizedBox(height: 16), | |
], | |
)), | |
// tabs | |
Container( | |
margin: EdgeInsets.only( | |
bottom: activeTab == 'booking' ? 20 : 12), | |
decoration: BoxDecoration( | |
border: Border( | |
bottom: BorderSide( | |
color: ColorBase.black10, | |
), | |
), | |
), | |
child: SingleChildScrollView( | |
scrollDirection: Axis.horizontal, | |
child: Row( | |
children: [ | |
Padding( | |
padding: EdgeInsets.only(top: 0, left: 0), | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.center, | |
children: [ | |
for (int x = 0; x < tab.length; x++) | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
for (var i = 0; | |
i < tab.length; | |
i++) { | |
tab[i]['is_active'] = false; | |
} | |
tab[x]['is_active'] = true; | |
activeTab = tab[x]['value']; | |
}); | |
if (activeTab == 'aktivitas' && | |
!isLoadActivity) { | |
_loadActivity(); | |
} | |
if (activeTab == 'coach' && | |
!isLoadCoach) { | |
_loadCoach(); | |
} | |
if (activeTab == 'komunitas' && | |
!isLoadCommunity) { | |
_loadCommunity(); | |
} | |
}, | |
child: Container( | |
alignment: Alignment.center, | |
// width: (screenWidth / 4), | |
padding: EdgeInsets.only( | |
bottom: 8, left: 32, right: 32), | |
decoration: BoxDecoration( | |
color: Colors.transparent, | |
border: Border( | |
bottom: BorderSide( | |
width: 1, | |
color: tab[x]['is_active'] | |
? ColorBase.black100 | |
: Colors | |
.transparent))), | |
child: Text( | |
tab[x]['name'] == 'Aktivitas' | |
? context.formatString( | |
AppLocale.aktivitas, | |
[], | |
) | |
: tab[x]['name'] == 'Komunitas' | |
? context.formatString( | |
AppLocale.komunitas, | |
[], | |
) | |
: tab[x]['name'], | |
textAlign: TextAlign.center, | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: tab[x]['is_active'] | |
? FontWeight.w500 | |
: FontWeight.w400, | |
color: tab[x]['is_active'] | |
? ColorBase.black100 | |
: ColorBase.black60, | |
), | |
), | |
), | |
), | |
], | |
), | |
), | |
], | |
), | |
), | |
), | |
// card tab booking | |
if (activeTab == 'booking') | |
Container( | |
padding: EdgeInsets.symmetric(horizontal: 16), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
// sample venue headline | |
isLoading | |
? Column( | |
children: [ | |
for (var i = 0; i < 3; i++) | |
Container( | |
margin: | |
EdgeInsets.only(bottom: 16), | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment | |
.spaceBetween, | |
children: [ | |
Column( | |
mainAxisSize: | |
MainAxisSize.min, | |
crossAxisAlignment: | |
CrossAxisAlignment | |
.start, | |
children: [ | |
Row( | |
children: [ | |
Skeleton( | |
width: 20, | |
height: 20), | |
SizedBox( | |
width: 6, | |
), | |
Skeleton( | |
width: 100, | |
height: 20), | |
], | |
), | |
SizedBox(height: 4), | |
Container( | |
margin: EdgeInsets.only( | |
left: 26), | |
width: | |
screenWidth - 108, | |
child: Skeleton( | |
width: 100, | |
height: 20), | |
) | |
], | |
), | |
], | |
), | |
) | |
], | |
) | |
: Column( | |
children: [ | |
for (var i = 0; | |
i < | |
venueDetail | |
.venueHighlights.length; | |
i++) | |
Container( | |
margin: | |
EdgeInsets.only(bottom: 16), | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment | |
.spaceBetween, | |
children: [ | |
Column( | |
mainAxisSize: | |
MainAxisSize.min, | |
crossAxisAlignment: | |
CrossAxisAlignment | |
.start, | |
children: [ | |
Row( | |
children: [ | |
Image( | |
image: NetworkImage( | |
BaseUrlConfig | |
.baseAssetUrl + | |
venueDetail | |
.venueHighlights[ | |
i] | |
.image, | |
), | |
height: 20, | |
width: 20, | |
errorBuilder: | |
(BuildContext | |
context, | |
Object | |
exception, | |
StackTrace | |
stackTrace) { | |
return Image | |
.asset( | |
'assets/images/avatar.png', | |
height: 20, | |
width: 20, | |
); | |
}, | |
), | |
SizedBox( | |
width: 6, | |
), | |
Text( | |
venueDetail | |
.venueHighlights[ | |
i] | |
.variableHeadline == | |
'lapangan_kualitas_tinggi' | |
? context.formatString( | |
AppLocale | |
.lapangan_kualitas_tinggi, | |
[]) | |
: venueDetail | |
.venueHighlights[ | |
i] | |
.variableHeadline == | |
'penerangan_optimal' | |
? context.formatString( | |
AppLocale | |
.penerangan_optimal, | |
[]) | |
: venueDetail.venueHighlights[i].variableHeadline == | |
'kebersihan_terjaga' | |
? context.formatString( | |
AppLocale | |
.kebersihan_terjaga, | |
[]) | |
: venueDetail.venueHighlights[i].variableHeadline == | |
'tersedia_ruang_ganti_shower' | |
? context.formatString(AppLocale.tersedia_ruang_ganti_shower, | |
[]) | |
: venueDetail.venueHighlights[i].variableHeadline == 'lahan_parkir_luas' | |
? context.formatString(AppLocale.lahan_parkir_luas, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'tempat_nongkrong_nyaman' | |
? context.formatString(AppLocale.tempat_nongkrong_nyaman, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'jam_operasional_fleksibel' | |
? context.formatString(AppLocale.jam_operasional_fleksibel, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'dekat_lokasi_strategis' | |
? context.formatString(AppLocale.dekat_lokasi_strategis, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'pelayanan_ramah_responsif' | |
? context.formatString(AppLocale.pelayanan_ramah_responsif, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'venue_favorit_komunitas' | |
? context.formatString(AppLocale.venue_favorit_komunitas, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'ac_sejuk_ventilasi_baik' | |
? context.formatString(AppLocale.ac_sejuk_ventilasi_baik, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'venue_ramah_anak_keluarga' | |
? context.formatString(AppLocale.venue_ramah_anak_keluarga, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'gabung_membership_main_lebih_hemat' | |
? context.formatString(AppLocale.gabung_membership_main_lebih_hemat, []) | |
: venueDetail.venueHighlights[i].variableHeadline == 'banyak_pilihan_produk_tambahan' | |
? context.formatString(AppLocale.banyak_pilihan_produk_tambahan, []) | |
: '-', | |
style: TextStyle( | |
fontFamily: | |
'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
14, | |
fontWeight: | |
FontWeight | |
.w500, | |
color: ColorBase | |
.black100, | |
), | |
) | |
], | |
), | |
SizedBox(height: 4), | |
Container( | |
margin: EdgeInsets.only( | |
left: 26), | |
width: | |
screenWidth - 108, | |
child: Text( | |
venueDetail | |
.venueHighlights[ | |
i] | |
.variableDescription == | |
'dibangun_dengan_material_terbaik_untuk_performa_maksimal' | |
? context.formatString( | |
AppLocale | |
.dibangun_dengan_material_terbaik_untuk_performa_maksimal, | |
[]) | |
: venueDetail | |
.venueHighlights[ | |
i] | |
.variableDescription == | |
'dilengkapi_lampu_led_terang_merata_cocok_untuk_permainan_malam_hari' | |
? context.formatString( | |
AppLocale | |
.dilengkapi_lampu_led_terang_merata_cocok_untuk_permainan_malam_hari, | |
[]) | |
: venueDetail | |
.venueHighlights[ | |
i] | |
.variableDescription == | |
'area_lapangan_ruang_tunggu_dan_toilet_dibersihkan_secara_rutin' | |
? context.formatString( | |
AppLocale | |
.area_lapangan_ruang_tunggu_dan_toilet_dibersihkan_secara_rutin, | |
[]) | |
: venueDetail.venueHighlights[i].variableDescription == | |
'nikmati_kenyamanan_setelah_bermain_dengan_fasilitas_lengkap' | |
? context.formatString( | |
AppLocale.nikmati_kenyamanan_setelah_bermain_dengan_fasilitas_lengkap, | |
[]) | |
: venueDetail.venueHighlights[i].variableDescription == 'area_parkir_aman_dan_mudah_diakses_untuk_kendaraan_roda_dua_dan_empat' | |
? context.formatString(AppLocale.area_parkir_aman_dan_mudah_diakses_untuk_kendaraan_roda_dua_dan_empat, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'ada_kafe_area_duduk_untuk_istirahat_ngopi_atau_menunggu_giliran_bermain' | |
? context.formatString(AppLocale.ada_kafe_area_duduk_untuk_istirahat_ngopi_atau_menunggu_giliran_bermain, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'buka_hingga_malam_cocok_untuk_pekerja_dan_pelajar' | |
? context.formatString(AppLocale.buka_hingga_malam_cocok_untuk_pekerja_dan_pelajar, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'berada_di_pusat_kota_mudah_dijangkau_dari_mana_saja' | |
? context.formatString(AppLocale.berada_di_pusat_kota_mudah_dijangkau_dari_mana_saja, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'tim_kami_siap_membantu_semua_kebutuhan_anda' | |
? context.formatString(AppLocale.tim_kami_siap_membantu_semua_kebutuhan_anda, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'rekomendasi_dari_berbagai_komunitas_olahraga_lokal' | |
? context.formatString(AppLocale.rekomendasi_dari_berbagai_komunitas_olahraga_lokal, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'udara_segar_membuat_permainan_lebih_nyaman' | |
? context.formatString(AppLocale.udara_segar_membuat_permainan_lebih_nyaman, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'cocok_untuk_latihan_anak_atau_rekreasi_keluarga' | |
? context.formatString(AppLocale.cocok_untuk_latihan_anak_atau_rekreasi_keluarga, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'dapatkan_potongan_harga_dengan_membeli_paket_member' | |
? context.formatString(AppLocale.dapatkan_potongan_harga_dengan_membeli_paket_member, []) | |
: venueDetail.venueHighlights[i].variableDescription == 'tambahkan_sewa_raket_bola_minuman_hingga_pelatih_langsung_dari_aplikasi' | |
? context.formatString(AppLocale.tambahkan_sewa_raket_bola_minuman_hingga_pelatih_langsung_dari_aplikasi, []) | |
: '-', | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight.w400, | |
color: ColorBase | |
.black80, | |
), | |
), | |
) | |
], | |
), | |
], | |
), | |
), | |
], | |
), | |
// matchCam | |
isLoading | |
? SizedBox(height: 0) | |
: (venueDetail.matchcamVenue == 1) | |
? GestureDetector( | |
onTap: () async { | |
if (venueDetail | |
.venueSportMatchcam > | |
0) { | |
int ada = 0; | |
category | |
.forEach((categoryData) { | |
if (categoryData.id == | |
venueDetail | |
.venueSportMatchcam) { | |
ada = 1; | |
chooseField(categoryData); | |
} | |
}); | |
if (ada == 0) { | |
_sportSelectorModal( | |
context, | |
screenWidth, | |
screenHeight, | |
category); | |
} | |
} else { | |
if (category.length == 1) { | |
int result = | |
await _checkPickedSport( | |
category[0]); | |
if (result == 0) { | |
chooseField(category[0]); | |
} else {} | |
} else { | |
_sportSelectorModal( | |
context, | |
screenWidth, | |
screenHeight, | |
category); | |
} | |
} | |
// MatchCamGeneralInfoBottomSheet( | |
// theContext: context, | |
// matchCamResponse: (p0, p1) { | |
// if (p0 == true) { | |
// // Navigator.of(context).pushNamed( | |
// // VenueDetailScreen.routeName, | |
// // arguments: { | |
// // 'venue_id': venue.id, | |
// // 'integration_type': | |
// // widget.integrationType, | |
// // }); | |
// } | |
// }, | |
// ); | |
}, | |
child: Container( | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment | |
.spaceBetween, | |
children: [ | |
Column( | |
mainAxisSize: | |
MainAxisSize.min, | |
crossAxisAlignment: | |
CrossAxisAlignment | |
.start, | |
children: [ | |
Row( | |
children: [ | |
Image.asset( | |
'assets/images/ver3/camera-border.png', | |
width: 20, | |
height: 20, | |
), | |
// Container( | |
// width: 28, | |
// height: 14, | |
// decoration: BoxDecoration( | |
// borderRadius: | |
// BorderRadius.circular(4), | |
// color: ColorBase.black60), | |
// ), | |
SizedBox( | |
width: 6, | |
), | |
Text( | |
context | |
.formatString( | |
AppLocale | |
.matchCam, | |
[], | |
), | |
style: TextStyle( | |
fontFamily: | |
'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
14, | |
fontWeight: | |
FontWeight | |
.w500, | |
color: ColorBase | |
.black100, | |
), | |
) | |
], | |
), | |
SizedBox(height: 4), | |
Container( | |
margin: EdgeInsets.only( | |
left: 26), | |
width: | |
screenWidth - 108, | |
child: Text( | |
context.formatString( | |
AppLocale | |
.rekam_aksi_kamu_di_lapangan_dan_abadikan_momen_momen_terbaik_dengan_MatchCam, | |
[], | |
), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight.w400, | |
color: ColorBase | |
.black100, | |
), | |
), | |
), | |
SizedBox(height: 4), | |
Container( | |
margin: | |
EdgeInsets.only( | |
left: 26), | |
width: | |
screenWidth - 108, | |
child: Row( | |
children: [ | |
Text( | |
context | |
.formatString( | |
AppLocale | |
.lihatLapangan, | |
[], | |
), | |
style: | |
TextStyle( | |
color: ColorBase | |
.primaryRed, | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight | |
.w500, | |
), | |
), | |
SizedBox( | |
width: 2), | |
SvgPicture.asset( | |
'assets/images/ver3/svg/arrow-right.svg', | |
height: ScreenUtil() | |
.scaleText * | |
16, | |
width: ScreenUtil() | |
.scaleText * | |
16, | |
color: ColorBase | |
.primaryRed, | |
), | |
], | |
)), | |
], | |
), | |
], | |
), | |
), | |
) | |
: SizedBox(height: 0), | |
if (!isLoading) | |
if (venueDetail.matchcamVenue == 1 || | |
venueDetail.venueHighlights.length > 0) | |
Padding( | |
padding: | |
EdgeInsets.symmetric(vertical: 20), | |
child: DottedLine( | |
dashColor: ColorBase.black10), | |
), | |
// sports | |
isLoading | |
? Row( | |
children: [ | |
Skeleton( | |
width: 16, | |
height: 16, | |
marginRight: 4), | |
Skeleton(width: 50, height: 16), | |
], | |
) | |
: Container( | |
child: Wrap( | |
children: [ | |
for (var i = 0; | |
i < venueDetail.sports.length; | |
i++) | |
Row( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
Container( | |
margin: EdgeInsets.only( | |
bottom: 8), | |
decoration: BoxDecoration( | |
color: Color(int.parse( | |
'0xfff5f5f5')), | |
borderRadius: | |
BorderRadius | |
.circular(8)), | |
padding: | |
EdgeInsets.symmetric( | |
vertical: 7, | |
horizontal: 8), | |
child: Row(children: [ | |
Container( | |
width: 16, | |
height: 16, | |
child: SvgPicture.network( | |
BaseUrlConfig | |
.baseAssetUrl + | |
venueDetail | |
.sports[ | |
i] | |
.svgPicture, | |
color: ColorBase | |
.black100)), | |
SizedBox(width: 4), | |
Text( | |
venueDetail | |
.sports[i].name, | |
style: TextStyle( | |
color: ColorBase | |
.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight.w400, | |
), | |
), | |
])), | |
if (i < | |
venueDetail | |
.sports.length - | |
1) | |
SizedBox(width: 6) | |
], | |
), | |
], | |
), | |
), | |
// description | |
if (isLoading) | |
Padding( | |
padding: | |
EdgeInsets.only(top: 12, bottom: 8), | |
child: Divider( | |
color: ColorBase.black10, | |
), | |
), | |
isLoading | |
? Row( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Skeleton( | |
width: 75, | |
height: 16, | |
marginBottom: 8), | |
Skeleton( | |
width: screenWidth - 64, | |
height: 45), | |
SizedBox(height: 12), | |
Skeleton( | |
width: 75, | |
height: 16, | |
marginBottom: 8), | |
Skeleton( | |
width: screenWidth - 64, | |
height: 45), | |
], | |
) | |
], | |
) | |
: Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
if (description != '') | |
Padding( | |
padding: EdgeInsets.symmetric( | |
vertical: 20), | |
child: DottedLine( | |
dashColor: ColorBase.black10), | |
), | |
if (description != '') | |
Text( | |
context.formatString( | |
AppLocale.deskripsi, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
if (description != '') | |
SizedBox(height: 2), | |
if (description != '') | |
Text( | |
description, | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
), | |
maxLines: 3, | |
overflow: TextOverflow.ellipsis, | |
), | |
if (venueRules != '') | |
SizedBox(height: 20), | |
if (venueRules != '') | |
Text( | |
context.formatString( | |
AppLocale.peraturanVenue, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
if (venueRules != '') | |
SizedBox(height: 2), | |
if (venueRules != '') | |
Text( | |
venueRules, | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
), | |
maxLines: 3, | |
overflow: TextOverflow.ellipsis, | |
), | |
SizedBox(height: 12), | |
if (!isLoading) | |
GestureDetector( | |
onTap: () { | |
Navigator.pushNamed( | |
context, | |
AboutVenueScreen | |
.routeName, | |
arguments: { | |
'description': | |
description, | |
'venue_rules': | |
venueRules, | |
}); | |
}, | |
child: Row( | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.selengkapnya, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase | |
.primaryRed, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight.w500, | |
), | |
), | |
SizedBox(width: 2), | |
SvgPicture.asset( | |
'assets/images/ver3/svg/arrow-right.svg', | |
height: ScreenUtil() | |
.scaleText * | |
16, | |
width: ScreenUtil() | |
.scaleText * | |
16, | |
color: | |
ColorBase.primaryRed, | |
), | |
], | |
)), | |
], | |
), | |
// card facility | |
SizedBox(height: 16), | |
isLoading | |
? _buildFacilitiesWidget(isLoading: true) | |
: _buildFacilitiesWidget( | |
facilities: venueDetail.facilities, | |
descPoints: venueDetail.descPoints), | |
// divider | |
Container( | |
margin: EdgeInsets.only(top: 20, bottom: 20), | |
child: Column( | |
children: [ | |
Container( | |
height: 2, | |
width: screenWidth, | |
color: ColorBase.black10, | |
child: SizedBox(width: 0)), | |
Container( | |
height: 6, | |
width: screenWidth, | |
color: ColorBase.black5, | |
child: SizedBox(width: 0)) | |
], | |
), | |
), | |
if (memberships.length > 0) | |
Container( | |
child: Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.paketMembership, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
SizedBox(height: 4), | |
Text( | |
context.formatString( | |
AppLocale.jadwalPastiAman, | |
[], | |
) + | |
' · ' + | |
context.formatString( | |
AppLocale.potonganHargaKhusus, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
), | |
), | |
SizedBox(height: 12), | |
]), | |
), | |
if (memberships.length > 0) | |
_buildHorizontalMembershipVenueContent( | |
membershipVenueList: memberships), | |
// divider | |
Container( | |
margin: EdgeInsets.only(top: 20, bottom: 20), | |
child: Column( | |
children: [ | |
Container( | |
height: 2, | |
width: screenWidth, | |
color: ColorBase.black10, | |
child: SizedBox(width: 0)), | |
Container( | |
height: 6, | |
width: screenWidth, | |
color: ColorBase.black5, | |
child: SizedBox(width: 0)) | |
], | |
), | |
), | |
// card review | |
Container( | |
child: Row(children: [ | |
isLoading | |
? Skeleton( | |
width: 75, | |
height: 24, | |
) | |
: Text( | |
context.formatString( | |
AppLocale.ulasanSectionTitle, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
]), | |
), | |
if (!isLoading) | |
Padding( | |
padding: EdgeInsets.symmetric( | |
vertical: 16, horizontal: 0), | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Container( | |
decoration: BoxDecoration( | |
color: ColorBase.black10, | |
border: Border.all( | |
color: ColorBase.black10), | |
borderRadius: | |
BorderRadius.circular(32)), | |
child: GestureDetector( | |
onTap: () { | |
setState(() { | |
if (reviewValue == 'field') { | |
reviewValue = 'activity'; | |
} else { | |
reviewValue = 'field'; | |
} | |
_refreshData(); | |
}); | |
}, | |
child: Row( | |
children: [ | |
Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 14, | |
vertical: 8), | |
decoration: BoxDecoration( | |
color: (reviewValue == | |
'field') | |
? Colors.white | |
: ColorBase.black10, | |
border: Border.all( | |
color: (reviewValue == | |
'field') | |
? Colors.white | |
: ColorBase | |
.black10), | |
borderRadius: | |
BorderRadius.circular( | |
32)), | |
child: Text( | |
context.formatString( | |
AppLocale.sewaLapangan, | |
[]), | |
style: TextStyle( | |
color: reviewValue == | |
'field' | |
? ColorBase.black100 | |
: ColorBase.black60, | |
fontFamily: 'Rubik', | |
fontWeight: | |
reviewValue == 'field' | |
? FontWeight.w500 | |
: FontWeight.w400, | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
), | |
), | |
), | |
Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 14, | |
vertical: 8), | |
decoration: BoxDecoration( | |
color: (reviewValue != | |
'field') | |
? Colors.white | |
: ColorBase.black10, | |
border: Border.all( | |
color: (reviewValue != | |
'field') | |
? Colors.white | |
: ColorBase | |
.black10), | |
borderRadius: | |
BorderRadius.circular( | |
32)), | |
child: Text( | |
context.formatString( | |
AppLocale.aktivitas, | |
[]), | |
style: TextStyle( | |
color: reviewValue != | |
'field' | |
? ColorBase.black100 | |
: ColorBase.black60, | |
fontFamily: 'Rubik', | |
fontWeight: | |
reviewValue != 'field' | |
? FontWeight.w500 | |
: FontWeight.w400, | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
), | |
), | |
), | |
], | |
), | |
), | |
), | |
], | |
), | |
), | |
BlocBuilder<VenueDetailBloc, VenueDetailState>( | |
bloc: reviewVenueBloc, | |
buildWhen: (previous, current) { | |
if (current is ReviewVenueLoading || | |
current is ReviewVenueFailure || | |
current is ReviewVenueLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (state is ReviewVenueLoaded) { | |
if (state.venueReview.summary.total > 0) { | |
if (reviewValue == 'field') { | |
venueReviews = state.venueReview; | |
} | |
} | |
} | |
return SizedBox(width: 0); | |
}, | |
), | |
// show review booking venue | |
if (venueReviews != null) | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
if (reviewValue == 'field') | |
_buildReviewContent( | |
venueReview: venueReviews), | |
], | |
), | |
if (venueReviews == null && | |
reviewValue == 'field') | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: double.infinity, | |
child: Column( | |
children: [ | |
SizedBox(height: 24), | |
Image( | |
image: AssetImage( | |
'assets/images/empty-state.png'), | |
width: 117, | |
), | |
SizedBox(height: 16), | |
Text( | |
context.formatString( | |
AppLocale.belumAdaUlasan, []), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik', | |
), | |
), | |
SizedBox(height: 4), | |
Text( | |
context.formatString( | |
AppLocale | |
.venueBelumMemilikiUlasanSewaLapangan, | |
[]), | |
style: TextStyle( | |
fontWeight: FontWeight.w400, | |
fontSize: | |
ScreenUtil().scaleText * | |
12, | |
fontFamily: 'Rubik', | |
color: ColorBase.black80), | |
), | |
SizedBox(height: 48), | |
], | |
), | |
) | |
], | |
), | |
BlocBuilder<VenueDetailBloc, VenueDetailState>( | |
bloc: reviewVenueBloc, | |
buildWhen: (previous, current) { | |
if (current is ReviewOpenPlayVenueLoading || | |
current is ReviewOpenPlayVenueFailure || | |
current is ReviewOpenPlayVenueLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (state is ReviewOpenPlayVenueLoaded) { | |
venueOpenPlayRatingStar = int.parse(state | |
.communityReview | |
.summary | |
.openPlayRating | |
.toString() | |
.substring(0, 1)); | |
customVenueOpenPlayRatingStar = | |
double.parse(state.communityReview | |
.summary.openPlayRating) | |
.toStringAsFixed(1); | |
splitRatingOpenPlay = | |
customVenueOpenPlayRatingStar | |
.split('.'); | |
ratingNotFullOpenPlay = | |
int.parse(splitRatingOpenPlay[1]) != 0 | |
? 1 | |
: 0; | |
return (state.communityReview.summary | |
.countOpenPlayReview > | |
0) | |
? Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
if (reviewValue == 'activity') | |
_buildOpenPlayReviewContent( | |
communityReview: state | |
.communityReview), | |
], | |
) | |
: SizedBox(width: 0); | |
} else if (state | |
is ReviewOpenPlayVenueFailure && | |
reviewValue == 'activity') { | |
return Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: double.infinity, | |
child: Column( | |
children: [ | |
SizedBox(height: 24), | |
Image( | |
image: AssetImage( | |
'assets/images/empty-state.png'), | |
width: 117, | |
), | |
SizedBox(height: 16), | |
Text( | |
context.formatString( | |
AppLocale.belumAdaUlasan, | |
[]), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: | |
ScreenUtil().scaleText * | |
14, | |
fontFamily: 'Rubik', | |
), | |
), | |
SizedBox(height: 4), | |
Text( | |
context.formatString( | |
AppLocale | |
.venueBelumMemilikiUlasanAktivitas, | |
[]), | |
style: TextStyle( | |
fontWeight: | |
FontWeight.w400, | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontFamily: 'Rubik', | |
color: ColorBase.black80), | |
), | |
SizedBox(height: 48), | |
], | |
), | |
) | |
], | |
); | |
} else if (state | |
is ReviewOpenPlayVenueFailure && | |
reviewValue != 'activity') { | |
return SizedBox(width: 0); | |
} else { | |
return Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
_buildReviewContent(isLoading: true), | |
Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 16, vertical: 20), | |
child: Divider( | |
color: ColorBase.black10), | |
), | |
], | |
); | |
} | |
}, | |
), | |
// card reschedule & pembatalan | |
BlocConsumer<VenueDetailBloc, VenueDetailState>( | |
bloc: venueDetailBloc, | |
listener: (ctx, state) { | |
if (state is VenueDetailLoaded) { | |
setState(() {}); | |
} | |
}, | |
buildWhen: (previous, current) { | |
if (current is VenueDetailLoading || | |
current is VenueDetailFailure || | |
current is VenueDetailLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (cancelPolicy != null) { | |
return _buildRescheduleRefundContent(); | |
} else { | |
return SizedBox(width: 0); | |
} | |
}, | |
), | |
BlocBuilder<VenueDetailBloc, VenueDetailState>( | |
bloc: otherVenuesBloc, | |
buildWhen: (previous, current) { | |
if (current is OtherVenuesLoading || | |
current is OtherVenuesFailure || | |
current is OtherVenuesLoaded) { | |
return true; | |
} | |
return false; | |
}, | |
builder: (ctx, state) { | |
if (state is OtherVenuesLoaded) { | |
return (state.otherVenueList.length > 0 && | |
isDisableShowNearbyVenue == 0) | |
? _buildOtherVenuesContent( | |
otherVenueList: | |
state.otherVenueList) | |
: SizedBox(width: 0); | |
} else { | |
return _buildOtherVenuesContent( | |
isLoading: true); | |
} | |
}, | |
), | |
// end section tab booking | |
], | |
)), | |
], | |
), | |
), | |
], | |
), | |
], | |
), | |
], | |
); | |
} | |
Widget _buildBottomBarWidget() { | |
MediaQueryData queryData = MediaQuery.of(context); | |
double screenWidth = MediaQuery.of(context).size.width; | |
double screenHeight = queryData.size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
return activeTab != 'booking' | |
? SizedBox(width: 0) | |
: Container( | |
width: double.infinity, | |
height: maxVoucher != null ? 96 : 54, | |
decoration: BoxDecoration( | |
color: Colors.white, | |
boxShadow: [ | |
if (maxVoucher == null) | |
BoxShadow( | |
color: Colors.black26, | |
blurRadius: 0.7, // soften the shadow | |
offset: Offset( | |
0.0, // Move to right 10 horizontally | |
-1.0, // Move to bottom 5 Vertically | |
), | |
) | |
], | |
), | |
child: | |
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ | |
if (maxVoucher != null) | |
GestureDetector( | |
onTap: () async { | |
LoadingDialogWidget.show(context); | |
VenueVoucherModel response = await venueVoucherRepository | |
.profileList(widget.context, venueId: widget.venueId); | |
if (response.statusCode == 200) { | |
LoadingDialogWidget.hide(context); | |
vouchers.clear(); | |
vouchers.addAll(response.data); | |
_availableVoucherModal( | |
context, screenWidth, screenHeight); | |
} else { | |
LoadingDialogWidget.hide(context); | |
customFlutterToast( | |
context: context, | |
msg: | |
'Gagal mengambil daftar voucher. Mohon coba beberapa saat lagi', | |
customToastType: CustomToastType.ERROR, | |
); | |
} | |
}, | |
child: Container( | |
margin: EdgeInsets.only(bottom: 8), | |
padding: const EdgeInsets.symmetric( | |
horizontal: 12, vertical: 8), | |
decoration: BoxDecoration( | |
color: Colors.blue.shade100, | |
borderRadius: const BorderRadius.only( | |
topLeft: Radius.circular(8), | |
topRight: Radius.circular(8), | |
), | |
), | |
child: Center( | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.center, | |
children: [ | |
Image.asset( | |
'assets/images/ver3/discount-fire-blue.png', | |
height: 16, | |
width: 16, | |
), | |
SizedBox(width: 6), | |
Text( | |
(maxVoucher.maxAmount > 0 && | |
maxVoucher.maxAmount != null && | |
maxVoucher.discountType == "percentage") | |
? context.formatString( | |
AppLocale.adaPromo, | |
['${maxVoucher.amount.toString()}%'], | |
) + | |
' ' + | |
context.formatString( | |
AppLocale.hinggaDiVenueIni, | |
[ | |
'Rp${Helpers.formatRupiah(maxVoucher.maxAmount.toString())}' | |
], | |
) | |
: (maxVoucher.maxAmount > 0 && | |
maxVoucher.maxAmount != null) | |
? context.formatString( | |
AppLocale.adaPromoHinggaDiVenueIni, | |
[ | |
'Rp${Helpers.formatRupiah(maxVoucher.maxAmount.toString())}' | |
], | |
) | |
: (maxVoucher.discountType == | |
"percentage") | |
? context.formatString( | |
AppLocale | |
.adaPromoHinggaDiVenueIni, | |
[ | |
'${maxVoucher.amount.toString()}%' | |
], | |
) | |
: context.formatString( | |
AppLocale | |
.promo_diskon_senilai, | |
[]) + | |
' ${Helpers.formatRupiah(maxVoucher.amount.toString())}', | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 13, | |
fontWeight: FontWeight.w400, | |
color: Color(0xFF1885D4), | |
), | |
), | |
SizedBox(width: 4), | |
Image.asset( | |
'assets/images/ver3/arrow-right-blue.png', | |
height: 14, | |
width: 14, | |
), | |
], | |
), | |
)), | |
), | |
Container( | |
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 16), | |
child: Row( | |
children: [ | |
Expanded( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.mulaiDari, | |
[], | |
), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 12, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500, | |
color: ColorBase.black60)), | |
SizedBox(height: 2), | |
Row( | |
children: [ | |
Text( | |
'Rp${Helpers.formatRupiah(basePrice.toString())}', | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 18, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500, | |
color: ColorBase.primaryBlack)), | |
], | |
), | |
], | |
), | |
), | |
SizedBox(width: 8), | |
// booking button | |
Container( | |
width: screenWidth * 0.4, | |
child: GestureDetector( | |
onTap: () async { | |
if (category.length == 1) { | |
int result = await _checkPickedSport(category[0]); | |
if (result == 0) { | |
chooseField(category[0]); | |
} else {} | |
} else { | |
_sportSelectorModal( | |
context, screenWidth, screenHeight, category); | |
} | |
}, | |
child: Container( | |
height: 38, | |
decoration: BoxDecoration( | |
color: ColorBase.primaryBlack, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: Center( | |
child: Text( | |
context.formatString( | |
AppLocale.pilih_jadwal, | |
[], | |
), | |
style: TextStyle( | |
fontSize: ScreenUtil().scaleText * 14, | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w500, | |
color: ColorBase.primaryWhite)), | |
), | |
), | |
), | |
), | |
], | |
)) | |
]), | |
); | |
} | |
Widget _buildBottomBarWidgetLoading() { | |
return Container( | |
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 16), | |
width: double.infinity, | |
decoration: BoxDecoration( | |
color: Colors.white, | |
boxShadow: [ | |
BoxShadow( | |
color: Colors.black26, | |
blurRadius: 0.7, // soften the shadow | |
offset: Offset( | |
0.0, // Move to right 10 horizontally | |
-1.0, // Move to bottom 5 Vertically | |
), | |
) | |
], | |
), | |
child: Row(children: [ | |
Container( | |
decoration: BoxDecoration( | |
border: Border.all(color: ColorBase.black40, width: 1), | |
borderRadius: BorderRadius.circular(8)), | |
height: 38, | |
width: 100, | |
child: Skeleton(width: 100, height: 38), | |
), | |
SizedBox(width: 56), | |
Expanded( | |
child: Skeleton(height: 38), | |
), | |
]), | |
); | |
} | |
Widget _eventParticipantAvatarItem( | |
BuildContext context, VenueEventDataNew eventData, int index) { | |
final mediaQuery = MediaQuery.of(context); | |
final screenWidth = mediaQuery.size.width; | |
int totalBorder = ((screenWidth - 64) / 40).round(); | |
int maxPlayer = eventData.maximumPlayer; | |
int maxPlayerShort = 5; | |
return Container( | |
child: Column( | |
children: [ | |
GestureDetector( | |
onTap: () {}, | |
child: Container( | |
width: screenWidth, | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.center, | |
mainAxisAlignment: MainAxisAlignment.start, | |
children: [ | |
Stack( | |
children: [ | |
Row( | |
children: [ | |
if (eventData.participantsAvatar != null) | |
for (int x = 0; | |
x < | |
((eventData.participantsAvatar.length > | |
maxPlayerShort - 1) | |
? maxPlayerShort == maxPlayer | |
? maxPlayerShort | |
: maxPlayerShort - 1 | |
: eventData.participantsAvatar.length); | |
x++) | |
Row( | |
children: [ | |
ClipOval( | |
child: (eventData.participantsAvatar[x] != | |
'' && | |
eventData.participantsAvatar[x] != | |
null) | |
? (x + 1 >= maxPlayerShort && | |
(maxPlayer - maxPlayerShort > | |
0)) | |
? ClipOval( | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/border_empty_avatar.svg', | |
height: 32, | |
width: 32, | |
)) | |
: Image( | |
image: NetworkImage( | |
BaseUrlConfig.baseAssetUrl + | |
eventData | |
.participantsAvatar[x], | |
), | |
height: 32, | |
width: 32, | |
errorBuilder: | |
(BuildContext context, | |
Object exception, | |
StackTrace stackTrace) { | |
return Image.asset( | |
'assets/images/ver3/default_user.png', | |
height: 32, | |
width: 32, | |
); | |
}, | |
) | |
: Image.asset( | |
'assets/images/ver3/default_user.png', | |
height: 32, | |
width: 32, | |
), | |
), | |
// if (x < 6) | |
SizedBox( | |
width: 8, | |
) | |
], | |
), | |
// if(maxPlayerShort==maxPlayer) | |
for (int x = 0; | |
x < | |
((eventData.participantsAvatar != null) | |
? (maxPlayerShort < maxPlayer && | |
maxPlayerShort - | |
eventData | |
.participantsAvatar | |
.length < | |
1) | |
? 1 | |
: maxPlayerShort - | |
eventData | |
.participantsAvatar.length | |
: maxPlayerShort); | |
x++) | |
Row( | |
children: [ | |
ClipOval( | |
child: SvgPicture.asset( | |
'assets/images/ver3/svg/border_empty_avatar.svg', | |
height: 32, | |
width: 32, | |
)), | |
// if (x < (((eventData.participantsAvatar != null) | |
// ? maxPlayerShort - | |
// eventData.participantsAvatar.length | |
// : maxPlayerShort)-1)) | |
SizedBox( | |
width: 8, | |
) | |
], | |
), | |
], | |
), | |
if (maxPlayer - maxPlayerShort > 0) | |
Positioned( | |
left: ((32 * (maxPlayerShort - 1)) + | |
(8 * (maxPlayerShort - 1))) | |
.toDouble(), | |
child: Container( | |
width: 32, | |
height: 32, | |
alignment: Alignment.center, | |
// constraints: | |
// BoxConstraints(maxWidth: screenWidth - 110), | |
child: Text( | |
maxPlayer - maxPlayerShort + 1 > 99 | |
? '+99' | |
: '+${(maxPlayer - maxPlayerShort) + 1}', | |
textAlign: TextAlign.center, | |
style: TextStyle( | |
color: ColorBase.black60, | |
// height: 1.4, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w500), | |
// overflow: TextOverflow.ellipsis, | |
), | |
), | |
) | |
], | |
), | |
Text('·', | |
style: TextStyle( | |
color: ColorBase.black60, | |
fontSize: ScreenUtil().scaleText * 18, | |
)), | |
SizedBox(width: 4), | |
Text( | |
' ${eventData.noOfParticipants}/${eventData.maximumPlayer}', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w500), | |
) | |
], | |
), | |
), | |
), | |
], | |
), | |
); | |
} | |
/// Category Title | |
Widget _buildCategoryTitle(String title, int index) { | |
return Padding( | |
key: jewelleryCategories[index], | |
padding: const EdgeInsets.only(top: 14, right: 12, left: 12), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
title, | |
style: const TextStyle( | |
fontSize: 19, | |
fontWeight: FontWeight.w900, | |
), | |
), | |
TextButton( | |
onPressed: () {}, | |
child: const Text( | |
'View more', | |
style: TextStyle( | |
fontSize: 13, | |
fontWeight: FontWeight.w300, | |
color: Colors.indigo), | |
), | |
), | |
], | |
), | |
const Divider(), | |
], | |
), | |
); | |
} | |
Widget _buildFacilitiesWidget( | |
{List<AditionalInformation> facilities, | |
List<AditionalInformation> descPoints, | |
bool isLoading = false}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
return Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
isLoading | |
? Container( | |
child: Column( | |
children: [ | |
Container( | |
margin: EdgeInsets.only(top: 12), | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.spaceEvenly, | |
children: [ | |
Expanded( | |
child: Row( | |
children: [ | |
Skeleton( | |
width: 50, | |
height: 24, | |
), | |
], | |
), | |
), | |
Expanded( | |
child: Row( | |
children: [ | |
Skeleton( | |
width: 50, | |
height: 24, | |
), | |
], | |
), | |
), | |
Expanded( | |
child: Row( | |
children: [ | |
Skeleton( | |
width: 50, | |
height: 24, | |
), | |
], | |
), | |
), | |
], | |
), | |
), | |
], | |
), | |
) | |
: Container( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
SizedBox(height: 20), | |
Container( | |
child: Text( | |
context.formatString(AppLocale.fasilitas, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
), | |
SizedBox(height: 12), | |
for (var i = 0; | |
i < | |
(facilities.length > 10 | |
? 10 | |
: facilities.length); | |
i += 2) | |
Container( | |
margin: EdgeInsets.only(top: (i == 0 ? 0 : 12)), | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceEvenly, | |
children: [ | |
Container( | |
width: (screenWidth - 48) / 2 - 12, | |
child: Row( | |
children: [ | |
CachedNetworkImage( | |
imageUrl: BaseUrlConfig.baseAssetUrl + | |
facilities[i].image, | |
width: 20, | |
height: 20, | |
fit: BoxFit.scaleDown, | |
progressIndicatorBuilder: (context, | |
url, downloadProgress) => | |
CircularProgressIndicator( | |
value: downloadProgress | |
.progress), | |
errorWidget: (context, url, error) => | |
Image.asset( | |
'assets/icons/image-broken.png', | |
height: 20, | |
width: 20, | |
), | |
), | |
SizedBox(width: 8), | |
Container( | |
width: (screenWidth - 48) / 2 - 44, | |
child: Text( | |
facilities[i].title, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
), | |
overflow: TextOverflow.ellipsis, | |
), | |
), | |
], | |
), | |
), | |
Container( | |
width: (screenWidth - 48) / 2 - 12, | |
child: (i + 1 < facilities.length) | |
? Row( | |
children: [ | |
CachedNetworkImage( | |
imageUrl: | |
BaseUrlConfig.baseAssetUrl + | |
facilities[i + 1].image, | |
width: 20, | |
height: 20, | |
fit: BoxFit.scaleDown, | |
progressIndicatorBuilder: | |
(context, url, | |
downloadProgress) => | |
CircularProgressIndicator( | |
value: | |
downloadProgress | |
.progress), | |
errorWidget: | |
(context, url, error) => | |
Image.asset( | |
'assets/icons/image-broken.png', | |
height: 20, | |
width: 20, | |
), | |
), | |
SizedBox(width: 8), | |
Container( | |
width: | |
(screenWidth - 48) / 2 - 44, | |
child: Text( | |
facilities[i + 1].title, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
14, | |
), | |
overflow: | |
TextOverflow.ellipsis, | |
), | |
), | |
], | |
) | |
: SizedBox(width: 0), | |
), | |
], | |
), | |
), | |
if (facilities.length > 10) | |
GestureDetector( | |
onTap: () { | |
_summaryModal(context, screenWidth, facilities); | |
}, | |
child: Container( | |
height: 40, | |
margin: EdgeInsets.only(top: 20), | |
decoration: BoxDecoration( | |
color: Colors.white, | |
borderRadius: BorderRadius.circular(12), | |
border: Border.all( | |
color: ColorBase.black10, width: 1), | |
), | |
child: Center( | |
child: Text( | |
context.formatString( | |
AppLocale.lihat_semua_fasilitas, | |
[facilities.length]), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
), | |
), | |
), | |
if (descPoints.length > 0) | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 12), | |
child: Divider(color: ColorBase.black10), | |
), | |
if (descPoints.length > 0) | |
Text( | |
context.formatString(AppLocale.deskripsi, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
if (descPoints.length > 0) SizedBox(height: 8), | |
if (descPoints.length > 0) | |
Text( | |
_getVenueDescriptions(descPoints), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
], | |
), | |
), | |
], | |
), | |
), | |
], | |
); | |
} | |
VoidCallback updateSport(List<String> newSelectedSport, bool isMyPref, | |
bool isAllSport, List<int> newSelectedSportId, BuildContext context) { | |
setState(() { | |
myPref = isMyPref; | |
allSport = isAllSport; | |
sportCategoryName = newSelectedSport; | |
// sports.clear(); | |
sports = newSelectedSportId; | |
if (activeTab == 'komunitas') { | |
communitiesBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchCommunities( | |
widget.venueId, | |
0, | |
10, | |
sportCategoryName, | |
sortCommunity, | |
widget.context, | |
)); | |
} | |
if (activeTab == 'coach') { | |
coachVenuesBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchCoachVenues( | |
widget.venueId, | |
0, | |
10, | |
sports, | |
widget.context, | |
)); | |
} | |
countTotalFilter(); | |
}); | |
return null; | |
} | |
void actionFilterMembership() { | |
if (activeTab == 'membership') { | |
membershipVenuesBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchMembershipVenues( | |
widget.context, widget.venueId, 0, 10, membershipTypes)); | |
} | |
} | |
void countTotalFilter() { | |
setState(() { | |
totalFilter = 0; | |
newSportFilter = 0; | |
newSportFilter += sportCategoryName.length; | |
}); | |
} | |
Widget _emptyState() { | |
double screenWidth = MediaQuery.of(context).size.width; | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
return Container( | |
width: screenWidth, | |
height: screenHeight, | |
child: Column(children: [ | |
SizedBox(height: MediaQuery.of(context).size.height * 0.1), | |
Image( | |
image: AssetImage('assets/images/ver3/empty_search.png'), | |
height: ScreenUtil().scaleText * 72, | |
fit: BoxFit.fitHeight, | |
), | |
SizedBox( | |
height: 16, | |
), | |
Text( | |
context.formatString(AppLocale.dataTidakDitemukan, []), | |
style: TextStyle( | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 16, | |
fontFamily: 'Rubik', | |
color: ColorBase.black100, | |
), | |
), | |
]), | |
); | |
} | |
void _facilitiesBottomSheet(context, List<AditionalInformation> facilities) { | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
double screenWidth = MediaQuery.of(context).size.width; | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
padding: EdgeInsets.fromLTRB(24, 8, 24, 24), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
SizedBox(height: 24), | |
Text( | |
context.formatString(AppLocale.fasilitas, []), | |
style: TextFontConst.RUBIK_MEDIUM_18, | |
), | |
SizedBox(height: 24), | |
Container( | |
constraints: BoxConstraints(maxHeight: screenHeight * 0.8), | |
child: SingleChildScrollView( | |
child: Column( | |
mainAxisSize: MainAxisSize.min, | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
for (var i = 0; i < facilities.length; i += 2) | |
Container( | |
margin: EdgeInsets.only(top: (i == 0 ? 0 : 12)), | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.spaceEvenly, | |
children: [ | |
Container( | |
width: (screenWidth - 48) / 2 - 12, | |
child: Row( | |
children: [ | |
CachedNetworkImage( | |
imageUrl: BaseUrlConfig.baseAssetUrl + | |
facilities[i].image, | |
width: 24, | |
height: 24, | |
fit: BoxFit.scaleDown, | |
progressIndicatorBuilder: (context, url, | |
downloadProgress) => | |
CircularProgressIndicator( | |
value: | |
downloadProgress.progress), | |
errorWidget: (context, url, error) => | |
Image.asset( | |
'assets/icons/image-broken.png', | |
height: 24, | |
width: 24, | |
), | |
), | |
SizedBox(width: 8), | |
Container( | |
width: (screenWidth - 48) / 2 - 44, | |
child: Text( | |
facilities[i].title, | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
), | |
overflow: TextOverflow.ellipsis, | |
), | |
), | |
], | |
), | |
), | |
Container( | |
width: (screenWidth - 48) / 2 - 12, | |
child: (i + 1 < facilities.length) | |
? Row( | |
children: [ | |
CachedNetworkImage( | |
imageUrl: | |
BaseUrlConfig.baseAssetUrl + | |
facilities[i + 1].image, | |
width: 24, | |
height: 24, | |
fit: BoxFit.scaleDown, | |
progressIndicatorBuilder: | |
(context, url, | |
downloadProgress) => | |
CircularProgressIndicator( | |
value: | |
downloadProgress | |
.progress), | |
errorWidget: | |
(context, url, error) => | |
Image.asset( | |
'assets/icons/image-broken.png', | |
height: 24, | |
width: 24, | |
), | |
), | |
SizedBox(width: 8), | |
Container( | |
width: | |
(screenWidth - 48) / 2 - 44, | |
child: Text( | |
facilities[i + 1].title, | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
14, | |
), | |
overflow: TextOverflow.ellipsis, | |
), | |
), | |
], | |
) | |
: SizedBox(width: 0), | |
), | |
], | |
), | |
), | |
], | |
), | |
), | |
) | |
], | |
), | |
); | |
}); | |
}, | |
); | |
} | |
void _sportsBottomSheet(context) { | |
double screenHeight = MediaQuery.of(context).size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
double screenWidth = MediaQuery.of(context).size.width; | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
padding: EdgeInsets.fromLTRB(24, 8, 24, 24), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
SizedBox(height: 24), | |
Text( | |
context.formatString( | |
AppLocale.pilihCabangOlahraga, | |
[], | |
), | |
style: TextFontConst.RUBIK_MEDIUM_18, | |
), | |
SizedBox(height: 24), | |
Container( | |
constraints: BoxConstraints(maxHeight: screenHeight * 0.8), | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
constraints: | |
BoxConstraints(maxHeight: screenHeight * 3 / 4), | |
width: screenWidth, | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
GestureDetector( | |
onTap: () { | |
modalSetState( | |
() {}, | |
); | |
}, | |
child: Container( | |
width: screenWidth, | |
color: Colors.transparent, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Row( | |
children: [ | |
Container( | |
height: 24, | |
width: 24, | |
child: CachedNetworkImage( | |
imageUrl: BaseUrlConfig | |
.baseAssetUrl + | |
'assets/img/football.png', | |
fit: BoxFit.contain, | |
progressIndicatorBuilder: | |
(context, url, | |
downloadProgress) => | |
Skeleton(), | |
errorWidget: | |
(context, url, error) => | |
Image.asset( | |
'assets/icons/image-broken.png', | |
height: 16, | |
width: 16, | |
fit: BoxFit.contain, | |
), | |
), | |
), | |
SizedBox( | |
width: 8, | |
), | |
Text( | |
"Sepak Bola", | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
height: 1.4, | |
fontSize: | |
ScreenUtil().scaleText * | |
16, | |
), | |
), | |
], | |
), | |
Container( | |
height: 20, | |
width: 20, | |
child: Image.asset( | |
'assets/images/radio-black.png', | |
fit: BoxFit.contain, | |
)), | |
], | |
), | |
), | |
), | |
Padding( | |
padding: | |
EdgeInsets.symmetric(vertical: 14), | |
child: Divider(color: ColorBase.black10), | |
), | |
], | |
), | |
], | |
), | |
), | |
), | |
], | |
), | |
), | |
), | |
SizedBox(height: 28), | |
Divider( | |
color: ColorBase.black10, | |
), | |
Padding( | |
padding: const EdgeInsets.all(0.0), | |
child: Container( | |
width: screenWidth - 16 * 2, | |
height: 44, | |
decoration: BoxDecoration( | |
border: Border.all(color: ColorBase.primaryRed), | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: TextButton( | |
onPressed: () async { | |
_sharedPreferencesManager.putBool( | |
'is_new_select_schedule', true); | |
Navigator.of(context).pushNamed( | |
NewChooseScheduleScreen.routeName, | |
arguments: { | |
'venue_id': widget.venueId, | |
'field_id': 222, | |
'integration_type': widget.integrationType, | |
}); | |
}, | |
child: Text( | |
context.formatString( | |
AppLocale.terapkan, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.primaryWhite, | |
fontWeight: FontWeight.w500, | |
height: 1.4, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
textAlign: TextAlign.center, | |
), | |
), | |
), | |
), | |
], | |
), | |
); | |
}); | |
}, | |
); | |
} | |
Widget _buildTimeWidget( | |
{List<OperationTime> operationTimes, bool isLoading = false}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
return Container( | |
padding: EdgeInsets.symmetric(vertical: 14, horizontal: 18), | |
margin: EdgeInsets.only(left: 16, right: 16), | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
color: Colors.white, | |
boxShadow: [ | |
BoxShadow( | |
color: Color.fromRGBO(0, 0, 0, 0.07), | |
offset: Offset(0.0, 3.0), | |
blurRadius: 7.0, | |
), | |
], | |
), | |
child: isLoading | |
? Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
children: [ | |
Skeleton(width: 14, height: 14, marginRight: 10), | |
Skeleton(width: 50, height: 16, marginRight: 10), | |
Spacer(), | |
Skeleton(width: 75, height: 16, marginRight: 10), | |
], | |
), | |
], | |
) | |
: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
_venueTimeExpand = !_venueTimeExpand; | |
}); | |
}, | |
child: (!_venueTimeExpand && currentDayOperationTime != null) | |
? Container( | |
color: Colors.transparent, | |
child: Row( | |
crossAxisAlignment: | |
(currentDayOperationTime.specialDay != '') | |
? CrossAxisAlignment.start | |
: CrossAxisAlignment.center, | |
children: [ | |
SvgPicture.asset('assets/icons/clock.svg'), | |
SizedBox(width: 10), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
if (currentDayOperationTime.specialDay != '') | |
SizedBox(height: 4), | |
Text( | |
currentDayOperationTime.day, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
if (currentDayOperationTime.specialDay != '') | |
SizedBox(height: 4), | |
if (currentDayOperationTime.specialDay != '') | |
Container( | |
width: (screenWidth - 32) / 2 - 8 - 30, | |
child: Text( | |
currentDayOperationTime.specialDay, | |
style: TextStyle( | |
color: ColorBase.secondaryRed, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
), | |
overflow: TextOverflow.ellipsis, | |
maxLines: 2, | |
), | |
), | |
], | |
), | |
Spacer(), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
if (currentDayOperationTime.specialDay != '') | |
SizedBox(height: 4), | |
Text( | |
(currentDayOperationTime.status == | |
'active' && | |
currentDayOperationTime.startTime != | |
null && | |
currentDayOperationTime.endTime != | |
null) | |
? '${currentDayOperationTime.startTime.substring(0, 5)} - ${currentDayOperationTime.endTime.substring(0, 5)}' | |
: context | |
.formatString(AppLocale.tutup, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
// if (currentDayOperationTime.specialDay != '') | |
// SizedBox(height: 4), | |
// if (currentDayOperationTime.specialDay != '') | |
// Container( | |
// width: | |
// (screenWidth - 32) / 2 - 8 - 44 - 12, | |
// child: Text( | |
// 'Jam operasional mungkin berbeda', | |
// style: TextStyle( | |
// color: ColorBase.secondaryRed, | |
// fontFamily: 'Rubik', | |
// fontSize: ScreenUtil().scaleText* 12, | |
// ), | |
// overflow: TextOverflow.ellipsis, | |
// maxLines: 2, | |
// textAlign: TextAlign.right, | |
// ), | |
// ), | |
], | |
), | |
SizedBox(width: 12), | |
Icon( | |
Icons.keyboard_arrow_down_rounded, | |
color: ColorBase.primaryRed, | |
), | |
], | |
), | |
) | |
: Container( | |
color: Colors.transparent, | |
child: Row( | |
crossAxisAlignment: | |
(operationTimes[0].specialDay != '') | |
? CrossAxisAlignment.start | |
: CrossAxisAlignment.center, | |
children: [ | |
SvgPicture.asset('assets/icons/clock.svg'), | |
SizedBox(width: 10), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
if (operationTimes[0].specialDay != '') | |
SizedBox(height: 4), | |
Text( | |
operationTimes[0].day, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
if (operationTimes[0].specialDay != '') | |
SizedBox(height: 4), | |
if (operationTimes[0].specialDay != '') | |
Container( | |
width: (screenWidth - 32) / 2 - 8 - 30, | |
child: Text( | |
operationTimes[0].specialDay, | |
style: TextStyle( | |
color: ColorBase.secondaryRed, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
), | |
overflow: TextOverflow.ellipsis, | |
maxLines: 2, | |
), | |
), | |
], | |
), | |
Spacer(), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
if (operationTimes[0].specialDay != '') | |
SizedBox(height: 4), | |
Text( | |
(operationTimes[0].status == 'active' && | |
operationTimes[0].startTime != | |
null && | |
operationTimes[0].endTime != null) | |
? '${operationTimes[0].startTime.substring(0, 5)} - ${operationTimes[0].endTime.substring(0, 5)}' | |
: context | |
.formatString(AppLocale.tutup, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
// if (operationTimes[0].specialDay != '') | |
// SizedBox(height: 4), | |
// if (operationTimes[0].specialDay != '') | |
// Container( | |
// width: | |
// (screenWidth - 32) / 2 - 8 - 44 - 12, | |
// child: Text( | |
// 'Jam operasional mungkin berbeda', | |
// style: TextStyle( | |
// color: ColorBase.secondaryRed, | |
// fontFamily: 'Rubik', | |
// fontSize: ScreenUtil().scaleText* 12, | |
// ), | |
// overflow: TextOverflow.ellipsis, | |
// maxLines: 2, | |
// textAlign: TextAlign.right, | |
// ), | |
// ), | |
], | |
), | |
SizedBox(width: 12), | |
Icon( | |
Icons.keyboard_arrow_down_rounded, | |
color: ColorBase.primaryRed, | |
), | |
], | |
), | |
), | |
), | |
if (operationTimes.length > 1 && _venueTimeExpand) | |
Column( | |
children: [ | |
SizedBox(height: 8), | |
for (var i = 1; i < operationTimes.length; i++) | |
if (operationTimes[i].day != null) | |
Container( | |
margin: EdgeInsets.only( | |
bottom: i < operationTimes.length - 1 ? 12 : 0), | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
SizedBox(width: 30), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
operationTimes[i].day, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
if (operationTimes[i].specialDay != '') | |
SizedBox(height: 4), | |
if (operationTimes[i].specialDay != '') | |
Container( | |
width: (screenWidth - 32) / 2 - 8 - 30, | |
child: Text( | |
operationTimes[i].specialDay, | |
style: TextStyle( | |
color: ColorBase.secondaryRed, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
), | |
overflow: TextOverflow.ellipsis, | |
maxLines: 2, | |
), | |
), | |
], | |
), | |
Spacer(), | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.end, | |
children: [ | |
Text( | |
(operationTimes[i].status == 'active' && | |
operationTimes[i].startTime != | |
null && | |
operationTimes[i].endTime != null) | |
? '${operationTimes[i].startTime.substring(0, 5)} - ${operationTimes[i].endTime.substring(0, 5)}' | |
: context.formatString( | |
AppLocale.tutup, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
// if (operationTimes[i].specialDay != '') | |
// SizedBox(height: 4), | |
// if (operationTimes[i].specialDay != '') | |
// Container( | |
// width: (screenWidth - 32) / 2 - | |
// 8 - | |
// 44 - | |
// 12, | |
// child: Text( | |
// 'Jam operasional mungkin berbeda', | |
// style: TextStyle( | |
// color: ColorBase.secondaryRed, | |
// fontFamily: 'Rubik', | |
// fontSize: ScreenUtil().scaleText* 12, | |
// ), | |
// overflow: TextOverflow.ellipsis, | |
// maxLines: 2, | |
// textAlign: TextAlign.right, | |
// ), | |
// ), | |
], | |
), | |
SizedBox(width: 32), | |
], | |
), | |
), | |
], | |
), | |
], | |
), | |
); | |
} | |
Widget _membership(BuildContext context, screenHeight, screenWidth) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
int x = 0; | |
int y = 0; | |
for (var i = 0; i < memberships.length; i++) { | |
if (memberships[i].type == package[0] && y < 2) { | |
x = i; | |
y++; | |
} | |
} | |
return Container( | |
width: screenWidth - 32, | |
padding: EdgeInsets.symmetric(vertical: 14, horizontal: 18), | |
margin: EdgeInsets.only(left: 16, right: 16), | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
color: Colors.white, | |
boxShadow: [ | |
BoxShadow( | |
color: Color.fromRGBO(0, 0, 0, 0.07), | |
offset: Offset(0.0, 3.0), | |
blurRadius: 7.0, | |
), | |
], | |
), | |
child: isLoading | |
? Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Skeleton(width: 120, height: 16), | |
SizedBox(height: 12), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Skeleton(width: 90, height: 14), | |
Skeleton(width: 90, height: 14), | |
], | |
), | |
], | |
) | |
: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
children: [ | |
Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver2/arrow.png', | |
fit: BoxFit.contain, | |
), | |
), | |
SizedBox( | |
width: 8, | |
), | |
Text( | |
context.formatString(AppLocale.paketMembership, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
), | |
SizedBox(height: 12), | |
Row( | |
children: [ | |
if (isLanggananPackageExist) ...[ | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
package.clear(); | |
package.add('langganan'); | |
}); | |
}, | |
child: Container( | |
decoration: BoxDecoration( | |
border: Border.all( | |
color: (package[0] == 'langganan') | |
? ColorBase.primaryRed | |
: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1), | |
borderRadius: BorderRadius.circular(4)), | |
padding: | |
EdgeInsets.symmetric(vertical: 7, horizontal: 8), | |
child: Row( | |
children: [ | |
if (package[0] == 'langganan') | |
Row( | |
children: [ | |
Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver2/status-indicator-red.png', | |
fit: BoxFit.contain, | |
), | |
), | |
SizedBox( | |
width: 8, | |
), | |
], | |
), | |
Text( | |
context.formatString(AppLocale.langganan, []), | |
style: TextStyle( | |
color: (package[0] == 'langganan') | |
? ColorBase.primaryRed | |
: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
), | |
) | |
], | |
), | |
), | |
), | |
SizedBox( | |
width: 6, | |
), | |
], | |
if (isBundlingPackageExist) ...[ | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
package.clear(); | |
package.add('bundling'); | |
}); | |
}, | |
child: Container( | |
decoration: BoxDecoration( | |
border: Border.all( | |
color: (package[0] == 'bundling') | |
? ColorBase.primaryRed | |
: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1), | |
borderRadius: BorderRadius.circular(4)), | |
padding: | |
EdgeInsets.symmetric(vertical: 7, horizontal: 8), | |
child: Row( | |
children: [ | |
if (package[0] == 'bundling') | |
Row( | |
children: [ | |
Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver2/status-indicator-red.png', | |
fit: BoxFit.contain, | |
), | |
), | |
SizedBox( | |
width: 8, | |
), | |
], | |
), | |
Text( | |
'Bundling', | |
style: TextStyle( | |
color: (package[0] == 'bundling') | |
? ColorBase.primaryRed | |
: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
), | |
) | |
], | |
), | |
), | |
) | |
] | |
], | |
), | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 12), | |
child: DottedLine(dashColor: ColorBase.black10), | |
), | |
for (var i = 0; i < memberships.length; i++) | |
if (memberships[i].type == package[0] && i <= x) | |
Container( | |
margin: EdgeInsets.only(bottom: 12), | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
style: BorderStyle.solid, | |
width: 1)), | |
padding: EdgeInsets.only( | |
top: 12, left: 14, right: 14, bottom: 14), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
memberships[i].name, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
Text( | |
memberships[i].type == 'langganan' | |
? '· ' + | |
context.formatString(AppLocale.langganan, | |
[memberships[i].minSlot.toString()]) + | |
' ' + | |
context.formatString( | |
AppLocale.slot_per_minggu, []) | |
: '· ' + | |
context.formatString( | |
AppLocale.paket_pembelian, | |
[memberships[i].minSlot.toString()]) + | |
' ' + | |
context.formatString( | |
AppLocale.jadwal_sekaligus, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
Text( | |
memberships[i].type == 'langganan' | |
? '· ' + | |
context.formatString( | |
AppLocale.perpanjang_setiap, []) + | |
' ' + | |
(memberships[i].slotCycle / 30) | |
.round() | |
.toString() + | |
' ' + | |
context.formatString(AppLocale.bulan, []) | |
: ' ', | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w400, | |
height: 1.4), | |
), | |
SizedBox(height: 6), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.end, | |
children: [ | |
if (memberships[i].discountAmount > 0) | |
Container( | |
height: 12, | |
width: 12, | |
child: Image.asset( | |
'assets/images/ver2/fire.png', | |
fit: BoxFit.contain, | |
), | |
), | |
if (memberships[i].discountAmount > 0) | |
SizedBox(width: 2), | |
if (memberships[i].discountAmount > 0) | |
Text( | |
memberships[i].discountType == 'percentage' | |
? context.formatString( | |
AppLocale.diskon, []) + | |
' ' + | |
memberships[i] | |
.discountAmount | |
.toString() + | |
'%' | |
: context.formatString( | |
AppLocale.diskon, []) + | |
' Rp ' + | |
Helpers.formatRupiah(memberships[i] | |
.discountAmount | |
.toString()) | |
.toString(), | |
style: TextStyle( | |
color: ColorBase.secondaryRed, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 11, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
SizedBox(width: 6), | |
GestureDetector( | |
onTap: () { | |
LoadingDialogWidget.show(context); | |
venueMembershipTncRepository | |
.membershipTnc( | |
context, | |
venueId: widget.venueId, | |
membershipId: memberships[i].id, | |
) | |
.then((val) { | |
LoadingDialogWidget.hide(context); | |
setState(() { | |
_membershipTnCModal( | |
context, | |
screenWidth, | |
screenHeight, | |
memberships[x], | |
memberships[i].id, | |
memberships[i] | |
.activeFields[0] | |
.fieldId, | |
memberships[i].type, | |
memberships[i].name, | |
val.data.tncs, | |
val.data.packageName, | |
memberships[i].slotRule); | |
}); | |
}); | |
}, | |
child: Container( | |
padding: EdgeInsets.symmetric( | |
horizontal: 8, vertical: 4), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(4), | |
border: Border.all( | |
color: ColorBase.primaryRed, | |
style: BorderStyle.solid, | |
width: 1)), | |
child: Text( | |
context | |
.formatString(AppLocale.beliPaket, []), | |
style: TextStyle( | |
color: ColorBase.primaryWhite, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
), | |
), | |
), | |
], | |
) | |
], | |
), | |
), | |
SizedBox(height: 4), | |
GestureDetector( | |
onTap: () { | |
Navigator.of(context).pushNamed( | |
MembershipPackageScreen.routeName, | |
arguments: { | |
// 'venue_id': otherVenueList[i].id | |
'type': package[0], | |
'venue_id': widget.venueId, | |
'integration_type': widget.integrationType, | |
}); | |
}, | |
child: Container( | |
height: 40, | |
width: screenWidth - 64, | |
alignment: Alignment.center, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all( | |
color: ColorBase.black10, | |
width: 1, | |
style: BorderStyle.solid), | |
color: Colors.white, | |
), | |
child: Text( | |
context.formatString(AppLocale.lihat_semua_paket, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
height: 1.4), | |
textAlign: TextAlign.center, | |
), | |
), | |
) | |
], | |
), | |
); | |
} | |
Widget _buildGroupedTimeWidget({bool isLoading = false}) { | |
double screenWidth = MediaQuery.of(context).size.width; | |
return Container( | |
width: screenWidth - 32, | |
padding: EdgeInsets.symmetric(vertical: 14, horizontal: 18), | |
margin: EdgeInsets.only(left: 16, right: 16), | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(8), | |
color: Colors.white, | |
boxShadow: [ | |
BoxShadow( | |
color: Color.fromRGBO(0, 0, 0, 0.07), | |
offset: Offset(0.0, 3.0), | |
blurRadius: 7.0, | |
), | |
], | |
), | |
child: isLoading | |
? Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Skeleton(width: 120, height: 16), | |
SizedBox(height: 12), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Skeleton(width: 90, height: 14), | |
Skeleton(width: 90, height: 14), | |
], | |
), | |
], | |
) | |
: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString(AppLocale.jam_operasional, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
SizedBox(height: 12), | |
for (var i = 0; i < groupedOperationTimes.length; i++) | |
Container( | |
padding: EdgeInsets.only( | |
bottom: i < groupedOperationTimes.length - 1 ? 6 : 0), | |
child: Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
(groupedOperationTimes[i]['days'].length == 1) | |
? groupedOperationTimes[i]['days'][0] | |
: (groupedOperationTimes[i]['days'].length == 2) | |
? '${groupedOperationTimes[i]['days'][0]} & ${groupedOperationTimes[i]['days'][1]}' | |
: '${groupedOperationTimes[i]['days'][0]} - ${groupedOperationTimes[i]['days'][groupedOperationTimes[i]['days'].length - 1]}', | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
Text( | |
groupedOperationTimes[i]['hours'], | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
], | |
), | |
), | |
], | |
), | |
); | |
} | |
void _summaryModal( | |
context, double screenWidth, List<AditionalInformation> facilities) { | |
MediaQueryData queryData = MediaQuery.of(context); | |
double screenHeight = queryData.size.height - | |
AppBar().preferredSize.height - | |
MediaQuery.of(context).padding.top; | |
final modalHeight = queryData.size.height - | |
AppBar().preferredSize.height - | |
queryData.padding.top; | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
Container( | |
constraints: | |
BoxConstraints(maxHeight: modalHeight - 100), | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Padding( | |
padding: EdgeInsets.only( | |
left: 24, | |
right: 24, | |
bottom: MediaQuery.of(context) | |
.padding | |
.bottom), | |
child: Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.fasilitas, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
Container( | |
width: screenWidth - 32, | |
child: Padding( | |
padding: EdgeInsets.symmetric( | |
vertical: 12), | |
child: DottedLine( | |
dashColor: ColorBase.black10), | |
), | |
), | |
Container( | |
constraints: BoxConstraints( | |
maxHeight: screenHeight * 0.8), | |
child: SingleChildScrollView( | |
child: Column( | |
mainAxisSize: MainAxisSize.min, | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
for (var i = 0; | |
i < facilities.length; | |
i += 2) | |
Container( | |
margin: EdgeInsets.only( | |
top: (i == 0 ? 0 : 12)), | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.start, | |
children: [ | |
Container( | |
width: | |
(screenWidth - 48) / | |
2 - | |
12, | |
child: Row( | |
children: [ | |
CachedNetworkImage( | |
imageUrl: BaseUrlConfig | |
.baseAssetUrl + | |
facilities[i] | |
.image, | |
width: 20, | |
height: 20, | |
fit: BoxFit | |
.scaleDown, | |
progressIndicatorBuilder: (context, | |
url, | |
downloadProgress) => | |
CircularProgressIndicator( | |
value: downloadProgress | |
.progress), | |
errorWidget: (context, | |
url, | |
error) => | |
Image.asset( | |
'assets/icons/image-broken.png', | |
height: 20, | |
width: 20, | |
), | |
), | |
SizedBox(width: 8), | |
Container( | |
width: (screenWidth - | |
48) / | |
2 - | |
44, | |
child: Text( | |
facilities[i] | |
.title, | |
style: | |
TextStyle( | |
color: ColorBase | |
.black100, | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
), | |
overflow: | |
TextOverflow | |
.ellipsis, | |
), | |
), | |
], | |
), | |
), | |
Container( | |
width: | |
(screenWidth - 48) / | |
2 - | |
12, | |
child: | |
(i + 1 < | |
facilities | |
.length) | |
? Row( | |
children: [ | |
CachedNetworkImage( | |
imageUrl: | |
BaseUrlConfig.baseAssetUrl + | |
facilities[i + 1].image, | |
width: | |
20, | |
height: | |
20, | |
fit: BoxFit | |
.scaleDown, | |
progressIndicatorBuilder: (context, | |
url, | |
downloadProgress) => | |
CircularProgressIndicator(value: downloadProgress.progress), | |
errorWidget: (context, | |
url, | |
error) => | |
Image.asset( | |
'assets/icons/image-broken.png', | |
height: | |
20, | |
width: | |
20, | |
), | |
), | |
SizedBox( | |
width: | |
8), | |
Container( | |
width: (screenWidth - 48) / | |
2 - | |
44, | |
child: | |
Text( | |
facilities[i + 1] | |
.title, | |
style: | |
TextStyle( | |
color: | |
ColorBase.black100, | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 12, | |
), | |
overflow: | |
TextOverflow.ellipsis, | |
), | |
), | |
], | |
) | |
: SizedBox( | |
width: 0), | |
), | |
], | |
), | |
), | |
], | |
), | |
), | |
), | |
SizedBox(height: 16), | |
], | |
), | |
), | |
]), | |
), | |
), | |
], | |
), | |
), | |
); | |
}, | |
); | |
}); | |
} | |
void filterActivityModal(context, double modalHeight) { | |
showModalBottomSheet( | |
backgroundColor: Colors.white, | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
constraints: BoxConstraints( | |
maxHeight: | |
MediaQuery.of(context).size.height * 0.8, // 80% max height | |
), | |
padding: EdgeInsets.only( | |
bottom: MediaQuery.of(context).viewInsets.bottom), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
Padding( | |
padding: | |
EdgeInsets.symmetric(horizontal: horizontalPadding), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.filter, | |
[], | |
), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
color: ColorBase.black100, | |
), | |
), | |
GestureDetector( | |
onTap: () { | |
setState(() { | |
categoryName = []; | |
filterCoaching = false; | |
filterBookedViaAyo = false; | |
filterSuperhost = false; | |
filterOfficialByVenue = false; | |
selectedLevelList = []; | |
timeFilterSelected = []; | |
selectedTimeStart = '00:00'; | |
selectedTimeEnd = '23:00'; | |
integerSelectedTimeList = | |
SfRangeValues(0, 23); | |
finalTimeList = SfRangeValues(0, 23); | |
filterStartTime = 0; | |
filterEndTime = 23; | |
selectedLevel = 'Semua Level'; | |
integerSelectedLevelList = | |
SfRangeValues(0, 4); | |
finalLevelList = SfRangeValues(0, 4); | |
startLevel = 0; | |
endLevel = 4; | |
}); | |
_loadActivity(); | |
Navigator.pop(context, null); | |
}, | |
child: Text( | |
context.formatString( | |
AppLocale.reset, | |
[], | |
), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
color: (categoryName.length > 0 || | |
filterCoaching || | |
filterBookedViaAyo || | |
filterSuperhost || | |
filterOfficialByVenue || | |
selectedLevelList.length > 0 || | |
timeFilterSelected.length > 0) | |
? ColorBase.primaryRed | |
: ColorBase.black60, | |
), | |
), | |
), | |
], | |
), | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 16), | |
child: DottedLine(dashColor: ColorBase.black10), | |
), | |
Container( | |
constraints: BoxConstraints( | |
maxHeight: | |
MediaQuery.of(context).size.height * 0.6), | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString(AppLocale.olahraga, []), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox(height: 8), | |
Wrap( | |
spacing: 0, | |
children: [ | |
for (var x = 0; | |
x < categoryActivityDatas.length; | |
x++) | |
GestureDetector( | |
onTap: () { | |
modalSetState( | |
() { | |
if (categoryName.contains( | |
categoryActivityDatas[x] | |
.name)) { | |
categoryName.remove( | |
categoryActivityDatas[x] | |
.name); | |
} else { | |
categoryName.add( | |
categoryActivityDatas[x] | |
.name); | |
} | |
if (categoryId.contains( | |
categoryActivityDatas[x] | |
.id)) { | |
categoryId.remove( | |
categoryActivityDatas[x] | |
.id); | |
} else { | |
categoryId.add( | |
categoryActivityDatas[x] | |
.id); | |
} | |
}, | |
); | |
}, | |
child: Container( | |
margin: EdgeInsets.only( | |
right: 8, bottom: 8), | |
padding: EdgeInsets.only( | |
left: 12, | |
right: 10, | |
top: 6, | |
bottom: 6), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius.circular(8), | |
color: categoryName.contains( | |
categoryActivityDatas[x] | |
.name) | |
? ColorBase.black10 | |
: ColorBase.primaryWhite, | |
border: Border.all( | |
color: categoryName.contains( | |
categoryActivityDatas[ | |
x] | |
.name) | |
? ColorBase.black10 | |
: ColorBase.black40)), | |
child: Row( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
Container( | |
width: 16, | |
height: 16, | |
child: SvgPicture.network( | |
'${BaseUrlConfig.baseAssetUrl}' + | |
categoryActivityDatas[x] | |
.svgPicture, | |
color: ColorBase.black100, | |
fit: BoxFit.contain, | |
), | |
), | |
SizedBox(width: 4), | |
Text( | |
categoryActivityDatas[x].name, | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w400, | |
fontSize: | |
ScreenUtil().scaleText * | |
14, | |
color: ColorBase.black100, | |
), | |
), | |
], | |
), | |
), | |
), | |
], | |
), | |
SizedBox(height: 20), | |
Text( | |
context | |
.formatString(AppLocale.tagAktivitas, []), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox(height: 8), | |
Wrap(spacing: 0, children: [ | |
GestureDetector( | |
onTap: () { | |
modalSetState( | |
() { | |
if (filterBookedViaAyo) { | |
filterBookedViaAyo = false; | |
} else { | |
filterBookedViaAyo = true; | |
} | |
}, | |
); | |
}, | |
child: Container( | |
margin: | |
EdgeInsets.only(right: 8, bottom: 8), | |
padding: EdgeInsets.only( | |
left: 12, | |
right: 10, | |
top: 6, | |
bottom: 6), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius.circular(8), | |
color: filterBookedViaAyo | |
? ColorBase.black10 | |
: ColorBase.primaryWhite, | |
border: Border.all( | |
color: filterBookedViaAyo | |
? ColorBase.black10 | |
: ColorBase.black40)), | |
child: Row( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
Image.asset( | |
'assets/images/ver3/ellipse-green.png', | |
height: 16, | |
width: 16, | |
), | |
SizedBox(width: 4), | |
Text( | |
'Booked via AYO', | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w400, | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
), | |
), | |
], | |
), | |
), | |
), | |
SizedBox(width: 6), | |
GestureDetector( | |
onTap: () { | |
modalSetState( | |
() { | |
if (filterOfficialByVenue) { | |
filterOfficialByVenue = false; | |
} else { | |
filterOfficialByVenue = true; | |
} | |
}, | |
); | |
}, | |
child: Container( | |
margin: | |
EdgeInsets.only(right: 8, bottom: 8), | |
padding: EdgeInsets.only( | |
left: 12, | |
right: 10, | |
top: 6, | |
bottom: 6), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius.circular(8), | |
color: filterOfficialByVenue | |
? ColorBase.black10 | |
: ColorBase.primaryWhite, | |
border: Border.all( | |
color: filterOfficialByVenue | |
? ColorBase.black10 | |
: ColorBase.black40)), | |
child: Row( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
Image.asset( | |
'assets/images/ver3/ellipse-purple.png', | |
height: 16, | |
width: 16, | |
), | |
SizedBox(width: 4), | |
Text( | |
'Official by Venue', | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w400, | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
), | |
), | |
], | |
), | |
), | |
), | |
SizedBox(width: 6), | |
GestureDetector( | |
onTap: () { | |
modalSetState( | |
() { | |
if (filterCoaching) { | |
filterCoaching = false; | |
} else { | |
filterCoaching = true; | |
} | |
}, | |
); | |
}, | |
child: Container( | |
margin: | |
EdgeInsets.only(right: 8, bottom: 8), | |
padding: EdgeInsets.only( | |
left: 12, | |
right: 10, | |
top: 6, | |
bottom: 6), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius.circular(8), | |
color: filterCoaching | |
? ColorBase.black10 | |
: ColorBase.primaryWhite, | |
border: Border.all( | |
color: filterCoaching | |
? ColorBase.black10 | |
: ColorBase.black40)), | |
child: Row( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
Image.asset( | |
'assets/images/ver3/whistle-transparent.png', | |
height: 16, | |
width: 16, | |
), | |
SizedBox(width: 4), | |
Text( | |
'Coaching', | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w400, | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
), | |
), | |
], | |
), | |
), | |
), | |
SizedBox(width: 6), | |
GestureDetector( | |
onTap: () { | |
modalSetState( | |
() { | |
if (filterSuperhost) { | |
filterSuperhost = false; | |
} else { | |
filterSuperhost = true; | |
} | |
}, | |
); | |
}, | |
child: Container( | |
margin: | |
EdgeInsets.only(right: 8, bottom: 8), | |
padding: EdgeInsets.only( | |
left: 12, | |
right: 10, | |
top: 6, | |
bottom: 6), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius.circular(8), | |
color: filterSuperhost | |
? ColorBase.black10 | |
: ColorBase.primaryWhite, | |
border: Border.all( | |
color: filterSuperhost | |
? ColorBase.black10 | |
: ColorBase.black40)), | |
child: Row( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
Image.asset( | |
'assets/images/ver3/crown-red.png', | |
height: 16, | |
width: 16, | |
), | |
SizedBox(width: 4), | |
Text( | |
'Superhost', | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontWeight: FontWeight.w400, | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
), | |
), | |
], | |
), | |
), | |
), | |
]), | |
SizedBox(height: 20), | |
Text( | |
context | |
.formatString(AppLocale.waktu_mulai, []), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox( | |
height: 8, | |
), | |
Text( | |
'$selectedTimeStart - $selectedTimeEnd', | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
), | |
), | |
SizedBox( | |
height: 8, | |
), | |
SfRangeSlider( | |
min: 0, | |
max: 23, | |
values: integerSelectedTimeList, | |
activeColor: ColorBase.black100, | |
showTicks: false, | |
showLabels: false, | |
interval: 1, | |
stepSize: 1, | |
showDividers: true, | |
enableTooltip: false, | |
dragMode: SliderDragMode.both, | |
onChanged: (value) { | |
modalSetState(() { | |
setState( | |
() { | |
finalTimeList = value; | |
filterStartTime = | |
(value.start).round(); | |
filterEndTime = (value.end).round(); | |
selectedTimeList.clear(); | |
timeFilterSelected.clear(); | |
integerSelectedTimeList = | |
SfRangeValues(filterStartTime, | |
filterEndTime); | |
for (var i = 0; | |
i < filterTimeList.length; | |
i++) { | |
filterTimeList[i]['value'] = false; | |
if (filterStartTime == | |
filterEndTime) { | |
if (i == filterEndTime + 1) { | |
filterTimeList[i]['value'] = | |
true; | |
} else { | |
filterTimeList[i]['value'] = | |
false; | |
} | |
} else { | |
filterTimeList[i]['value'] = | |
false; | |
} | |
} | |
for (var i = 0; | |
i < timeList.length; | |
i++) { | |
if (i >= filterStartTime && | |
i <= filterEndTime) { | |
selectedTimeList.add(timeList[i]); | |
} | |
} | |
for (var i = 0; | |
i < selectedTimeList.length; | |
i++) { | |
if (timeFilterSelected.contains( | |
selectedTimeList[i])) { | |
timeFilterSelected | |
.remove(selectedTimeList[i]); | |
} else { | |
timeFilterSelected | |
.add(selectedTimeList[i]); | |
} | |
selectedTimeStart = | |
timeFilterSelected[0]; | |
selectedTimeEnd = | |
timeFilterSelected[ | |
timeFilterSelected.length - | |
1]; | |
} | |
}, | |
); | |
}); | |
}, | |
inactiveColor: ColorBase.black40, | |
endThumbIcon: Container( | |
width: 24, | |
height: 24, | |
child: Image.asset( | |
'assets/images/ver3/slider-white.png', | |
fit: BoxFit.cover, | |
)), | |
startThumbIcon: Container( | |
width: 24, | |
height: 24, | |
child: Image.asset( | |
'assets/images/ver3/slider-white.png', | |
fit: BoxFit.cover, | |
)), | |
minorTicksPerInterval: 0, | |
), | |
SizedBox(height: 20), | |
Text( | |
context.formatString( | |
AppLocale.skill_level, | |
[], | |
), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox(height: 8), | |
Text( | |
'$selectedLevel', | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w400, | |
), | |
), | |
SizedBox( | |
height: 8, | |
), | |
SfRangeSlider( | |
min: 0, | |
max: 4, | |
values: integerSelectedLevelList, | |
activeColor: ColorBase.black100, | |
showTicks: false, | |
showLabels: false, | |
interval: 1, | |
stepSize: 1, | |
showDividers: true, | |
enableTooltip: false, | |
dragMode: SliderDragMode.both, | |
onChanged: (value) { | |
modalSetState(() { | |
setState( | |
() { | |
finalLevelList = value; | |
startLevel = (value.start).round(); | |
endLevel = (value.end).round(); | |
selectedLevelList.clear(); | |
integerSelectedLevelList = | |
SfRangeValues( | |
startLevel, endLevel); | |
for (var i = 0; | |
i < filterLevelList.length; | |
i++) { | |
if (startLevel == 0 && | |
endLevel == 4) { | |
filterLevelList[i]['value'] = | |
false; | |
filterLevelList[0]['value'] = | |
true; | |
} else { | |
filterLevelList[i]['value'] = | |
false; | |
if (startLevel == endLevel) { | |
if (i == endLevel + 1) { | |
filterLevelList[i]['value'] = | |
true; | |
} else { | |
filterLevelList[i]['value'] = | |
false; | |
} | |
} else { | |
filterLevelList[i]['value'] = | |
false; | |
} | |
} | |
} | |
for (var i = 0; | |
i < levelList.length; | |
i++) { | |
if (i >= startLevel && | |
i <= endLevel) { | |
selectedLevelList | |
.add(levelList[i]); | |
} | |
} | |
if (selectedLevelList.length == 5) { | |
selectedLevel = 'Semua Level'; | |
} else { | |
for (var i = 0; | |
i < selectedLevelList.length; | |
i++) { | |
if (i == 0) { | |
selectedLevel = | |
selectedLevelList[i]; | |
} else { | |
if (selectedLevelList.length > | |
1 && | |
i < | |
selectedLevelList | |
.length) { | |
if (i != | |
selectedLevelList.length - | |
1) { | |
selectedLevel = | |
selectedLevel + ', '; | |
} else { | |
selectedLevel = | |
selectedLevel + ' & '; | |
} | |
} | |
selectedLevel = selectedLevel + | |
selectedLevelList[i]; | |
} | |
} | |
} | |
}, | |
); | |
}); | |
}, | |
inactiveColor: ColorBase.black40, | |
endThumbIcon: Container( | |
width: 24, | |
height: 24, | |
child: Image.asset( | |
'assets/images/ver3/slider-white.png', | |
fit: BoxFit.cover, | |
)), | |
startThumbIcon: Container( | |
width: 24, | |
height: 24, | |
child: Image.asset( | |
'assets/images/ver3/slider-white.png', | |
fit: BoxFit.cover, | |
)), | |
minorTicksPerInterval: 0, | |
), | |
SizedBox(height: 24), | |
], | |
), | |
), | |
), | |
Visibility( | |
visible: true, | |
child: Column( | |
children: [ | |
SizedBox(height: 16), | |
Container( | |
width: double.infinity, | |
height: 38, | |
decoration: BoxDecoration( | |
color: (categoryName.length > 0 || | |
filterCoaching || | |
filterBookedViaAyo || | |
filterSuperhost || | |
filterOfficialByVenue || | |
selectedLevelList.length > 0 || | |
timeFilterSelected.length > 0) | |
? ColorBase.primaryRed | |
: ColorBase.black40, | |
borderRadius: BorderRadius.circular(12), | |
), | |
child: TextButton( | |
onPressed: () { | |
_loadActivity(); | |
Navigator.pop(context); | |
}, | |
child: Center( | |
child: Text( | |
context.formatString( | |
AppLocale.terapkan, | |
[], | |
), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
color: Colors.white, | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
textAlign: TextAlign.center, | |
), | |
), | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 24), | |
], | |
), | |
), | |
], | |
), | |
); | |
}, | |
); | |
}, | |
).whenComplete(() { | |
countTotalFilter(); | |
if (!_isApplyFilterButtonClicked) { | |
setState(() { | |
_isApplyFilterButtonShown = (totalFilter > 0) ? true : false; | |
}); | |
if (totalFilter == 0) { | |
// refreshData(); | |
} else { | |
// if (!_isOpenLocationModalClicked) { | |
// revertChipValueChanges('sports'); | |
// revertChipValueChanges('locations'); | |
// revertChipValueChanges('sparring_types'); | |
// revertChipValueChanges('time_preferences'); | |
// countTotalFilter(); | |
// } | |
} | |
} | |
}); | |
} | |
void sortCommunityModal(context) { | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
SizedBox(height: 10), | |
Padding( | |
padding: EdgeInsets.only( | |
left: 24, | |
right: 24, | |
bottom: MediaQuery.of(context).padding.bottom), | |
child: Column( | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString(AppLocale.urutkan, []), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
color: ColorBase.black100, | |
), | |
), | |
GestureDetector( | |
onTap: () { | |
Navigator.pop(context); | |
}, | |
child: Icon( | |
Icons.close, | |
color: ColorBase.black80, | |
), | |
), | |
], | |
), | |
SizedBox(height: 36), | |
for (var i = 0; i < sortCommunityOptions.length; i++) | |
Column( | |
children: [ | |
GestureDetector( | |
onTap: () { | |
modalSetState(() { | |
_sortCommunityRadio = | |
sortCommunityOptions[i]['value']; | |
_isApplySortCommunityButtonShown = | |
(_currentSortCommunityRadio == | |
_sortCommunityRadio) | |
? false | |
: true; | |
}); | |
}, | |
child: Container( | |
color: Colors.transparent, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
sortCommunityOptions[i]['name'], | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
color: ColorBase.black100, | |
), | |
), | |
SizedBox( | |
height: 20, | |
width: 20, | |
child: Radio( | |
activeColor: ColorBase.primaryRed, | |
value: sortCommunityOptions[i] | |
['value'], | |
groupValue: _sortCommunityRadio, | |
onChanged: (value) { | |
modalSetState(() { | |
_sortCommunityRadio = | |
sortCommunityOptions[i] | |
['value']; | |
_isApplySortCommunityButtonShown = | |
(_currentSortCommunityRadio == | |
_sortCommunityRadio) | |
? false | |
: true; | |
}); | |
}, | |
), | |
), | |
], | |
), | |
), | |
), | |
if (i < sortCommunityOptions.length - 1) | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 16), | |
child: Divider(color: ColorBase.black10), | |
), | |
], | |
), | |
Visibility( | |
visible: _isApplySortCommunityButtonShown, | |
child: Column( | |
children: [ | |
SizedBox(height: 40), | |
Container( | |
width: double.infinity, | |
height: 38, | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(12), | |
), | |
child: TextButton( | |
onPressed: () { | |
_isApplySortCommunityButtonShown = true; | |
setState(() { | |
sortCommunity = _sortCommunityRadio; | |
_loadCommunity(); | |
currentTotalCommunity = 100; | |
hasMoreCommunity = true; | |
}); | |
Navigator.pop(context); | |
}, | |
child: Center( | |
child: Text( | |
context.formatString( | |
AppLocale.terapkan, []), | |
style: TextStyle( | |
color: Colors.white, | |
fontWeight: FontWeight.w500, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
textAlign: TextAlign.center, | |
), | |
), | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 24), | |
], | |
), | |
), | |
], | |
), | |
); | |
}, | |
); | |
}).whenComplete(() { | |
if (!_isApplySortCommunityButtonShown) { | |
setState(() { | |
_sortCommunityRadio = _currentSortCommunityRadio; | |
}); | |
} | |
}); | |
} | |
void _cancelPolicyModal(BuildContext context, double screenWidth) { | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
Padding( | |
padding: EdgeInsets.only( | |
left: 24, | |
right: 24, | |
bottom: MediaQuery.of(context).padding.bottom), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.kebijakanRefundRescheduleTitle, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
if (cancelPolicy.name == | |
VenueBookingConstant.cancelPolicyStrict) ...[ | |
if (reschedulePolicy > 0) ...[ | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 16), | |
child: DottedLine(dashColor: ColorBase.black10), | |
), | |
Container( | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
height: 18, | |
width: 18, | |
child: Center( | |
child: ClipOval( | |
child: Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver2/arrow-grey.png', | |
fit: BoxFit.cover), | |
), | |
), | |
), | |
), | |
SizedBox(width: 12), | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: screenWidth - 16 * 4 - 30, | |
child: Text( | |
(reschedulePolicy > 0) | |
? context.formatString( | |
AppLocale | |
.kebijakanRefundScheduleDef, | |
[ | |
reschedulePolicy | |
.toString() | |
], | |
) | |
: context.formatString( | |
AppLocale | |
.kebijakanRefundScheduleDefNo, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * 14, | |
), | |
), | |
), | |
SizedBox(height: 6), | |
], | |
), | |
], | |
), | |
), | |
], | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 16), | |
child: DottedLine(dashColor: ColorBase.black10), | |
), | |
Container( | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
height: 18, | |
width: 18, | |
child: Center( | |
child: ClipOval( | |
child: Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver2/arrow.png', | |
fit: BoxFit.cover), | |
), | |
), | |
), | |
), | |
SizedBox(width: 12), | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: screenWidth - 16 * 4 - 30, | |
child: Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale | |
.booking_tidak_dapat_dibatalkan, | |
[]), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
14, | |
), | |
), | |
SizedBox(height: 12), | |
Text( | |
context.formatString( | |
AppLocale | |
.tidak_berlaku_refund, | |
[]), | |
style: TextStyle( | |
color: ColorBase.primaryRed, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
12, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
)), | |
SizedBox(height: 6), | |
], | |
), | |
], | |
), | |
), | |
], | |
if (cancelPolicy.name != | |
VenueBookingConstant.cancelPolicyStrict) ...[ | |
Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
if (reschedulePolicy > 0) ...[ | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 16), | |
child: DottedLine( | |
dashColor: ColorBase.black10), | |
), | |
Container( | |
child: Row( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
height: 18, | |
width: 18, | |
child: Center( | |
child: ClipOval( | |
child: Container( | |
height: 16, | |
width: 16, | |
child: Image.asset( | |
'assets/images/ver2/arrow-grey.png', | |
fit: BoxFit.cover), | |
), | |
), | |
), | |
), | |
SizedBox(width: 12), | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: screenWidth - 16 * 4 - 30, | |
child: Text( | |
(reschedulePolicy > 0) | |
? context.formatString( | |
AppLocale | |
.kebijakanRefundScheduleDef, | |
[ | |
reschedulePolicy | |
.toString() | |
], | |
) | |
: context.formatString( | |
AppLocale | |
.kebijakanRefundScheduleDefNo, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
14, | |
), | |
), | |
), | |
SizedBox(height: 6), | |
], | |
), | |
], | |
), | |
), | |
], | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 16), | |
child: | |
DottedLine(dashColor: ColorBase.black10), | |
), | |
for (var i = 0; | |
i < cancelPolicy.policies.length; | |
i++) | |
Container( | |
margin: EdgeInsets.only(bottom: 16), | |
child: Row( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
height: 18, | |
width: 18, | |
child: Center( | |
child: ClipOval( | |
child: Container( | |
height: 16, | |
width: 16, | |
// color: | |
// Color(int.parse( | |
// "0xff${cancelPolicy.policies[i].color}")), | |
child: Image.asset( | |
cancelPolicy.policies[i] | |
.color == | |
'00C48C' | |
? 'assets/images/ver2/arrow-green-new.png' | |
: cancelPolicy | |
.policies[i] | |
.color == | |
'FCB145' | |
? 'assets/images/ver2/arrow-yellow-new.png' | |
: 'assets/images/ver2/arrow-red-new.png', | |
fit: BoxFit.cover), | |
), | |
), | |
), | |
), | |
// Column( | |
// crossAxisAlignment: | |
// CrossAxisAlignment.center, | |
// children: [ | |
// Container( | |
// height: 18, | |
// width: 18, | |
// child: Center( | |
// child: ClipOval( | |
// child: Container( | |
// height: 16, | |
// width: 16, | |
// color: Color(int.parse( | |
// "0xff${cancelPolicy.policies[i].color}")), | |
// ), | |
// ), | |
// ), | |
// ), | |
// Container( | |
// height: (cancelPolicy.policies[i] | |
// .percentage > | |
// 0) | |
// ? 56 | |
// : 28, | |
// width: 4, | |
// color: Color(int.parse( | |
// "0xff${cancelPolicy.policies[i].color}")), | |
// ) | |
// ], | |
// ), | |
SizedBox(width: 12), | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
Container( | |
width: screenWidth - 16 * 4 - 30, | |
child: Text( | |
_getCancelPolicyDescription( | |
cancelPolicy.policies[i] | |
.percentage), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
14, | |
), | |
), | |
), | |
SizedBox(height: 6), | |
if (cancelPolicy | |
.policies[i].percentage > | |
0) | |
Text( | |
cancelPolicy | |
.policies[i].percentage | |
.toString() + | |
'% Refund', | |
style: TextStyle( | |
color: Color(int.parse( | |
"0xff${cancelPolicy.policies[i].color}")), | |
fontFamily: 'Rubik', | |
fontSize: | |
ScreenUtil().scaleText * | |
14, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
], | |
), | |
], | |
), | |
), | |
// SizedBox(height: 16), | |
// Container( | |
// width: screenWidth, | |
// padding: EdgeInsets.all(8), | |
// decoration: BoxDecoration( | |
// color: ColorBase.black10, | |
// borderRadius: BorderRadius.circular(8), | |
// ), | |
// child: Row( | |
// crossAxisAlignment: | |
// CrossAxisAlignment.start, | |
// children: [ | |
// Container( | |
// height: 14, | |
// width: 14, | |
// child: SvgPicture.asset( | |
// 'assets/images/info-black.svg', | |
// fit: BoxFit.contain, | |
// color: ColorBase.black60, | |
// ), | |
// ), | |
// SizedBox(width: 8), | |
// Container( | |
// width: screenWidth - 86, | |
// child: Text( | |
// 'Dana yang dikembalikan tidak termasuk biaya transaksi.', | |
// style: TextStyle( | |
// fontFamily: 'Rubik', | |
// fontSize: | |
// ScreenUtil().scaleText * 12, | |
// color: ColorBase.black80, | |
// ), | |
// maxLines: 10, | |
// ), | |
// ), | |
// ], | |
// ), | |
// ) | |
], | |
), | |
], | |
SizedBox(height: 24), | |
], | |
), | |
), | |
], | |
), | |
); | |
}, | |
); | |
}); | |
} | |
void _additionalInformationModal( | |
context, double screenWidth, AditionalInformation additionalInformation) { | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
SizedBox(height: 10), | |
Padding( | |
padding: EdgeInsets.only( | |
left: 24, | |
right: 24, | |
bottom: MediaQuery.of(context).padding.bottom), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
additionalInformation.title, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 18, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
SizedBox(height: 24), | |
Text( | |
additionalInformation.content, | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
), | |
SizedBox(height: 24), | |
], | |
), | |
), | |
], | |
), | |
); | |
}, | |
); | |
}); | |
} | |
void _availableVoucherModal( | |
context, double screenWidth, double screenHeight) { | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
SizedBox(height: 10), | |
Padding( | |
padding: EdgeInsets.only( | |
left: 24, | |
right: 24, | |
bottom: MediaQuery.of(context).padding.bottom), | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.voucherVenueTitle, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
SizedBox(height: 24), | |
Container( | |
width: screenWidth, | |
padding: EdgeInsets.all(8), | |
decoration: BoxDecoration( | |
color: Color(0xFFF7F7F7), | |
borderRadius: BorderRadius.circular(8), | |
border: Border.all(color: ColorBase.black10), | |
), | |
child: Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Container( | |
height: 14, | |
width: 14, | |
child: SvgPicture.asset( | |
'assets/images/info-black.svg', | |
fit: BoxFit.contain, | |
color: ColorBase.black60, | |
), | |
), | |
SizedBox(width: 8), | |
Container( | |
width: screenWidth - 86, | |
child: Text( | |
context.formatString( | |
AppLocale.voucherVenueInfo, | |
[], | |
), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
color: ColorBase.black80, | |
), | |
maxLines: 10, | |
), | |
), | |
], | |
), | |
), | |
SizedBox(height: 20), | |
Container( | |
constraints: | |
BoxConstraints(maxHeight: screenHeight * 0.45), | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
for (var i = 0; i < vouchers.length; i++) | |
Stack( | |
children: [ | |
Container( | |
padding: EdgeInsets.symmetric( | |
vertical: 16, horizontal: 22), | |
margin: EdgeInsets.only(bottom: 16), | |
decoration: BoxDecoration( | |
borderRadius: | |
BorderRadius.circular(8), | |
color: Colors.white, | |
), | |
width: screenWidth - | |
horizontalPadding * 2, | |
child: Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
GestureDetector( | |
onTap: () {}, | |
child: Container( | |
color: Colors.transparent, | |
child: Column( | |
crossAxisAlignment: | |
CrossAxisAlignment | |
.start, | |
children: [ | |
Text( | |
vouchers[i] | |
.voucherDesc != | |
null | |
? vouchers[i] | |
.voucherDesc | |
: vouchers[i] | |
.description, | |
style: TextStyle( | |
color: ColorBase | |
.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
16, | |
fontWeight: | |
FontWeight.w500, | |
), | |
maxLines: 2, | |
overflow: TextOverflow | |
.ellipsis, | |
), | |
if (vouchers[i] | |
.minTransaction != | |
null && | |
vouchers[i] | |
.minTransaction > | |
0) | |
SizedBox(height: 4), | |
if (vouchers[i] | |
.minTransaction != | |
null && | |
vouchers[i] | |
.minTransaction > | |
0) | |
Text( | |
'${context.formatString( | |
AppLocale.minTrans, | |
[], | |
)} Rp ${Helpers.formatRupiah(vouchers[i].minTransaction.toString())}', | |
style: TextStyle( | |
color: ColorBase | |
.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
), | |
overflow: TextOverflow | |
.ellipsis, | |
), | |
if (vouchers[i] | |
.minTransaction == | |
null && | |
vouchers[i] | |
.minTransaction == | |
0) | |
Text( | |
context.formatString( | |
AppLocale | |
.tanpaMinimumTrans, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase | |
.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
), | |
overflow: TextOverflow | |
.ellipsis, | |
), | |
if (vouchers[i] | |
.dateDiff != | |
null) | |
SizedBox(height: 4), | |
if (vouchers[i] | |
.dateDiff != | |
null) | |
Row( | |
children: [ | |
Text( | |
vouchers[i].dateDiff <= | |
7 | |
? context.formatString( | |
AppLocale | |
.berakhirDalam, | |
[]) + | |
' ${vouchers[i].dateDiff} ' + | |
context.formatString( | |
AppLocale | |
.hari, | |
[]) | |
: context.formatString( | |
AppLocale | |
.berlakuHingga, | |
[]) + | |
' ${vouchers[i].date}', | |
style: TextStyle( | |
color: ColorBase | |
.black80, | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
), | |
), | |
], | |
), | |
if (vouchers[i] | |
.endDateDiff != | |
null) | |
SizedBox(height: 4), | |
if (vouchers[i] | |
.endDateDiff != | |
null) | |
Row( | |
children: [ | |
Text( | |
vouchers[i].endDateDiff <= | |
7 | |
? context.formatString( | |
AppLocale | |
.berakhirDalam, | |
[]) + | |
' ${vouchers[i].endDateDiff} ' + | |
context.formatString( | |
AppLocale | |
.hari, | |
[]) | |
: context.formatString( | |
AppLocale | |
.berlakuHingga, | |
[]) + | |
' ${vouchers[i].endDateFormat}', | |
style: TextStyle( | |
color: ColorBase | |
.black80, | |
fontFamily: | |
'Rubik', | |
fontSize: | |
ScreenUtil() | |
.scaleText * | |
12, | |
), | |
), | |
], | |
), | |
], | |
), | |
), | |
), | |
Padding( | |
padding: EdgeInsets.symmetric( | |
vertical: 12), | |
child: DottedLine( | |
dashColor: ColorBase.black40, | |
), | |
), | |
Row( | |
mainAxisAlignment: | |
MainAxisAlignment | |
.spaceBetween, | |
children: [ | |
Text( | |
vouchers[i].name, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight.w500, | |
), | |
), | |
GestureDetector( | |
onTap: () { | |
FlutterClipboard.copy( | |
vouchers[i].name); | |
customFlutterToastWithoutClose( | |
context: context, | |
msg: | |
"${context.formatString( | |
AppLocale | |
.berhasilSalinKode, | |
[], | |
)} ${vouchers[i].name}", | |
customToastTypeWithoutClose: | |
CustomToastTypeWithoutClose | |
.INFO, | |
); | |
}, | |
child: Text( | |
context.formatString( | |
AppLocale.salin, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase | |
.primaryRed, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
12, | |
fontWeight: | |
FontWeight.w500, | |
), | |
), | |
), | |
], | |
), | |
], | |
), | |
), | |
Positioned( | |
right: 0, | |
child: SvgPicture.asset( | |
'assets/images/ver2/ticket-accent-primary-red.svg', | |
width: 60, | |
fit: BoxFit.contain, | |
), | |
), | |
], | |
) | |
], | |
), | |
), | |
), | |
SizedBox(height: 24), | |
GestureDetector( | |
onTap: () async { | |
if (category.length == 1) { | |
int result = | |
await _checkPickedSport(category[0]); | |
if (result == 0) { | |
chooseField(category[0]); | |
} else {} | |
} else { | |
_sportSelectorModal(context, screenWidth, | |
screenHeight, category); | |
} | |
}, | |
child: Container( | |
height: 38, | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: Center( | |
child: Text( | |
context.formatString( | |
AppLocale.pilihLapangan, | |
[], | |
), | |
style: TextFontConst.RUBIK_MEDIUM_WHITE_14 | |
.copyWith(height: 1), | |
), | |
), | |
), | |
), | |
SizedBox(height: 24), | |
], | |
), | |
), | |
], | |
), | |
); | |
}, | |
); | |
}); | |
} | |
void _membershipTnCModal( | |
context, | |
double screenWidth, | |
double screenHeight, | |
VenueMembership membershipPackage, | |
int membershipsId, | |
int membershipsFieldId, | |
String membershipsType, | |
String membershipsName, | |
List membershipsTnc, | |
String membershipsNames, | |
String membershipsSlotRule, | |
) { | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return Container( | |
padding: EdgeInsets.only( | |
left: 24, | |
right: 24, | |
bottom: MediaQuery.of(context).padding.bottom), | |
height: screenHeight * 0.8, | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
SizedBox(height: 10), | |
Text( | |
(membershipsType == 'bundling') | |
? context.formatString(AppLocale.paket_bundling, []) | |
: context.formatString(AppLocale.paket_langganan, []), | |
style: TextStyle( | |
color: ColorBase.black60, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
height: 1.4, | |
fontWeight: FontWeight.w400, | |
), | |
), | |
Text( | |
membershipsNames, | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 18, | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 16), | |
child: DottedLine(dashColor: ColorBase.black10), | |
), | |
Text( | |
context.formatString(AppLocale.syarat_ketentuan, []), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
SizedBox(height: 8), | |
Expanded( | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
for (var i = 0; i < membershipsTnc.length; i++) | |
Row( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
Text( | |
(i + 1).toString() + '. ', | |
style: TextStyle( | |
overflow: TextOverflow.clip, | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
height: 1.4, | |
fontWeight: FontWeight.w400, | |
), | |
), | |
Container( | |
width: screenWidth - 65, | |
child: Text( | |
membershipsTnc[i], | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
height: 1.4, | |
fontWeight: FontWeight.w400, | |
), | |
), | |
), | |
], | |
), | |
SizedBox( | |
height: 24, | |
), | |
], | |
), | |
), | |
), | |
SizedBox( | |
height: 8, | |
), | |
Text( | |
context.formatString(AppLocale.dengan_melanjutkan, []), | |
style: TextStyle( | |
color: ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 12, | |
height: 1.4, | |
fontWeight: FontWeight.w400, | |
), | |
overflow: TextOverflow.clip, | |
), | |
SizedBox( | |
height: 12, | |
), | |
GestureDetector( | |
onTap: () { | |
if (membershipsType == 'bundling') { | |
int fieldId = | |
membershipPackage.activeFields[0].fieldId; | |
String fieldName = | |
membershipPackage.activeFields[0].fieldName; | |
int sportId = | |
membershipPackage.activeFields[0].sportId; | |
String sportName = | |
membershipPackage.activeFields[0].sportName; | |
// Navigator.of(context) | |
// .pushNamed(NewChooseScheduleBundlingScreen.routeName, | |
// // MembershipChooseScheduleScreen.routeName, | |
// arguments: { | |
// // 'venue_id': otherVenueList[i].id | |
// 'venue_id': widget.venueId, | |
// 'integration_type': widget.integrationType, | |
// 'field_id': membershipsFieldId, | |
// 'memberships_id': membershipsId, | |
// 'memberships_type': membershipsType, | |
// 'memberships_name': membershipsName, | |
// 'memberships_slot_rule': membershipsSlotRule, | |
// // 'sport_id': pickedSportId, | |
// // 'sport_name': pickedSportName, | |
// // 'remove_until_route': widget.removeUntilRoute, | |
// // 'booking_action': widget.bookingAction, | |
// 'integration_type': widget.integrationType, | |
// }); | |
Navigator.of(context).pushNamed( | |
NewChooseScheduleBundlingScreen.routeName, | |
arguments: { | |
'venue_id': widget.venueId, | |
'integration_type': widget.integrationType, | |
'field_id': membershipsFieldId, | |
'field_name': fieldName, | |
'package': membershipPackage, | |
'package_id': membershipPackage.id, | |
'package_type': membershipPackage.type, | |
'package_name': membershipPackage.name, | |
'package_slot_rule': membershipPackage.slotRule, | |
'package_active_days': | |
membershipPackage.activeDays, | |
'package_booking_start': | |
membershipPackage.bookingPeriodStartDate, | |
'package_booking_end': | |
membershipPackage.bookingPeriodEndDate, | |
'sport_id': sportId, | |
'sport_name': sportName, | |
}); | |
} else { | |
Navigator.of(context).pushNamed( | |
ChooseScheduleRecurringScreen.routeName, | |
// MembershipChooseScheduleScreen.routeName, | |
arguments: { | |
// 'venue_id': otherVenueList[i].id | |
'venue_id': widget.venueId, | |
'integration_type': widget.integrationType, | |
'field_id': membershipsFieldId, | |
'memberships_id': membershipsId, | |
'memberships_type': membershipsType, | |
'memberships_name': membershipsName, | |
'memberships_slot_rule': membershipsSlotRule, | |
// 'sport_id': pickedSportId, | |
// 'sport_name': pickedSportName, | |
// 'remove_until_route': widget.removeUntilRoute, | |
// 'booking_action': widget.bookingAction, | |
'integration_type': widget.integrationType, | |
}); | |
} | |
// MembershipChooseScheduleScreen | |
}, | |
child: Container( | |
width: screenWidth, | |
height: 38, | |
alignment: Alignment.center, | |
padding: EdgeInsets.all(8), | |
decoration: BoxDecoration( | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: Container( | |
width: screenWidth - 86, | |
alignment: Alignment.center, | |
child: Text( | |
context.formatString(AppLocale.beliPaket, []), | |
style: TextStyle( | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 14, | |
height: 1.4, | |
fontWeight: FontWeight.w500, | |
color: ColorBase.primaryWhite, | |
), | |
maxLines: 10, | |
), | |
), | |
), | |
), | |
SizedBox(height: 20), | |
], | |
), | |
); | |
}, | |
); | |
}); | |
} | |
void _sportSelectorModal(BuildContext context, double screenWidth, | |
double screenHeight, List<CategoryData> category) async { | |
double paddingBottom = MediaQuery.of(context).padding.bottom; | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(8.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return BlocProvider.value( | |
value: categoryBloc, | |
child: Container( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
InkWell( | |
onTap: () {}, | |
child: Center( | |
child: Container( | |
margin: EdgeInsets.only(top: 8, bottom: 16), | |
width: 40, | |
height: 4.0, | |
decoration: BoxDecoration( | |
borderRadius: BorderRadius.circular(6), | |
color: Colors.black26, | |
), | |
), | |
), | |
), | |
SizedBox(height: 10), | |
Padding( | |
padding: EdgeInsets.only( | |
left: 16, | |
right: 16, | |
bottom: MediaQuery.of(context).padding.bottom), | |
child: Column( | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.pilihCabangOlahraga, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 18, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
GestureDetector( | |
onTap: () { | |
Navigator.pop(context); | |
}, | |
child: Icon( | |
Icons.close, | |
color: ColorBase.black80, | |
), | |
), | |
], | |
), | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 14), | |
child: Divider(color: ColorBase.black10), | |
), | |
Container( | |
constraints: | |
BoxConstraints(maxHeight: screenHeight * 3 / 4), | |
width: screenWidth, | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
for (var i = 0; i < category.length; i++) | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
GestureDetector( | |
onTap: () { | |
modalSetState( | |
() { | |
setState(() { | |
for (var j = 0; | |
j < category.length; | |
j++) { | |
category[j].isPicked = | |
false; | |
} | |
category[i].isPicked = true; | |
if (category[i] | |
.totalCommunity == | |
0) { | |
} else {} | |
}); | |
}, | |
); | |
}, | |
child: Container( | |
width: screenWidth, | |
color: Colors.transparent, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment | |
.spaceBetween, | |
children: [ | |
Row( | |
children: [ | |
Container( | |
height: 24, | |
width: 24, | |
child: SvgPicture.network( | |
BaseUrlConfig | |
.baseAssetUrl + | |
category[i] | |
.svgPath)), | |
SizedBox( | |
width: 8, | |
), | |
Text( | |
Helpers.capitalizeString( | |
category[i] | |
.name | |
.toLowerCase()), | |
style: TextStyle( | |
color: | |
ColorBase.black80, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
14, | |
), | |
), | |
], | |
), | |
Container( | |
height: 20, | |
width: 20, | |
child: (category[i] | |
.isPicked != | |
true) | |
? Image.asset( | |
'assets/images/radio-black.png', | |
fit: BoxFit.contain, | |
) | |
: Image.asset( | |
'assets/images/radio-red.png', | |
fit: BoxFit.contain, | |
), | |
), | |
], | |
), | |
), | |
), | |
if (i < category.length - 1) | |
Padding( | |
padding: EdgeInsets.symmetric( | |
vertical: 14), | |
child: Divider( | |
color: ColorBase.black10), | |
), | |
], | |
), | |
], | |
), | |
), | |
), | |
SizedBox(height: 32), | |
], | |
), | |
), | |
Divider( | |
color: ColorBase.black10, | |
), | |
Padding( | |
padding: EdgeInsets.only( | |
top: 16, | |
left: 16, | |
right: 16, | |
bottom: (MediaQuery.of(context).padding.bottom > 16) | |
? MediaQuery.of(context).padding.bottom | |
: 16), | |
child: Container( | |
width: screenWidth - 16 * 2, | |
height: 30 + | |
((MediaQuery.of(context).padding.bottom > 16) | |
? MediaQuery.of(context).padding.bottom | |
: 16.0) | |
.toDouble(), | |
decoration: BoxDecoration( | |
border: Border.all(color: ColorBase.primaryRed), | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: TextButton( | |
onPressed: () async { | |
Navigator.pop(context); | |
for (int i = 0; i < category.length; i++) { | |
if (category[i].isPicked) { | |
int result = | |
await _checkPickedSport(category[i]); | |
if (result == 0) { | |
chooseField(category[i]); | |
} else {} | |
} | |
} | |
}, | |
child: Text( | |
context.formatString( | |
AppLocale.terapkan, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.primaryWhite, | |
fontWeight: FontWeight.w500, | |
height: 1.4, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
textAlign: TextAlign.center, | |
), | |
), | |
), | |
), | |
], | |
), | |
), | |
); | |
}, | |
); | |
}, | |
); | |
} | |
void _coachSportSelectorModal( | |
BuildContext context, | |
double screenWidth, | |
double screenHeight, | |
List<Sports> category, | |
int fieldAdditionalServiceId) async { | |
double paddingBottom = MediaQuery.of(context).padding.bottom; | |
showModalBottomSheet( | |
shape: RoundedRectangleBorder( | |
borderRadius: BorderRadius.vertical(top: Radius.circular(8.0)), | |
), | |
context: context, | |
isScrollControlled: true, | |
builder: (context) { | |
return StatefulBuilder( | |
builder: (BuildContext ctx, StateSetter modalSetState) { | |
return BlocProvider.value( | |
value: categoryBloc, | |
child: Container( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
SizedBox(height: 18), | |
Padding( | |
padding: EdgeInsets.only( | |
left: 16, | |
right: 16, | |
bottom: MediaQuery.of(context).padding.bottom), | |
child: Column( | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |
children: [ | |
Text( | |
context.formatString( | |
AppLocale.pilihCabangOlahraga, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil().scaleText * 16, | |
fontWeight: FontWeight.w500, | |
), | |
), | |
GestureDetector( | |
onTap: () { | |
Navigator.pop(context); | |
}, | |
child: Icon( | |
Icons.close, | |
color: ColorBase.black80, | |
), | |
), | |
], | |
), | |
Padding( | |
padding: EdgeInsets.symmetric(vertical: 14), | |
child: Divider(color: ColorBase.black10), | |
), | |
Container( | |
constraints: | |
BoxConstraints(maxHeight: screenHeight * 3 / 4), | |
width: screenWidth, | |
child: SingleChildScrollView( | |
child: Column( | |
crossAxisAlignment: CrossAxisAlignment.start, | |
children: [ | |
for (var i = 0; i < category.length; i++) | |
Column( | |
crossAxisAlignment: | |
CrossAxisAlignment.start, | |
children: [ | |
GestureDetector( | |
onTap: () { | |
modalSetState( | |
() { | |
setState(() { | |
for (var j = 0; | |
j < category.length; | |
j++) { | |
category[j].isPicked = | |
false; | |
} | |
category[i].isPicked = true; | |
}); | |
}, | |
); | |
}, | |
child: Container( | |
width: screenWidth, | |
color: Colors.transparent, | |
child: Row( | |
mainAxisAlignment: | |
MainAxisAlignment | |
.spaceBetween, | |
children: [ | |
Row( | |
children: [ | |
Container( | |
height: 20, | |
width: 20, | |
child: SvgPicture.network( | |
BaseUrlConfig | |
.baseAssetUrl + | |
category[i] | |
.svgPath)), | |
SizedBox( | |
width: 8, | |
), | |
Text( | |
Helpers.capitalizeString( | |
category[i] | |
.name | |
.toLowerCase()), | |
style: TextStyle( | |
color: | |
ColorBase.black100, | |
fontFamily: 'Rubik', | |
fontSize: ScreenUtil() | |
.scaleText * | |
14, | |
), | |
), | |
], | |
), | |
Container( | |
height: 20, | |
width: 20, | |
child: (category[i] | |
.isPicked != | |
true) | |
? Image.asset( | |
'assets/images/radio-black.png', | |
fit: BoxFit.contain, | |
) | |
: Image.asset( | |
'assets/images/radio-red.png', | |
fit: BoxFit.contain, | |
), | |
), | |
], | |
), | |
), | |
), | |
if (i < category.length - 1) | |
Padding( | |
padding: EdgeInsets.symmetric( | |
vertical: 14), | |
child: Divider( | |
color: ColorBase.black10), | |
), | |
], | |
), | |
], | |
), | |
), | |
), | |
SizedBox(height: 32), | |
], | |
), | |
), | |
Divider( | |
color: ColorBase.black10, | |
), | |
Padding( | |
padding: EdgeInsets.only( | |
top: 16, | |
left: 16, | |
right: 16, | |
bottom: (MediaQuery.of(context).padding.bottom > 16) | |
? MediaQuery.of(context).padding.bottom | |
: 16), | |
child: Container( | |
width: screenWidth - 16 * 2, | |
height: 30 + | |
((MediaQuery.of(context).padding.bottom > 16) | |
? MediaQuery.of(context).padding.bottom | |
: 16.0) | |
.toDouble(), | |
decoration: BoxDecoration( | |
border: Border.all(color: ColorBase.primaryRed), | |
color: ColorBase.primaryRed, | |
borderRadius: BorderRadius.circular(8), | |
), | |
child: TextButton( | |
onPressed: () async { | |
Navigator.pop(context); | |
for (int i = 0; i < category.length; i++) { | |
if (category[i].isPicked) { | |
int result = | |
await _checkPickedSportCoach(category[i]); | |
if (result == 0) { | |
chooseFieldCoach( | |
category[i], fieldAdditionalServiceId); | |
} else {} | |
} | |
} | |
}, | |
child: Text( | |
context.formatString( | |
AppLocale.terapkan, | |
[], | |
), | |
style: TextStyle( | |
color: ColorBase.primaryWhite, | |
fontWeight: FontWeight.w500, | |
height: 1.4, | |
fontSize: ScreenUtil().scaleText * 14, | |
), | |
textAlign: TextAlign.center, | |
), | |
), | |
), | |
), | |
], | |
), | |
), | |
); | |
}, | |
); | |
}, | |
); | |
} | |
dynamic onGoBack() { | |
setState(() { | |
_refreshData(); | |
_updateTotalCart(); | |
}); | |
} | |
void _loadActivity() { | |
eventVenuesBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchEventVenues( | |
widget.venueId, | |
0, | |
10, | |
categoryName, | |
filterCoaching, | |
filterBookedViaAyo, | |
filterSuperhost, | |
filterOfficialByVenue, | |
selectedLevelList, | |
timeFilterSelected, | |
filterDateActivity, | |
widget.context, | |
)); | |
setState(() { | |
isLoadActivity = true; | |
}); | |
} | |
void _loadCoach() { | |
coachVenuesBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchCoachVenues( | |
widget.venueId, | |
0, | |
10, | |
[], | |
widget.context, | |
)); | |
setState(() { | |
isLoadCoach = true; | |
}); | |
} | |
void _loadMembership() { | |
membershipVenuesBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchMembershipVenues( | |
widget.context, widget.venueId, 0, 10, membershipTypes)); | |
setState(() { | |
isLoadMembership = true; | |
}); | |
} | |
void _loadCommunity() { | |
communitiesBloc = BlocProvider.of<VenueDetailBloc>(context) | |
..add(FetchCommunities( | |
widget.venueId, | |
0, | |
100, | |
[], | |
sortCommunity, | |
widget.context, | |
)); | |
setState(() { | |
isLoadCommunity = true; | |
}); | |
} | |
void _refreshData() async { | |
setState(() { | |
isLoading = false; | |
}); | |
} | |
void _getHeaderImage() { | |
setState(() { | |
if ((selectedSport.toLowerCase()) == 'sepak bola') { | |
headerImage = 'header-sepak-bola.png'; | |
} else if ((selectedSport.toLowerCase()) == 'futsal') { | |
headerImage = 'header-fustal.png'; | |
} else if ((selectedSport.toLowerCase()) == 'mini soccer') { | |
headerImage = 'header-mini-soccer.png'; | |
} else if ((selectedSport.toLowerCase()) == 'badminton' || | |
(selectedSport.toLowerCase()) == 'bulu tangkis') { | |
headerImage = 'header-badminton.png'; | |
} else if ((selectedSport.toLowerCase()) == 'basket ball' || | |
(selectedSport.toLowerCase()) == 'bola basket') { | |
headerImage = 'header-basket-ball.png'; | |
} else if ((selectedSport.toLowerCase()) == 'tenis meja') { | |
headerImage = 'header-tenis-meja.png'; | |
} else if ((selectedSport.toLowerCase()) == 'tenis') { | |
headerImage = 'header-tennis.png'; | |
} else { | |
headerImage = 'header-sepak-bola.png'; | |
} | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment