1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-22 21:09:21 +00:00

Register to post events

This commit is contained in:
Pierre HUBERT 2020-04-18 16:07:56 +02:00
parent 469e1e1f92
commit 02034acbbe
4 changed files with 91 additions and 13 deletions

View File

@ -4,6 +4,7 @@ import 'package:comunic/enums/post_visibility_level.dart';
import 'package:comunic/enums/user_access_levels.dart'; import 'package:comunic/enums/user_access_levels.dart';
import 'package:comunic/helpers/comments_helper.dart'; import 'package:comunic/helpers/comments_helper.dart';
import 'package:comunic/helpers/survey_helper.dart'; import 'package:comunic/helpers/survey_helper.dart';
import 'package:comunic/helpers/websocket_helper.dart';
import 'package:comunic/lists/comments_list.dart'; import 'package:comunic/lists/comments_list.dart';
import 'package:comunic/lists/posts_list.dart'; import 'package:comunic/lists/posts_list.dart';
import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/api_request.dart';
@ -46,11 +47,17 @@ const _APIPostsTargetKindsMap = {
}; };
class PostsHelper { class PostsHelper {
/// Stores the list of posts we are registered to
///
/// First int = post ID
/// Second int = number of registered people
static final _registeredPosts = Map<int, int>();
/// Get the list of latest posts. Return the list of posts or null in case of /// Get the list of latest posts. Return the list of posts or null in case of
/// failure /// failure
Future<PostsList> getLatest({int from = 0}) async { Future<PostsList> getLatest({int from = 0}) async {
final response = final response =
await APIRequest(uri: "posts/get_latest", needLogin: true, args: { await APIRequest(uri: "posts/get_latest", needLogin: true, args: {
"include_groups": true.toString(), "include_groups": true.toString(),
"startFrom": from.toString(), "startFrom": from.toString(),
}).exec(); }).exec();
@ -69,8 +76,7 @@ class PostsHelper {
/// Get the list of posts of a user /// Get the list of posts of a user
Future<PostsList> getUserPosts(int userID, {int from = 0}) async { Future<PostsList> getUserPosts(int userID, {int from = 0}) async {
final response = await (APIRequest(uri: "posts/get_user", needLogin: true) final response = await (APIRequest(uri: "posts/get_user", needLogin: true)
..addInt("userID", userID) ..addInt("userID", userID)..addInt("startFrom", from == 0 ? 0 : from - 1))
..addInt("startFrom", from == 0 ? 0 : from - 1))
.exec(); .exec();
if (response.code != 200) return null; if (response.code != 200) return null;
@ -87,8 +93,7 @@ class PostsHelper {
/// Get the list of posts of a group /// Get the list of posts of a group
Future<PostsList> getGroupPosts(int groupID, {int from = 0}) async { Future<PostsList> getGroupPosts(int groupID, {int from = 0}) async {
final response = await (APIRequest(uri: "posts/get_group", needLogin: true) final response = await (APIRequest(uri: "posts/get_group", needLogin: true)
..addInt("groupID", groupID) ..addInt("groupID", groupID)..addInt("startFrom", from == 0 ? 0 : from - 1))
..addInt("startFrom", from == 0 ? 0 : from - 1))
.exec(); .exec();
if (response.code != 200) return null; if (response.code != 200) return null;
@ -121,11 +126,11 @@ class PostsHelper {
/// This function crash in case of error /// This function crash in case of error
Future<void> createPost(NewPost post) async { Future<void> createPost(NewPost post) async {
APIRequest request = APIRequest request =
APIRequest(uri: "posts/create", needLogin: true, args: { APIRequest(uri: "posts/create", needLogin: true, args: {
"kind-page": _APIPostsTargetKindsMap[post.target], "kind-page": _APIPostsTargetKindsMap[post.target],
"kind-id": post.targetID.toString(), "kind-id": post.targetID.toString(),
"visibility": _APIPostsVisibilityLevelMap.map( "visibility": _APIPostsVisibilityLevelMap.map(
(s, v) => MapEntry(v, s))[post.visibility], (s, v) => MapEntry(v, s))[post.visibility],
"kind": _APIPostsKindsMap.map((s, k) => MapEntry(k, s))[post.kind], "kind": _APIPostsKindsMap.map((s, k) => MapEntry(k, s))[post.kind],
"content": post.content "content": post.content
}); });
@ -169,7 +174,7 @@ class PostsHelper {
args: { args: {
"postID": id.toString(), "postID": id.toString(),
"new_level": "new_level":
_APIPostsVisibilityLevelMap.map((k, v) => MapEntry(v, k))[level] _APIPostsVisibilityLevelMap.map((k, v) => MapEntry(v, k))[level]
}, },
).exec()) ).exec())
.isOK; .isOK;
@ -185,6 +190,28 @@ class PostsHelper {
.isOK; .isOK;
} }
/// Register to a post events
Future<void> registerPostEvents(int id) async {
if (_registeredPosts.containsKey(id))
_registeredPosts[id]++;
else {
_registeredPosts[id] = 1;
await ws("\$main/register_post", {"postID": id});
}
}
/// Un-register to post events
Future<void> unregisterPostEvents(int id) async {
if (!_registeredPosts.containsKey(id)) return;
_registeredPosts[id]--;
if (_registeredPosts[id] <= 0) {
_registeredPosts.remove(id);
await ws("\$main/unregister_post", {"postID": id});
}
}
/// Turn an API entry into a [Post] object /// Turn an API entry into a [Post] object
Post _apiToPost(Map<String, dynamic> map) { Post _apiToPost(Map<String, dynamic> map) {
final postKind = _APIPostsKindsMap[map["kind"]]; final postKind = _APIPostsKindsMap[map["kind"]];

View File

@ -591,7 +591,8 @@ class _PostTileState extends State<PostTile> {
context: context, context: context,
title: tr("Update post content"), title: tr("Update post content"),
message: tr("Please enter message content: "), message: tr("Please enter message content: "),
defaultValue: widget.post.content.isNull == null ? "" : widget.post.content.content, defaultValue:
widget.post.content.isNull == null ? "" : widget.post.content.content,
hint: tr("Post content"), hint: tr("Post content"),
); );

View File

@ -1,4 +1,5 @@
import 'package:comunic/helpers/groups_helper.dart'; import 'package:comunic/helpers/groups_helper.dart';
import 'package:comunic/helpers/posts_helper.dart';
import 'package:comunic/helpers/users_helper.dart'; import 'package:comunic/helpers/users_helper.dart';
import 'package:comunic/lists/groups_list.dart'; import 'package:comunic/lists/groups_list.dart';
import 'package:comunic/lists/posts_list.dart'; import 'package:comunic/lists/posts_list.dart';
@ -6,6 +7,7 @@ import 'package:comunic/lists/users_list.dart';
import 'package:comunic/models/post.dart'; import 'package:comunic/models/post.dart';
import 'package:comunic/ui/screens/conversation_screen.dart'; import 'package:comunic/ui/screens/conversation_screen.dart';
import 'package:comunic/ui/tiles/post_tile.dart'; import 'package:comunic/ui/tiles/post_tile.dart';
import 'package:comunic/ui/widgets/safe_state.dart';
import 'package:comunic/ui/widgets/scroll_watcher.dart'; import 'package:comunic/ui/widgets/scroll_watcher.dart';
import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart'; import 'package:comunic/utils/ui_utils.dart';
@ -41,7 +43,7 @@ class PostsListWidget extends StatefulWidget {
State<StatefulWidget> createState() => PostsListWidgetState(); State<StatefulWidget> createState() => PostsListWidgetState();
} }
class PostsListWidgetState extends State<PostsListWidget> { class PostsListWidgetState extends SafeState<PostsListWidget> {
// Helpers // Helpers
final UsersHelper _usersHelper = UsersHelper(); final UsersHelper _usersHelper = UsersHelper();
final GroupsHelper _groupsHelper = GroupsHelper(); final GroupsHelper _groupsHelper = GroupsHelper();
@ -54,6 +56,8 @@ class PostsListWidgetState extends State<PostsListWidget> {
ErrorLevel _error = ErrorLevel.NONE; ErrorLevel _error = ErrorLevel.NONE;
bool _loading = false; bool _loading = false;
final _registeredPosts = Set<int>();
set error(ErrorLevel err) => setState(() => _error = err); set error(ErrorLevel err) => setState(() => _error = err);
@override @override
@ -63,6 +67,22 @@ class PostsListWidgetState extends State<PostsListWidget> {
_scrollController = ScrollWatcher(onReachBottom: reachedPostsBottom); _scrollController = ScrollWatcher(onReachBottom: reachedPostsBottom);
} }
@override
void dispose() {
super.dispose();
_unregisterAllPosts();
}
@override
void setState(fn) {
if (!mounted) return;
super.setState(fn);
// Register for posts update
_registerRequiredPosts();
}
@override @override
void didChangeDependencies() { void didChangeDependencies() {
super.didChangeDependencies(); super.didChangeDependencies();
@ -111,6 +131,37 @@ class PostsListWidgetState extends State<PostsListWidget> {
_loading = false; _loading = false;
} }
/// Register for potential new posts
void _registerRequiredPosts() async {
if (_list == null) return;
final missing = _list
.where((f) => !_registeredPosts.contains(f.id))
.map((f) => f.id)
.toSet();
_registeredPosts.addAll(missing);
for (final postID in missing) {
await PostsHelper().registerPostEvents(postID);
}
}
/// Unregister from all posts
///
/// This method should be called only once
void _unregisterAllPosts() async {
for (final postID in _registeredPosts) {
// We put the try - catch here because we must absolutely unregister ALL
// POSTS event if one post fails to remove
try {
await PostsHelper().unregisterPostEvents(postID);
} catch (e, stack) {
print("Could not unregister post! $e $stack");
}
}
}
Widget _buildErrorCard() { Widget _buildErrorCard() {
return buildErrorCard(tr("Could not get the list of posts !")); return buildErrorCard(tr("Could not get the list of posts !"));
} }

View File

@ -1,5 +1,4 @@
import 'package:comunic/models/displayed_content.dart'; import 'package:comunic/models/displayed_content.dart';
import 'package:comunic/utils/bbcode_parser.dart';
import 'package:comunic/utils/input_utils.dart'; import 'package:comunic/utils/input_utils.dart';
import 'package:comunic/utils/navigation_utils.dart'; import 'package:comunic/utils/navigation_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -37,11 +36,11 @@ class TextWidget extends StatelessWidget {
var content = this.content.parsedString; var content = this.content.parsedString;
// Parse BBcode // Parse BBcode
if (parseBBcode) /*if (parseBBcode)
return BBCodeParsedWidget( return BBCodeParsedWidget(
text: content, text: content,
parseCallback: (style, text) => _parseLinks(context, text, style), parseCallback: (style, text) => _parseLinks(context, text, style),
); );*/
// Just parse link // Just parse link
return RichText( return RichText(