import 'package:flutter/cupertino.dart'; import 'package:yumi/app_localizations.dart'; import 'package:yumi/ui_kit/components/sc_tts.dart'; import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; import 'package:yumi/shared/data_sources/sources/repositories/sc_room_repository_imp.dart'; import 'package:yumi/shared/data_sources/sources/repositories/sc_user_repository_impl.dart'; import 'package:yumi/shared/data_sources/sources/repositories/sc_vip_repository_imp.dart'; import 'package:yumi/shared/business_logic/models/req/sc_user_profile_cmd.dart'; import 'package:yumi/shared/business_logic/models/res/country_res.dart'; import 'package:yumi/shared/business_logic/models/res/login_res.dart'; import 'package:yumi/shared/business_logic/models/res/room_user_card_res.dart'; import 'package:yumi/shared/business_logic/models/res/sc_user_identity_res.dart'; import 'package:yumi/shared/business_logic/models/res/sc_vip_res.dart'; class SocialChatUserProfileManager extends ChangeNotifier { SCUserProfileCmd? editUser; void updateUserAvatar(String avatar) { editUser ??= SCUserProfileCmd(); editUser!.setUserAvatar = avatar; notifyListeners(); } void updateUserSex(num sex) { editUser ??= SCUserProfileCmd(); editUser!.setUserSex = sex; } void updateUserNickname(String nickname) { editUser ??= SCUserProfileCmd(); editUser!.setUserNickname = nickname; } void updateBornYear(num bornYear) { editUser ??= SCUserProfileCmd(); editUser!.setBornYear = bornYear; } void updateBornMonth(num bornMonth) { editUser ??= SCUserProfileCmd(); editUser!.setBornMonth = bornMonth; } void updateBornDay(num bornDay) { editUser ??= SCUserProfileCmd(); editUser!.setBornDay = bornDay; } void updateAge(num age) { editUser ??= SCUserProfileCmd(); editUser!.setAge = age; } void setCountry(Country country) { editUser ??= SCUserProfileCmd(); editUser!.setCountryCode = country.alphaTwo!; editUser!.setCountryId = country.id!; editUser!.setCountryName = country.countryName!; } void resetEditUserData() { editUser = null; notifyListeners(); } SocialChatUserProfile? get currentUserProfile => AccountStorage().getCurrentUser()?.userProfile; void syncCurrentUserProfile(SocialChatUserProfile? profile) { if (profile == null) { return; } final currentUser = AccountStorage().getCurrentUser(); if (currentUser != null) { currentUser.setUserProfile(profile); AccountStorage().setCurrentUser(currentUser); } notifyListeners(); } Future fetchUserProfileData({ bool loadGuardCount = true, bool refreshFamilyData = false, }) async { var us = AccountStorage().getCurrentUser(); String userId = us?.userProfile?.id ?? ""; if (userId.isEmpty) { return; } var userInfo = await SCAccountRepository().loadUserInfo(userId); userInfo = await _withCurrentVipLevel(userInfo, userId); syncCurrentUserProfile(userInfo); } SCUserIdentityRes? userIdentity; void getUserIdentity() async { userIdentity = await SCAccountRepository().userIdentity(); notifyListeners(); } /// 当前正在查看的个人详情资料,不用于承载登录用户自己的 Me 页数据。 SocialChatUserProfile? userProfile; void getUserInfoById(String userId) async { userProfile = null; final loadedProfile = await SCAccountRepository().loadUserInfo(userId); userProfile = await _withCurrentVipLevel(loadedProfile, userId); notifyListeners(); } ///房间资料卡 RoomUserCardRes? userCardInfo; // List? userCountGuardResList; void roomUserCard(String roomId, String userId) async { userCardInfo = null; userCardInfo = await SCChatRoomRepository().roomUserCard(roomId, userId); userCardInfo = await _withCurrentVipLevelForCard(userCardInfo, userId); notifyListeners(); } Future _withCurrentVipLevelForCard( RoomUserCardRes? card, String userId, ) async { final profile = card?.userProfile; if (card == null || profile == null) { return card; } final mergedProfile = await _withCurrentVipLevel(profile, userId); if (mergedProfile == profile) { return card; } return card.copyWith(userProfile: mergedProfile); } Future _withCurrentVipLevel( SocialChatUserProfile profile, String userId, ) async { if (!_isCurrentUserId(userId)) { return profile; } final profileVipLevel = profile.vipLevel?.trim(); if (profileVipLevel != null && profileVipLevel.isNotEmpty) { return profile; } final currentVipLevel = currentUserProfile?.vipLevel?.trim(); final resolvedVipLevel = currentVipLevel != null && currentVipLevel.isNotEmpty ? currentVipLevel : await _loadCurrentVipLevel(); if (resolvedVipLevel == null || resolvedVipLevel.isEmpty) { return profile; } return profile.copyWith(vipLevel: resolvedVipLevel); } bool _isCurrentUserId(String userId) { final currentUserId = AccountStorage().getCurrentUser()?.userProfile?.id; return currentUserId != null && currentUserId.isNotEmpty && currentUserId == userId; } Future _loadCurrentVipLevel() async { final repository = SCVipRepositoryImp(); try { final home = await repository.vipHome(); final homeVipLevel = _vipLevelFromStatus(home.state); if (homeVipLevel != null) { return homeVipLevel; } } catch (_) {} try { return _vipLevelFromStatus(await repository.vipStatus()); } catch (_) { return null; } } String? _vipLevelFromStatus(SCVipStatusRes? status) { if (status == null) { return null; } if (status.active == false) { return '0'; } final level = status.levelInt; return level > 0 ? level.toString() : '0'; } void followUser(String userId) async { var result = await SCAccountRepository().followUser(userId); if (result) { if (userCardInfo != null) { userCardInfo = userCardInfo?.copyWith(follow: !userCardInfo!.follow!); notifyListeners(); } } } double myBalance = 0.0; void balance() async { myBalance = await SCAccountRepository().balance(); notifyListeners(); } updateBalance(double m) { myBalance = m; notifyListeners(); } void inviteHostOpt(BuildContext ct, String id, String status) async { final successMessage = SCAppLocalizations.of(ct)!.operationSuccessful; try { await SCAccountRepository().inviteHost(id, status); getUserIdentity(); SCTts.show(successMessage); } catch (e) {} } void inviteAgentOpt(BuildContext ct, String id, String status) async { final successMessage = SCAppLocalizations.of(ct)!.operationSuccessful; try { await SCAccountRepository().inviteAgent(id, status); getUserIdentity(); SCTts.show(successMessage); } catch (e) {} } void inviteBDOpt(BuildContext ct, String id, String status) async { final successMessage = SCAppLocalizations.of(ct)!.operationSuccessful; try { await SCAccountRepository().inviteBD(id, status); getUserIdentity(); SCTts.show(successMessage); } catch (e) {} } void inviteBDLeader(BuildContext ct, String id, String status) async { final successMessage = SCAppLocalizations.of(ct)!.operationSuccessful; try { await SCAccountRepository().inviteBDLeader(id, status); getUserIdentity(); SCTts.show(successMessage); } catch (e) {} } void inviteRechargeAgent(BuildContext ct, String id, String status) async { final successMessage = SCAppLocalizations.of(ct)!.operationSuccessful; try { await SCAccountRepository().inviteRechargeAgent(id, status); getUserIdentity(); SCTts.show(successMessage); } catch (e) {} } void cpRlationshipProcessApply( BuildContext ct, String id, bool status, ) async { final successMessage = SCAppLocalizations.of(ct)!.operationSuccessful; try { await SCAccountRepository().cpRelationshipProcessApply(id, status); fetchUserProfileData(loadGuardCount: false); SCTts.show(successMessage); } catch (e) {} } }