import 'dart:io'; import 'package:dart_json_mapper/dart_json_mapper.dart'; import 'package:get/get.dart'; import 'package:naiyouwl/app/controller/GlobalController.dart'; import 'package:naiyouwl/app/controller/controllers.dart'; import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; import '../../../common/LogHelper.dart'; import '../../../common/SharedPreferencesUtil.dart'; import '../../../component/connection_status.dart'; import '../../../data/model/LocalUser.dart'; import '../../../data/model/NodeMode.dart'; import '../../../data/model/SysConfig.dart'; import '../../../data/model/UserMode.dart'; import '../../../network/api_service.dart'; import '../../../routes/app_pages.dart'; enum ImageType { CUSTOMER, PROMOTION, TUTORIAL, RENEWAL, } class HomeController extends GetxController with TrayListener,WindowListener { //TODO: Implement HomeController var isLoading = false.obs; var sysConfig = SysConfig().obs; var localUsers = LocalUser().obs; var userMode = User().obs; var errorMsg = ''.obs; var selectNode = '选择节点'.obs; var connectStatus = Rx(ConnectionStatus.disconnected); var nodeModes = []; late final GlobalController globalController = controllers.global; final Map imageMap = { ImageType.CUSTOMER: "assets/images/main/customer.png", ImageType.PROMOTION: "assets/images/main/promotion.png", ImageType.TUTORIAL: "assets/images/main/tutorial.png", ImageType.RENEWAL: "assets/images/main/renewal.png", }; void onImageTap(ImageType type) { if(type == ImageType.CUSTOMER){ } else if (type == ImageType.PROMOTION){ } else if (type == ImageType.TUTORIAL){ } else if (type == ImageType.RENEWAL){ } LogHelper().d("${imageMap[type]} tapped as ${type.toString().split('.').last}"); } void updateStatus(ConnectionStatus newStatus) { connectStatus.value = newStatus; } void SetSysProxy() async{ if(connectStatus.value == ConnectionStatus.stopped){ updateStatus(ConnectionStatus.disconnected); // await Get.find().clearSystemProxy(); return; } updateStatus(ConnectionStatus.connecting); // await Get.find().makeClash(globalController.nodeModes); // await Get.find().chageProxyConfig(); // // Future.delayed(const Duration(seconds: 3), () async { // if(!Get.find().isSystemProxy()){ // await Get.find().setSystemProxy(); // } else { // await Get.find().clearSystemProxy(); // } // updateStatus(ConnectionStatus.stopped); // }); } Future fetchSysConfig() async { try { String? data = await SharedPreferencesUtil().getString("sysconfig"); if(data != null){ sysConfig.value =JsonMapper.deserialize(data)!; } } catch (e) { errorMsg.value = e.toString(); } finally { } } Future fetchUserinfo() async { try { isLoading.value = true; userMode.value = await ApiService().userinfo("/api/client/v4/userinfo"); await globalController.fetchNodes(); } catch (e) { errorMsg.value = e.toString(); } finally { isLoading.value = false; } } Future fetchNode() async { try { isLoading.value = true; await globalController.fetchNodes(); } catch (e) { errorMsg.value = e.toString(); } finally { isLoading.value = false; } } //await SharedPreferencesUtil().setObject("localUser", userModes.toJson()); Future fetchLocalUser() async { try { String? userdata = await SharedPreferencesUtil().getString("localUser"); if(userdata != null){ localUsers.value = JsonMapper.deserialize(userdata)!; } } catch (e) { errorMsg.value = e.toString(); } finally { } } final count = 0.obs; @override void onInit() { super.onInit(); //globalController = Get.put(GlobalController()); fetchSysConfig(); fetchLocalUser(); fetchUserinfo(); windowManager.addListener(this); trayManager.addListener(this); } @override void onReady() { super.onReady(); } @override void onClose() { super.onClose(); } @override void onWindowClose() { super.onWindowClose(); windowManager.hide(); } @override void onTrayIconMouseDown() { // windowManager.focus(); windowManager.show(); } @override void onTrayIconRightMouseDown() { super.onTrayIconRightMouseDown(); trayManager.popUpContextMenu(); } @override void onTrayMenuItemClick(MenuItem menuItem) { switch (menuItem.key) { case 'exit': windowManager.close().then((value) async { //await Get.find().closeClashDaemon(); exit(0); }); break; case 'show': windowManager.focus(); windowManager.show(); } } bool GetEnable() => userMode.value.enable == 1; String GetUserName() => localUsers.value.email.toString(); String GetExpiredAt() => "到期时间:${userMode.value.expiredAt}"; String GetTraffic() => "用户流量:${userMode.value.unusedTraffic}"; String GetNode() => selectNode.value; void RouteNode() => Get.toNamed(Routes.NODE); }