import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:yumi/ui_kit/widgets/bag/props_bag_mountains_detail_dialog.dart'; import 'package:provider/provider.dart'; import 'package:yumi/app_localizations.dart'; import 'package:yumi/ui_kit/components/sc_compontent.dart'; import 'package:yumi/ui_kit/components/sc_page_list.dart'; import 'package:yumi/ui_kit/components/text/sc_text.dart'; import 'package:yumi/ui_kit/components/sc_tts.dart'; import 'package:yumi/app/routes/sc_fluro_navigator.dart'; import 'package:yumi/shared/tools/sc_loading_manager.dart'; import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; import 'package:yumi/shared/data_sources/sources/repositories/sc_store_repository_imp.dart'; import 'package:yumi/shared/business_logic/models/res/bags_list_res.dart'; import 'package:yumi/shared/business_logic/models/res/login_res.dart'; import 'package:yumi/services/auth/user_profile_manager.dart'; import 'package:yumi/ui_kit/widgets/countdown_timer.dart'; import 'package:yumi/modules/store/store_route.dart'; import '../../../../shared/data_sources/models/enum/sc_props_type.dart'; import '../../../../ui_kit/components/sc_debounce_widget.dart'; import '../../../../ui_kit/components/dialog/dialog_base.dart'; import '../../../../ui_kit/theme/socialchat_theme.dart'; ///坐骑 class BagsMountainsPage extends SCPageList { @override _BagsMountainsPageState createState() => _BagsMountainsPageState(); } class _BagsMountainsPageState extends SCPageListState { BagsListRes? selecteMountains; ///自己当前佩戴的坐骑 PropsResources? myMountains; @override void initState() { super.initState(); enablePullUp = false; isGridView = true; gridViewCount = 3; padding = EdgeInsets.symmetric(horizontal: 6.w); backgroundColor = Colors.transparent; gridDelegate = SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: gridViewCount, mainAxisSpacing: 12.w, crossAxisSpacing: 12.w, childAspectRatio: 0.88, ); myMountains = AccountStorage().getMountains(); loadData(1); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.transparent, body: Column( children: [ Expanded(child: buildList(context)), selecteMountains != null ? SizedBox(height: 10.w) : Container(), selecteMountains != null ? Container( decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(12.w), topRight: Radius.circular(12.w), ), color: Color(0xff18F2B1).withOpacity(0.1), ), child: Column( children: [ SizedBox(height: 5.w), Row( spacing: 5.w, mainAxisAlignment: MainAxisAlignment.center, children: [ text( "${SCAppLocalizations.of(context)!.expirationTime}:", textColor: Colors.white, fontSize: 12.sp, ), CountdownTimer( fontSize: 11.sp, color: SocialChatTheme.primaryLight, expiryDate: DateTime.fromMillisecondsSinceEpoch( selecteMountains?.expireTime ?? 0, ), ), ], ), SizedBox(height: 10.w), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ SCDebounceWidget( child: Container( alignment: Alignment.center, width: 120.w, height: 35.w, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12.w), color: SocialChatTheme.primaryLight, ), child: text( SCAppLocalizations.of(context)!.renewal, fontWeight: FontWeight.w600, fontSize: 14.sp, textColor: Colors.white, ), ), onTap: () { ///过期 续费操作 SCNavigatorUtils.push( context, StoreRoute.list, replace: false, ); }, ), SizedBox(width: 10.w), SCDebounceWidget( child: Container( alignment: Alignment.center, width: 120.w, height: 35.w, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12.w), color: myMountains?.id == selecteMountains?.propsResources?.id ? Colors.white : SocialChatTheme.primaryLight, ), child: text( myMountains?.id == selecteMountains?.propsResources?.id ? SCAppLocalizations.of(context)!.inUse : SCAppLocalizations.of(context)!.use, fontSize: 14.sp, fontWeight: FontWeight.w600, textColor: myMountains?.id != selecteMountains?.propsResources?.id ? Colors.white : Color(0xffB1B1B1), ), ), onTap: () { if (myMountains?.id != selecteMountains?.propsResources?.id) { ///佩戴 SmartDialog.show( tag: "showConfirmDialog", alignment: Alignment.center, debounce: true, animationType: SmartAnimationType.fade, builder: (_) { return MsgDialog( title: SCAppLocalizations.of(context)!.tips, msg: SCAppLocalizations.of( context, )!.confirmUseTips, btnText: SCAppLocalizations.of(context)!.confirm, onEnsure: () { _use(selecteMountains!, false); }, ); }, ); } else { ///卸下 SmartDialog.show( tag: "showConfirmDialog", alignment: Alignment.center, debounce: true, animationType: SmartAnimationType.fade, builder: (_) { return MsgDialog( title: SCAppLocalizations.of(context)!.tips, msg: SCAppLocalizations.of( context, )!.confirmUnUseTips, btnText: SCAppLocalizations.of(context)!.confirm, onEnsure: () { _use(selecteMountains!, true); }, ); }, ); } }, ), ], ), SizedBox(height: 10.w), ], ), ) : Container(), ], ), ); } @override Widget buildItem(BagsListRes res) { return GestureDetector( child: Container( decoration: BoxDecoration( color:Color(0xff18F2B1).withOpacity(0.1), border: Border.all( color: selecteMountains?.propsResources?.id == res.propsResources?.id ? SocialChatTheme.primaryLight : Colors.transparent, width: 1.w, ), borderRadius: BorderRadius.all(Radius.circular(8.w)), ), child: Stack( alignment: Alignment.center, children: [ Column( children: [ SizedBox(height: 25.w), netImage( url: res.propsResources?.cover ?? "", width: 55.w, height: 55.w, ), SizedBox(height: 8.w), Row( mainAxisSize: MainAxisSize.min, children: [ text( res.propsResources?.name ?? "", textColor: Colors.white, fontSize: 12.sp, ), ], ), ], ), PositionedDirectional( top: 0, start: 0, child: Container( padding: EdgeInsets.symmetric(horizontal: 5.w), decoration: BoxDecoration( color: SocialChatTheme.primaryLight, borderRadius: BorderRadiusDirectional.only( topStart: Radius.circular(6.w), topEnd: Radius.circular(12.w), bottomEnd: Radius.circular(12.w), ), ), child: Row( children: [ CountdownTimer( fontSize: 9.sp, color: Colors.white, expiryDate: DateTime.fromMillisecondsSinceEpoch( res.expireTime ?? 0, ), ), SizedBox(width: 3.w), Image.asset( "sc_images/store/sc_icon_bag_clock.png", width: 22.w, height: 22.w, ), ], ), ), ), ], ), ), onTap: () { selecteMountains = res; setState(() {}); }, ); } ///加载数据 @override loadPage({ required int page, required Function(List) onSuccess, Function? onErr, }) async { try { var storeList = await SCStoreRepositoryImp().storeBackpack( AccountStorage().getCurrentUser()?.userProfile?.id ?? "", SCPropsType.RIDE.name, ); for (var v in storeList) { if (v.propsResources?.id == myMountains?.id) { selecteMountains = v; continue; } } onSuccess(storeList); } catch (e) { if (onErr != null) { onErr(); } } } void _showDetail(BagsListRes res) { SmartDialog.show( tag: "showPropsDetail", alignment: Alignment.center, animationType: SmartAnimationType.fade, builder: (_) { return PropsBagMountainsDetailDialog(res); }, onDismiss: () { myMountains = AccountStorage().getMountains(); setState(() {}); }, ); } void _use(BagsListRes res, bool unload) { SCLoadingManager.show(context: context); SCStoreRepositoryImp() .switchPropsUse( SCPropsType.RIDE.name, res.propsResources?.id ?? "", unload, ) .then((value) async { setState(() {}); if (!unload) { myMountains = res.propsResources; SCTts.show(SCAppLocalizations.of(context)!.successfulWear); } else { myMountains = null; SCTts.show(SCAppLocalizations.of(context)!.successfullyUnloaded); } Provider.of( context, listen: false, ).fetchUserProfileData(loadGuardCount: false); SCLoadingManager.hide(); }) .catchError((e) { SCLoadingManager.hide(); }); } }