import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/login_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models/common/theme_type.dart'; import 'package:PiliPlus/models/user/info.dart'; import 'package:PiliPlus/models/user/stat.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:hive/hive.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; class MineController extends GetxController { // 用户信息 头像、昵称、lv Rx userInfo = UserInfoData().obs; // 用户状态 动态、关注、粉丝 Rx userStat = UserStat().obs; RxBool isLogin = false.obs; Rx themeType = ThemeType.system.obs; Box get setting => GStorage.setting; static RxBool anonymity = (Accounts.account.isNotEmpty && !Accounts.get(AccountType.heartbeat).isLogin) .obs; ThemeType get nextThemeType => ThemeType.values[(themeType.value.index + 1) % ThemeType.values.length]; @override onInit() { super.onInit(); dynamic userInfoCache = GStorage.userInfo.get('userInfoCache'); if (userInfoCache != null) { userInfo.value = userInfoCache; isLogin.value = true; } } onLogin([bool longPress = false]) async { if (!isLogin.value || longPress) { Get.toNamed('/loginPage', preventDuplicates: false); } else { int mid = userInfo.value.mid!; String face = userInfo.value.face!; Get.toNamed('/member?mid=$mid', arguments: {'face': face}, preventDuplicates: false); } } Future queryUserInfo() async { if (!isLogin.value) { return {'status': false}; } var res = await UserHttp.userInfo(); if (res['status']) { if (res['data'].isLogin) { userInfo.value = res['data']; GStorage.userInfo.put('userInfoCache', res['data']); isLogin.value = true; } else { LoginUtils.onLogoutMain(); return; } } else { SmartDialog.showToast(res['msg']); if (res['msg'] == '账号未登录') { LoginUtils.onLogoutMain(); return; } } queryUserStatOwner(); } Future queryUserStatOwner() async { var res = await UserHttp.userStatOwner(); if (res['status']) { userStat.value = res['data']; } } static onChangeAnonymity(BuildContext context) { if (Accounts.account.isEmpty) { SmartDialog.showToast('请先登录'); return; } anonymity.value = !anonymity.value; if (anonymity.value) { SmartDialog.show( clickMaskDismiss: false, usePenetrate: true, displayTime: const Duration(seconds: 2), alignment: Alignment.bottomCenter, builder: (context) { return ColoredBox( color: Theme.of(context).colorScheme.primaryContainer, child: Padding( padding: EdgeInsets.only( top: 15, left: 20, right: 20, bottom: MediaQuery.paddingOf(context).bottom + 15, ), child: Column( mainAxisSize: MainAxisSize.min, children: [ Row( children: [ Icon( MdiIcons.incognito, ), const SizedBox(width: 10), Text('已进入无痕模式', style: Theme.of(context).textTheme.titleMedium) ], ), const SizedBox(height: 10), Text( '搜索、观看视频/直播不携带身份信息(包含大会员)\n' '不产生查询或播放记录\n' '点赞等其它操作不受影响\n' '(前往隐私设置了解详情)', style: Theme.of(context).textTheme.bodySmall), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ TextButton( onPressed: () { SmartDialog.dismiss(result: true); SmartDialog.showToast('已设为永久无痕模式'); }, child: Text( '保存为永久', style: TextStyle( color: Theme.of(context).colorScheme.primary, ), )), const SizedBox(width: 10), TextButton( onPressed: () { SmartDialog.dismiss(); SmartDialog.showToast('已设为临时无痕模式'); }, child: Text( '仅本次(默认)', style: TextStyle( color: Theme.of(context).colorScheme.primary, ), ), ), ], ), ], ), ), ); }, ).then((res) { res == true ? Accounts.set(AccountType.heartbeat, AnonymousAccount()) : Accounts.accountMode[AccountType.heartbeat] = AnonymousAccount(); }); } else { Accounts.set(AccountType.heartbeat, Accounts.main); SmartDialog.show( clickMaskDismiss: false, usePenetrate: true, displayTime: const Duration(seconds: 1), alignment: Alignment.bottomCenter, builder: (context) { return ColoredBox( color: Theme.of(context).colorScheme.secondaryContainer, child: Padding( padding: EdgeInsets.only( top: 15, left: 20, right: 20, bottom: MediaQuery.paddingOf(context).bottom + 15, ), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Icon( MdiIcons.incognitoOff, ), const SizedBox(width: 10), Text('已退出无痕模式', style: Theme.of(context).textTheme.titleMedium), ], ), ), ); }, ); } } onChangeTheme() { themeType.value = nextThemeType; try { Get.find().themeType.value = themeType.value; } catch (_) {} setting.put(SettingBoxKey.themeMode, themeType.value.code); Get.changeThemeMode(themeType.value.toThemeMode); } pushFollow() { if (!isLogin.value) { SmartDialog.showToast('账号未登录'); return; } Get.toNamed('/follow?mid=${userInfo.value.mid}', preventDuplicates: false); } pushFans() { if (!isLogin.value) { SmartDialog.showToast('账号未登录'); return; } Get.toNamed('/fan?mid=${userInfo.value.mid}', preventDuplicates: false); } pushDynamic() { if (!isLogin.value) { SmartDialog.showToast('账号未登录'); return; } Get.toNamed('/memberDynamics?mid=${userInfo.value.mid}', preventDuplicates: false); } }