diff --git a/lib/helpers/events_helper.dart b/lib/helpers/events_helper.dart index fee32d9..fbbe5c1 100644 --- a/lib/helpers/events_helper.dart +++ b/lib/helpers/events_helper.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:comunic/models/comment.dart'; import 'package:event_bus/event_bus.dart'; /// Events helper @@ -23,6 +24,13 @@ class NewNumberUnreadConversations { NewNumberUnreadConversations(this.newNum); } +/// New comment +class NewCommentEvent { + final Comment comment; + + NewCommentEvent(this.comment); +} + class EventsHelper { static EventBus _mgr = EventBus(); diff --git a/lib/helpers/websocket_helper.dart b/lib/helpers/websocket_helper.dart index a43a665..f27864b 100644 --- a/lib/helpers/websocket_helper.dart +++ b/lib/helpers/websocket_helper.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; +import 'package:comunic/helpers/comments_helper.dart'; import 'package:comunic/helpers/events_helper.dart'; import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/config.dart'; @@ -39,8 +40,7 @@ class WebSocketHelper { // Determine WebSocket URI final wsURL = - "${(config().apiServerSecure ? "wss" : "ws")}://${config() - .apiServerName}${config().apiServerUri}ws?token=$token"; + "${(config().apiServerSecure ? "wss" : "ws")}://${config().apiServerName}${config().apiServerUri}ws?token=$token"; final wsURI = Uri.parse(wsURL); // Connect @@ -48,7 +48,7 @@ class WebSocketHelper { _ws.stream.listen( // When we got data - (data) { + (data) { print("WS New data: $data"); _processMessage(data.toString()); }, @@ -110,16 +110,22 @@ class WebSocketHelper { /// Process an unattended message static _processUnattendedMessage(WsMessage msg) { switch (msg.title) { - // New number of notifications + // New number of notifications case "number_notifs": EventsHelper.emit(NewNumberNotifsEvent(msg.data)); break; - // New number of unread conversations + // New number of unread conversations case "number_unread_conversations": EventsHelper.emit(NewNumberUnreadConversations(msg.data)); break; + // New comment + case "new_comment": + EventsHelper.emit( + NewCommentEvent(CommentsHelper.apiToComment(msg.data))); + break; + default: throw Exception("Unknown message type: ${msg.title}"); } diff --git a/lib/ui/tiles/post_tile.dart b/lib/ui/tiles/post_tile.dart index 3cf5690..18b4285 100644 --- a/lib/ui/tiles/post_tile.dart +++ b/lib/ui/tiles/post_tile.dart @@ -4,7 +4,6 @@ import 'package:comunic/enums/post_kind.dart'; import 'package:comunic/enums/post_visibility_level.dart'; import 'package:comunic/helpers/comments_helper.dart'; import 'package:comunic/helpers/posts_helper.dart'; -import 'package:comunic/helpers/users_helper.dart'; import 'package:comunic/lists/groups_list.dart'; import 'package:comunic/lists/users_list.dart'; import 'package:comunic/models/comment.dart'; @@ -493,22 +492,6 @@ class _PostTileState extends State { if (commentID < 1) throw new Exception("Comment ID is inferior to 1!"); clearCommentForm(); - - // Get and show new comment - final newComment = await _commentsHelper.getSingle(commentID); - - if (newComment == null) - return showSimpleSnack( - context, tr("Could not retrieve created comment!")); - - // Get information about the user who created the comment (if required) - if (!widget.usersInfo.hasUser(newComment.userID)) - widget.usersInfo - .add(await UsersHelper().getSingleWithThrow(newComment.userID)); - - setState(() { - widget.post.comments.add(newComment); - }); } catch (e) { print(e); showSimpleSnack(context, tr("Could not create comment!")); diff --git a/lib/ui/widgets/posts_list_widget.dart b/lib/ui/widgets/posts_list_widget.dart index 9bcd054..b3a5edc 100644 --- a/lib/ui/widgets/posts_list_widget.dart +++ b/lib/ui/widgets/posts_list_widget.dart @@ -1,9 +1,11 @@ +import 'package:comunic/helpers/events_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/lists/groups_list.dart'; import 'package:comunic/lists/posts_list.dart'; import 'package:comunic/lists/users_list.dart'; +import 'package:comunic/models/comment.dart'; import 'package:comunic/models/post.dart'; import 'package:comunic/ui/screens/conversation_screen.dart'; import 'package:comunic/ui/tiles/post_tile.dart'; @@ -65,6 +67,9 @@ class PostsListWidgetState extends SafeState { super.initState(); _scrollController = ScrollWatcher(onReachBottom: reachedPostsBottom); + + // Register to events + this.listen((ev) => this._addComment(ev.comment)); } @override @@ -219,4 +224,24 @@ class PostsListWidgetState extends SafeState { void reachedPostsBottom() { if (widget.getOlder != null) loadPostsList(getOlder: true); } + + /// Add new comment + void _addComment(Comment c) async { + if (_list == null) return; + + try { + final p = _list.singleWhere((p) => p.id == c.postID, orElse: () => null); + + if (p == null) return; + + if (!_users.hasUser(c.userID)) + _users.add(await UsersHelper().getSingleWithThrow(c.userID)); + + setState(() { + p.comments.add(c); + }); + } catch (e, stack) { + print("$e\n$stack"); + } + } }