diff --git a/Frontend/patient_manager/images/notify_logo.png b/Frontend/patient_manager/images/notify_logo.png new file mode 100644 index 00000000..1041552c Binary files /dev/null and b/Frontend/patient_manager/images/notify_logo.png differ diff --git a/Frontend/patient_manager/lib/mih_components/mih_pop_up_messages/mih_notification_message.dart b/Frontend/patient_manager/lib/mih_components/mih_pop_up_messages/mih_notification_message.dart new file mode 100644 index 00000000..9e4717fe --- /dev/null +++ b/Frontend/patient_manager/lib/mih_components/mih_pop_up_messages/mih_notification_message.dart @@ -0,0 +1,197 @@ +import 'package:flutter/material.dart'; +import 'package:patient_manager/main.dart'; +import 'package:patient_manager/mih_objects/arguments.dart'; + +class MIHNotificationMessage extends StatefulWidget { + final NotificationArguments arguments; + const MIHNotificationMessage({ + super.key, + required this.arguments, + }); + + @override + State createState() => _MIHNotificationMessageState(); +} + +class _MIHNotificationMessageState extends State + with SingleTickerProviderStateMixin { + //var messageTypes = {}; + late AnimationController _animationController; + late Animation _scaleAnimation; + late double popUpWidth; + late double? popUpheight; + late double popUpTitleSize; + late double popUpSubtitleSize; + late double popUpBodySize; + late double popUpIconSize; + late double popUpPaddingSize; + Size? size; + + void checkScreenSize() { + if (MzanziInnovationHub.of(context)!.theme.screenType == "desktop") { + setState(() { + popUpWidth = (size!.width / 4) * 2; + popUpheight = 90; + popUpTitleSize = 20.0; + popUpSubtitleSize = 20.0; + popUpBodySize = 15; + popUpPaddingSize = 5.0; + popUpIconSize = 100; + }); + } else { + setState(() { + popUpWidth = size!.width - 20; + popUpheight = 90; + popUpTitleSize = 20.0; + popUpSubtitleSize = 18.0; + popUpBodySize = 15; + popUpPaddingSize = 15.0; + popUpIconSize = 100; + }); + } + } + + Widget NotifyPopUp() { + //messageTypes["Input Error"] = + return Stack( + children: [ + Container( + padding: EdgeInsets.all(popUpPaddingSize), + alignment: Alignment.topLeft, + width: popUpWidth, + height: popUpheight, + decoration: BoxDecoration( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + borderRadius: BorderRadius.circular(25.0), + // border: Border.all( + // color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + // width: 5.0), + ), + child: SingleChildScrollView( + child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + //const SizedBox(height: 5), + Row( + children: [ + Icon( + Icons.notifications, + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + Flexible( + child: Text( + widget.arguments.title, + textAlign: TextAlign.left, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + fontSize: popUpTitleSize, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + const SizedBox(height: 5), + Row( + children: [ + Text( + widget.arguments.body, + textAlign: TextAlign.left, + style: TextStyle( + color: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + fontSize: popUpBodySize, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ], + ), + ), + ), + Positioned( + top: 5, + right: 5, + width: 50, + height: 50, + child: IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: Icon( + Icons.close, + color: MzanziInnovationHub.of(context)!.theme.errorColor(), + size: 35, + ), + ), + ), + ], + ); + } + + @override + void dispose() { + _animationController.dispose(); + super.dispose(); + } + + @override + void initState() { + super.initState(); + + _animationController = AnimationController( + vsync: this, + duration: + const Duration(milliseconds: 200), // Adjust the duration as needed + ); + + _scaleAnimation = Tween( + begin: const Offset(0, -1), + end: Offset.zero, + ).animate(_animationController); + + // Start the animation when + // the dialog is displayed + _animationController.forward(); + } + + @override + Widget build(BuildContext context) { + size = MediaQuery.of(context).size; + checkScreenSize(); + //setInputError(); + + //print(size); + // setState(() { + // width = size.width; + // height = size.height; + // }); + return SlideTransition( + position: _scaleAnimation, + child: Dialog( + insetAnimationDuration: const Duration(milliseconds: 1000), + insetAnimationCurve: Curves.bounceIn, + alignment: Alignment.topCenter, + child: NotifyPopUp(), + ), + ); + // return SlideTransition( + // position: Tween( + // begin: const Offset(0, -1), + // end: Offset.zero, + // ).animate(widget.animationController), + // child: Dialog( + // alignment: Alignment.topCenter, + // child: NotifyPopUp(), + // ), + // ); + } +} diff --git a/Frontend/patient_manager/lib/mih_objects/arguments.dart b/Frontend/patient_manager/lib/mih_objects/arguments.dart index ccc57108..c4657bfb 100644 --- a/Frontend/patient_manager/lib/mih_objects/arguments.dart +++ b/Frontend/patient_manager/lib/mih_objects/arguments.dart @@ -7,6 +7,16 @@ import 'package:patient_manager/mih_objects/business_user.dart'; import 'package:patient_manager/mih_objects/notification.dart'; import 'package:patient_manager/mih_objects/patients.dart'; +class NotificationArguments { + final String title; + final String body; + + NotificationArguments( + this.title, + this.body, + ); +} + class BusinessArguments { final AppUser signedInUser; final BusinessUser? businessUser; diff --git a/Frontend/patient_manager/lib/mih_packages/mih_home/mih_home.dart b/Frontend/patient_manager/lib/mih_packages/mih_home/mih_home.dart index 7d712adc..91a83fd0 100644 --- a/Frontend/patient_manager/lib/mih_packages/mih_home/mih_home.dart +++ b/Frontend/patient_manager/lib/mih_packages/mih_home/mih_home.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; @@ -14,6 +15,7 @@ import 'package:patient_manager/mih_components/mih_layout/mih_app_drawer.dart'; import 'package:patient_manager/mih_components/mih_layout/mih_window.dart'; import 'package:patient_manager/mih_components/mih_pop_up_messages/mih_delete_message.dart'; import 'package:patient_manager/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:patient_manager/mih_components/mih_pop_up_messages/mih_notification_message.dart'; import 'package:patient_manager/mih_components/mih_pop_up_messages/mih_warning_message.dart'; import 'package:patient_manager/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:patient_manager/mih_components/mih_pop_up_messages/mih_success_message.dart'; @@ -239,6 +241,30 @@ class _MIHHomeState extends State { void setAppsDev(List tileList) { if (AppEnviroment.getEnv() == "Dev") { + tileList.add(MIHTile( + onTap: () { + showDialog( + barrierColor: const Color(0x01000000), + context: context, + builder: (context) { + return MIHNotificationMessage( + arguments: NotificationArguments( + "Testing", + "Testing the new MIH Notification", + ), + ); + }, + ); + }, + tileName: "Notify - Dev", + tileIcon: Icon( + Icons.notifications, + color: getSec(), + size: 200, + ), + p: getPrim(), + s: getSec(), + )); tileList.add(MIHTile( onTap: () { showDialog( @@ -705,9 +731,7 @@ class _MIHHomeState extends State { bool hasNewNotifications() { //print(widget.notifications.toString()); - if (widget.notifications - .map((item) => item.notification_read) - .contains("No")) { + if (notifiList.map((item) => item.notification_read).contains("No")) { //print("New Notification Available"); return true; } else { @@ -736,6 +760,25 @@ class _MIHHomeState extends State { setState(() { notifiList = notifi; }); + + if (hasNewNotifications()) { + print("New Notifications"); + // await MIHNotificationServices.showNotification( + // title: "New Notification waiting", + // body: + // "You have new notification waiting for you in the notification panel", + // ); + notificationPopUp(); + } + } + + void notificationPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); } @override @@ -752,7 +795,6 @@ class _MIHHomeState extends State { businessUserSwitch = false; notifiList = widget.notifications; }); - super.initState(); } diff --git a/Frontend/patient_manager/lib/mih_router/routeGenerator.dart b/Frontend/patient_manager/lib/mih_router/routeGenerator.dart index 2328a45f..ca600d1e 100644 --- a/Frontend/patient_manager/lib/mih_router/routeGenerator.dart +++ b/Frontend/patient_manager/lib/mih_router/routeGenerator.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:patient_manager/mih_components/mih_layout/mih_print_prevew.dart'; +import 'package:patient_manager/mih_components/mih_pop_up_messages/mih_notification_message.dart'; import 'package:patient_manager/mih_packages/authentication/auth_check.dart'; import 'package:patient_manager/mih_packages/patient_profile/add_or_view_patient.dart'; import 'package:patient_manager/mih_packages/patient_profile/patient_add.dart'; @@ -40,6 +41,16 @@ class RouteGenerator { case '/': return MaterialPageRoute( settings: settings, builder: (_) => const AuthCheck()); + case '/notifications': + if (args is NotificationArguments) { + return MaterialPageRoute( + settings: settings, + builder: (_) => MIHNotificationMessage( + arguments: args, + ), + ); + } + return _errorRoute(); case '/forgot-password': return MaterialPageRoute( settings: settings, builder: (_) => const ForgotPassword());