mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-03 19:54:12 +00:00 
			
		
		
		
	Get latest posts from server
This commit is contained in:
		
							
								
								
									
										14
									
								
								lib/enums/post_kind.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								lib/enums/post_kind.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					/// Different kinds of posts
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum PostKind {
 | 
				
			||||||
 | 
					  TEXT,
 | 
				
			||||||
 | 
					  IMAGE,
 | 
				
			||||||
 | 
					  WEB_LINK,
 | 
				
			||||||
 | 
					  PDF,
 | 
				
			||||||
 | 
					  MOVIE,
 | 
				
			||||||
 | 
					  COUNTDOWN,
 | 
				
			||||||
 | 
					  SURVEY,
 | 
				
			||||||
 | 
					  YOUTUBE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										5
									
								
								lib/enums/post_visibility_level.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								lib/enums/post_visibility_level.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					/// Post visibility level
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum PostVisibilityLevel { PUBLIC, FRIENDS, USER, GROUP_MEMBERS }
 | 
				
			||||||
							
								
								
									
										5
									
								
								lib/enums/user_access_levels.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								lib/enums/user_access_levels.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					/// User access levels
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum UserAccessLevels { NONE, BASIC, INTERMEDIATE, FULL}
 | 
				
			||||||
							
								
								
									
										82
									
								
								lib/helpers/posts_helper.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								lib/helpers/posts_helper.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/enums/post_kind.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/enums/post_visibility_level.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/enums/user_access_levels.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/posts_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/api_request.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/post.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Posts helper
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const _APIPostsVisibilityLevelMap = {
 | 
				
			||||||
 | 
					  "public": PostVisibilityLevel.PUBLIC,
 | 
				
			||||||
 | 
					  "friends": PostVisibilityLevel.FRIENDS,
 | 
				
			||||||
 | 
					  "private": PostVisibilityLevel.USER,
 | 
				
			||||||
 | 
					  "members": PostVisibilityLevel.GROUP_MEMBERS
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const _APIPostsKindsMap = {
 | 
				
			||||||
 | 
					  "text": PostKind.TEXT,
 | 
				
			||||||
 | 
					  "image": PostKind.IMAGE,
 | 
				
			||||||
 | 
					  "weblink": PostKind.WEB_LINK,
 | 
				
			||||||
 | 
					  "pdf": PostKind.PDF,
 | 
				
			||||||
 | 
					  "movie": PostKind.MOVIE,
 | 
				
			||||||
 | 
					  "countdown": PostKind.COUNTDOWN,
 | 
				
			||||||
 | 
					  "survey": PostKind.SURVEY,
 | 
				
			||||||
 | 
					  "youtube": PostKind.YOUTUBE
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const _APIUserAccessMap = {
 | 
				
			||||||
 | 
					  "no-access": UserAccessLevels.NONE,
 | 
				
			||||||
 | 
					  "basic": UserAccessLevels.BASIC,
 | 
				
			||||||
 | 
					  "intermediate": UserAccessLevels.INTERMEDIATE,
 | 
				
			||||||
 | 
					  "full": UserAccessLevels.FULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class PostsHelper {
 | 
				
			||||||
 | 
					  /// Get the list of latest posts. Return the list of posts or null in case of
 | 
				
			||||||
 | 
					  /// failure
 | 
				
			||||||
 | 
					  Future<PostsList> getLatest() async {
 | 
				
			||||||
 | 
					    final response = await APIRequest(
 | 
				
			||||||
 | 
					      uri: "posts/get_latest",
 | 
				
			||||||
 | 
					      needLogin: true,
 | 
				
			||||||
 | 
					    ).exec();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (response.code != 200) return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      // Parse & return the list of posts
 | 
				
			||||||
 | 
					      return PostsList()..addAll(response.getArray().map((f) => _apiToPost(f)));
 | 
				
			||||||
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					      print(e.toString());
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Turn an API entry into a [Post] object
 | 
				
			||||||
 | 
					  Post _apiToPost(Map<String, dynamic> map) {
 | 
				
			||||||
 | 
					    return Post(
 | 
				
			||||||
 | 
					      id: map["ID"],
 | 
				
			||||||
 | 
					      userID: map["userID"],
 | 
				
			||||||
 | 
					      userPageID: map["user_page_id"],
 | 
				
			||||||
 | 
					      groupID: map["group_id"],
 | 
				
			||||||
 | 
					      timeSent: map["post_time"],
 | 
				
			||||||
 | 
					      content: map["content"],
 | 
				
			||||||
 | 
					      visibilityLevel: _APIPostsVisibilityLevelMap[map["visibility_level"]],
 | 
				
			||||||
 | 
					      kind: _APIPostsKindsMap[map["kind"]],
 | 
				
			||||||
 | 
					      fileSize: map["file_size"],
 | 
				
			||||||
 | 
					      fileType: map["file_type"],
 | 
				
			||||||
 | 
					      filePath: map["file_path"],
 | 
				
			||||||
 | 
					      fileURL: map["file_path_url"],
 | 
				
			||||||
 | 
					      timeEnd: map["time_end"],
 | 
				
			||||||
 | 
					      linkURL: map["link_url"],
 | 
				
			||||||
 | 
					      linkTitle: map["link_title"],
 | 
				
			||||||
 | 
					      linkDescription: map["link_description"],
 | 
				
			||||||
 | 
					      linkImage: map["link_image"],
 | 
				
			||||||
 | 
					      likes: map["likes"],
 | 
				
			||||||
 | 
					      userLikes: map["userlike"],
 | 
				
			||||||
 | 
					      access: _APIUserAccessMap[map["user_access"]],
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -51,6 +51,12 @@ class UsersHelper {
 | 
				
			|||||||
    return list;
 | 
					    return list;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Get users information from a given [Set]
 | 
				
			||||||
 | 
					  Future<UsersList> getList(Set<int> users,
 | 
				
			||||||
 | 
					      {bool forceDownload = false}) async {
 | 
				
			||||||
 | 
					    return await getUsersInfo(users.toList());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Get users information
 | 
					  /// Get users information
 | 
				
			||||||
  ///
 | 
					  ///
 | 
				
			||||||
  /// If [forceDownload] is set to true, the data will always be retrieved from
 | 
					  /// If [forceDownload] is set to true, the data will always be retrieved from
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										39
									
								
								lib/lists/posts_list.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								lib/lists/posts_list.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					import 'dart:collection';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'package:comunic/models/post.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Posts List
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Contains method to easily process a list of posts
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class PostsList extends ListBase<Post> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  List<Post> _list = List();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int get length => _list.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  set length(int l) => _list.length = l;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Post operator [](int index) => _list[index];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  void operator []=(int index, Post value) => _list[index] = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get the list of users ID in this set
 | 
				
			||||||
 | 
					  Set<int> get usersID {
 | 
				
			||||||
 | 
					    Set<int> set = Set();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    forEach((p) {
 | 
				
			||||||
 | 
					      set.add(p.userID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if(p.userPageID != null && p.userPageID > 0)
 | 
				
			||||||
 | 
					        set.add(p.userPageID);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return set;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										64
									
								
								lib/models/post.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								lib/models/post.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/enums/post_kind.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/enums/post_visibility_level.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/enums/user_access_levels.dart';
 | 
				
			||||||
 | 
					import 'package:meta/meta.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Single post information
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Post {
 | 
				
			||||||
 | 
					  final int id;
 | 
				
			||||||
 | 
					  final int userID;
 | 
				
			||||||
 | 
					  final int userPageID;
 | 
				
			||||||
 | 
					  final int groupID;
 | 
				
			||||||
 | 
					  final int timeSent;
 | 
				
			||||||
 | 
					  final String content;
 | 
				
			||||||
 | 
					  final PostVisibilityLevel visibilityLevel;
 | 
				
			||||||
 | 
					  final PostKind kind;
 | 
				
			||||||
 | 
					  final int fileSize;
 | 
				
			||||||
 | 
					  final String fileType;
 | 
				
			||||||
 | 
					  final String filePath;
 | 
				
			||||||
 | 
					  final String fileURL;
 | 
				
			||||||
 | 
					  final int timeEnd;
 | 
				
			||||||
 | 
					  final String linkURL;
 | 
				
			||||||
 | 
					  final String linkTitle;
 | 
				
			||||||
 | 
					  final String linkDescription;
 | 
				
			||||||
 | 
					  final String linkImage;
 | 
				
			||||||
 | 
					  final int likes;
 | 
				
			||||||
 | 
					  final bool userLikes;
 | 
				
			||||||
 | 
					  final UserAccessLevels access;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Post({
 | 
				
			||||||
 | 
					    @required this.id,
 | 
				
			||||||
 | 
					    @required this.userID,
 | 
				
			||||||
 | 
					    @required this.userPageID,
 | 
				
			||||||
 | 
					    @required this.groupID,
 | 
				
			||||||
 | 
					    @required this.timeSent,
 | 
				
			||||||
 | 
					    @required this.content,
 | 
				
			||||||
 | 
					    @required this.visibilityLevel,
 | 
				
			||||||
 | 
					    @required this.kind,
 | 
				
			||||||
 | 
					    @required this.fileSize,
 | 
				
			||||||
 | 
					    @required this.fileType,
 | 
				
			||||||
 | 
					    @required this.filePath,
 | 
				
			||||||
 | 
					    @required this.fileURL,
 | 
				
			||||||
 | 
					    @required this.timeEnd,
 | 
				
			||||||
 | 
					    @required this.linkURL,
 | 
				
			||||||
 | 
					    @required this.linkTitle,
 | 
				
			||||||
 | 
					    @required this.linkDescription,
 | 
				
			||||||
 | 
					    @required this.linkImage,
 | 
				
			||||||
 | 
					    @required this.likes,
 | 
				
			||||||
 | 
					    @required this.userLikes,
 | 
				
			||||||
 | 
					    @required this.access,
 | 
				
			||||||
 | 
					  })  : assert(id != null),
 | 
				
			||||||
 | 
					        assert(userID != null),
 | 
				
			||||||
 | 
					        assert(userPageID != 0 || groupID != 0),
 | 
				
			||||||
 | 
					        assert(timeSent != null),
 | 
				
			||||||
 | 
					        assert(kind != PostKind.TEXT || content != null),
 | 
				
			||||||
 | 
					        assert(visibilityLevel != null),
 | 
				
			||||||
 | 
					        assert(kind != null),
 | 
				
			||||||
 | 
					        assert(kind != PostKind.COUNTDOWN || timeEnd != null),
 | 
				
			||||||
 | 
					        assert(likes != null),
 | 
				
			||||||
 | 
					        assert(userLikes != null),
 | 
				
			||||||
 | 
					        assert(access != null);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,3 +1,10 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/helpers/posts_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/helpers/users_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/posts_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/users_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/ui/screens/conversation_screen.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/ui/tiles/post_tile.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/utils/intl_utils.dart';
 | 
				
			||||||
import 'package:comunic/utils/ui_utils.dart';
 | 
					import 'package:comunic/utils/ui_utils.dart';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -11,10 +18,59 @@ class NewestPostsScreen extends StatefulWidget {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _NewestPostsScreenState extends State<NewestPostsScreen> {
 | 
					class _NewestPostsScreenState extends State<NewestPostsScreen> {
 | 
				
			||||||
 | 
					  // Helpers
 | 
				
			||||||
 | 
					  final PostsHelper _postsHelper = PostsHelper();
 | 
				
			||||||
 | 
					  final UsersHelper _usersHelper = UsersHelper();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Class members
 | 
				
			||||||
 | 
					  PostsList _list;
 | 
				
			||||||
 | 
					  UsersList _users;
 | 
				
			||||||
 | 
					  ErrorLevel _error = ErrorLevel.NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  set error(ErrorLevel err) => setState(() => _error = err);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  void didChangeDependencies() {
 | 
				
			||||||
 | 
					    super.didChangeDependencies();
 | 
				
			||||||
 | 
					    _loadPostsList();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void _loadError() =>
 | 
				
			||||||
 | 
					      error = _list == null ? ErrorLevel.MAJOR : ErrorLevel.MINOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Future<void> _loadPostsList() async {
 | 
				
			||||||
 | 
					    final list = await _postsHelper.getLatest();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (list == null) return _loadError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    final users = await _usersHelper.getList(list.usersID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (users == null) return _loadError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    setState(() {
 | 
				
			||||||
 | 
					      _list = list;
 | 
				
			||||||
 | 
					      _users = users;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Widget _buildErrorCard() {
 | 
				
			||||||
 | 
					    return buildErrorCard(tr("Could not get the list of posts !"));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Widget _buildListView() {
 | 
				
			||||||
 | 
					    return ListView.builder(
 | 
				
			||||||
 | 
					      itemCount: _list.length,
 | 
				
			||||||
 | 
					      itemBuilder: (c, i) => PostTile(
 | 
				
			||||||
 | 
					            post: _list[i],
 | 
				
			||||||
 | 
					            usersInfo: _users,
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    return buildCenteredProgressBar();
 | 
					    if (_error == ErrorLevel.MAJOR) return _buildErrorCard();
 | 
				
			||||||
 | 
					    if (_list == null) return buildCenteredProgressBar();
 | 
				
			||||||
 | 
					    return _buildListView();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								lib/ui/tiles/post_tile.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								lib/ui/tiles/post_tile.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/lists/users_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/post.dart';
 | 
				
			||||||
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Single posts tile
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class PostTile extends StatelessWidget {
 | 
				
			||||||
 | 
					  final Post post;
 | 
				
			||||||
 | 
					  final UsersList usersInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const PostTile({
 | 
				
			||||||
 | 
					    Key key,
 | 
				
			||||||
 | 
					    @required this.post,
 | 
				
			||||||
 | 
					    @required this.usersInfo,
 | 
				
			||||||
 | 
					  })  : assert(post != null),
 | 
				
			||||||
 | 
					        assert(usersInfo != null),
 | 
				
			||||||
 | 
					        super(key: key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
 | 
					    return ListTile(
 | 
				
			||||||
 | 
					      leading: Text("a post"),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user