mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-26 06:49:22 +00:00
Ready to implement the list of notifications
This commit is contained in:
parent
481d718338
commit
61124c34ef
78
lib/helpers/notifications_helper.dart
Normal file
78
lib/helpers/notifications_helper.dart
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
import 'package:comunic/lists/notifications_list.dart';
|
||||||
|
import 'package:comunic/models/api_request.dart';
|
||||||
|
import 'package:comunic/models/notification.dart';
|
||||||
|
|
||||||
|
/// Notifications helper
|
||||||
|
///
|
||||||
|
/// @author Pierre HUBERT
|
||||||
|
|
||||||
|
const _NotificationElementTypeAPImapping = {
|
||||||
|
"user_page": NotificationElementType.USER_PAGE,
|
||||||
|
"group_page": NotificationElementType.GROUP_PAGE,
|
||||||
|
"conversation": NotificationElementType.CONVERSATION,
|
||||||
|
"conversation_message": NotificationElementType.CONVERSATION_MESSAGE,
|
||||||
|
"post": NotificationElementType.POST,
|
||||||
|
"post_text": NotificationElementType.POST_TEXT,
|
||||||
|
"post_img": NotificationElementType.POST_IMAGE,
|
||||||
|
"post_youtube": NotificationElementType.POST_YOUTUBE,
|
||||||
|
"post_movie": NotificationElementType.POST_MOVIE,
|
||||||
|
"post_weblink": NotificationElementType.POST_WEBLINK,
|
||||||
|
"post_pdf": NotificationElementType.POST_PDF,
|
||||||
|
"post_timer": NotificationElementType.POST_TIMER,
|
||||||
|
"post_survey": NotificationElementType.POST_SURVEY,
|
||||||
|
"comment": NotificationElementType.COMMENT,
|
||||||
|
"friend_request": NotificationElementType.FRIENDSHIP_REQUEST,
|
||||||
|
"group_membership": NotificationElementType.GROUP_MEMBERSHIP,
|
||||||
|
};
|
||||||
|
|
||||||
|
const _NotificationsTypeAPImapping = {
|
||||||
|
"comment_created": NotificationType.COMMENT_CREATED,
|
||||||
|
"sent_friend_request": NotificationType.SENT_FRIEND_REQUEST,
|
||||||
|
"accepted_friend_request": NotificationType.ACCEPTED_FRIEND_REQUEST,
|
||||||
|
"rejected_friend_request": NotificationType.REJECTED_FRIEND_REQUEST,
|
||||||
|
"elem_created": NotificationType.ELEM_CREATED,
|
||||||
|
"elem_updated": NotificationType.ELEM_UPDATED,
|
||||||
|
"sent_group_membership_invitation":
|
||||||
|
NotificationType.SENT_GROUP_MEMBERSHIP_INVITATION,
|
||||||
|
"accepted_group_membership_invitation":
|
||||||
|
NotificationType.ACCEPTED_GROUP_MEMBERSHIP_INVITATION,
|
||||||
|
"rejected_group_membership_invitation":
|
||||||
|
NotificationType.REJECTED_GROUP_MEMBERSHIP_INVITATION,
|
||||||
|
"sent_group_membership_request":
|
||||||
|
NotificationType.SENT_GROUP_MEMBERSHIP_REQUEST,
|
||||||
|
"accepted_group_membership_request":
|
||||||
|
NotificationType.ACCEPTED_GROUP_MEMBERSHIP_REQUEST,
|
||||||
|
"rejected_group_membership_request":
|
||||||
|
NotificationType.REJECTED_GROUP_MEMBERSHIP_REQUEST,
|
||||||
|
};
|
||||||
|
|
||||||
|
class NotificationsHelper {
|
||||||
|
/// Get the list of unread notifications of the user
|
||||||
|
Future<NotificationsList> getUnread() async {
|
||||||
|
final response =
|
||||||
|
await APIRequest(uri: "notifications/get_list_unread", needLogin: true)
|
||||||
|
.exec();
|
||||||
|
|
||||||
|
if (!response.isOK)
|
||||||
|
throw Exception("Could not get the list of notifications!");
|
||||||
|
|
||||||
|
// Parse the list of notifications
|
||||||
|
return NotificationsList()
|
||||||
|
..addAll(response
|
||||||
|
.getArray()
|
||||||
|
.map((f) => Notification(
|
||||||
|
id: f["id"],
|
||||||
|
timeCreate: f["time_create"],
|
||||||
|
seen: f["seen"],
|
||||||
|
fromUser: f["from_user_id"],
|
||||||
|
onElemId: f["on_elem_id"],
|
||||||
|
onElemType: _NotificationElementTypeAPImapping[f["on_elem_type"]],
|
||||||
|
type: _NotificationsTypeAPImapping[f["type"]],
|
||||||
|
fromContainerId: f["from_container_id"],
|
||||||
|
fromContainerType: f["from_container_type"] == ""
|
||||||
|
? null
|
||||||
|
: _NotificationElementTypeAPImapping[
|
||||||
|
f["from_container_type"]]))
|
||||||
|
.toList());
|
||||||
|
}
|
||||||
|
}
|
19
lib/lists/abstract_list.dart
Normal file
19
lib/lists/abstract_list.dart
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import 'dart:collection';
|
||||||
|
|
||||||
|
/// Abstract list
|
||||||
|
///
|
||||||
|
/// @author Pierre HUBERT
|
||||||
|
|
||||||
|
class AbstractList<E> extends ListBase<E> {
|
||||||
|
final _list = List<E>();
|
||||||
|
|
||||||
|
int get length => _list.length;
|
||||||
|
|
||||||
|
set length(int l) => _list.length = l;
|
||||||
|
|
||||||
|
@override
|
||||||
|
E operator [](int index) => _list[index];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void operator []=(int index, E value) => _list[index] = value;
|
||||||
|
}
|
8
lib/lists/notifications_list.dart
Normal file
8
lib/lists/notifications_list.dart
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import 'package:comunic/lists/abstract_list.dart';
|
||||||
|
import 'package:comunic/models/notification.dart';
|
||||||
|
|
||||||
|
/// Notifications list
|
||||||
|
///
|
||||||
|
/// @author Pierre HUBERT
|
||||||
|
|
||||||
|
class NotificationsList extends AbstractList<Notification> {}
|
69
lib/models/notification.dart
Normal file
69
lib/models/notification.dart
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
/// Notification model
|
||||||
|
///
|
||||||
|
/// @author Pierre HUBERT
|
||||||
|
|
||||||
|
enum NotificationElementType {
|
||||||
|
USER_PAGE,
|
||||||
|
GROUP_PAGE,
|
||||||
|
CONVERSATION,
|
||||||
|
CONVERSATION_MESSAGE,
|
||||||
|
POST,
|
||||||
|
POST_TEXT,
|
||||||
|
POST_IMAGE,
|
||||||
|
POST_YOUTUBE,
|
||||||
|
POST_MOVIE,
|
||||||
|
POST_WEBLINK,
|
||||||
|
POST_PDF,
|
||||||
|
POST_TIMER,
|
||||||
|
POST_SURVEY,
|
||||||
|
COMMENT,
|
||||||
|
FRIENDSHIP_REQUEST,
|
||||||
|
GROUP_MEMBERSHIP,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum NotificationType {
|
||||||
|
COMMENT_CREATED,
|
||||||
|
SENT_FRIEND_REQUEST,
|
||||||
|
ACCEPTED_FRIEND_REQUEST,
|
||||||
|
REJECTED_FRIEND_REQUEST,
|
||||||
|
ELEM_CREATED,
|
||||||
|
ELEM_UPDATED,
|
||||||
|
SENT_GROUP_MEMBERSHIP_INVITATION,
|
||||||
|
ACCEPTED_GROUP_MEMBERSHIP_INVITATION,
|
||||||
|
REJECTED_GROUP_MEMBERSHIP_INVITATION,
|
||||||
|
SENT_GROUP_MEMBERSHIP_REQUEST,
|
||||||
|
ACCEPTED_GROUP_MEMBERSHIP_REQUEST,
|
||||||
|
REJECTED_GROUP_MEMBERSHIP_REQUEST,
|
||||||
|
}
|
||||||
|
|
||||||
|
class Notification {
|
||||||
|
final int id;
|
||||||
|
final int timeCreate;
|
||||||
|
final bool seen;
|
||||||
|
final int fromUser;
|
||||||
|
final int onElemId;
|
||||||
|
final NotificationElementType onElemType;
|
||||||
|
final NotificationType type;
|
||||||
|
final int fromContainerId;
|
||||||
|
final NotificationElementType fromContainerType;
|
||||||
|
|
||||||
|
const Notification({
|
||||||
|
@required this.id,
|
||||||
|
@required this.timeCreate,
|
||||||
|
@required this.seen,
|
||||||
|
@required this.fromUser,
|
||||||
|
@required this.onElemId,
|
||||||
|
@required this.onElemType,
|
||||||
|
@required this.type,
|
||||||
|
@required this.fromContainerId,
|
||||||
|
@required this.fromContainerType,
|
||||||
|
}) : assert(id != null),
|
||||||
|
assert(timeCreate != null),
|
||||||
|
assert(seen != null),
|
||||||
|
assert(fromUser != null),
|
||||||
|
assert(onElemId != null),
|
||||||
|
assert(onElemType != null),
|
||||||
|
assert(type != null);
|
||||||
|
}
|
@ -3,6 +3,7 @@ import 'package:comunic/ui/routes/app_settings_route.dart';
|
|||||||
import 'package:comunic/ui/screens/conversations_list_screen.dart';
|
import 'package:comunic/ui/screens/conversations_list_screen.dart';
|
||||||
import 'package:comunic/ui/screens/friends_list_screen.dart';
|
import 'package:comunic/ui/screens/friends_list_screen.dart';
|
||||||
import 'package:comunic/ui/screens/newest_posts.dart';
|
import 'package:comunic/ui/screens/newest_posts.dart';
|
||||||
|
import 'package:comunic/ui/screens/notifications_screen.dart';
|
||||||
import 'package:comunic/ui/widgets/navbar_widget.dart';
|
import 'package:comunic/ui/widgets/navbar_widget.dart';
|
||||||
import 'package:comunic/utils/account_utils.dart';
|
import 'package:comunic/utils/account_utils.dart';
|
||||||
import 'package:comunic/utils/intl_utils.dart';
|
import 'package:comunic/utils/intl_utils.dart';
|
||||||
@ -76,6 +77,9 @@ class _HomeRouteState extends State<HomeRoute> {
|
|||||||
/// Build the body of the application
|
/// Build the body of the application
|
||||||
Widget _buildBody(BuildContext context) {
|
Widget _buildBody(BuildContext context) {
|
||||||
switch (_currTab) {
|
switch (_currTab) {
|
||||||
|
case BarCallbackActions.OPEN_NOTIFICATIONS:
|
||||||
|
return NotificationsScreen();
|
||||||
|
|
||||||
case BarCallbackActions.OPEN_CONVERSATIONS:
|
case BarCallbackActions.OPEN_CONVERSATIONS:
|
||||||
return ConversationsListScreen();
|
return ConversationsListScreen();
|
||||||
|
|
||||||
|
46
lib/ui/screens/notifications_screen.dart
Normal file
46
lib/ui/screens/notifications_screen.dart
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import 'package:comunic/lists/notifications_list.dart';
|
||||||
|
import 'package:comunic/utils/intl_utils.dart';
|
||||||
|
import 'package:comunic/utils/ui_utils.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
/// Notifications screen
|
||||||
|
///
|
||||||
|
/// @author Pierre HUBERT
|
||||||
|
|
||||||
|
enum _Status { LOADING, ERROR, NONE }
|
||||||
|
|
||||||
|
class NotificationsScreen extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_NotificationsScreenState createState() => _NotificationsScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _NotificationsScreenState extends State<NotificationsScreen> {
|
||||||
|
NotificationsList _list;
|
||||||
|
_Status _status = _Status.LOADING;
|
||||||
|
|
||||||
|
void setStatus(_Status s) => setState(() => _status = s);
|
||||||
|
|
||||||
|
Future<void> _loadList() async {
|
||||||
|
setStatus(_Status.LOADING);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
// In case of error
|
||||||
|
if (_status == _Status.ERROR)
|
||||||
|
return buildErrorCard(tr("Could not get the list of notifications!"),
|
||||||
|
actions: [
|
||||||
|
MaterialButton(
|
||||||
|
onPressed: () => _loadList(),
|
||||||
|
child: Text(tr("Try again".toUpperCase())),
|
||||||
|
)
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Loading status
|
||||||
|
if (_list == null || _status == _Status.LOADING)
|
||||||
|
return Center(
|
||||||
|
child: CircularProgressIndicator(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ typedef OnSelectMenuAction = void Function(BarCallbackActions);
|
|||||||
|
|
||||||
/// Callback actions
|
/// Callback actions
|
||||||
enum BarCallbackActions {
|
enum BarCallbackActions {
|
||||||
|
OPEN_NOTIFICATIONS,
|
||||||
OPEN_CONVERSATIONS,
|
OPEN_CONVERSATIONS,
|
||||||
OPEN_NEWEST_POSTS,
|
OPEN_NEWEST_POSTS,
|
||||||
OPEN_FRIENDS,
|
OPEN_FRIENDS,
|
||||||
@ -20,6 +21,7 @@ enum BarCallbackActions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Color _primaryColor() => darkTheme() ? Colors.black : Colors.blue;
|
Color _primaryColor() => darkTheme() ? Colors.black : Colors.blue;
|
||||||
|
|
||||||
Color _secondaryColor() => darkTheme() ? darkAccentColor : Colors.white;
|
Color _secondaryColor() => darkTheme() ? darkAccentColor : Colors.white;
|
||||||
|
|
||||||
/// Menu item information
|
/// Menu item information
|
||||||
@ -52,6 +54,10 @@ class _ActionMenuItem {
|
|||||||
|
|
||||||
/// List of menu items to show
|
/// List of menu items to show
|
||||||
final _menuItems = <_MenuItem>[
|
final _menuItems = <_MenuItem>[
|
||||||
|
_MenuItem(
|
||||||
|
label: tr("Notifications"),
|
||||||
|
icon: Icon(Icons.notifications),
|
||||||
|
action: BarCallbackActions.OPEN_NOTIFICATIONS),
|
||||||
_MenuItem(
|
_MenuItem(
|
||||||
label: tr("Conversations"),
|
label: tr("Conversations"),
|
||||||
icon: Icon(Icons.comment),
|
icon: Icon(Icons.comment),
|
||||||
|
Loading…
Reference in New Issue
Block a user