import 'dart:convert'; import 'package:circle_app/main.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/device.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import '../../common/Widgets/open_vip_tip/view.dart'; import '../../network/api.dart'; import '../../network/dio_manager.dart'; import '../../util/eventBus.dart'; import '../select_circle/logic.dart'; import '../userinfo/logic.dart'; import 'state.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; class CircleLogic extends GetxController { PageController pageController = PageController(initialPage: 1, viewportFraction: 0.8); SwiperController swiperController = SwiperController(); final RefreshController refreshController = RefreshController(); InterestsBean circle = InterestsBean(lists: []); final CircleState state = CircleState(); var statistics = Rx( DataModel(visitCount: 0, lastVisitUsers: [], likeMeCount: 0)); //Map? statistics; int page = 1; int vicinityPage = 1; bool isMore = true; int myVip = 0; bool isShowCircle = true; String cityName = ""; List bannerList = []; AutoScrollController scrollController = AutoScrollController(); ScrollController listScrollController = ScrollController(); @override void onInit() async { super.onInit(); var data = await DioManager.instance.get( url: Api.getCircleInterests, params: {"page": page, 'page_size': 20}); var bean = BaseResponse.fromJson( data, (data) => InterestsBean.fromJson(data)); if (bean.data is InterestsBean && bean.isSuccess()) { circle = bean.data!; if (circle.lists.length < 20) { isMore = false; } update(); } myVip = await getVip(); loadCirclePeopleData(); initGerder(); getCityList(); getBanner(); getNearByList(); EventBusManager.on().listen((event) { myVip = event.vip; // update(); }); } List genderList = []; List orientationList = []; List roleList = []; void initGerder() async { var data1 = await DioManager.instance.get(url: Api.getCircleList, params: {}); var bean1 = BaseResponse.fromJson( data1, (data1) => ConfigBean.fromJson(data1)); ConfigBean configBean = bean1.data!; configBean.genderMap.forEach((key, value) { genderList.add(MyConfigData(key, value, false)); }); configBean.orientationMap.forEach((key, value) { orientationList.add(MyConfigData(key, value, false)); }); configBean.roleMap.forEach((key, value) { roleList.add(MyConfigData(key, value, false)); }); } List provinceList = []; Map cityMap = {}; getCityList() async { try { String jsonString = await rootBundle.loadString('assets/province.json'); List jsonData = json.decode(jsonString); provinceList = jsonData.map((dynamic item) => Province.fromJson(item)).toList(); cityMap.clear(); for (int i = 0; i < provinceList.length; i++) { Map areaMap = {}; for (int c = 0; c < provinceList[i].city.length; c++) { String cityName = provinceList[i].city[c].name; areaMap[cityName] = []; // 不再存储区域列表,直接设置为空列表 } cityMap[provinceList[i].name] = areaMap; } } catch (e) { print('Error loading JSON file: $e'); } } loadMore() async { if (!isMore) return; page = page + 1; var data = await DioManager.instance.get( url: Api.getCircleInterests, params: {"page": page, 'page_size': 20}); var bean = BaseResponse.fromJson( data, (data) => InterestsBean.fromJson(data)); InterestsBean newcircle = bean.data!; if (newcircle.lists.isNotEmpty) { if (newcircle.lists.length < 20) { isMore = false; } circle.lists.addAll(newcircle.lists); update(); } } outCircle(String interest_id, bool isStatus) async { var data = await DioManager.instance.post( url: "${Api.outCrrcle}$interest_id/join", params: {"status": isStatus ? "0" : "1"}); var bean = BaseResponse.fromJson(data, (data) => data); if (bean.code == 200) { circle.lists.forEach((element) { if (element.id.toString() == interest_id.toString()) { element.isJoin = !isStatus; } }); } showOKToast(bean.msg); } updateCircleInfo(Circle circleInfo) { for (int i = 0; i < circle.lists.length; i++) { Circle temp = circle.lists[i]; if (temp.id == circleInfo.id) { circle.lists[i] = circleInfo; break; } } update(); } setCircle(String circleId) { circle.lists.forEach((element) { if (element.id.toString() == circleId.toString()) { element.isJoin = true; } }); } //访问我的圈子人数 loadCirclePeopleData() async { var data = await DioManager.instance.get(url: Api.getInterestsCount); var myAlbumBean = BaseResponse.fromJson( data, (data) => DataModel.fromJson(data)); if (data['code'] == 200) { statistics.value = myAlbumBean.data; // update(); } } Circle getCircleIndex() { return circle.lists[state.index]; } void pushHome(String userId) { Get.toNamed(AppRoutes.UserInfoActivity, arguments: userId); } void getPipeiData() async { var data = await DioManager.instance.get(url: Api.getMatch); if (data['code'] == 200) { //发送消息 bool isSuccess = await createCustomMsg( data['data']['account_id'].toString().split('_').last, data['data']['account_id']); if (!isSuccess) { await sendTextMsg(data['data']['account_id']); } } else if (data['code'] == 21201) { showOKToast(data['msg']); showRechargeDialog(); } else { showOKToast(data['msg']); } } showRechargeDialog() { Get.bottomSheet( Scaffold( backgroundColor: Colors.transparent, body: Open_vip_tipPage(true), ), isScrollControlled: true, enableDrag: false); } void getBanner() async { var data = await DioManager.instance.get(url: Api.getNearbyBeanner, params: {}); var bean = BaseResponse.fromJson( data, (data) => BannerList.fromJson(data)); bannerList.clear(); bannerList.addAll(bean.data.banners); cityName = bean.data.city; } int offset = 0; int deep = 0; List vicinityList = []; void getNearByList() async { List genders = []; genderList.forEach((element) { if (element.isSelect) { genders.add(element.id); } }); List roles = []; roleList.forEach((element) { if (element.isSelect) roles.add(element.id); }); List orientations = []; orientationList.forEach((element) { if (element.isSelect) orientations.add(element.id); }); if(offset==0){ getBanner(); } var data = await DioManager.instance.post(url: Api.postNearbyList, params: { "offset": offset, 'deep': deep, 'city': cityName, "genders": genders, "roles": roles, "orientations": orientations }); var bean = BaseResponse.fromJson( data, (data) => VicinityBean.fromJson(data)); try { offset = bean.data.offset; deep = bean.data.deep; } catch (Exception) {} if (vicinityPage == 1) { cityName = bean.data.city; vicinityList.clear(); } try{ vicinityList.addAll(bean.data.users); } on Exception{} if (vicinityPage == 1) { refreshController.refreshCompleted(); } else { refreshController.loadComplete(); } update(); } } class VicinityBean { String city; int offset; int deep; List users; VicinityBean( {required this.city, required this.users, required this.offset, required this.deep}); factory VicinityBean.fromJson(Map json) { List listsJson = json['users']; List lists = listsJson.map((e) => VicinityItemBean.fromJson(e)).toList(); return VicinityBean( users: lists, city: json['city'], offset: json['offset'], deep: json['deep']); } } class VicinityItemBean { final int id; final String nickname; final String avatar; final String signature; final String birthday; final int age; final int vip; final int gender; final int role; final int orientation; final double lng; final double lat; final String city; final List interests; final List images; final String avatarThumb; final String genderName; final String roleName; final String orientationName; final String bgPicUrl; final String onlineFlag; final bool isOnline; VicinityItemBean({ required this.id, required this.nickname, required this.avatar, required this.signature, required this.birthday, required this.age, required this.vip, required this.gender, required this.role, required this.orientation, required this.lng, required this.lat, required this.city, required this.interests, required this.images, required this.avatarThumb, required this.genderName, required this.roleName, required this.orientationName, required this.bgPicUrl, required this.onlineFlag, required this.isOnline, }); factory VicinityItemBean.fromJson(Map json) { var interestList = json['interests'] as List; List interests = interestList.map((interest) => Interest.fromJson(interest)).toList(); return VicinityItemBean( id: json['id'], nickname: json['nickname'], avatar: json['avatar'], signature: json['signature'], birthday: json['birthday'], age: json['age'], vip: json['vip'], gender: json['gender'], role: json['role'], orientation: json['orientation'], lng: json['lng'], lat: json['lat'], city: json['city'], interests: interests, images: List.from(json['images']), avatarThumb: json['avatar_thumb'], genderName: json['gender_name'], roleName: json['role_name'], orientationName: json['orientation_name'], bgPicUrl: json['bg_picUrl'], onlineFlag: json['online_flag'], isOnline: json['isOnline'], ); } } // class Interest { // final int id; // final String title; // final String intro; // final String image; // final double amount; // final double oldAmount; // final String iosItem; // final DateTime lastCalloutTime; // final DateTime lastJoinTime; // final bool isJoin; // final bool isLike; // final bool isLimit; // final int viewTotal; // final int joinTotal; // // Interest({ // required this.id, // required this.title, // required this.intro, // required this.image, // required this.amount, // required this.oldAmount, // required this.iosItem, // required this.lastCalloutTime, // required this.lastJoinTime, // required this.isJoin, // required this.isLike, // required this.isLimit, // required this.viewTotal, // required this.joinTotal, // }); // factory Interest.fromJson(Map json) { // return Interest( // id: json['id'], // title: json['title'], // intro: json['intro'], // image: json['image'], // amount: json['amount'], // oldAmount: json['oldAmount'], // iosItem: json['iosItem'], // lastCalloutTime: DateTime.parse(json['lastCalloutTime']), // lastJoinTime: DateTime.parse(json['lastJoinTime']), // isJoin: json['isJoin'], // isLike: json['isLike'], // isLimit: json['isLimit'], // viewTotal: json['viewTotal'], // joinTotal: json['joinTotal'], // ); // } // } class InterestsBean { List lists; InterestsBean({required this.lists}); factory InterestsBean.fromJson(Map json) { List listsJson = json['lists']; List lists = listsJson.map((e) => Circle.fromJson(e)).toList(); return InterestsBean(lists: lists); } } class Circle { int id; String image; String title; String intro; String ios_item; double amount; bool is_limit; double oldAmount; String lastCalloutTime; bool isJoin; dynamic isLike; int viewTotal; int joinTotal; List lastJoinUsers; Circle({ required this.id, required this.is_limit, required this.image, required this.ios_item, required this.title, required this.intro, required this.amount, required this.oldAmount, required this.lastCalloutTime, required this.isJoin, required this.isLike, required this.viewTotal, required this.joinTotal, required this.lastJoinUsers, }); factory Circle.fromJson(Map json) { List lastJoinUsersJson = json['last_join_users']; List lastJoinUsers = lastJoinUsersJson.map((e) => JoinUser.fromJson(e)).toList(); return Circle( id: json['id'], is_limit: json['is_limit'] ?? false, image: json['image'], ios_item: json['ios_item'] ?? '', title: json['title'], intro: json['intro'], amount: json['amount'].toDouble(), oldAmount: json['old_amount'].toDouble(), lastCalloutTime: json['last_callout_time'], isJoin: json['is_join'], isLike: json['is_like'], viewTotal: json['view_total'], joinTotal: json['join_total'], lastJoinUsers: lastJoinUsers, ); } } class JoinUser { int id; String avatar; String nickname; JoinUser({ required this.id, required this.avatar, required this.nickname, }); factory JoinUser.fromJson(Map json) { return JoinUser( id: json['id'], avatar: json['avatar'], nickname: json['nickname'], ); } } class LastJoinUser { int id; String avatar; String nickname; LastJoinUser({ required this.id, required this.avatar, required this.nickname, }); factory LastJoinUser.fromJson(Map json) { return LastJoinUser( id: json['id'], avatar: json['avatar'], nickname: json['nickname'], ); } } class DataModel { int visitCount = 0; List lastVisitUsers = []; int likeMeCount = 0; DataModel( {required this.visitCount, required this.lastVisitUsers, required this.likeMeCount}); factory DataModel.fromJson(Map json) { return DataModel( visitCount: json['visit_count'], lastVisitUsers: json['last_visit_users'], likeMeCount: json['like_me_count'], ); } } class Province { String name; List city; Province({required this.name, required this.city}); factory Province.fromJson(Map json) { List cityData = json['city']; List cityList = cityData.map((dynamic item) => CityBean.fromJson(item)).toList(); return Province( name: json['name'], city: cityList, ); } @override String getPickerViewText() { return this.name; } } class CityBean { String name; List area; CityBean({required this.name, required this.area}); factory CityBean.fromJson(Map json) { List areaData = json['area']; List areaList = areaData.map((dynamic item) => item.toString()).toList(); return CityBean( name: json['name'], area: areaList, ); } } class BannerItem { final String name; final int type; final String? param; final String scene; final String picUrl; BannerItem({ required this.name, required this.type, this.param, required this.scene, required this.picUrl, }); factory BannerItem.fromJson(Map json) { return BannerItem( name: json['name'], type: json['type'], param: json['param'], scene: json['scene'], picUrl: json['pic_url'], ); } } class BannerList { final String city; final List banners; BannerList({required this.banners, required this.city}); factory BannerList.fromJson(Map json) { final bannerList = json['banners'] as List; final banners = bannerList.map((item) => BannerItem.fromJson(item)).toList(); return BannerList(banners: banners, city: json['city']); } }