2026-07-01 18:25:58 +08:00

928 lines
43 KiB
Dart

import 'dart:io';
import 'package:aslan/chatvibe_data/sources/local/user_manager.dart';
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:provider/provider.dart';
import '../../../app_localizations.dart';
import '../../../chatvibe_core/constants/at_global_config.dart';
import '../../../chatvibe_core/constants/at_screen.dart';
import '../../../chatvibe_core/routes/at_fluro_navigator.dart';
import '../../../chatvibe_core/utilities/at_loading_manager.dart';
import '../../../chatvibe_data/sources/repositories/user_repository_impl.dart';
import '../../../chatvibe_domain/models/res/at_web_pay_commodity_res.dart';
import '../../../chatvibe_domain/models/res/at_web_pay_user_profile_res.dart';
import '../../../chatvibe_managers/apple_payment_manager.dart';
import '../../../chatvibe_managers/google_payment_manager.dart';
import '../../../chatvibe_managers/user_profile_manager.dart';
import '../../../chatvibe_ui/components/appbar/chatvibe_appbar.dart';
import '../../../chatvibe_ui/components/at_compontent.dart';
import '../../../chatvibe_ui/components/at_debounce_widget.dart';
import '../../../chatvibe_ui/components/text/at_text.dart';
import '../../../chatvibe_ui/theme/chatvibe_theme.dart';
import '../../../main.dart';
import '../../index/main_route.dart';
import '../wallet_route.dart';
import 'at_pay_custom_price_item_page.dart';
import 'at_pay_google_apple_price_item_page.dart';
import 'contry/pay_select_country_page.dart';
class ATRechargePageV2 extends StatefulWidget {
@override
_ATRechargePageV2State createState() => _ATRechargePageV2State();
}
class _ATRechargePageV2State extends State<ATRechargePageV2> with RouteAware {
bool _hasPersmission = false;
CountryList? _selectedCountry;
List<CountryList> _countryList = [];
List<Channels> _channels = [];
List<Commodity> _commodity = [];
String _selectedChannelId = "";
String _regionId = "";
@override
void initState() {
super.initState();
Provider.of<ChatVibeUserProfileManager>(context, listen: false).balance();
if (Platform.isAndroid) {
Provider.of<GooglePaymentManager>(context, listen: false).init(context);
} else if (Platform.isIOS) {
Provider.of<ApplePaymentManager>(context, listen: false).init(context);
}
if ((Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.agent ??
false) ||
(Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.anchor ??
false) ||
(Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.bd ??
false) ||
(Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.admin ??
false) ||
(Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.manager ??
false) ||
(Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.superAdmin ??
false) ||
(Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.bdLeader ??
false) ||
(Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.freightAgent ??
false) ||
(Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.superFreightAgent ??
false)) {
_hasPersmission = true;
}
_loadData();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
// 注册路由观察
final route = ModalRoute.of(context);
if (route is PageRoute) {
routeObserver.subscribe(this, route);
}
}
@override
void didPush() {
// 路由被推入时调用
_updateVisibility(true);
}
@override
void didPopNext() {
// 当从下一个页面返回时调用
_updateVisibility(true);
}
@override
void didPushNext() {
// 当推入下一个页面时调用
_updateVisibility(false);
}
@override
void didPop() {
// 路由弹出时调用
_updateVisibility(false);
}
void _updateVisibility(bool isVisible) {
if (isVisible) {
Provider.of<ChatVibeUserProfileManager>(context, listen: false).balance();
} else {}
}
@override
void dispose() {
routeObserver.unsubscribe(this);
super.dispose();
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Image.asset(
"atu_images/index/at_icon_recharge_bg.png",
width: ScreenUtil().screenWidth,
height: ScreenUtil().screenHeight,
fit: BoxFit.fill,
),
Scaffold(
backgroundColor: Colors.transparent,
resizeToAvoidBottomInset: false,
appBar: ChatVibeStandardAppBar(
title: ATAppLocalizations.of(context)!.recharge,
backButtonColor: Colors.white,
actions: [
// GestureDetector(
// child: Container(
// margin: EdgeInsetsDirectional.only(end: 15.w),
// child: Image.asset(
// "atu_images/index/at_icon_recharge_recod.png",
// width: 24.w,
// height: 24.w,
// ),
// ),
// onTap: () {
// showGeneralDialog(
// context: context,
// barrierLabel: '',
// barrierDismissible: true,
// transitionDuration: Duration(milliseconds: 300),
// barrierColor: Colors.transparent,
// pageBuilder: (
// BuildContext context,
// Animation animation,
// Animation secondaryAnimation,
// ) {
// return GestureDetector(
// behavior: HitTestBehavior.opaque,
// onTap: () {
// Navigator.pop(context);
// setState(() {});
// },
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.end,
// children: <Widget>[
// SizedBox(height: height(68)),
// Row(
// children: [
// Spacer(),
// GestureDetector(
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white30,
// borderRadius: BorderRadius.circular(4),
// ),
// padding: EdgeInsets.symmetric(
// horizontal: 8.w,
// vertical: 3.w,
// ),
// child: Column(
// crossAxisAlignment:
// CrossAxisAlignment.start,
// children: [
// SizedBox(height: 5.w),
// GestureDetector(
// child: text(
// ATAppLocalizations.of(
// context,
// )!.goldListort,
// textColor: Colors.white70,
// fontSize: 14.sp,
// ),
// onTap: () {
// Navigator.of(context).pop();
// ATNavigatorUtils.push(
// context,
// WalletRoute.goldRecord,
// replace: false,
// );
// },
// ),
// // SizedBox(height: 5.w),
// // Container(
// // color: Colors.black26,
// // width: 110.w,
// // height: 0.5.w,
// // ),
// // SizedBox(height: 5.w,),
// // text(
// // ATAppLocalizations.of(
// // context,
// // )!.rechargeList,
// // textColor: Colors.black38,
// // fontSize: 14.sp,
// // ),
// SizedBox(height: 5.w),
// ],
// ),
// ),
// onTap: () {},
// ),
// SizedBox(width: 10.w),
// ],
// ),
// Expanded(child: SizedBox(width: width(1))),
// ],
// ),
// );
// },
// );
// },
// ),
],
),
body: SafeArea(
top: false,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(height: 25.w),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
height: 85.w,
width: ScreenUtil().screenWidth * 0.9,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/index/at_icon_wallet_bg.png",
),
fit: BoxFit.fill,
),
),
child: Stack(
alignment: AlignmentDirectional.centerEnd,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
children: [
SizedBox(width: 6.w),
Image.asset(
"atu_images/general/at_icon_jb.png",
width: 20.w,
height: 20.w,
),
SizedBox(width: 5.w),
text(
ATAppLocalizations.of(context)!.balance,
fontSize: 16.sp,
fontWeight: FontWeight.w600,
textColor: Colors.white,
),
],
),
SizedBox(height: 5.w),
Consumer<ChatVibeUserProfileManager>(
builder: (context, ref, child) {
return Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(width: 15.w),
text(
"${ref.myBalance}",
textColor: Colors.white,
fontSize: 18.sp,
),
],
);
},
),
],
),
ATDebounceWidget(
child: Container(
margin: EdgeInsetsDirectional.only(end: 18.w),
padding: EdgeInsets.symmetric(
horizontal: 8.w,
vertical: 5.w,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
gradient: LinearGradient(
colors: [
Color(0xffFFECD0),
Color(0xffEAB66B),
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
child: text(
ATAppLocalizations.of(context)!.rechargeRecords,
fontSize: 12.sp,
fontWeight: FontWeight.w600,
textColor: Colors.white,
),
),
onTap: () {
ATNavigatorUtils.push(
context,
WalletRoute.goldRecord,
replace: false,
);
},
),
],
),
),
],
),
SizedBox(height: 25.w),
Expanded(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 8.w),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8.w),
topRight: Radius.circular(8.w),
),
),
child: SingleChildScrollView(
child: Column(
children: [
SizedBox(height: 8.w),
_hasPersmission
? Row(
children: [
SizedBox(width: 5.w),
text(
ATAppLocalizations.of(
context,
)!.selectACountry,
textColor: Colors.black,
fontSize: 13.sp,
),
Spacer(),
GestureDetector(
child: Container(
alignment: Alignment.center,
width: 65.w,
height: 23.w,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/general/at_icon_pay_select_country_bg.png",
),
fit: BoxFit.fill,
),
),
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
netImage(
url:
_selectedCountry
?.country
?.nationalFlag ??
"",
borderRadius: BorderRadius.all(
Radius.circular(3.w),
),
width: 19.w,
height: 14.w,
),
SizedBox(width: 5.w),
Container(
constraints: BoxConstraints(
maxWidth: 32.w,
),
child: text(
_selectedCountry
?.country
?.aliasName ??
"",
textColor: Colors.white,
fontSize: 9.sp,
fontWeight: FontWeight.bold,
),
),
],
),
),
onTap: () {
SmartDialog.show(
tag: "showPaySelectCountryDialog",
alignment: Alignment.bottomCenter,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return PaySelectCountryPage(
_countryList,
_selectedCountry,
(se) {
if (_selectedCountry?.id !=
se.id) {
_selectedCountry = se;
setState(() {});
refreshWebPayCommodity();
}
},
);
},
);
},
),
SizedBox(width: 10.w),
],
)
: Container(),
SizedBox(height: 8.w),
Column(
spacing: 10.w,
children: [
if (_hasPersmission)
ATDebounceWidget(
child: Stack(
children: [
Container(
margin: EdgeInsets.symmetric(
horizontal: 8.w,
),
height: 55.w,
padding: EdgeInsets.symmetric(
horizontal: 8.w,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
8.w,
),
color:
_selectedChannelId == "-1"
? ChatVibeTheme.primaryLight
.withOpacity(0.1)
: Colors.white,
border:
_selectedChannelId == "-1"
? Border.all(
color:
ChatVibeTheme
.primaryLight,
)
: Border.all(
color: Colors.white,
),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(
0.2,
),
spreadRadius: 2,
blurRadius: 3,
offset: Offset(
0,
1,
), // changes position of shadow
),
],
),
child: Row(
children: [
Image.asset(
"atu_images/general/at_icon_logo.png",
width: 35.w,
height: 35.w,
),
SizedBox(width: 6.w),
text(
"Aslan",
textColor: Colors.black,
fontSize: 16.sp,
fontWeight: FontWeight.bold,
),
SizedBox(width: 6.w),
text(
ATAppLocalizations.of(
context,
)!.officialRechargeAgent,
textColor: Colors.black,
fontSize: 13.sp,
),
],
),
),
PositionedDirectional(
end: 0,
child: Container(
margin: EdgeInsets.symmetric(
horizontal: 8.w,
),
padding: EdgeInsets.symmetric(
horizontal: 6.w,
vertical: 2.w,
),
decoration: BoxDecoration(
borderRadius:
BorderRadiusDirectional.only(
topEnd: Radius.circular(8.w),
bottomStart: Radius.circular(
8.w,
),
),
gradient: LinearGradient(
colors: [
Color(0xffFF3639),
Color(0xffFF787A),
],
),
),
child: text(
ATAppLocalizations.of(
context,
)!.biggestDiscount,
textColor: Colors.white,
fontSize: 12.sp,
),
),
),
],
),
onTap: () {
setState(() {
_selectedChannelId = "-1";
});
ATNavigatorUtils.push(
context,
WalletRoute.agentList,
replace: false,
);
},
),
if (_hasPersmission)
Column(
spacing: 10.w,
children: List.generate(_channels.length, (
index,
) {
return GestureDetector(
child: Container(
margin: EdgeInsets.symmetric(
horizontal: 8.w,
),
height: 55.w,
padding: EdgeInsets.symmetric(
horizontal: 12.w,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
8.w,
),
color:
_selectedChannelId ==
_channels[index]
.channel
?.id
? ChatVibeTheme.primaryLight
.withOpacity(0.1)
: Colors.white,
border:
_selectedChannelId ==
_channels[index]
.channel
?.id
? Border.all(
color:
ChatVibeTheme
.primaryLight,
)
: Border.all(
color: Colors.white,
),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(
0.2,
),
spreadRadius: 2,
blurRadius: 3,
offset: Offset(
0,
1,
), // changes position of shadow
),
],
),
child: Row(
children: [
netImage(
url:
_channels[index]
.channel
?.channelIcon ??
"",
width: 35.w,
height: 35.w,
fit: BoxFit.contain,
),
SizedBox(width: 6.w),
text(
_channels[index]
.channel
?.channelName ??
"",
textColor: Colors.black,
fontSize: 16.sp,
fontWeight: FontWeight.bold,
),
],
),
),
onTap: () {
setState(() {
_selectedChannelId =
_channels[index].channel?.id ??
"";
});
SmartDialog.show(
tag: "showPayPriceItemDialog",
alignment: Alignment.bottomCenter,
debounce: true,
animationType:
SmartAnimationType.fade,
builder: (_) {
return ATPayCustomPriceItemPage(
_channels[index],
_commodity,
);
},
);
},
);
}),
),
if (Platform.isAndroid)
GestureDetector(
child: Container(
margin: EdgeInsets.symmetric(
horizontal: 8.w,
),
height: 55.w,
padding: EdgeInsets.symmetric(
horizontal: 12.w,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color:
_selectedChannelId == "-2"
? ChatVibeTheme.primaryLight
.withOpacity(0.1)
: Colors.white,
border:
_selectedChannelId == "-2"
? Border.all(
color:
ChatVibeTheme.primaryLight,
)
: Border.all(color: Colors.white),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.2),
spreadRadius: 2,
blurRadius: 3,
offset: Offset(
0,
1,
), // changes position of shadow
),
],
),
child: Row(
children: [
Image.asset(
"atu_images/general/at_icon_google_pay.png",
width: 35.w,
height: 35.w,
fit: BoxFit.contain,
),
SizedBox(width: 6.w),
text(
ATAppLocalizations.of(
context,
)!.googlePay,
textColor: Colors.black,
fontSize: 16.sp,
fontWeight: FontWeight.bold,
),
],
),
),
onTap: () {
setState(() {
_selectedChannelId = "-2";
});
SmartDialog.show(
tag: "showPayPriceItemDialog",
alignment: Alignment.bottomCenter,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return ATPayGoogleApplePriceItemPage(
selectedChannelId: "-2",
);
},
);
},
),
if (Platform.isIOS)
GestureDetector(
child: Container(
margin: EdgeInsets.symmetric(
horizontal: 8.w,
),
height: 55.w,
padding: EdgeInsets.symmetric(
horizontal: 12.w,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color:
_selectedChannelId == "-3"
? ChatVibeTheme.primaryLight
.withOpacity(0.1)
: Colors.white,
border:
_selectedChannelId == "-3"
? Border.all(
color:
ChatVibeTheme.primaryLight,
)
: Border.all(color: Colors.white),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.2),
spreadRadius: 2,
blurRadius: 3,
offset: Offset(
0,
1,
), // changes position of shadow
),
],
),
child: Row(
children: [
Image.asset(
"atu_images/general/at_icon_apple_pay.png",
width: 35.w,
height: 35.w,
fit: BoxFit.contain,
),
SizedBox(width: 6.w),
text(
ATAppLocalizations.of(
context,
)!.appStore,
textColor: Colors.black,
fontSize: 16.sp,
fontWeight: FontWeight.bold,
),
],
),
),
onTap: () {
setState(() {
_selectedChannelId = "-3";
});
SmartDialog.show(
tag: "showPayPriceItemDialog",
alignment: Alignment.bottomCenter,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return ATPayGoogleApplePriceItemPage(
selectedChannelId: "-3",
);
},
);
},
),
SizedBox(height: 5.w),
],
),
],
),
),
),
),
],
),
),
),
],
);
}
void _loadData() async {
String type = "GOLD";
if (Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.freightAgent ??
false) {
type = "FREIGHT_GOLD";
} else if (Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.superFreightAgent ??
false) {
type = "FREIGHT_GOLD_SUPER";
}
try {
ATLoadingManager.exhibitOperation();
var webPayUserProfileRes = await AccountRepository().webPayUserProfile(
userId: AccountStorage().getCurrentUser()?.userProfile?.id ?? "",
account: AccountStorage().getCurrentUser()?.userProfile?.account ?? "",
type: type,
);
_countryList = webPayUserProfileRes.countryList ?? [];
_selectedCountry = webPayUserProfileRes.countryList?.first;
String payCountryId = _selectedCountry?.id ?? "";
_regionId = webPayUserProfileRes.regionId ?? "";
setState(() {});
var webPayCommodityRes = await AccountRepository().webPayCommodity(
payCountryId: payCountryId,
type: type,
regionId: webPayUserProfileRes.regionId,
);
_channels = webPayCommodityRes.channels ?? [];
_commodity = webPayCommodityRes.commodity ?? [];
setState(() {});
ATLoadingManager.veilRoutine();
} catch (e) {
ATLoadingManager.veilRoutine();
}
}
void refreshWebPayCommodity() async {
ATLoadingManager.exhibitOperation();
String type = "GOLD";
if (Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.freightAgent ??
false) {
type = "FREIGHT_GOLD";
} else if (Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.superFreightAgent ??
false) {
type = "FREIGHT_GOLD_SUPER";
}
try {
var webPayCommodityRes = await AccountRepository().webPayCommodity(
payCountryId: _selectedCountry?.id,
type: type,
regionId: _regionId,
);
_selectedChannelId = "";
_channels = webPayCommodityRes.channels ?? [];
_commodity = webPayCommodityRes.commodity ?? [];
setState(() {});
ATLoadingManager.veilRoutine();
} catch (_) {
ATLoadingManager.veilRoutine();
}
}
}