11// ignore_for_file: invalid_use_of_protected_member
22
33import 'dart:async' ;
4+ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart' ;
45import 'package:get/get.dart' ;
56import 'package:simple_live_app/app/controller/base_controller.dart' ;
67import 'package:simple_live_app/app/event_bus.dart' ;
8+ import 'package:simple_live_app/app/log.dart' ;
79import 'package:simple_live_app/app/utils.dart' ;
810import 'package:simple_live_app/models/db/follow_user.dart' ;
11+ import 'package:simple_live_app/models/db/follow_user_tag.dart' ;
912import 'package:simple_live_app/services/db_service.dart' ;
1013import 'package:simple_live_app/services/follow_service.dart' ;
1114
@@ -14,13 +17,21 @@ class FollowUserController extends BasePageController<FollowUser> {
1417 StreamSubscription <dynamic >? onUpdatedListStream;
1518
1619 /// 0:全部 1:直播中 2:未直播
17- var filterMode = 0. obs;
20+ var filterMode = FollowUserTag (id: "0" , tag: "全部" , userId: []).obs;
21+ RxList <FollowUserTag > tagList = [
22+ FollowUserTag (id: "0" , tag: "全部" , userId: []),
23+ FollowUserTag (id: "1" , tag: "直播中" , userId: []),
24+ FollowUserTag (id: "2" , tag: "未开播" , userId: []),
25+ ].obs;
26+
27+ // 用户自定义标签
28+ RxList <FollowUserTag > userTagList = < FollowUserTag > [].obs;
1829
1930 @override
2031 void onInit () {
2132 onUpdatedIndexedStream = EventBus .instance.listen (
2233 EventBus .kBottomNavigationBarClicked,
23- (index) {
34+ (index) {
2435 if (index == 1 ) {
2536 scrollToTopOrRefresh ();
2637 }
@@ -36,6 +47,7 @@ class FollowUserController extends BasePageController<FollowUser> {
3647 @override
3748 Future refreshData () async {
3849 await FollowService .instance.loadData ();
50+ updateTagList ();
3951 super .refreshData ();
4052 }
4153
@@ -44,40 +56,134 @@ class FollowUserController extends BasePageController<FollowUser> {
4456 if (page > 1 ) {
4557 return Future .value ([]);
4658 }
47- if (filterMode.value == 0 ) {
59+ if (filterMode.value.tag == "全部" ) {
4860 return FollowService .instance.followList.value;
49- } else if (filterMode.value == 1 ) {
61+ } else if (filterMode.value.tag == "直播中" ) {
5062 return FollowService .instance.liveList.value;
51- } else {
63+ } else if (filterMode.value.tag == "未开播" ) {
5264 return FollowService .instance.notLiveList.value;
65+ } else {
66+ FollowService .instance.filterDataByTag (filterMode.value);
67+ return FollowService .instance.curTagFollowList.value;
68+ }
69+ }
70+
71+ void updateTagList () {
72+ userTagList.assignAll (FollowService .instance.followTagList);
73+ tagList.value = tagList.take (3 ).toList ();
74+ for (var i in userTagList) {
75+ if (! tagList.contains (i)) {
76+ tagList.add (i);
77+ }
5378 }
5479 }
5580
5681 void filterData () {
57- if (filterMode.value == 0 ) {
82+ if (filterMode.value.tag == "全部" ) {
5883 list.assignAll (FollowService .instance.followList.value);
59- } else if (filterMode.value == 1 ) {
84+ } else if (filterMode.value.tag == "直播中" ) {
6085 list.assignAll (FollowService .instance.liveList.value);
61- } else if (filterMode.value == 2 ) {
86+ } else if (filterMode.value.tag == "未开播" ) {
6287 list.assignAll (FollowService .instance.notLiveList.value);
88+ } else {
89+ FollowService .instance.filterDataByTag (filterMode.value);
90+ list.assignAll (FollowService .instance.curTagFollowList);
6391 }
6492 }
6593
66- void setFilterMode (int mode ) {
67- filterMode.value = mode ;
94+ void setFilterMode (FollowUserTag tag ) {
95+ filterMode.value = tag ;
6896 filterData ();
6997 }
7098
7199 void removeItem (FollowUser item) async {
72100 var result =
73- await Utils .showAlertDialog ("确定要取消关注${item .userName }吗?" , title: "取消关注" );
101+ await Utils .showAlertDialog ("确定要取消关注${item .userName }吗?" , title: "取消关注" );
74102 if (! result) {
75103 return ;
76104 }
105+ // 取消关注同时删除标签内的 userId
106+ if (item.tag != "全部" ){
107+ var tag = tagList.firstWhere ((tag) => tag.tag == item.tag);
108+ tag.userId.remove (item.id);
109+ updateTag (tag);
110+ }
77111 await DBService .instance.followBox.delete (item.id);
78112 refreshData ();
79113 }
80114
115+ void updateItem (FollowUser item){
116+ FollowService .instance.addFollow (item);
117+ }
118+ // 修改item的标签
119+ void setItemTag (FollowUser item, FollowUserTag targetTag) {
120+ FollowUserTag tarTag = targetTag;
121+ FollowUserTag curTag =
122+ tagList.firstWhere ((tag) => tag.tag == item.tag);
123+ // 从当前标签(非全部)删除item 向目标标签(全部包含所有item == 非全部)添加item
124+ curTag.userId.remove (item.id);
125+ tarTag.userId.addIf (! tarTag.userId.contains (item.id), item.id);
126+ // 数据库更新
127+ item.tag = tarTag.tag;
128+ updateTag (curTag);
129+ updateTag (tarTag);
130+ updateItem (item);
131+ filterData ();
132+ }
133+
134+ void removeTag (FollowUserTag tag) {
135+ // 将tag下的所有follow设置为全部
136+ for (var i in tag.userId){
137+ var follow = DBService .instance.followBox.get (i);
138+ if (follow != null ){
139+ follow.tag = "全部" ;
140+ updateItem (follow);
141+ }
142+ }
143+ FollowService .instance.delFollowUserTag (tag);
144+ updateTagList ();
145+ Log .i ('删除tag${tag .tag }' );
146+ }
147+
148+ void addTag (String tag) async {
149+ FollowService .instance
150+ .addFollowUserTag (tag)
151+ .then ((value) => updateTagList ());
152+ }
153+
154+ void updateTag (FollowUserTag followUserTag) {
155+ if (followUserTag.tag == '全部' ){
156+ return ;
157+ }
158+ FollowService .instance.updateFollowUserTag (followUserTag);
159+ }
160+
161+ void updateTagName (FollowUserTag followUserTag, String tag) {
162+ // 未操作
163+ if (followUserTag.tag == tag) {
164+ return ;
165+ }
166+ // 避免重名
167+ if (tagList.any ((item) => item.tag == tag)) {
168+ SmartDialog .showToast ("标签名重复,修改失败" );
169+ return ;
170+ }
171+ final FollowUserTag item = followUserTag.copyWith (tag: tag);
172+ updateTag (item);
173+ SmartDialog .showToast ("修改成功" );
174+ updateTagList ();
175+ }
176+
177+ // 调整标签顺序
178+ void updateTagOrder (int oldIndex, int newIndex) {
179+ if (newIndex > oldIndex) newIndex -= 1 ; // 处理索引调整
180+ final item = userTagList.removeAt (oldIndex);
181+ userTagList.insert (newIndex, item);
182+ tagList.value = tagList.take (3 ).toList ();
183+ tagList.addAll (userTagList);
184+ DBService .instance.updateFollowTagOrder (userTagList);
185+ }
186+
81187 @override
82188 void onClose () {
83189 onUpdatedIndexedStream? .cancel ();
0 commit comments