mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-10-31 18:24:23 +00:00 
			
		
		
		
	Show groups posts
This commit is contained in:
		
							
								
								
									
										73
									
								
								lib/helpers/groups_helper.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								lib/helpers/groups_helper.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| import 'package:comunic/lists/groups_list.dart'; | ||||
| import 'package:comunic/models/api_request.dart'; | ||||
| import 'package:comunic/models/group.dart'; | ||||
|  | ||||
| /// Groups helper | ||||
| /// | ||||
| /// @author Pierre HUBERT | ||||
|  | ||||
| const _APIGroupsMembershipLevelsMap = { | ||||
|   "administrator": GroupMembershipLevel.ADMINISTRATOR, | ||||
|   "moderator": GroupMembershipLevel.MODERATOR, | ||||
|   "member": GroupMembershipLevel.MEMBER, | ||||
|   "invited": GroupMembershipLevel.INVITED, | ||||
|   "pending": GroupMembershipLevel.PENDING, | ||||
|   "visitor": GroupMembershipLevel.VISITOR | ||||
| }; | ||||
|  | ||||
| const _APIGroupsVisibilityLevelsMap = { | ||||
|   "open": GroupVisibilityLevel.OPEN, | ||||
|   "private": GroupVisibilityLevel.PRIVATE, | ||||
|   "secrete": GroupVisibilityLevel.SECRETE | ||||
| }; | ||||
|  | ||||
| const _APIGroupsRegistrationLevelsMap = { | ||||
|   "open": GroupRegistrationLevel.OPEN, | ||||
|   "moderated": GroupRegistrationLevel.MODERATED, | ||||
|   "closed": GroupRegistrationLevel.CLOSED | ||||
| }; | ||||
|  | ||||
| const _APIGroupsPostsCreationLevelsMap = { | ||||
|   "moderators": GroupPostCreationLevel.MODERATORS, | ||||
|   "members": GroupPostCreationLevel.MEMBERS | ||||
| }; | ||||
|  | ||||
| class GroupsHelper { | ||||
|   /// Get a list of groups from the server | ||||
|   Future<GroupsList> getList(Set<int> groups) async { | ||||
|  | ||||
|     if(groups.length == 0) | ||||
|       return GroupsList(); | ||||
|  | ||||
|     final response = await APIRequest( | ||||
|       uri: "groups/get_multiple_info", | ||||
|       needLogin: true, | ||||
|       args: {"list": groups.join(",")}, | ||||
|     ).exec(); | ||||
|  | ||||
|     if (response.code != 200) return null; | ||||
|  | ||||
|     final list = GroupsList(); | ||||
|  | ||||
|     response | ||||
|         .getObject() | ||||
|         .forEach((k, d) => list[int.parse(k)] = _getGroupFromAPI(d)); | ||||
|  | ||||
|     return list; | ||||
|   } | ||||
|  | ||||
|   /// Turn an API entry into a group object | ||||
|   Group _getGroupFromAPI(Map<String, dynamic> map) { | ||||
|     return Group( | ||||
|         id: map["id"], | ||||
|         name: map["name"], | ||||
|         numberMembers: map["number_members"], | ||||
|         membershipLevel: _APIGroupsMembershipLevelsMap[map["membership"]], | ||||
|         visibilityLevel: _APIGroupsVisibilityLevelsMap[map["visibility"]], | ||||
|         registrationLevel: | ||||
|             _APIGroupsRegistrationLevelsMap[map["registration_level"]], | ||||
|         postCreationLevel: _APIGroupsPostsCreationLevelsMap[map["posts_level"]], | ||||
|         virtualDirectory: map["virtual_directory"], | ||||
|         following: map["following"]); | ||||
|   } | ||||
| } | ||||
| @@ -43,6 +43,9 @@ class PostsHelper { | ||||
|     final response = await APIRequest( | ||||
|       uri: "posts/get_latest", | ||||
|       needLogin: true, | ||||
|       args: { | ||||
|         "include_groups": true.toString() | ||||
|       } | ||||
|     ).exec(); | ||||
|  | ||||
|     if (response.code != 200) return null; | ||||
|   | ||||
							
								
								
									
										29
									
								
								lib/lists/groups_list.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								lib/lists/groups_list.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| import 'dart:collection'; | ||||
|  | ||||
| import 'package:comunic/models/group.dart'; | ||||
|  | ||||
| /// Groups list | ||||
| /// | ||||
| /// @author Pierre HUBERT | ||||
|  | ||||
| class GroupsList extends MapBase<int, Group> { | ||||
|  | ||||
|   final Map<int, Group> _groups = Map(); | ||||
|  | ||||
|   @override | ||||
|   Group operator [](Object key) => _groups[key]; | ||||
|  | ||||
|   @override | ||||
|   void operator []=(int key, Group value) => _groups[key] = value; | ||||
|  | ||||
|   @override | ||||
|   void clear() => _groups.clear(); | ||||
|  | ||||
|   @override | ||||
|   Iterable<int> get keys => _groups.keys; | ||||
|  | ||||
|   @override | ||||
|   Group remove(Object key) => _groups.remove(key); | ||||
|  | ||||
| } | ||||
|  | ||||
| @@ -9,7 +9,6 @@ import 'package:comunic/models/post.dart'; | ||||
| /// @author Pierre HUBERT | ||||
|  | ||||
| class PostsList extends ListBase<Post> { | ||||
|  | ||||
|   List<Post> _list = List(); | ||||
|  | ||||
|   int get length => _list.length; | ||||
| @@ -29,14 +28,22 @@ class PostsList extends ListBase<Post> { | ||||
|     forEach((p) { | ||||
|       set.add(p.userID); | ||||
|  | ||||
|       if(p.userPageID != null && p.userPageID > 0) | ||||
|         set.add(p.userPageID); | ||||
|       if (p.userPageID != null && p.userPageID > 0) set.add(p.userPageID); | ||||
|  | ||||
|       if(p.comments != null) | ||||
|         set.addAll(p.comments.usersID); | ||||
|       if (p.comments != null) set.addAll(p.comments.usersID); | ||||
|     }); | ||||
|  | ||||
|     return set; | ||||
|   } | ||||
|  | ||||
| } | ||||
|   /// Get the list of groups in this list of posts | ||||
|   Set<int> get groupsID { | ||||
|     Set<int> set = Set(); | ||||
|  | ||||
|     forEach((p) { | ||||
|       if (p.isGroupPost) set.add(p.groupID); | ||||
|     }); | ||||
|  | ||||
|     return set; | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										53
									
								
								lib/models/group.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								lib/models/group.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| import 'package:meta/meta.dart'; | ||||
|  | ||||
| /// Group information | ||||
| /// | ||||
| /// @author Pierre HUBERT | ||||
|  | ||||
| enum GroupMembershipLevel { | ||||
|   ADMINISTRATOR, | ||||
|   MODERATOR, | ||||
|   MEMBER, | ||||
|   INVITED, | ||||
|   PENDING, | ||||
|   VISITOR | ||||
| } | ||||
|  | ||||
| enum GroupVisibilityLevel { OPEN, PRIVATE, SECRETE } | ||||
|  | ||||
| enum GroupRegistrationLevel { OPEN, MODERATED, CLOSED } | ||||
|  | ||||
| enum GroupPostCreationLevel { MODERATORS, MEMBERS } | ||||
|  | ||||
| class Group { | ||||
|   final int id; | ||||
|   final String name; | ||||
|   final int numberMembers; | ||||
|   final GroupMembershipLevel membershipLevel; | ||||
|   final GroupVisibilityLevel visibilityLevel; | ||||
|   final GroupRegistrationLevel registrationLevel; | ||||
|   final GroupPostCreationLevel postCreationLevel; | ||||
|   final String virtualDirectory; | ||||
|   final bool following; | ||||
|  | ||||
|   Group({ | ||||
|     @required this.id, | ||||
|     @required this.name, | ||||
|     @required this.numberMembers, | ||||
|     @required this.membershipLevel, | ||||
|     @required this.visibilityLevel, | ||||
|     @required this.registrationLevel, | ||||
|     @required this.postCreationLevel, | ||||
|     @required this.virtualDirectory, | ||||
|     @required this.following, | ||||
|   })  : assert(id != null), | ||||
|         assert(name != null), | ||||
|         assert(numberMembers != null), | ||||
|         assert(membershipLevel != null), | ||||
|         assert(visibilityLevel != null), | ||||
|         assert(registrationLevel != null), | ||||
|         assert(postCreationLevel != null), | ||||
|         assert(following != null); | ||||
|  | ||||
|   get displayName => this.name; | ||||
| } | ||||
| @@ -6,6 +6,7 @@ import 'package:comunic/enums/post_visibility_level.dart'; | ||||
| import 'package:comunic/helpers/comments_helper.dart'; | ||||
| import 'package:comunic/helpers/likes_helper.dart'; | ||||
| import 'package:comunic/helpers/posts_helper.dart'; | ||||
| import 'package:comunic/lists/groups_list.dart'; | ||||
| import 'package:comunic/lists/users_list.dart'; | ||||
| import 'package:comunic/models/comment.dart'; | ||||
| import 'package:comunic/models/like_element.dart'; | ||||
| @@ -38,6 +39,7 @@ enum _PostActions { DELETE, UPDATE_CONTENT } | ||||
| class PostTile extends StatefulWidget { | ||||
|   final Post post; | ||||
|   final UsersList usersInfo; | ||||
|   final GroupsList groupsInfo; | ||||
|   final void Function(Post) onDeletedPost; | ||||
|   final bool showPostTarget; | ||||
|  | ||||
| @@ -47,10 +49,12 @@ class PostTile extends StatefulWidget { | ||||
|     @required this.usersInfo, | ||||
|     @required this.onDeletedPost, | ||||
|     @required this.showPostTarget, | ||||
|     @required this.groupsInfo, | ||||
|   })  : assert(post != null), | ||||
|         assert(usersInfo != null), | ||||
|         assert(onDeletedPost != null), | ||||
|         assert(showPostTarget != null), | ||||
|         assert(groupsInfo != null), | ||||
|         super(key: key); | ||||
|  | ||||
|   @override | ||||
| @@ -85,7 +89,7 @@ class _PostTileState extends State<PostTile> { | ||||
|  | ||||
|     return " > " + | ||||
|         (widget.post.isGroupPost | ||||
|             ? "Group" | ||||
|             ? widget.groupsInfo[widget.post.groupID].displayName | ||||
|             : widget.usersInfo.getUser(widget.post.userPageID).displayName); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,6 @@ | ||||
| import 'package:comunic/helpers/groups_helper.dart'; | ||||
| import 'package:comunic/helpers/users_helper.dart'; | ||||
| import 'package:comunic/lists/groups_list.dart'; | ||||
| import 'package:comunic/lists/posts_list.dart'; | ||||
| import 'package:comunic/lists/users_list.dart'; | ||||
| import 'package:comunic/models/post.dart'; | ||||
| @@ -33,10 +35,12 @@ class PostsListWidget extends StatefulWidget { | ||||
| class _PostsListWidgetState extends State<PostsListWidget> { | ||||
|   // Helpers | ||||
|   final UsersHelper _usersHelper = UsersHelper(); | ||||
|   final GroupsHelper _groupsHelper = GroupsHelper(); | ||||
|  | ||||
|   // Class members | ||||
|   PostsList _list; | ||||
|   UsersList _users; | ||||
|   GroupsList _groups; | ||||
|  | ||||
|   set error(ErrorLevel err) => setState(() => _error = err); | ||||
|  | ||||
| @@ -61,9 +65,14 @@ class _PostsListWidgetState extends State<PostsListWidget> { | ||||
|  | ||||
|     if (users == null) return _loadError(); | ||||
|  | ||||
|     final groups = await _groupsHelper.getList(list.groupsID); | ||||
|  | ||||
|     if(groups == null) return _loadError(); | ||||
|  | ||||
|     setState(() { | ||||
|       _list = list; | ||||
|       _users = users; | ||||
|       _groups = groups; | ||||
|     }); | ||||
|   } | ||||
|  | ||||
| @@ -77,6 +86,7 @@ class _PostsListWidgetState extends State<PostsListWidget> { | ||||
|       itemBuilder: (c, i) => PostTile( | ||||
|             post: _list[i], | ||||
|             usersInfo: _users, | ||||
|             groupsInfo: _groups, | ||||
|             onDeletedPost: _removePost, | ||||
|             showPostTarget: widget.showPostsTarget, | ||||
|           ), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user