Merge branch 'diplomatic-quarter-live' of https://gitlab.com/Cloud_Solution/diplomatic-quarter into diplomatic-quarter-haroon
commit
b7b7ead3ba
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
@ -0,0 +1,22 @@
|
|||||||
|
class GetNotificationsRequestModel {
|
||||||
|
int notificationStatusID;
|
||||||
|
int pagingSize;
|
||||||
|
int currentPage;
|
||||||
|
|
||||||
|
GetNotificationsRequestModel(
|
||||||
|
{this.notificationStatusID, this.pagingSize, this.currentPage});
|
||||||
|
|
||||||
|
GetNotificationsRequestModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
notificationStatusID = json['NotificationStatusID'];
|
||||||
|
pagingSize = json['pagingSize'];
|
||||||
|
currentPage = json['currentPage'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['NotificationStatusID'] = this.notificationStatusID;
|
||||||
|
data['pagingSize'] = this.pagingSize;
|
||||||
|
data['currentPage'] = this.currentPage;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
class GetNotificationsResponseModel {
|
||||||
|
int id;
|
||||||
|
int recordId;
|
||||||
|
int patientID;
|
||||||
|
bool projectOutSA;
|
||||||
|
String deviceType;
|
||||||
|
String deviceToken;
|
||||||
|
String message;
|
||||||
|
String messageType;
|
||||||
|
String messageTypeData;
|
||||||
|
dynamic videoURL;
|
||||||
|
bool isQueue;
|
||||||
|
String isQueueOn;
|
||||||
|
String createdOn;
|
||||||
|
String createdBy;
|
||||||
|
String notificationType;
|
||||||
|
bool isSent;
|
||||||
|
String isSentOn;
|
||||||
|
bool isRead;
|
||||||
|
String isReadOn;
|
||||||
|
int channelID;
|
||||||
|
int projectID;
|
||||||
|
|
||||||
|
GetNotificationsResponseModel(
|
||||||
|
{this.id,
|
||||||
|
this.recordId,
|
||||||
|
this.patientID,
|
||||||
|
this.projectOutSA,
|
||||||
|
this.deviceType,
|
||||||
|
this.deviceToken,
|
||||||
|
this.message,
|
||||||
|
this.messageType,
|
||||||
|
this.messageTypeData,
|
||||||
|
this.videoURL,
|
||||||
|
this.isQueue,
|
||||||
|
this.isQueueOn,
|
||||||
|
this.createdOn,
|
||||||
|
this.createdBy,
|
||||||
|
this.notificationType,
|
||||||
|
this.isSent,
|
||||||
|
this.isSentOn,
|
||||||
|
this.isRead,
|
||||||
|
this.isReadOn,
|
||||||
|
this.channelID,
|
||||||
|
this.projectID});
|
||||||
|
|
||||||
|
GetNotificationsResponseModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
id = json['Id'];
|
||||||
|
recordId = json['RecordId'];
|
||||||
|
patientID = json['PatientID'];
|
||||||
|
projectOutSA = json['ProjectOutSA'];
|
||||||
|
deviceType = json['DeviceType'];
|
||||||
|
deviceToken = json['DeviceToken'];
|
||||||
|
message = json['Message'];
|
||||||
|
messageType = json['MessageType'];
|
||||||
|
messageTypeData = json['MessageTypeData'];
|
||||||
|
videoURL = json['VideoURL'];
|
||||||
|
isQueue = json['IsQueue'];
|
||||||
|
isQueueOn = json['IsQueueOn'];
|
||||||
|
createdOn = json['CreatedOn'];
|
||||||
|
createdBy = json['CreatedBy'];
|
||||||
|
notificationType = json['NotificationType'];
|
||||||
|
isSent = json['IsSent'];
|
||||||
|
isSentOn = json['IsSentOn'];
|
||||||
|
isRead = json['IsRead'];
|
||||||
|
isReadOn = json['IsReadOn'];
|
||||||
|
channelID = json['ChannelID'];
|
||||||
|
projectID = json['ProjectID'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['Id'] = this.id;
|
||||||
|
data['RecordId'] = this.recordId;
|
||||||
|
data['PatientID'] = this.patientID;
|
||||||
|
data['ProjectOutSA'] = this.projectOutSA;
|
||||||
|
data['DeviceType'] = this.deviceType;
|
||||||
|
data['DeviceToken'] = this.deviceToken;
|
||||||
|
data['Message'] = this.message;
|
||||||
|
data['MessageType'] = this.messageType;
|
||||||
|
data['MessageTypeData'] = this.messageTypeData;
|
||||||
|
data['VideoURL'] = this.videoURL;
|
||||||
|
data['IsQueue'] = this.isQueue;
|
||||||
|
data['IsQueueOn'] = this.isQueueOn;
|
||||||
|
data['CreatedOn'] = this.createdOn;
|
||||||
|
data['CreatedBy'] = this.createdBy;
|
||||||
|
data['NotificationType'] = this.notificationType;
|
||||||
|
data['IsSent'] = this.isSent;
|
||||||
|
data['IsSentOn'] = this.isSentOn;
|
||||||
|
data['IsRead'] = this.isRead;
|
||||||
|
data['IsReadOn'] = this.isReadOn;
|
||||||
|
data['ChannelID'] = this.channelID;
|
||||||
|
data['ProjectID'] = this.projectID;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
class MarkMessageAsReadRequestModel {
|
||||||
|
int notificationPoolID;
|
||||||
|
|
||||||
|
MarkMessageAsReadRequestModel({this.notificationPoolID});
|
||||||
|
|
||||||
|
MarkMessageAsReadRequestModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
notificationPoolID = json['NotificationPoolID'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['NotificationPoolID'] = this.notificationPoolID;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/config.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/notifications/get_notifications_request_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/notifications/get_notifications_response_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/notifications/mark_message_as_read_request_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/service/base_service.dart';
|
||||||
|
|
||||||
|
class NotificationService extends BaseService {
|
||||||
|
List<GetNotificationsResponseModel> notificationsList = List();
|
||||||
|
|
||||||
|
Future getAllNotifications(GetNotificationsRequestModel getNotificationsRequestModel ) async {
|
||||||
|
hasError = false;
|
||||||
|
await baseAppClient.post(PUSH_NOTIFICATION_GET_ALL_NOTIFICATIONS,
|
||||||
|
onSuccess: (dynamic response, int statusCode) {
|
||||||
|
if(getNotificationsRequestModel.currentPage ==0)
|
||||||
|
notificationsList.clear();
|
||||||
|
response['List_GetAllNotificationsFromPool'].forEach((appoint) {
|
||||||
|
notificationsList.add(GetNotificationsResponseModel.fromJson(appoint));
|
||||||
|
});
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
hasError = true;
|
||||||
|
super.error = error;
|
||||||
|
}, body: getNotificationsRequestModel.toJson());
|
||||||
|
}
|
||||||
|
Future markAsRead(MarkMessageAsReadRequestModel markMessageAsReadRequestModel ) async {
|
||||||
|
hasError = false;
|
||||||
|
await baseAppClient.post(PUSH_NOTIFICATION_SET_MESSAGES_FROM_POOL_AS_READ,
|
||||||
|
onSuccess: (dynamic response, int statusCode) {
|
||||||
|
updateNotification(markMessageAsReadRequestModel.notificationPoolID);
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
hasError = true;
|
||||||
|
super.error = error;
|
||||||
|
}, body: markMessageAsReadRequestModel.toJson());
|
||||||
|
}
|
||||||
|
|
||||||
|
updateNotification(id) {
|
||||||
|
int index = notificationsList.indexWhere((element) => element.id == id);
|
||||||
|
notificationsList[index].isRead = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/notifications/get_notifications_request_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/notifications/get_notifications_response_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/notifications/mark_message_as_read_request_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/service/notifications_service.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import '../../locator.dart';
|
||||||
|
import 'base_view_model.dart';
|
||||||
|
|
||||||
|
class NotificationViewModel extends BaseViewModel {
|
||||||
|
NotificationService _notificationService = locator<NotificationService>();
|
||||||
|
|
||||||
|
List<GetNotificationsResponseModel> get notifications =>
|
||||||
|
_notificationService.notificationsList;
|
||||||
|
|
||||||
|
Future getNotifications(
|
||||||
|
GetNotificationsRequestModel getNotificationsRequestModel, BuildContext context) async {
|
||||||
|
if(getNotificationsRequestModel.currentPage == 0)
|
||||||
|
setState(ViewState.Busy);
|
||||||
|
|
||||||
|
await _notificationService
|
||||||
|
.getAllNotifications(getNotificationsRequestModel);
|
||||||
|
if (_notificationService.hasError) {
|
||||||
|
error = _notificationService.error;
|
||||||
|
setState(ViewState.Error);
|
||||||
|
} else {
|
||||||
|
setState(ViewState.Idle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future markAsRead(id) async {
|
||||||
|
// setState(ViewState.Busy);
|
||||||
|
MarkMessageAsReadRequestModel markMessageAsReadRequestModel =
|
||||||
|
new MarkMessageAsReadRequestModel(notificationPoolID: id);
|
||||||
|
await _notificationService.markAsRead(markMessageAsReadRequestModel);
|
||||||
|
setState(ViewState.Idle);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,103 @@
|
|||||||
|
import 'package:diplomaticquarterapp/core/model/notifications/get_notifications_response_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/viewModels/notifications_view_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/progress_indicator/app_circular_progress_Indeicator.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class NotificationsDetailsPage extends StatelessWidget {
|
||||||
|
final GetNotificationsResponseModel notification;
|
||||||
|
|
||||||
|
NotificationsDetailsPage({this.notification});
|
||||||
|
|
||||||
|
getDateForm(String date) {
|
||||||
|
DateTime d = DateUtil.convertStringToDate(date);
|
||||||
|
String monthName = DateUtil.getMonth(d.month).toString();
|
||||||
|
TimeOfDay timeOfDay = TimeOfDay(hour: d.hour, minute: d.minute);
|
||||||
|
String minute = timeOfDay.minute < 10
|
||||||
|
? timeOfDay.minute.toString().padLeft(2, '0')
|
||||||
|
: timeOfDay.minute.toString();
|
||||||
|
|
||||||
|
String hour = '${timeOfDay.hourOfPeriod}:$minute';
|
||||||
|
if (timeOfDay.period == DayPeriod.am) {
|
||||||
|
hour = hour + "AM";
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
hour = hour + "PM";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return monthName + ',${d.day},${d.year}, $hour';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BaseView<NotificationViewModel>(
|
||||||
|
builder: (_, model, widget) => AppScaffold(
|
||||||
|
isShowAppBar: true,
|
||||||
|
appBarTitle: TranslationBase.of(context).notificationDetails,
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Center(
|
||||||
|
child: FractionallySizedBox(
|
||||||
|
widthFactor: 0.9,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
height: 25,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
// margin: EdgeInsets.only(left: 30),
|
||||||
|
width: double.infinity,
|
||||||
|
color: Colors.grey[400],
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Texts(
|
||||||
|
getDateForm(notification.createdOn),
|
||||||
|
fontSize: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 15,
|
||||||
|
),
|
||||||
|
if (notification.messageTypeData.length != 0)
|
||||||
|
FractionallySizedBox(
|
||||||
|
widthFactor: 0.9,
|
||||||
|
child: Image.network(notification.messageTypeData,
|
||||||
|
loadingBuilder: (BuildContext context, Widget child,
|
||||||
|
ImageChunkEvent loadingProgress) {
|
||||||
|
if (loadingProgress == null) return child;
|
||||||
|
return Center(
|
||||||
|
child: SizedBox(
|
||||||
|
width: 40.0,
|
||||||
|
height: 40.0,
|
||||||
|
child: AppCircularProgressIndicator(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
fit: BoxFit
|
||||||
|
.fill) //Image.network(notification.messageTypeData),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 15,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Center(
|
||||||
|
child: Texts(notification.message),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,148 @@
|
|||||||
|
import 'package:diplomaticquarterapp/core/model/notifications/get_notifications_request_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/viewModels/notifications_view_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/DrawerPages/notifications/notification_details_page.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
|
|
||||||
|
// ignore: must_be_immutable
|
||||||
|
class NotificationsPage extends StatelessWidget {
|
||||||
|
getDateForm(String date) {
|
||||||
|
DateTime d = DateUtil.convertStringToDate(date);
|
||||||
|
String monthName = DateUtil.getMonth(d.month).toString();
|
||||||
|
TimeOfDay timeOfDay = TimeOfDay(hour: d.hour, minute: d.minute);
|
||||||
|
String minute = timeOfDay.minute < 10
|
||||||
|
? timeOfDay.minute.toString().padLeft(2, '0')
|
||||||
|
: timeOfDay.minute.toString();
|
||||||
|
|
||||||
|
String hour = '${timeOfDay.hourOfPeriod}:$minute';
|
||||||
|
if (timeOfDay.period == DayPeriod.am) {
|
||||||
|
hour = hour + "AM";
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
hour = hour + "PM";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//DayPeriod.am
|
||||||
|
return monthName + ',${d.day},${d.year}, $hour';
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentIndex = 0;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
var prescriptionReport;
|
||||||
|
return BaseView<NotificationViewModel>(
|
||||||
|
onModelReady: (model) {
|
||||||
|
GetNotificationsRequestModel getNotificationsRequestModel =
|
||||||
|
new GetNotificationsRequestModel(
|
||||||
|
currentPage: currentIndex,
|
||||||
|
pagingSize: 14,
|
||||||
|
notificationStatusID: 2);
|
||||||
|
|
||||||
|
model.getNotifications(getNotificationsRequestModel, context);
|
||||||
|
},
|
||||||
|
builder: (_, model, widget) => AppScaffold(
|
||||||
|
isShowAppBar: true,
|
||||||
|
appBarTitle: TranslationBase.of(context).notifications,
|
||||||
|
baseViewModel: model,
|
||||||
|
body: ListView(
|
||||||
|
children: model.notifications
|
||||||
|
.map(
|
||||||
|
(notification) => InkWell(
|
||||||
|
onTap: () async {
|
||||||
|
if(!notification.isRead)
|
||||||
|
model.markAsRead(notification.id);
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (BuildContext context) =>
|
||||||
|
NotificationsDetailsPage(
|
||||||
|
notification: notification,
|
||||||
|
)));
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
margin: EdgeInsets.only(
|
||||||
|
top: 5, left: 10, right: 10, bottom: 5),
|
||||||
|
padding: EdgeInsets.all(8.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.all(
|
||||||
|
Radius.circular(10.0),
|
||||||
|
),
|
||||||
|
border: Border.all(
|
||||||
|
color: notification.isRead
|
||||||
|
? Colors.grey[200]
|
||||||
|
: Theme.of(context).primaryColor,
|
||||||
|
width: 0.5),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Texts(getDateForm(notification.createdOn)),
|
||||||
|
SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Texts(notification.message)),
|
||||||
|
if (notification.messageType == "image")
|
||||||
|
Icon(FontAwesomeIcons.images)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 15,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList()
|
||||||
|
..add(
|
||||||
|
InkWell(
|
||||||
|
onTap: () async {
|
||||||
|
GifLoaderDialogUtils.showMyDialog(
|
||||||
|
context);
|
||||||
|
currentIndex++;
|
||||||
|
GetNotificationsRequestModel
|
||||||
|
getNotificationsRequestModel =
|
||||||
|
new GetNotificationsRequestModel(
|
||||||
|
currentPage: currentIndex,
|
||||||
|
pagingSize: 14,
|
||||||
|
notificationStatusID: 2);
|
||||||
|
|
||||||
|
await model.getNotifications(getNotificationsRequestModel,context);
|
||||||
|
GifLoaderDialogUtils.hideDialog(
|
||||||
|
context);
|
||||||
|
|
||||||
|
},
|
||||||
|
child: Center(
|
||||||
|
child: Image.asset('assets/images/notf.png'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue