Merge branch 'diplomatic-quarter-live' of https://gitlab.com/Cloud_Solution/diplomatic-quarter into sultan
commit
4976870d2e
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