mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-22 12:59:21 +00:00
Diplay the number of unread notifications / conversations
This commit is contained in:
parent
90d58bbee3
commit
003eb1efc2
@ -1,5 +1,6 @@
|
|||||||
import 'package:comunic/lists/notifications_list.dart';
|
import 'package:comunic/lists/notifications_list.dart';
|
||||||
import 'package:comunic/models/api_request.dart';
|
import 'package:comunic/models/api_request.dart';
|
||||||
|
import 'package:comunic/models/count_unread_notifications.dart';
|
||||||
import 'package:comunic/models/notification.dart';
|
import 'package:comunic/models/notification.dart';
|
||||||
|
|
||||||
/// Notifications helper
|
/// Notifications helper
|
||||||
@ -47,6 +48,22 @@ const _NotificationsTypeAPImapping = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class NotificationsHelper {
|
class NotificationsHelper {
|
||||||
|
/// Get the number of unread notifications
|
||||||
|
///
|
||||||
|
/// This method throws in case of error
|
||||||
|
Future<CountUnreadNotifications> countUnread() async {
|
||||||
|
final response =
|
||||||
|
await APIRequest(uri: "notifications/count_all_news", needLogin: true)
|
||||||
|
.exec();
|
||||||
|
|
||||||
|
final content = response.assertOk().getObject();
|
||||||
|
|
||||||
|
return CountUnreadNotifications(
|
||||||
|
notifications: content["notifications"],
|
||||||
|
conversations: content["conversations"],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the list of unread notifications of the user
|
/// Get the list of unread notifications of the user
|
||||||
Future<NotificationsList> getUnread() async {
|
Future<NotificationsList> getUnread() async {
|
||||||
final response =
|
final response =
|
||||||
|
14
lib/models/count_unread_notifications.dart
Normal file
14
lib/models/count_unread_notifications.dart
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/// Count the number of unread notifications
|
||||||
|
///
|
||||||
|
/// @author Pierre Hubert
|
||||||
|
|
||||||
|
class CountUnreadNotifications {
|
||||||
|
final int notifications;
|
||||||
|
final int conversations;
|
||||||
|
|
||||||
|
CountUnreadNotifications({
|
||||||
|
this.notifications,
|
||||||
|
this.conversations,
|
||||||
|
}) : assert(notifications != null),
|
||||||
|
assert(conversations != null);
|
||||||
|
}
|
@ -1,3 +1,6 @@
|
|||||||
|
import 'package:comunic/helpers/notifications_helper.dart';
|
||||||
|
import 'package:comunic/models/count_unread_notifications.dart';
|
||||||
|
import 'package:comunic/ui/widgets/safe_state.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';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -106,7 +109,7 @@ final _menuActionsItem = <_ActionMenuItem>[
|
|||||||
];
|
];
|
||||||
|
|
||||||
/// Public widget
|
/// Public widget
|
||||||
class ComunicAppBar extends StatelessWidget implements PreferredSizeWidget {
|
class ComunicAppBar extends StatefulWidget implements PreferredSizeWidget {
|
||||||
final OnSelectMenuAction onTap;
|
final OnSelectMenuAction onTap;
|
||||||
final BarCallbackActions selectedAction;
|
final BarCallbackActions selectedAction;
|
||||||
|
|
||||||
@ -115,6 +118,51 @@ class ComunicAppBar extends StatelessWidget implements PreferredSizeWidget {
|
|||||||
: assert(onTap != null),
|
: assert(onTap != null),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_ComunicAppBarState createState() => _ComunicAppBarState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Size get preferredSize => Size.fromHeight(40);
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ComunicAppBarState extends SafeState<ComunicAppBar> {
|
||||||
|
CountUnreadNotifications _unreadNotifications;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_refreshCountUnread();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _refreshCountUnread() async {
|
||||||
|
try {
|
||||||
|
final count = await NotificationsHelper().countUnread();
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
_unreadNotifications = count;
|
||||||
|
});
|
||||||
|
} catch (e, stack) {
|
||||||
|
print("Could not refresh the number of unread notifications: $e");
|
||||||
|
print(stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the number of unread notifications for the selected notice
|
||||||
|
int getNumberUnread(BarCallbackActions action) {
|
||||||
|
if (_unreadNotifications == null) return 0;
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case BarCallbackActions.OPEN_NOTIFICATIONS:
|
||||||
|
return _unreadNotifications.notifications;
|
||||||
|
|
||||||
|
case BarCallbackActions.OPEN_CONVERSATIONS:
|
||||||
|
return _unreadNotifications.conversations;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Material(
|
return Material(
|
||||||
@ -125,16 +173,14 @@ class ComunicAppBar extends StatelessWidget implements PreferredSizeWidget {
|
|||||||
_menuItems.length,
|
_menuItems.length,
|
||||||
(i) => _MenuItemWidget(
|
(i) => _MenuItemWidget(
|
||||||
item: _menuItems[i],
|
item: _menuItems[i],
|
||||||
onTap: onTap,
|
onTap: widget.onTap,
|
||||||
isSelected: _menuItems[i].action == selectedAction,
|
isSelected: _menuItems[i].action == widget.selectedAction,
|
||||||
|
newNotice: getNumberUnread(_menuItems[i].action),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
Size get preferredSize => Size.fromHeight(40);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The [Widget] part of a menu item
|
/// The [Widget] part of a menu item
|
||||||
@ -143,12 +189,16 @@ class _MenuItemWidget extends StatelessWidget {
|
|||||||
final OnSelectMenuAction onTap;
|
final OnSelectMenuAction onTap;
|
||||||
final bool isSelected;
|
final bool isSelected;
|
||||||
|
|
||||||
const _MenuItemWidget(
|
/// A number to notify of news.
|
||||||
{Key key,
|
final int newNotice;
|
||||||
@required this.item,
|
|
||||||
@required this.onTap,
|
const _MenuItemWidget({
|
||||||
@required this.isSelected})
|
Key key,
|
||||||
: assert(item != null),
|
@required this.item,
|
||||||
|
@required this.onTap,
|
||||||
|
@required this.isSelected,
|
||||||
|
this.newNotice = 0,
|
||||||
|
}) : assert(item != null),
|
||||||
assert(onTap != null),
|
assert(onTap != null),
|
||||||
assert(isSelected != null),
|
assert(isSelected != null),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
@ -171,14 +221,34 @@ class _MenuItemWidget extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildIconContainer() {
|
Widget _buildIconContainer() {
|
||||||
return Column(
|
return Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
Spacer(
|
||||||
|
flex: 2,
|
||||||
|
),
|
||||||
IconTheme(
|
IconTheme(
|
||||||
data: IconThemeData(
|
data: IconThemeData(
|
||||||
color: isSelected ? _primaryColor() : _secondaryColor()),
|
color: isSelected ? _primaryColor() : _secondaryColor()),
|
||||||
child: item.icon,
|
child: item.icon,
|
||||||
)
|
),
|
||||||
|
newNotice > 0 ? Spacer() : Container(),
|
||||||
|
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),
|
||||||
|
)),
|
||||||
|
Spacer(
|
||||||
|
flex: 2,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user