1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2025-06-19 08:15:16 +00:00

Use Websocket to update number of unread notifications

This commit is contained in:
2020-04-18 14:14:54 +02:00
parent 36f89a9a53
commit 1b13a90615
6 changed files with 104 additions and 26 deletions

View File

@ -1,3 +1,4 @@
import 'package:comunic/helpers/events_helper.dart';
import 'package:comunic/helpers/notifications_helper.dart';
import 'package:comunic/models/count_unread_notifications.dart';
import 'package:comunic/ui/widgets/safe_state.dart';
@ -113,8 +114,7 @@ class ComunicAppBar extends StatefulWidget implements PreferredSizeWidget {
final OnSelectMenuAction onTap;
final BarCallbackActions selectedAction;
const ComunicAppBar(
{Key key, @required this.onTap, @required this.selectedAction})
const ComunicAppBar({Key key, @required this.onTap, @required this.selectedAction})
: assert(onTap != null),
super(key: key);
@ -126,12 +126,17 @@ class ComunicAppBar extends StatefulWidget implements PreferredSizeWidget {
}
class _ComunicAppBarState extends SafeState<ComunicAppBar> {
CountUnreadNotifications _unreadNotifications;
var _unreadNotifications =
CountUnreadNotifications(notifications: 0, conversations: 0);
@override
void initState() {
_refreshCountUnread();
super.initState();
// Listen to notifications number update
this.listenChangeState<NewNumberNotifsEvent>(
(d) => _unreadNotifications.notifications = d.newNum);
}
void _refreshCountUnread() async {
@ -171,7 +176,7 @@ class _ComunicAppBarState extends SafeState<ComunicAppBar> {
crossAxisAlignment: CrossAxisAlignment.stretch,
children: List.generate(
_menuItems.length,
(i) => _MenuItemWidget(
(i) => _MenuItemWidget(
item: _menuItems[i],
onTap: widget.onTap,
isSelected: _menuItems[i].action == widget.selectedAction,
@ -212,9 +217,9 @@ class _MenuItemWidget extends StatelessWidget {
color: isSelected ? _secondaryColor() : _primaryColor(),
child: !item.isMenu
? InkWell(
child: _buildIconContainer(),
onTap: () => onTap(item.action),
)
child: _buildIconContainer(),
onTap: () => onTap(item.action),
)
: _buildContextMenuPopupButton(),
),
);
@ -235,15 +240,15 @@ class _MenuItemWidget extends StatelessWidget {
newNotice == 0
? Container()
: Material(
color: Colors.red,
child: Padding(
padding: const EdgeInsets.all(2.0),
child: Text(" $newNotice ",
style: TextStyle(color: Colors.white)),
),
borderRadius: BorderRadius.all(
Radius.circular(50.0),
)),
color: Colors.red,
child: Padding(
padding: const EdgeInsets.all(2.0),
child: Text(" $newNotice ",
style: TextStyle(color: Colors.white)),
),
borderRadius: BorderRadius.all(
Radius.circular(50.0),
)),
Spacer(flex: 2),
],
);
@ -255,9 +260,9 @@ class _MenuItemWidget extends StatelessWidget {
child: _buildIconContainer(),
itemBuilder: (i) => _menuActionsItem
.map((f) => PopupMenuItem(
child: Text(f.label),
value: f.action,
))
child: Text(f.label),
value: f.action,
))
.toList(),
onSelected: onTap,
);

View File

@ -8,7 +8,6 @@ import 'package:flutter/material.dart';
/// @author Pierre HUBERT
abstract class SafeState<T extends StatefulWidget> extends State<T> {
final _subscriptions = List<StreamSubscription>();
@override
@ -21,8 +20,7 @@ abstract class SafeState<T extends StatefulWidget> extends State<T> {
@override
void setState(fn) {
if(mounted)
super.setState(fn);
if (mounted) super.setState(fn);
}
/// Register to a new subscription
@ -30,4 +28,14 @@ abstract class SafeState<T extends StatefulWidget> extends State<T> {
void listen<T>(void onEvent(T event)) {
_subscriptions.add(EventsHelper.on<T>(onEvent));
}
}
/// Register to a new subscription
///
/// Callback will we called inside of setState
@protected
void listenChangeState<T>(void onEvent(T event)) {
_subscriptions.add(EventsHelper.on<T>((d) {
setState(() => onEvent(d));
}));
}
}