import 'package:flutter/material.dart'; import 'package:flutter_svga/flutter_svga.dart'; import 'package:aslan/chatvibe_data/sources/local/file_cache_manager.dart'; import 'package:aslan/chatvibe_data/sources/repositories/config_repository_imp.dart'; import 'package:aslan/chatvibe_data/sources/repositories/room_repository_imp.dart'; import 'package:aslan/chatvibe_core/utilities/at_path_utils.dart'; import 'package:aslan/chatvibe_core/utilities/at_gift_vap_svga_manager.dart'; import 'package:aslan/chatvibe_data/models/country_mode.dart'; import 'package:aslan/chatvibe_domain/models/res/at_banner_leaderboard_res.dart'; import 'package:aslan/chatvibe_domain/models/res/country_res.dart'; import 'package:aslan/chatvibe_domain/models/res/gift_res.dart'; import 'package:aslan/chatvibe_domain/models/res/at_index_banner_res.dart'; import 'package:aslan/chatvibe_domain/models/res/at_room_emoji_res.dart'; import '../chatvibe_data/models/enum/at_banner_type.dart'; import '../chatvibe_domain/models/res/room_res.dart'; class AppGeneralManager extends ChangeNotifier { List countryModeList = []; Map> _countryMap = {}; Map _countryByNameMap = {}; ///礼物 List giftResList = []; Map _giftByIdMap = {}; Map> giftByTab = {}; Map> activityGiftByTab = {}; ///选中的国家 Country? selectCountryInfo; List activityList = []; AppGeneralManager() { loadCountry(); giftList(); // 使用默认参数 giftActivityList(); discoveryRoom(); // giftBackpack(); // configLevel(); } ///加载国家列表 void loadCountry() async { if (countryModeList.isNotEmpty) { resetCountryState(); notifyListeners(); return; } while (countryModeList.isEmpty) { await Future.delayed(Duration(milliseconds: 550)); var result = await ConfigRepositoryImp().loadCountry(); if (result.openCountry!.isNotEmpty) { result.openCountry?.forEach((c) { String prefix = c.aliasName?.substring(0, 1) ?? ""; if (prefix.isNotEmpty) { List countryList = _countryMap[prefix] ?? []; countryList.add(c.copyWith()); _countryMap[prefix] = countryList; } _countryByNameMap[c.countryName!] = c; }); } _countryMap.forEach((k, v) { countryModeList.add(CountryMode(k, v)); }); ///排序 countryModeList.sort((a, b) => a.prefix.compareTo(b.prefix)); notifyListeners(); } } ///国家国家名称获取国家 Country? getCountryByName(String countryName) { return _countryByNameMap[countryName]; } /// 只暴露国旗地址给 Selector 使用,避免 AppGeneralManager 其它数据更新时刷新整块 UI。 String getCountryFlagByName(String? countryName) { if (countryName == null || countryName.isEmpty) return ""; return _countryByNameMap[countryName]?.nationalFlag ?? ""; } ///选择国家 Country? selectCountry(int subIndex, int cIndex) { var selectCm = countryModeList[subIndex].prefixCountrys[cIndex]; if (selectCountryInfo != null) { selectCountryInfo = null; } else { selectCountryInfo = selectCm; } return selectCountryInfo; } void setCurrentCountry(Country? countryInfo) { selectCountryInfo = countryInfo; notifyListeners(); } void resetCountryState() { selectCountryInfo = null; } void openDrawer(BuildContext context) { Scaffold.of(context).openDrawer(); } void closeDrawer(BuildContext context) { Scaffold.of(context).closeDrawer(); } void giftList({bool includeCustomized = true}) async { try { giftResList = await ChatRoomRepository().giftList(); giftByTab.clear(); for (var gift in giftResList) { giftByTab[gift.giftTab]; var gmap = giftByTab[gift.giftTab]; gmap ??= []; gmap.add(gift); giftByTab[gift.giftTab!] = gmap; var gAllMap = giftByTab["ALL"]; gAllMap ??= []; if (gift.giftTab != "NATIONAL_FLAG" && gift.giftTab != "ACTIVITY" && gift.giftTab != "LUCKY_GIFT" && gift.giftTab != "CP" && gift.giftTab != "CUSTOMIZED" && gift.giftTab != "MAGIC") { gAllMap.add(gift); } giftByTab["ALL"] = gAllMap; _giftByIdMap[gift.id!] = gift; } if (includeCustomized) { giftByTab["CUSTOMIZED"] ??= []; ///定制礼物需要一个占位符,显示规则的 giftByTab["CUSTOMIZED"]?.insert(0, ChatVibeGiftRes(id: "-1000")); } else { giftByTab.remove("CUSTOMIZED"); } notifyListeners(); ///先去预下载 downLoad(giftResList); } catch (e) {} } void giftActivityList() async { try { activityList.clear(); activityList = await ChatRoomRepository().giftActivityList(); activityGiftByTab.clear(); for (var gift in activityList) { var gmap = activityGiftByTab["${gift.activityId}"]; gmap ??= []; gmap.add(gift); activityGiftByTab["${gift.activityId}"] = gmap; } notifyListeners(); } catch (e) {} } ///礼物背包 void giftBackpack() async { try { await ChatRoomRepository().giftBackpack(); } catch (e) {} } ///礼物id获取礼物 ChatVibeGiftRes? getGiftById(String id) { return _giftByIdMap[id]; } void downLoad(List giftResList) { for (var gift in giftResList) { if (gift.giftSourceUrl != null) { if (ATPathUtils.fetchFileExtensionFunction( gift.giftSourceUrl!, ).toLowerCase() == ".svga") { ///预解析 if (!ATGiftVapSvgaManager().videoItemCache.containsKey( gift.giftSourceUrl, )) { SVGAParser.shared.decodeFromURL(gift.giftSourceUrl!).then((entity) { entity.autorelease = false; ATGiftVapSvgaManager().videoItemCache[gift.giftSourceUrl!] = entity; }); } } else { if ((gift.giftSourceUrl ?? "").isNotEmpty) { FileCacheManager.getInstance().getFile(url: gift.giftSourceUrl!); } } } } } List homeBanners = []; List exploreBanners = []; List roomBanners = []; List gameBanners = []; ///首页banner void loadMainBanner() async { try { var banners = await ConfigRepositoryImp().getBanner(); homeBanners.clear(); roomBanners.clear(); gameBanners.clear(); exploreBanners.clear(); for (var v in banners) { if ((v.displayPosition ?? "").contains( ATBannerType.EXPLORE_PAGE.name, )) { exploreBanners.add(v); } if ((v.displayPosition ?? "").contains(ATBannerType.ROOM.name)) { roomBanners.add(v); } if ((v.displayPosition ?? "").contains(ATBannerType.HOME_ALERT.name)) { homeBanners.add(v); } if ((v.displayPosition ?? "").contains(ATBannerType.GAME.name)) { gameBanners.add(v); } } notifyListeners(); } catch (e) {} } Map> emojiByTab = {}; ///emoji表情 void emojiAll() async { var roomEmojis = await ChatRoomRepository().emojiAll(); for (var value in roomEmojis) { emojiByTab[value.groupName!] = value.emojis ?? []; } notifyListeners(); } ///加载等级资源 void configLevel() { ConfigRepositoryImp().configLevel(); } ATBannerLeaderboardRes? appLeaderResult; ///查询榜单前三名 void appLeaderboard() async { try { appLeaderResult = await ChatRoomRepository().appLeaderboard(); notifyListeners(); } catch (e) {} } ChatVibeRoomRes? hotRoom; void discoveryRoom() { ChatRoomRepository() .discovery(allRegion: true) .then((values) { hotRoom = values.first; }) .catchError((e) {}); } }