fix: 修改客服,增加sdk使用;增加邀请链接短链,升级flutter到3.35.0,Dart 3.9.0
This commit is contained in:
@@ -79,13 +79,8 @@ class HIMenuView extends GetView<HIMenuController> implements HasSwipeConfig {
|
||||
mainAxisSize: MainAxisSize.min, // 让 Column 包裹内容
|
||||
children: [
|
||||
Obx(() {
|
||||
final account =
|
||||
KRAppRunData.getInstance().kr_account.value;
|
||||
final isDeviceLogin =
|
||||
account != null && account.startsWith('9000');
|
||||
final accountText = (account == null || isDeviceLogin)
|
||||
? '待绑定'
|
||||
: '${KRAppRunData.getInstance().kr_account.value.toString()}';
|
||||
final authType = KRAppRunData.getInstance().kr_authType.value;
|
||||
final accountText = authType == 'email' ? '${KRAppRunData.getInstance().kr_account.value.toString()}' : '待绑定';
|
||||
return UserInfoCard(
|
||||
controller: controller,
|
||||
userId: accountText,
|
||||
|
||||
@@ -1,21 +1,69 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:chatwoot_flutter_sdk/chatwoot_sdk.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:kaer_with_panels/app/common/app_run_data.dart';
|
||||
|
||||
/// 客服2(Chatwoot)控制器
|
||||
class KRChatwootController extends GetxController {
|
||||
/// Chatwoot 客服链接
|
||||
final String kr_chatwootUrl = 'https://app.chatwoot.com/widget?website_token=YXQmh16ymNYW1SVybhnoQQ9w';
|
||||
import 'package:kaer_with_panels/app/utils/kr_secure_storage.dart';
|
||||
|
||||
/// 加载状态
|
||||
final RxBool kr_isLoading = true.obs;
|
||||
class KRChatwootController {
|
||||
// 配置参数
|
||||
final String baseUrl = 'https://app.chatwoot.com';
|
||||
final String inboxIdentifier = 'YXQmh16ymNYW1SVybhnoQQ9w';
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
KRChatwootController() {
|
||||
KRSecureStorage().kr_readData(key: 'USER_INFO').then((value) {
|
||||
print('KRSecureStorage_keyUserInfo: $value');
|
||||
});
|
||||
}
|
||||
|
||||
/// 设置加载状态
|
||||
/// [loading] 是否正在加载
|
||||
void kr_setLoading(bool loading) {
|
||||
kr_isLoading.value = loading;
|
||||
/// 获取当前用户信息
|
||||
/// 建议从你的全局 UserState 或本地存储中动态获取
|
||||
ChatwootUser get chatUser {
|
||||
final appRunData = KRAppRunData.getInstance();
|
||||
final userId = appRunData.kr_userId.value?.toString();
|
||||
final deviceId = appRunData.deviceId;
|
||||
final account = appRunData.kr_account.value;
|
||||
|
||||
// 优先使用 userId 作为唯一标识,如果没有则使用 deviceId
|
||||
final identifier = userId ?? deviceId ?? 'unknown_user';
|
||||
|
||||
// 名字使用账号,如果没有则显示 Guest
|
||||
final name = account ?? 'Guest';
|
||||
|
||||
// 邮箱如果是邮箱格式则使用,否则构造一个唯一的虚拟邮箱以满足格式要求
|
||||
String email = '';
|
||||
if (account != null && account.contains('@')) {
|
||||
email = account;
|
||||
} else {
|
||||
email = '$identifier@hifastvpn.com';
|
||||
}
|
||||
|
||||
return ChatwootUser(
|
||||
identifier: identifier, // 必填:用于关联历史聊天记录
|
||||
name: name,
|
||||
email: email,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// 处理文件/附件选择逻辑
|
||||
Future<List<String>> onFilePicker() async {
|
||||
try {
|
||||
final result = await FilePicker.platform.pickFiles(
|
||||
allowMultiple: true,
|
||||
type: FileType.any,
|
||||
);
|
||||
|
||||
if (result != null && result.paths.isNotEmpty) {
|
||||
// 过滤掉 null 路径并转换为 String 列表
|
||||
return result.paths.whereType<String>().toList();
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint("KRChatwoot: 文件选择失败 - $e");
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
// 可以在这里添加更多业务方法,例如:
|
||||
// void trackEvent(String eventName) { ... }
|
||||
}
|
||||
@@ -1,52 +1,71 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:kaer_with_panels/app/widgets/hi_base_scaffold.dart';
|
||||
import 'package:kaer_with_panels/app/widgets/kr_simple_loading.dart';
|
||||
import 'package:chatwoot_flutter_sdk/chatwoot_sdk.dart';
|
||||
import '../controllers/kr_chatwoot_controller.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
/// 客服2(Chatwoot)视图页面
|
||||
class KRChatwootView extends GetView<KRChatwootController> {
|
||||
class KRChatwootView extends StatefulWidget {
|
||||
const KRChatwootView({super.key});
|
||||
|
||||
@override
|
||||
State<KRChatwootView> createState() => _KRChatwootViewState();
|
||||
}
|
||||
|
||||
class _KRChatwootViewState extends State<KRChatwootView> {
|
||||
// 实例化控制器
|
||||
final KRChatwootController _controller = KRChatwootController();
|
||||
|
||||
// 控制加载遮罩状态
|
||||
bool _isPageLoading = true;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return HIBaseScaffold(
|
||||
showBack: true,
|
||||
topContentAreaHeight: 0,
|
||||
child: Stack(
|
||||
children: [
|
||||
InAppWebView(
|
||||
initialUrlRequest: URLRequest(
|
||||
url: WebUri(controller.kr_chatwootUrl),
|
||||
return Scaffold(
|
||||
// 设置背景色为白色,确保顶部 20px 区域不漏出底色
|
||||
backgroundColor: Colors.white,
|
||||
body: Padding(
|
||||
// 在这里设置顶部 20px 的间距
|
||||
padding: const EdgeInsets.only(top: 20.0),
|
||||
child: Stack(
|
||||
children: [
|
||||
ChatwootWidget(
|
||||
baseUrl: _controller.baseUrl,
|
||||
websiteToken: _controller.inboxIdentifier,
|
||||
user: _controller.chatUser,
|
||||
locale: "zh_CN",
|
||||
onAttachFile: _controller.onFilePicker,
|
||||
onLoadStarted: () {
|
||||
debugPrint("KRChatwoot: 开始加载 SDK");
|
||||
},
|
||||
closeWidget: () {
|
||||
print('返回');
|
||||
Get.back();
|
||||
},
|
||||
onLoadCompleted: () {
|
||||
debugPrint("KRChatwoot: SDK 加载完毕");
|
||||
if (mounted) {
|
||||
setState(() => _isPageLoading = false);
|
||||
}
|
||||
},
|
||||
),
|
||||
initialSettings: InAppWebViewSettings(
|
||||
javaScriptEnabled: true,
|
||||
domStorageEnabled: true,
|
||||
allowsInlineMediaPlayback: true,
|
||||
),
|
||||
onLoadStart: (controller, url) {
|
||||
this.controller.kr_setLoading(true);
|
||||
},
|
||||
onLoadStop: (controller, url) {
|
||||
this.controller.kr_setLoading(false);
|
||||
},
|
||||
onReceivedError: (controller, request, error) {
|
||||
this.controller.kr_setLoading(false);
|
||||
},
|
||||
),
|
||||
Obx(() {
|
||||
if (controller.kr_isLoading.value) {
|
||||
return const Center(
|
||||
child: KRSimpleLoading(
|
||||
size: 40,
|
||||
|
||||
// 加载中的占位图
|
||||
if (_isPageLoading)
|
||||
Container(
|
||||
color: Colors.white,
|
||||
child: const Center(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
CircularProgressIndicator(strokeWidth: 2),
|
||||
const SizedBox(height: 16),
|
||||
Text("正在连接客服...", style: TextStyle(color: Colors.grey)),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return const SizedBox.shrink();
|
||||
}),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -121,12 +121,8 @@ class KRDeleteAccountView extends GetView<KRDeleteAccountController> {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Obx(() {
|
||||
final account = KRAppRunData.getInstance().kr_account.value;
|
||||
final isDeviceLogin =
|
||||
account != null && account.startsWith('9000');
|
||||
final accountText = (account ==null || isDeviceLogin)
|
||||
? '待绑定'
|
||||
: '${KRAppRunData.getInstance().kr_account.value.toString()}';
|
||||
final authType = KRAppRunData.getInstance().kr_authType.value;
|
||||
final accountText = authType == 'email' ? '${KRAppRunData.getInstance().kr_account.value.toString()}' : '待绑定';
|
||||
return Text(
|
||||
accountText,
|
||||
style: TextStyle(
|
||||
|
||||
@@ -10,6 +10,7 @@ import 'package:share_plus/share_plus.dart';
|
||||
import 'package:kaer_with_panels/app/utils/kr_common_util.dart';
|
||||
import 'package:kaer_with_panels/app/widgets/hi_base_scaffold.dart';
|
||||
import 'package:kaer_with_panels/app/widgets/hi_help_entrance.dart';
|
||||
import 'package:kaer_with_panels/app/common/app_run_data.dart';
|
||||
|
||||
class KRInviteView extends GetView<KRInviteController> {
|
||||
const KRInviteView({super.key});
|
||||
@@ -123,14 +124,14 @@ class KRInviteView extends GetView<KRInviteController> {
|
||||
color: Colors.white,
|
||||
),
|
||||
onPressed: () {
|
||||
|
||||
if (controller.kr_referCode.value.isNotEmpty) {
|
||||
final code = controller.kr_referCode.value;
|
||||
final text = '#您的好友邀请您使用Hi快网络加速器\n'
|
||||
'安装完毕后,在软件内<邀请好友>页面粘贴以下邀请码\n'
|
||||
'$code\n'
|
||||
'您和您的好友将会分别获得3天免费时长\n\n'
|
||||
'点击此处进入下载页面\n'
|
||||
'或在浏览器输入hifastvpn.com下载#';
|
||||
'首次付款后您和您的好友将会分别获得3天免费时长\n'
|
||||
'请在浏览器输入${KRAppRunData.getInstance().shareUrl.value}下载#';
|
||||
if (GetPlatform.isIOS) {
|
||||
Share.share(text, subject: '直接分享Hi快VPN邀请链接');
|
||||
} else {
|
||||
|
||||
@@ -86,12 +86,8 @@ class KRLoginView extends GetView<KRLoginController> {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Obx(() {
|
||||
final account = KRAppRunData.getInstance().kr_account.value;
|
||||
final isDeviceLogin =
|
||||
account != null && account.startsWith('9000');
|
||||
final accountText = (account == null || isDeviceLogin)
|
||||
? '待绑定'
|
||||
: '${KRAppRunData.getInstance().kr_account.value.toString()}';
|
||||
final authType = KRAppRunData.getInstance().kr_authType.value;
|
||||
final accountText = authType == 'email' ? '${KRAppRunData.getInstance().kr_account.value.toString()}' : '待绑定';
|
||||
|
||||
return Text(
|
||||
accountText,
|
||||
|
||||
Reference in New Issue
Block a user