Added unread list api in notification
This commit is contained in:
@@ -4,7 +4,7 @@ import 'package:tm_app/data/services/notification_service.dart';
|
|||||||
|
|
||||||
class NotificationsRepository {
|
class NotificationsRepository {
|
||||||
NotificationsRepository({required NotificationsService notificationsService})
|
NotificationsRepository({required NotificationsService notificationsService})
|
||||||
: _notificationsService = notificationsService;
|
: _notificationsService = notificationsService;
|
||||||
|
|
||||||
final NotificationsService _notificationsService;
|
final NotificationsService _notificationsService;
|
||||||
|
|
||||||
@@ -12,14 +12,20 @@ class NotificationsRepository {
|
|||||||
required int limit,
|
required int limit,
|
||||||
required int offset,
|
required int offset,
|
||||||
}) async {
|
}) async {
|
||||||
return _notificationsService.getNotifications(
|
return _notificationsService.getNotifications(limit: limit, offset: offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Result<Map<String, dynamic>>> markAllAsRead() async {
|
||||||
|
return _notificationsService.markAllAsRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Result<NotificationResponseModel>> getUnreadNotifications({
|
||||||
|
required int limit,
|
||||||
|
required int offset,
|
||||||
|
}) {
|
||||||
|
return _notificationsService.getUnreadNotifications(
|
||||||
limit: limit,
|
limit: limit,
|
||||||
offset: offset,
|
offset: offset,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Result<Map<String, dynamic>>> markAllAsRead() async {
|
|
||||||
return _notificationsService.markAllAsRead();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ class NotificationApi {
|
|||||||
static const String markAllAsRead = '/api/v1/notifications/mark';
|
static const String markAllAsRead = '/api/v1/notifications/mark';
|
||||||
static const String markAsRead = '/api/v1/notifications/mark-as-read';
|
static const String markAsRead = '/api/v1/notifications/mark-as-read';
|
||||||
static const String tenderApprovalsTender = '/api/v1/notifications';
|
static const String tenderApprovalsTender = '/api/v1/notifications';
|
||||||
static String getTenderApprovalById({required String tenderId}) {
|
static const String unreadNotifications = '/api/v1/notifications?seen=false';
|
||||||
return '$tenderApprovalsTender/$tenderId';
|
static String getUnreadNotifications({required int limit, required int offset}) {
|
||||||
|
return '$unreadNotifications?limit=$limit&offset=$offset';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
// notification_service.dart
|
// notification_service.dart
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:tm_app/core/utils/result.dart';
|
||||||
import 'package:tm_app/data/services/api/notification_api.dart';
|
import 'package:tm_app/data/services/api/notification_api.dart';
|
||||||
import 'package:tm_app/data/services/model/notification__response/notification_response_model.dart';
|
import 'package:tm_app/data/services/model/notification__response/notification_response_model.dart';
|
||||||
|
|
||||||
import 'package:tm_app/core/utils/result.dart';
|
|
||||||
import '../../core/network/network_manager.dart';
|
import '../../core/network/network_manager.dart';
|
||||||
|
|
||||||
class NotificationsService {
|
class NotificationsService {
|
||||||
NotificationsService({required NetworkManager networkManager})
|
NotificationsService({required NetworkManager networkManager})
|
||||||
: _networkManager = networkManager;
|
: _networkManager = networkManager;
|
||||||
final NetworkManager _networkManager;
|
final NetworkManager _networkManager;
|
||||||
|
|
||||||
Future<Result<NotificationResponseModel>> getNotifications({
|
Future<Result<NotificationResponseModel>> getNotifications({
|
||||||
@@ -24,15 +25,14 @@ class NotificationsService {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Result<Map<String, dynamic>>> markAllAsRead() async {
|
Future<Result<Map<String, dynamic>>> markAllAsRead() async {
|
||||||
final result = await _networkManager.makeRequest(
|
final result = await _networkManager.makeRequest(
|
||||||
NotificationApi.markAllAsRead,
|
NotificationApi.markAllAsRead,
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
(json) => json,
|
(json) => json,
|
||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Future<Result<NotificationResponseModel>> markAsRead({
|
Future<Result<NotificationResponseModel>> markAsRead({
|
||||||
required String notificationId,
|
required String notificationId,
|
||||||
@@ -46,4 +46,16 @@ Future<Result<Map<String, dynamic>>> markAllAsRead() async {
|
|||||||
);
|
);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<Result<NotificationResponseModel>> getUnreadNotifications({
|
||||||
|
required int limit,
|
||||||
|
required int offset,
|
||||||
|
}) async {
|
||||||
|
final result = await _networkManager.makeRequest(
|
||||||
|
NotificationApi.unreadNotifications,
|
||||||
|
method: 'GET',
|
||||||
|
(json) => NotificationResponseModel.fromJson(json),
|
||||||
|
);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ class NotificationViewModel with ChangeNotifier {
|
|||||||
: _repository = repositoryViewModel {
|
: _repository = repositoryViewModel {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
getNotifications();
|
getNotifications();
|
||||||
|
getUnreadNotifications();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,6 +31,13 @@ class NotificationViewModel with ChangeNotifier {
|
|||||||
bool get hasMoreData => _hasMoreData;
|
bool get hasMoreData => _hasMoreData;
|
||||||
int get totalPages => _totalPages;
|
int get totalPages => _totalPages;
|
||||||
|
|
||||||
|
NotificationResponseModel? _unreadNotificationResponse;
|
||||||
|
bool _isUnreadLoading = false;
|
||||||
|
|
||||||
|
NotificationResponseModel? get unreadNotificationResponse =>
|
||||||
|
_unreadNotificationResponse;
|
||||||
|
bool get isUnreadLoading => _isUnreadLoading;
|
||||||
|
|
||||||
/// Fetch notifications
|
/// Fetch notifications
|
||||||
Future<void> getNotifications({int page = 1, bool isMobile = false}) async {
|
Future<void> getNotifications({int page = 1, bool isMobile = false}) async {
|
||||||
_isLoading = true;
|
_isLoading = true;
|
||||||
@@ -110,7 +118,9 @@ class NotificationViewModel with ChangeNotifier {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
await getNotifications(page: 1);
|
await getNotifications(page: currentPage, );
|
||||||
|
await getUnreadNotifications();
|
||||||
|
|
||||||
|
|
||||||
// toast success
|
// toast success
|
||||||
AppToast.success(context, 'All notifications marked as read.');
|
AppToast.success(context, 'All notifications marked as read.');
|
||||||
@@ -147,4 +157,28 @@ class NotificationViewModel with ChangeNotifier {
|
|||||||
return '${difference.inDays} days ago';
|
return '${difference.inDays} days ago';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> getUnreadNotifications({int page = 1}) async {
|
||||||
|
_isUnreadLoading = true;
|
||||||
|
notifyListeners();
|
||||||
|
|
||||||
|
final int offset = _pageSize * page;
|
||||||
|
|
||||||
|
final result = await _repository.getUnreadNotifications(
|
||||||
|
limit: _pageSize,
|
||||||
|
offset: offset,
|
||||||
|
);
|
||||||
|
|
||||||
|
switch (result) {
|
||||||
|
case Ok<NotificationResponseModel>():
|
||||||
|
_unreadNotificationResponse = result.value;
|
||||||
|
break;
|
||||||
|
case Error<NotificationResponseModel>():
|
||||||
|
_errorMessage = result.error.toString();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
_isUnreadLoading = false;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,20 @@ class NotificationUnreadTab extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final viewModel = context.watch<NotificationViewModel>();
|
final viewModel = context.watch<NotificationViewModel>();
|
||||||
|
|
||||||
|
if (viewModel.isUnreadLoading) {
|
||||||
|
return const Center(child: CircularProgressIndicator());
|
||||||
|
}
|
||||||
|
|
||||||
final notifications =
|
final notifications =
|
||||||
viewModel.notificationResponse?.data?.notifications ?? [];
|
viewModel.unreadNotificationResponse?.data?.notifications ?? [];
|
||||||
|
|
||||||
|
if (notifications.isEmpty) {
|
||||||
|
return const Center(child: Text('No unread notifications'));
|
||||||
|
}
|
||||||
|
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
|
controller: scrollController,
|
||||||
itemCount: notifications.length,
|
itemCount: notifications.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final notification = notifications[index];
|
final notification = notifications[index];
|
||||||
|
|||||||
Reference in New Issue
Block a user