164 lines
5.6 KiB
Dart
Executable File

import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/mine/mall/webview/webview_logic.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_entity.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_state.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../../../tools/wechat/pay/wx_pay_tool.dart';
import '../../../tools/wechat/wechatManageTool.dart';
class AdvancedFeaturesWebLogic extends BaseGetXController {
late AdvancedFeaturesWebState state = AdvancedFeaturesWebState();
DateTime? _lastPressedAt; // 记录上一次按下返回键的时间
//获取购买跳转地址
Future<void> getVipBuyURLRequest() async {
final AdvancedFeaturesWebEntity entity =
await ApiRepository.to.getServicePackageBuyUrl();
if (entity.errorCode!.codeIsSuccessful) {
if (state.webBuyType.value == XSConstantMacro.webBuyTypeVip) {
state.webBuyUrl.value = entity.data!.vipBuyUrl!;
state.webBuyTitle.value = '高级功能'.tr;
} else if (state.webBuyType.value == XSConstantMacro.webBuyTypeAuth) {
state.webBuyUrl.value = entity.data!.cloudauthBuyUrl!;
state.webBuyTitle.value = '实名认证'.tr;
} else if (state.webBuyType.value == XSConstantMacro.webBuyTypeSMS) {
state.webBuyUrl.value = entity.data!.smsBuyUrl!;
state.webBuyTitle.value = '短信购买'.tr;
} else if (state.webBuyType.value == XSConstantMacro.webBuyTypeEmail) {
state.webBuyUrl.value = entity.data!.emailBuyUrl!;
state.webBuyTitle.value = '邮件购买'.tr;
} else if (state.webBuyType.value == XSConstantMacro.webBuyTypeShop) {
state.webBuyUrl.value = entity.data!.shopList!;
state.webBuyTitle.value = '商城购买'.tr;
}else if (state.webBuyType.value == XSConstantMacro.webBuyTypeCloudStorage) {
state.webBuyUrl.value = entity.data!.cloudStorage!;
state.webBuyTitle.value = '云存购买'.tr;
}
state.webBuyView.setNavigationDelegate(
NavigationDelegate(
onProgress: (int progress) {
// Update loading bar.
state.webProgress.value = progress / 100;
},
onPageStarted: (String url) {
state.webProgress.value = 0.0;
},
onPageFinished: (String url) {
state.webProgress.value = 1.0;
},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) async {
//路由跳转逻辑
if (WebViewLogic.judgePaySchemes(request.url)) {
await WebViewLogic.runScheme(request.url);
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
),
);
state.webBuyView.loadRequest(Uri.parse(state.webBuyUrl.value));
state.webBuyView.addJavaScriptChannel(
'FlutterBridge',
onMessageReceived: (JavaScriptMessage message) async {
flutterBridge(message);
},
);
}
}
//监听webview的调用
Future<void> flutterBridge(JavaScriptMessage message) async {
final dynamic obj = jsonDecode(message.message);
if (obj is! Map && obj['action'] is String) {
return;
}
final String action = obj['action'];
final dynamic data = obj['data'];
final String? callFun = obj['callFun'];
switch (action) {
case 'WechatPayParams':
//微信支付
WechatManageTool.getAppInfo(() {
wxPay(data, callFun);
});
// wxPay(data, callFun);
break;
}
}
//微信支付
Future<void> wxPay(dynamic data, String? callFun) async {
WxPayTool.pay(WxPayTool.mapToPayment(data), (WeChatResponse response) {
if (response is WeChatPaymentResponse) {
final Map data = {
'type': response.type,
'extData': response.extData,
'errCode': response.errCode,
'errStr': response.errStr,
};
state.webBuyView.runJavaScript(
'window.$callFun(`${json.encode(data)}`)',
);
}
});
}
//判断webview 是否可以有路由可以回退,无则退出当前页面
Future<bool> canGoBack(bool didPop) async {
final bool canGoBack = await state.webBuyView.canGoBack();
if (canGoBack) {
await state.webBuyView.goBack();
} else if (state.allowReturn) {
Get.back(result: true);
} else {
if (_lastPressedAt == null ||
DateTime.now().difference(_lastPressedAt!) >
const Duration(seconds: 2)) {
// 如果两次返回键时间间隔大于 2 秒,则提示再次按下返回键退出
_lastPressedAt = DateTime.now();
showToast('${'再返回一次退出'.tr}${F.title}');
return false;
}
SystemNavigator.pop();
return true;
}
refreshGoBack();
return false;
}
//刷新当前路由状态
void refreshGoBack() {
//如果属于一直返回按钮,则根据是否有路由可以回退刷新
if (state.allowReturn) {
return;
}
state.webBuyView.canGoBack().then((bool value) {
state.canGoBack = value;
update();
});
}
@override
Future<void> onReady() async {
super.onReady();
}
@override
void onInit() {
super.onInit();
getVipBuyURLRequest();
}
}