From 9463919c4b085defb6834af0c731abe04c53750c Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 23 Jul 2024 11:11:12 +0300 Subject: [PATCH 001/140] Started the Period Tracker feature --- assets/images/period_planner1.svg | 440 ++++++++++++++++++ assets/images/period_planner2.svg | 38 ++ assets/images/period_planner3.svg | 1 + assets/images/period_planner4.svg | 36 ++ lib/src/app/navigation/app_router.dart | 8 + lib/src/app/navigation/menu/menuItems.dart | 20 + .../pages/periodPlannerScreen.dart | 117 +++++ lib/src/utils/constants.dart | 2 + lib/src/utils/routes.dart | 2 + 9 files changed, 664 insertions(+) create mode 100644 assets/images/period_planner1.svg create mode 100644 assets/images/period_planner2.svg create mode 100644 assets/images/period_planner3.svg create mode 100644 assets/images/period_planner4.svg create mode 100644 lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart diff --git a/assets/images/period_planner1.svg b/assets/images/period_planner1.svg new file mode 100644 index 00000000..f3df1dfb --- /dev/null +++ b/assets/images/period_planner1.svg @@ -0,0 +1,440 @@ + \ No newline at end of file diff --git a/assets/images/period_planner2.svg b/assets/images/period_planner2.svg new file mode 100644 index 00000000..f6792382 --- /dev/null +++ b/assets/images/period_planner2.svg @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/assets/images/period_planner3.svg b/assets/images/period_planner3.svg new file mode 100644 index 00000000..ac257459 --- /dev/null +++ b/assets/images/period_planner3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/period_planner4.svg b/assets/images/period_planner4.svg new file mode 100644 index 00000000..3c0dd795 --- /dev/null +++ b/assets/images/period_planner4.svg @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index ea3a8d73..522a0c00 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -52,6 +52,7 @@ import 'package:nishauri/src/features/hiv/presentation/pages/groups/ARTGroups.da import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrderWizardFormScreen.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart'; import 'package:nishauri/src/features/lab/presentation/pages/LabResultsScreen.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; import 'package:nishauri/src/features/treatment_support/presentation/pages/TreatmentSupport.dart'; import 'package:nishauri/src/features/user/presentation/pages/ProfileScreen.dart'; @@ -373,6 +374,13 @@ final List secureRoutes = [ }, ) ]), + GoRoute( + name: RouteNames.PERIOD_PLANNER, + path: 'period-planner', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlannerScreen(); + }, + ), ]; final List openRoutes = [ GoRoute( diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 22e09177..1346e21c 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -266,6 +266,26 @@ List getGenericMenuItems(BuildContext context) { // title: MenuItemNames.CHAT_HCW, // onPressed: () => context.goNamed(RouteNames.CHAT_HCW), // ), + MenuItem( + shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, + icon: SvgPicture.asset( + "assets/images/period_planner4.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset( + "assets/images/period_planner4.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, + ), + title: MenuItemNames.PERIOD_PLANNER, + onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), + color: Constants.periodPlanner, + ), ]; } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart new file mode 100644 index 00000000..167ae1d6 --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class PeriodPlannerScreen extends StatefulWidget { + const PeriodPlannerScreen({super.key}); + + @override + State createState() => _PeriodPlannerScreenState(); +} + +class _PeriodPlannerScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + title: "Period Planner 🌸", + subTitle: "Track Your Cycle with Ease \nAnd Stay Informed", + color: Constants.periodPlanner, + ), + const SizedBox(height: Constants.SPACING), + const Text( + 'Saturday', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const Text( + '23', + style: TextStyle(fontSize: 60, fontWeight: FontWeight.bold), + ), + const SizedBox(height: Constants.SPACING), + Stack( + alignment: Alignment.center, + children: [ + const SizedBox( + width: Constants.SPACING * 30, // Adjust the width as needed + height: Constants.SPACING * 30, // Adjust the height as needed + child: CircularProgressIndicator( + value: 0.3, // example value for the progress + strokeWidth: 10, + backgroundColor: Colors.grey, + valueColor: AlwaysStoppedAnimation(Constants.periodPlanner), + ), + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Period Day 3', + style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold), + ), + const SizedBox(height: Constants.SPACING + 20,), + const Text( + 'Low Chances of getting Pregnant', + style: TextStyle(fontSize: 16), + ), + const SizedBox(height: Constants.SPACING + 20,), + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Constants.periodPlanner, // background + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), // Adjust padding as needed + ), + child: const Text( + 'Daily Log', + style: TextStyle(fontSize: 18), + ), + ), + ], + ), + ], + ), + const SizedBox(height: Constants.SPACING), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + ElevatedButton( + onPressed: () { + // Add symptom log functionality + }, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Colors.grey[300], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + ), + child: const Text( + 'Symptoms', + style: TextStyle(fontSize: 18), + ), + ), + ElevatedButton( + onPressed: () { + // Add discharge log functionality + }, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Colors.grey[300], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + ), + child: const Text( + 'Discharge', + style: TextStyle(fontSize: 18), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index aeb3b049..39a88cc5 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -38,6 +38,8 @@ class Constants { static const clinicCardColor = Color.fromARGB(255,13,71,161); static const announcement = Color.fromARGB(255, 64, 87, 162); static const frequentlyAskedQuestions = Color.fromARGB(255, 123, 83, 162); + static const periodPlanner = Color.fromARGB(255, 244, 143, 177); + static const periodPlannerShortcutBgColor = Color.fromARGB(255, 255, 182, 193); static const iconSize = 70.0; static const shortcutIconSize = 30.0; diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 00c2edb5..0b3b3f67 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -57,6 +57,7 @@ class RouteNames { static const DISPATCHED_DRUGS = "dispatched-drugs"; static const REMOVE_PROGRAM = "remove-program"; static const BLOG_POST = "blog-post"; + static const PERIOD_PLANNER = "Period Planner"; } @@ -84,6 +85,7 @@ class MenuItemNames { static const REQUEST_DRUGS = "Request Drugs"; static const DISPATCHED_DRUGS = "Dispached Drugs"; static const REMOVE_PROGRAM = "Remove Program"; + static const PERIOD_PLANNER = "Period Planner"; } class ProgramCodeNameIds { From 1f9ad70a900c514f57d6cd8b399b8d9300de4633 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 23 Jul 2024 16:15:15 +0300 Subject: [PATCH 002/140] Added a Get Started Page for stating the features of the Period Planner App --- assets/images/getting-started1.jpg | Bin 0 -> 29134 bytes assets/images/getting-started2.jpg | Bin 0 -> 16897 bytes assets/images/getting-started3.jpg | Bin 0 -> 18302 bytes lib/src/app/navigation/app_router.dart | 11 +- .../presentation/pages/periodPlanner.dart | 151 ++++++++++++++++++ .../pages/periodPlannerScreen.dart | 1 - lib/src/utils/routes.dart | 1 + 7 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 assets/images/getting-started1.jpg create mode 100644 assets/images/getting-started2.jpg create mode 100644 assets/images/getting-started3.jpg create mode 100644 lib/src/features/period_planner/presentation/pages/periodPlanner.dart diff --git a/assets/images/getting-started1.jpg b/assets/images/getting-started1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c48368cb588df6c08cf56c49cb22fa1da46256d GIT binary patch literal 29134 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≀$+#KV0p~v{>r5r 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 literal 0 HcmV?d00001 diff --git a/assets/images/getting-started2.jpg b/assets/images/getting-started2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75d01d7e69277a9e5e39be462e9838150dc3a642 GIT binary patch literal 16897 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 M5I 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 secureRoutes = [ GoRoute( name: RouteNames.PERIOD_PLANNER, path: 'period-planner', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlanner(); + }, + ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_SCREEN, + path: 'period-planner-screen', builder: (BuildContext context, GoRouterState state) { return const PeriodPlannerScreen(); }, - ), + ), ]; final List openRoutes = [ GoRoute( diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart new file mode 100644 index 00000000..695b3a2a --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -0,0 +1,151 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class PeriodPlanner extends StatelessWidget { + const PeriodPlanner({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + title: "Period Planner App 🌸", + color: Constants.periodPlanner, + ), + Expanded( + child: SingleChildScrollView( + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(20.0), + decoration: BoxDecoration( + color: Constants.periodPlanner.withOpacity(0.8), + image: const DecorationImage( + image: AssetImage("assets/images/contours.png"), + opacity: 0.1, + fit: BoxFit.cover, + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + DecoratedBox( + decoration: BoxDecoration(), + child: SvgPicture.asset( + "assets/images/period_planner2.svg", + fit: BoxFit.contain, + height: 100, + width: 100, + ), + ), + const SizedBox(height: 20.0), + const Text( + 'Track Your Cycle with Ease', + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 10.0), + const Text( + 'Stay healthy And Well Informed', + style: TextStyle( + color: Colors.white, + fontSize: 16.0, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20.0), + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const PeriodPlannerScreen(), + ), + ); + }, + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric( + vertical: 15.0, + horizontal: 40.0, + ), + ), + child: const Text( + 'Get Started', + style: TextStyle( + fontSize: 18.0, + ), + ), + ), + ], + ), + ), + const SizedBox(height: 20.0), + Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Features', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 10.0), + FeatureTile( + title: 'Track Your Period', + description: 'Keep an accurate record of your menstrual cycles to better understand your health.', + icon: Icons.track_changes, + ), + FeatureTile( + title: 'Period Calendar', + description: 'View and manage your menstrual cycles with a detailed calendar.', + icon: Icons.calendar_today, + ), + FeatureTile( + title: 'Partner Tracking', + description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', + icon: Icons.people, + ), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} + +class FeatureTile extends StatelessWidget { + final String title; + final String description; + final IconData icon; + + FeatureTile({ + required this.title, + required this.description, + required this.icon, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: Icon(icon), + title: Text(title), + subtitle: Text(description), + ); + } +} diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 167ae1d6..21e53fc7 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -76,7 +76,6 @@ class _PeriodPlannerScreenState extends State { ], ), const SizedBox(height: Constants.SPACING), - Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 0b3b3f67..292f0366 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -58,6 +58,7 @@ class RouteNames { static const REMOVE_PROGRAM = "remove-program"; static const BLOG_POST = "blog-post"; static const PERIOD_PLANNER = "Period Planner"; + static const PERIOD_PLANNER_SCREEN = "Period Planner Screen"; } From d7cf62748e0fd54a66e7b6f3490cc0ce4b8277a8 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 23 Jul 2024 18:43:55 +0300 Subject: [PATCH 003/140] added a menu for Period Planner --- lib/src/app/navigation/app_router.dart | 8 ++ .../presentation/pages/periodPlanner.dart | 5 +- .../presentation/pages/periodPlannerMenu.dart | 130 ++++++++++++++++++ lib/src/utils/routes.dart | 1 + 4 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 462e8edc..8bf5773d 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -53,6 +53,7 @@ import 'package:nishauri/src/features/hiv/presentation/pages/groups/ARTGroups.da import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrderWizardFormScreen.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart'; import 'package:nishauri/src/features/lab/presentation/pages/LabResultsScreen.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlanner.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; @@ -390,6 +391,13 @@ final List secureRoutes = [ return const PeriodPlannerScreen(); }, ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_MENU, + path: 'period-planner-menu', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlannerMenu(); + }, + ), ]; final List openRoutes = [ GoRoute( diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index 695b3a2a..b0ff926f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; @@ -23,7 +24,7 @@ class PeriodPlanner extends StatelessWidget { Container( padding: const EdgeInsets.all(20.0), decoration: BoxDecoration( - color: Constants.periodPlanner.withOpacity(0.8), + color: Constants.periodPlanner.withOpacity(1.0), image: const DecorationImage( image: AssetImage("assets/images/contours.png"), opacity: 0.1, @@ -67,7 +68,7 @@ class PeriodPlanner extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => const PeriodPlannerScreen(), + builder: (context) => const PeriodPlannerMenu(), ), ); }, diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart new file mode 100644 index 00000000..7168df37 --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; +import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +_menuItems(BuildContext context) => [ + MenuItem( + shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, + icon: SvgPicture.asset( + "assets/images/period_planner4.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/shopping-meds.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Track Periods", + onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN), + color: Constants.periodPlanner.withOpacity(1.0), + ), + MenuItem( + shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, + icon: SvgPicture.asset( + "assets/images/shopping.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Period Calendar", + onPressed: () => context.goNamed(RouteNames.HIV_DRUG_ORDERS), + color: Constants.periodPlanner.withOpacity(1.0), + ), + MenuItem( + shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, + icon: SvgPicture.asset( + "assets/images/review.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/review.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Partners", + onPressed: () => context.goNamed(RouteNames.DISPATCHED_DRUGS), + color: Constants.periodPlanner.withOpacity(1.0), + ), + ]; + +class PeriodPlannerMenu extends StatelessWidget { + const PeriodPlannerMenu({super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final _items = _menuItems(context); + + return Scaffold( + body: Column( + children: [ + CustomAppBar( + title: "Period Planner 🌸", + color: Constants.periodPlanner.withOpacity(1.0), + ), + Expanded( + child: MenuItemsBuilder( + crossAxisCount: 2, + itemBuilder: (item) => Card( + margin: const EdgeInsets.all(Constants.SPACING), + clipBehavior: Clip.antiAlias, + child: InkWell( + splashColor: Constants.periodPlannerShortcutBgColor, + onTap: item.onPressed, + child: Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: item.color ?? theme.colorScheme.primary, + image: const DecorationImage( + image: AssetImage("assets/images/contours.png"), + opacity: 0.2, + fit: BoxFit.cover, + ), + ), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + item.icon, + const SizedBox(height: Constants.SPACING), + Text( + item.title ?? '', + style: theme.textTheme.titleMedium?.copyWith( + color: Colors.white, + fontWeight: FontWeight.normal, + overflow: TextOverflow.ellipsis, + ), + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + ), + ), + items: _items, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 292f0366..d6a263b7 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -59,6 +59,7 @@ class RouteNames { static const BLOG_POST = "blog-post"; static const PERIOD_PLANNER = "Period Planner"; static const PERIOD_PLANNER_SCREEN = "Period Planner Screen"; + static const PERIOD_PLANNER_MENU = "Period Planner Menu"; } From 04eea226d3f7a80c1ddb988e772a050bcacaee9d Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 24 Jul 2024 17:44:44 +0300 Subject: [PATCH 004/140] added calendar on period planner screen and calendar as well --- assets/images/partners.webp | Bin 0 -> 18894 bytes assets/images/partners1.svg | 71 +++++++++ assets/images/partners2.svg | 38 +++++ assets/images/partners3.svg | 1 + assets/images/period_calender1.png | Bin 0 -> 26546 bytes assets/images/period_calender1.svg | 10 ++ assets/images/period_calender2.png | Bin 0 -> 17904 bytes assets/images/period_calender2.svg | 35 +++++ assets/images/period_calender3.png | Bin 0 -> 38293 bytes lib/src/app/navigation/app_router.dart | 9 ++ lib/src/app/navigation/menu/menuItems.dart | 4 +- .../presentation/pages/periodCalendar.dart | 24 +++ .../presentation/pages/periodPlannerMenu.dart | 16 +- .../pages/periodPlannerScreen.dart | 145 ++++++++---------- .../presentation/widgets/customCalendar.dart | 69 +++++++++ .../presentation/widgets/periodInfoCard.dart | 38 +++++ lib/src/utils/routes.dart | 1 + 17 files changed, 367 insertions(+), 94 deletions(-) create mode 100644 assets/images/partners.webp create mode 100644 assets/images/partners1.svg create mode 100644 assets/images/partners2.svg create mode 100644 assets/images/partners3.svg create mode 100644 assets/images/period_calender1.png create mode 100644 assets/images/period_calender1.svg create mode 100644 assets/images/period_calender2.png create mode 100644 assets/images/period_calender2.svg create mode 100644 assets/images/period_calender3.png create mode 100644 lib/src/features/period_planner/presentation/pages/periodCalendar.dart create mode 100644 lib/src/features/period_planner/presentation/widgets/customCalendar.dart create mode 100644 lib/src/features/period_planner/presentation/widgets/periodInfoCard.dart diff --git a/assets/images/partners.webp b/assets/images/partners.webp new file mode 100644 index 0000000000000000000000000000000000000000..83a7795e74fef5e78a24e1c1d21958107324af27 GIT binary patch literal 18894 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 NW9xy2_5b*n{y*B8El&Ud literal 0 HcmV?d00001 diff --git a/assets/images/partners1.svg b/assets/images/partners1.svg new file mode 100644 index 00000000..4e102ee0 --- /dev/null +++ b/assets/images/partners1.svg @@ -0,0 +1,71 @@ + \ No newline at end of file diff --git a/assets/images/partners2.svg b/assets/images/partners2.svg new file mode 100644 index 00000000..12594e20 --- /dev/null +++ b/assets/images/partners2.svg @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/assets/images/partners3.svg b/assets/images/partners3.svg new file mode 100644 index 00000000..c126e68f --- /dev/null +++ b/assets/images/partners3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/period_calender1.png b/assets/images/period_calender1.png new file mode 100644 index 0000000000000000000000000000000000000000..58efc6daeb609a81a3ea8d939010aec918cb21fb GIT binary patch literal 26546 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 literal 0 HcmV?d00001 diff --git a/assets/images/period_calender1.svg b/assets/images/period_calender1.svg new file mode 100644 index 00000000..098d3386 --- /dev/null +++ b/assets/images/period_calender1.svg @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/assets/images/period_calender2.png b/assets/images/period_calender2.png new file mode 100644 index 0000000000000000000000000000000000000000..331aeb4a7845062d0fd0e4b628f8528331283661 GIT binary patch literal 17904 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/images/period_calender2.svg b/assets/images/period_calender2.svg new file mode 100644 index 00000000..e3bb9b11 --- /dev/null +++ b/assets/images/period_calender2.svg @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/assets/images/period_calender3.png b/assets/images/period_calender3.png new file mode 100644 index 0000000000000000000000000000000000000000..d7ada02d78f4568cb56558c9677218bd4c35129c GIT binary patch literal 38293 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 secureRoutes = [ }, ) ]), + //Routes for the Period Planner GoRoute( name: RouteNames.PERIOD_PLANNER, path: 'period-planner', @@ -398,6 +400,13 @@ final List secureRoutes = [ return const PeriodPlannerMenu(); }, ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_CALENDAR, + path: 'period-planner-calendar', + builder: (BuildContext context, GoRouterState state) { + return const PeriodCalendar(); + }, + ), ]; final List openRoutes = [ GoRoute( diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 1346e21c..9a7fbba4 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -269,14 +269,14 @@ List getGenericMenuItems(BuildContext context) { MenuItem( shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, icon: SvgPicture.asset( - "assets/images/period_planner4.svg", + "assets/images/period_planner2.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, width: 80, height: 80, ), shortcutIcon: SvgPicture.asset( - "assets/images/period_planner4.svg", + "assets/images/period_planner2.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, width: Constants.shortcutIconSize, diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart new file mode 100644 index 00000000..75c4dacf --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:table_calendar/table_calendar.dart'; + +class PeriodCalendar extends StatelessWidget { + const PeriodCalendar({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + CustomAppBar( + title: "Calendar", + color: Constants.periodPlanner.withOpacity(1.0), + ), + CustomCalendar(initialFormat: CalendarFormat.month,) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart index 7168df37..3e162a97 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -17,7 +17,7 @@ _menuItems(BuildContext context) => [ width: 80, height: 80, ), - shortcutIcon: SvgPicture.asset("assets/images/shopping-meds.svg", + shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", semanticsLabel: "Periods", fit: BoxFit.contain, width: Constants.shortcutIconSize, @@ -29,37 +29,37 @@ _menuItems(BuildContext context) => [ MenuItem( shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, icon: SvgPicture.asset( - "assets/images/shopping.svg", + "assets/images/period_calender1.svg", semanticsLabel: "Periods", fit: BoxFit.contain, width: 80, height: 80, ), - shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", + shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", semanticsLabel: "Periods", fit: BoxFit.contain, width: Constants.shortcutIconSize, height: Constants.shortcutIconSize), - title: "Period Calendar", - onPressed: () => context.goNamed(RouteNames.HIV_DRUG_ORDERS), + title: "Calendar", + onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR), color: Constants.periodPlanner.withOpacity(1.0), ), MenuItem( shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, icon: SvgPicture.asset( - "assets/images/review.svg", + "assets/images/partners2.svg", semanticsLabel: "Periods", fit: BoxFit.contain, width: 80, height: 80, ), - shortcutIcon: SvgPicture.asset("assets/images/review.svg", + shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", semanticsLabel: "Periods", fit: BoxFit.contain, width: Constants.shortcutIconSize, height: Constants.shortcutIconSize), title: "Partners", - onPressed: () => context.goNamed(RouteNames.DISPATCHED_DRUGS), + onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), color: Constants.periodPlanner.withOpacity(1.0), ), ]; diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 21e53fc7..876c8d2e 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -1,6 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periodCalendar.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/periodInfoCard.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:table_calendar/table_calendar.dart'; class PeriodPlannerScreen extends StatefulWidget { const PeriodPlannerScreen({super.key}); @@ -16,98 +20,71 @@ class _PeriodPlannerScreenState extends State { body: Column( children: [ const CustomAppBar( - title: "Period Planner 🌸", - subTitle: "Track Your Cycle with Ease \nAnd Stay Informed", + title: "Track Periods 🌸", color: Constants.periodPlanner, ), const SizedBox(height: Constants.SPACING), - const Text( - 'Saturday', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - const Text( - '23', - style: TextStyle(fontSize: 60, fontWeight: FontWeight.bold), - ), - const SizedBox(height: Constants.SPACING), - Stack( - alignment: Alignment.center, - children: [ - const SizedBox( - width: Constants.SPACING * 30, // Adjust the width as needed - height: Constants.SPACING * 30, // Adjust the height as needed - child: CircularProgressIndicator( - value: 0.3, // example value for the progress - strokeWidth: 10, - backgroundColor: Colors.grey, - valueColor: AlwaysStoppedAnimation(Constants.periodPlanner), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + SizedBox( + height: 150, + child: CustomCalendar(initialFormat: CalendarFormat.week,), ), - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'Period Day 3', - style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold), - ), - const SizedBox(height: Constants.SPACING + 20,), - const Text( - 'Low Chances of getting Pregnant', - style: TextStyle(fontSize: 16), - ), - const SizedBox(height: Constants.SPACING + 20,), - ElevatedButton( - onPressed: () {}, - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: Constants.periodPlanner, // background - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), + const SizedBox(height: 20), + Stack( + alignment: Alignment.center, + children: [ + const SizedBox( + width: Constants.SPACING * 30, // Adjust the width as needed + height: Constants.SPACING * 30, // Adjust the height as needed + child: CircularProgressIndicator( + value: 0.5, // example value for the progress + strokeWidth: 10, + backgroundColor: Colors.grey, + valueColor: AlwaysStoppedAnimation(Constants.periodPlanner), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), // Adjust padding as needed ), - child: const Text( - 'Daily Log', - style: TextStyle(fontSize: 18), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Period', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: Constants.SPACING), + const Text( + 'Day 3', + style: TextStyle(fontSize: 38, color: Constants.periodPlanner,fontWeight: FontWeight.bold), + ), + const SizedBox(height: Constants.SPACING), + const Text( + 'Low Chances of getting Pregnant', + style: TextStyle(fontSize: 16), + ), + const SizedBox(height: Constants.SPACING), + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Constants.periodPlanner, // background + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), // Adjust padding as needed + ), + child: const Text( + 'Daily Log', + style: TextStyle(fontSize: 18), + ), + ), + ], ), - ), - ], - ), - ], - ), - const SizedBox(height: Constants.SPACING), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - ElevatedButton( - onPressed: () { - // Add symptom log functionality - }, - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: Colors.grey[300], - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - ), - child: const Text( - 'Symptoms', - style: TextStyle(fontSize: 18), - ), - ), - ElevatedButton( - onPressed: () { - // Add discharge log functionality - }, - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: Colors.grey[300], - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), - ), - child: const Text( - 'Discharge', - style: TextStyle(fontSize: 18), + ], ), - ), - ], + ], + ), ), ], ), diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart new file mode 100644 index 00000000..4a466762 --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:table_calendar/table_calendar.dart'; + +class CustomCalendar extends StatefulWidget { + final CalendarFormat initialFormat; + + CustomCalendar({this.initialFormat = CalendarFormat.month}); + + @override + _CustomCalendarState createState() => _CustomCalendarState(); +} + +class _CustomCalendarState extends State { + DateTime _focusedDay = DateTime.now(); + DateTime _selectedDay = DateTime.now(); + late CalendarFormat _calendarFormat; + + @override + void initState() { + super.initState(); + _calendarFormat = widget.initialFormat; + } + + @override + Widget build(BuildContext context) { + return TableCalendar( + firstDay: DateTime(2010), + lastDay: DateTime(2100), + focusedDay: _focusedDay, + selectedDayPredicate: (day) { + return isSameDay(_selectedDay, day); + }, + onDaySelected: (selectedDay, focusedDay) { + setState(() { + _selectedDay = selectedDay; + _focusedDay = focusedDay; + }); + }, + calendarFormat: _calendarFormat, + // onFormatChanged: (format) { + // setState(() { + // _calendarFormat = format; + // }); + // }, + headerVisible: true, + calendarStyle: const CalendarStyle( + isTodayHighlighted: true, + selectedDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + todayDecoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + defaultDecoration: BoxDecoration( + shape: BoxShape.circle, + ), + weekendDecoration: BoxDecoration( + shape: BoxShape.circle, + ), + ), + daysOfWeekStyle: const DaysOfWeekStyle( + weekendStyle: TextStyle(color: Colors.black), + weekdayStyle: TextStyle(color: Colors.black), + ), + ); + } +} diff --git a/lib/src/features/period_planner/presentation/widgets/periodInfoCard.dart b/lib/src/features/period_planner/presentation/widgets/periodInfoCard.dart new file mode 100644 index 00000000..66995d7e --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/periodInfoCard.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +class PeriodInfoCard extends StatelessWidget { + PeriodInfoCard({super.key}); + + @override + Widget build(BuildContext context) { + return Card( + color: Colors.pink[50], // Set the card color to match the previous container color + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + elevation: 4, // Adjust the elevation to add shadow to the card + child: const Padding( + padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Period', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + SizedBox(height: 10), + Text( + 'Day 5', + style: TextStyle(fontSize: 38, color: Colors.pink, fontWeight: FontWeight.bold), + ), + SizedBox(height: 10), + Text( + 'Low chance of getting pregnant', + style: TextStyle(fontSize: 16), + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index d6a263b7..045d869e 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -60,6 +60,7 @@ class RouteNames { static const PERIOD_PLANNER = "Period Planner"; static const PERIOD_PLANNER_SCREEN = "Period Planner Screen"; static const PERIOD_PLANNER_MENU = "Period Planner Menu"; + static const PERIOD_PLANNER_CALENDAR = "Period Planner Calendar"; } From 571ddd9f7cc14d8ae9bd33965af58619793ac3d3 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 24 Jul 2024 20:11:50 +0300 Subject: [PATCH 005/140] Added Carousel Slider but needs more improvement though --- .../pages/periodPlannerScreen.dart | 142 +++++++++++------- .../presentation/widgets/carouselCard.dart | 83 ++++++++++ 2 files changed, 173 insertions(+), 52 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/widgets/carouselCard.dart diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 876c8d2e..7fd58be6 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -1,7 +1,7 @@ +import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodCalendar.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/periodInfoCard.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:table_calendar/table_calendar.dart'; @@ -23,67 +23,105 @@ class _PeriodPlannerScreenState extends State { title: "Track Periods 🌸", color: Constants.periodPlanner, ), - const SizedBox(height: Constants.SPACING), - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - SizedBox( - height: 150, - child: CustomCalendar(initialFormat: CalendarFormat.week,), - ), - const SizedBox(height: 20), - Stack( - alignment: Alignment.center, + //const SizedBox(height: Constants.SPACING), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( children: [ - const SizedBox( - width: Constants.SPACING * 30, // Adjust the width as needed - height: Constants.SPACING * 30, // Adjust the height as needed - child: CircularProgressIndicator( - value: 0.5, // example value for the progress - strokeWidth: 10, - backgroundColor: Colors.grey, - valueColor: AlwaysStoppedAnimation(Constants.periodPlanner), - ), + SizedBox( + height: 150, + child: CustomCalendar(initialFormat: CalendarFormat.week,), ), - Column( - mainAxisAlignment: MainAxisAlignment.center, + const SizedBox(height: 20), + Stack( + alignment: Alignment.center, children: [ - const Text( - 'Period', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + const SizedBox( + width: Constants.SPACING * 30, // Adjust the width as needed + height: Constants.SPACING * 30, // Adjust the height as needed + child: CircularProgressIndicator( + value: 0.5, // example value for the progress + strokeWidth: 10, + backgroundColor: Colors.grey, + valueColor: AlwaysStoppedAnimation(Constants.periodPlanner), + ), ), - const SizedBox(height: Constants.SPACING), - const Text( - 'Day 3', - style: TextStyle(fontSize: 38, color: Constants.periodPlanner,fontWeight: FontWeight.bold), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Period', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: Constants.SPACING), + const Text( + 'Day 3', + style: TextStyle(fontSize: 38, color: Constants.periodPlanner,fontWeight: FontWeight.bold), + ), + const SizedBox(height: Constants.SPACING), + const Text( + 'Low Chances of getting Pregnant', + style: TextStyle(fontSize: 16), + ), + const SizedBox(height: Constants.SPACING), + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Constants.periodPlanner, // background + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), // Adjust padding as needed + ), + child: const Text( + 'Daily Log', + style: TextStyle(fontSize: 18), + ), + ), + const SizedBox(height: 20,), + ], ), - const SizedBox(height: Constants.SPACING), - const Text( - 'Low Chances of getting Pregnant', - style: TextStyle(fontSize: 16), + ], + ), + const SizedBox(height: 20,), + const Text( + "Please give your Daily Insights:", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20.0, + color: Constants.periodPlanner, + ), + ), + CarouselSlider( + options: CarouselOptions( + height: 180, + enlargeCenterPage: true, + enableInfiniteScroll: false, + initialPage: 0, + autoPlay: false, + ), + items: const [ + CarouselCard( + svgPath: "assets/images/period_planner2.svg", + title: "Symptoms", ), - const SizedBox(height: Constants.SPACING), - ElevatedButton( - onPressed: () {}, - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: Constants.periodPlanner, // background - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), // Adjust padding as needed - ), - child: const Text( - 'Daily Log', - style: TextStyle(fontSize: 18), - ), + CarouselCard( + svgPath: "assets/images/period_planner2.svg", + title: "Discharge", ), + CarouselCard( + svgPath: "assets/images/period_planner2.svg", + title: "Mood", + ), ], ), ], ), - ], + ), ), ), ], diff --git a/lib/src/features/period_planner/presentation/widgets/carouselCard.dart b/lib/src/features/period_planner/presentation/widgets/carouselCard.dart new file mode 100644 index 00000000..a4fb3dfb --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/carouselCard.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:nishauri/src/shared/display/AppCard.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class CarouselCard extends StatelessWidget { + final String svgPath; + final String title; + final double? width; + final double? height; + final Function()? onTap; + + const CarouselCard({ + super.key, + required this.svgPath, + required this.title, + this.width, + this.height, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return AppCard( + clipBehaviour: Clip.antiAlias, + svgImage: "assets/images/rect_bg.svg", + onTap: onTap, + child: SizedBox( + width: width, + height: height, + child: Row( + children: [ + Expanded( + flex: 1, + child: Container( + // height: 200, + // width: 336, + // color: Colors.red, // Set the background color to red + padding: const EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + // style: theme.textTheme.titleMedium?.copyWith( + // color: Constants.announcement, + // ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 10), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: onTap, + child: Text( + 'Click Me', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ], + ), + ), + ), + // Right column with SVG image + Expanded( + flex: 1, + child: SvgPicture.asset( + svgPath, + fit: BoxFit.scaleDown, + height: double.infinity, + ), + ), + ], + ), + ), + ); + } +} \ No newline at end of file From fc5ab7f45c78a6e590ce1025929b4246cf471bca Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 25 Jul 2024 15:23:51 +0300 Subject: [PATCH 006/140] added showModalBottomSheet widget for logging mood, symptoms and discharge --- assets/images/discharge1.svg | 1 + assets/images/discharge2.svg | 1 + assets/images/discharge3.svg | 1 + assets/images/moods1.svg | 1 + assets/images/moods2.svg | 1 + assets/images/symptoms.svg | 1 + .../pages/periodPlannerScreen.dart | 27 +++++-- .../presentation/widgets/carouselCard.dart | 23 ++++-- .../presentation/widgets/logItems.dart | 75 +++++++++++++++++++ .../presentation/widgets/logWidget.dart | 43 +++++++++++ .../presentation/widgets/logger.dart | 13 ++++ 11 files changed, 175 insertions(+), 12 deletions(-) create mode 100644 assets/images/discharge1.svg create mode 100644 assets/images/discharge2.svg create mode 100644 assets/images/discharge3.svg create mode 100644 assets/images/moods1.svg create mode 100644 assets/images/moods2.svg create mode 100644 assets/images/symptoms.svg create mode 100644 lib/src/features/period_planner/presentation/widgets/logItems.dart create mode 100644 lib/src/features/period_planner/presentation/widgets/logWidget.dart create mode 100644 lib/src/features/period_planner/presentation/widgets/logger.dart diff --git a/assets/images/discharge1.svg b/assets/images/discharge1.svg new file mode 100644 index 00000000..2c4d09e3 --- /dev/null +++ b/assets/images/discharge1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/discharge2.svg b/assets/images/discharge2.svg new file mode 100644 index 00000000..fd0ee312 --- /dev/null +++ b/assets/images/discharge2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/discharge3.svg b/assets/images/discharge3.svg new file mode 100644 index 00000000..7654adf9 --- /dev/null +++ b/assets/images/discharge3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/moods1.svg b/assets/images/moods1.svg new file mode 100644 index 00000000..64bb1e7f --- /dev/null +++ b/assets/images/moods1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/moods2.svg b/assets/images/moods2.svg new file mode 100644 index 00000000..22bea26e --- /dev/null +++ b/assets/images/moods2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/symptoms.svg b/assets/images/symptoms.svg new file mode 100644 index 00000000..e587c86b --- /dev/null +++ b/assets/images/symptoms.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 7fd58be6..c007bbb0 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -2,6 +2,9 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/logWidget.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:table_calendar/table_calendar.dart'; @@ -92,30 +95,42 @@ class _PeriodPlannerScreenState extends State { "Please give your Daily Insights:", style: TextStyle( fontWeight: FontWeight.bold, - fontSize: 20.0, + fontSize: 15.0, color: Constants.periodPlanner, ), ), CarouselSlider( options: CarouselOptions( - height: 180, + height: 150, enlargeCenterPage: true, enableInfiniteScroll: false, initialPage: 0, autoPlay: false, ), - items: const [ + items: [ CarouselCard( - svgPath: "assets/images/period_planner2.svg", + svgPath: "assets/images/symptoms.svg", title: "Symptoms", + destination: LoggerWidget( + heading: "Log Symptoms", + items: LogItems.getSymptoms(), + ) ), CarouselCard( - svgPath: "assets/images/period_planner2.svg", + svgPath: "assets/images/discharge1.svg", title: "Discharge", + destination: LoggerWidget( + heading: "Log Discharge", + items: LogItems.getDischarge(), + ) ), CarouselCard( - svgPath: "assets/images/period_planner2.svg", + svgPath: "assets/images/moods1.svg", title: "Mood", + destination: LoggerWidget( + heading: "How are you feeling?", + items: LogItems.getMoods(), + ), ), ], ), diff --git a/lib/src/features/period_planner/presentation/widgets/carouselCard.dart b/lib/src/features/period_planner/presentation/widgets/carouselCard.dart index a4fb3dfb..7adde65f 100644 --- a/lib/src/features/period_planner/presentation/widgets/carouselCard.dart +++ b/lib/src/features/period_planner/presentation/widgets/carouselCard.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:nishauri/src/utils/constants.dart'; @@ -8,7 +9,7 @@ class CarouselCard extends StatelessWidget { final String title; final double? width; final double? height; - final Function()? onTap; + final Widget destination; const CarouselCard({ super.key, @@ -16,7 +17,7 @@ class CarouselCard extends StatelessWidget { required this.title, this.width, this.height, - this.onTap, + required this.destination, }); @override @@ -25,7 +26,6 @@ class CarouselCard extends StatelessWidget { return AppCard( clipBehaviour: Clip.antiAlias, svgImage: "assets/images/rect_bg.svg", - onTap: onTap, child: SizedBox( width: width, height: height, @@ -36,7 +36,7 @@ class CarouselCard extends StatelessWidget { child: Container( // height: 200, // width: 336, - // color: Colors.red, // Set the background color to red + color: Constants.periodPlanner.withOpacity(0.5), // Set the background color to red padding: const EdgeInsets.all(10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -49,12 +49,23 @@ class CarouselCard extends StatelessWidget { maxLines: 2, overflow: TextOverflow.ellipsis, ), - const SizedBox(height: 10), + const SizedBox(height: 30), ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Constants.periodPlanner, ), - onPressed: onTap, + onPressed: () { + showModalBottomSheet( + context: context, + builder: (context) => FractionallySizedBox( + heightFactor: 0.5, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: destination, + ), + ), + ); + }, child: Text( 'Click Me', style: theme.textTheme.titleSmall?.copyWith( diff --git a/lib/src/features/period_planner/presentation/widgets/logItems.dart b/lib/src/features/period_planner/presentation/widgets/logItems.dart new file mode 100644 index 00000000..f4f522f5 --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/logItems.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; + +class LogItems { + static List getSymptoms() { + Color symptomsColor = Colors.pink; + return [ + Logger( + icon: Icons.favorite, + label: 'Cramps', + color: symptomsColor, + ), + Logger( + icon: Icons.sentiment_satisfied, + label: 'Mood swings', + color: symptomsColor, + ), + Logger( + icon: Icons.battery_alert, + label: 'Fatigue', + color: symptomsColor, + ), + // Add more symptom loggers as needed + ]; + } + + static List getDischarge() { + Color dischargeColor = Colors.blue; + return [ + Logger( + icon: Icons.water_drop, + label: 'No discharge', + color: dischargeColor, + ), + Logger( + icon: Icons.water_drop, + label: 'Spotting', + color: dischargeColor, + ), + Logger( + icon: Icons.water_drop, + label: 'Sticky', + color: dischargeColor, + ), + Logger( + icon: Icons.water_drop, + label: 'Creamy', + color: dischargeColor, + ), + // Add more discharge loggers as needed + ]; + } + + static List getMoods() { + Color moodsColor = Colors.orange; + return [ + Logger( + icon: Icons.sentiment_very_satisfied, + label: 'Happy', + color: moodsColor, + ), + Logger( + icon: Icons.sentiment_dissatisfied, + label: 'Sad', + color: moodsColor, + ), + Logger( + icon: Icons.sentiment_neutral, + label: 'Anxious', + color: moodsColor, + ), + // Add more mood loggers as needed + ]; + } +} diff --git a/lib/src/features/period_planner/presentation/widgets/logWidget.dart b/lib/src/features/period_planner/presentation/widgets/logWidget.dart new file mode 100644 index 00000000..30a64f82 --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/logWidget.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; + +class LoggerWidget extends StatelessWidget { + final String heading; + final List items; + + LoggerWidget({required this.heading, required this.items}); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + heading, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 16), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: items.map((item) => _buildItemCard(item)).toList(), + ), + ), + ], + ); + } + + Widget _buildItemCard(Logger item) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + Icon(item.icon, size: 40, color: item.color), + const SizedBox(height: 8), + Text(item.label), + ], + ), + ); + } +} diff --git a/lib/src/features/period_planner/presentation/widgets/logger.dart b/lib/src/features/period_planner/presentation/widgets/logger.dart new file mode 100644 index 00000000..4c3765a2 --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/logger.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +class Logger { + final IconData icon; + final String label; + final Color color; + + Logger({ + required this.icon, + required this.label, + required this.color, + }); +} \ No newline at end of file From 39266d426df210dc44b484c3ec253355fd1dee8e Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 26 Jul 2024 12:04:51 +0300 Subject: [PATCH 007/140] Added highlighting on ovulation, period and fertile days in the calendar --- .../pages/periodPlannerScreen.dart | 3 +- .../presentation/widgets/carouselCard.dart | 7 +- .../presentation/widgets/customCalendar.dart | 101 +++++++++++++++--- .../presentation/widgets/logWidget.dart | 43 -------- .../presentation/widgets/loggerWidget.dart | 76 +++++++++++++ 5 files changed, 164 insertions(+), 66 deletions(-) delete mode 100644 lib/src/features/period_planner/presentation/widgets/logWidget.dart create mode 100644 lib/src/features/period_planner/presentation/widgets/loggerWidget.dart diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index c007bbb0..643ff9e0 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -3,8 +3,7 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logWidget.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/loggerWidget.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:table_calendar/table_calendar.dart'; diff --git a/lib/src/features/period_planner/presentation/widgets/carouselCard.dart b/lib/src/features/period_planner/presentation/widgets/carouselCard.dart index 7adde65f..4e2a695d 100644 --- a/lib/src/features/period_planner/presentation/widgets/carouselCard.dart +++ b/lib/src/features/period_planner/presentation/widgets/carouselCard.dart @@ -34,18 +34,13 @@ class CarouselCard extends StatelessWidget { Expanded( flex: 1, child: Container( - // height: 200, - // width: 336, - color: Constants.periodPlanner.withOpacity(0.5), // Set the background color to red + color: Constants.periodPlanner.withOpacity(0.5), padding: const EdgeInsets.all(10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, - // style: theme.textTheme.titleMedium?.copyWith( - // color: Constants.announcement, - // ), maxLines: 2, overflow: TextOverflow.ellipsis, ), diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 4a466762..72e22d4a 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -12,9 +12,28 @@ class CustomCalendar extends StatefulWidget { class _CustomCalendarState extends State { DateTime _focusedDay = DateTime.now(); - DateTime _selectedDay = DateTime.now(); + //DateTime _selectedDay = DateTime.now(); late CalendarFormat _calendarFormat; + // Define ovulation and period days + final List fertileDays = [ + DateTime(2024, 8, 13), + DateTime(2024, 8, 14), + DateTime(2024, 8, 15), + DateTime(2024, 8, 16), + DateTime(2024, 8, 17), + ]; + + final List periodDays = [ + DateTime(2024, 8, 5), + DateTime(2024, 8, 6), + DateTime(2024, 8, 7), + DateTime(2024, 8, 8), + DateTime(2024, 8, 9), + ]; + + final DateTime ovulationDay = DateTime(2024, 8 ,18); + @override void initState() { super.initState(); @@ -27,30 +46,25 @@ class _CustomCalendarState extends State { firstDay: DateTime(2010), lastDay: DateTime(2100), focusedDay: _focusedDay, - selectedDayPredicate: (day) { - return isSameDay(_selectedDay, day); - }, + // selectedDayPredicate: (day) { + // return isSameDay(_selectedDay, day); + // }, onDaySelected: (selectedDay, focusedDay) { setState(() { - _selectedDay = selectedDay; + //_selectedDay = selectedDay; _focusedDay = focusedDay; }); }, calendarFormat: _calendarFormat, - // onFormatChanged: (format) { - // setState(() { - // _calendarFormat = format; - // }); - // }, headerVisible: true, calendarStyle: const CalendarStyle( isTodayHighlighted: true, - selectedDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), + // selectedDecoration: BoxDecoration( + // color: Colors.pink, + // shape: BoxShape.circle, + // ), todayDecoration: BoxDecoration( - color: Colors.blue, + color: Colors.red, shape: BoxShape.circle, ), defaultDecoration: BoxDecoration( @@ -64,6 +78,63 @@ class _CustomCalendarState extends State { weekendStyle: TextStyle(color: Colors.black), weekdayStyle: TextStyle(color: Colors.black), ), + calendarBuilders: CalendarBuilders( + defaultBuilder: (context, day, focusedDay) { + for (DateTime ovulationDay in fertileDays) { + if (isSameDay(day, ovulationDay)) { + return Container( + margin: const EdgeInsets.all(6.0), + decoration: const BoxDecoration( + color: Colors.green, + shape: BoxShape.circle, + ), + child: Center( + child: Text( + '${day.day}', + style: const TextStyle(color: Colors.white), + ), + ), + ); + } + } + + for (DateTime periodDay in periodDays) { + if (isSameDay(day, periodDay)) { + return Container( + margin: const EdgeInsets.all(6.0), + decoration: const BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + child: Center( + child: Text( + '${day.day}', + style: const TextStyle(color: Colors.white), + ), + ), + ); + } + } + + if(isSameDay(day, ovulationDay)) { + return Container( + margin: const EdgeInsets.all(6.0), + decoration: const BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + child: Center( + child: Text( + '${day.day}', + style: const TextStyle(color: Colors.white), + ), + ), + ); + } + + return null; + }, + ), ); } } diff --git a/lib/src/features/period_planner/presentation/widgets/logWidget.dart b/lib/src/features/period_planner/presentation/widgets/logWidget.dart deleted file mode 100644 index 30a64f82..00000000 --- a/lib/src/features/period_planner/presentation/widgets/logWidget.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; - -class LoggerWidget extends StatelessWidget { - final String heading; - final List items; - - LoggerWidget({required this.heading, required this.items}); - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - heading, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 16), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: items.map((item) => _buildItemCard(item)).toList(), - ), - ), - ], - ); - } - - Widget _buildItemCard(Logger item) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - Icon(item.icon, size: 40, color: item.color), - const SizedBox(height: 8), - Text(item.label), - ], - ), - ); - } -} diff --git a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart new file mode 100644 index 00000000..b283f49f --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; + +class LoggerWidget extends StatefulWidget { + final String heading; + final List items; + + LoggerWidget({required this.heading, required this.items}); + + @override + _LoggerWidgetState createState() => _LoggerWidgetState(); +} + +class _LoggerWidgetState extends State { + // Create a list to keep track of the selected items + late List _selectedItems; + + @override + void initState() { + super.initState(); + // Initialize the list with false (none of the items are selected initially) + _selectedItems = List.filled(widget.items.length, false); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + widget.heading, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 16), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: widget.items + .asMap() + .entries + .map((entry) => _buildItemCard(entry.key, entry.value)) + .toList(), + ), + ), + ], + ); + } + + Widget _buildItemCard(int index, Logger item) { + return GestureDetector( + onTap: () { + setState(() { + _selectedItems[index] = !_selectedItems[index]; + }); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + Stack( + alignment: Alignment.center, + children: [ + Icon(item.icon, size: 40, color: item.color), + if (_selectedItems[index]) + Icon(Icons.check_circle, size: 40, color: Colors.green.withOpacity(0.9)), + ], + ), + const SizedBox(height: 8), + Text(item.label), + ], + ), + ), + ); + } +} From bc966e9b3659608f03d541c817ec9f1355369780 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 26 Jul 2024 18:26:13 +0300 Subject: [PATCH 008/140] added another calendar to allow new users to log their previous period. Still needs some work though. --- lib/src/app/navigation/app_router.dart | 8 +++ .../pages/editPeriodsCalendar.dart | 70 +++++++++++++++++++ .../presentation/pages/periodCalendar.dart | 61 +++++++++++++++- .../presentation/pages/periodPlanner.dart | 9 +-- .../presentation/pages/periodPlannerMenu.dart | 36 +++++----- .../presentation/widgets/calendarKey.dart | 30 ++++++++ .../presentation/widgets/customCalendar.dart | 3 + .../presentation/widgets/logItems.dart | 9 ++- .../presentation/widgets/loggerWidget.dart | 22 ++++++ lib/src/utils/routes.dart | 1 + 10 files changed, 221 insertions(+), 28 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart create mode 100644 lib/src/features/period_planner/presentation/widgets/calendarKey.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 77cf4204..a4e36b76 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -53,6 +53,7 @@ import 'package:nishauri/src/features/hiv/presentation/pages/groups/ARTGroups.da import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrderWizardFormScreen.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart'; import 'package:nishauri/src/features/lab/presentation/pages/LabResultsScreen.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; @@ -407,6 +408,13 @@ final List secureRoutes = [ return const PeriodCalendar(); }, ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR, + path: 'period-planner-edit-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return EditPeriodCalendar(); + }, + ), ]; final List openRoutes = [ GoRoute( diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart new file mode 100644 index 00000000..8e6dc6ea --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:table_calendar/table_calendar.dart'; + +class EditPeriodCalendar extends StatefulWidget { + @override + State createState() => _EditPeriodCalendarState(); +} + +class _EditPeriodCalendarState extends State { + // List of selected dates + final List _selectedDates = []; + + // Callback when a day is selected + void _onDaySelected(DateTime day, DateTime focusedDay) { + setState(() { + if (_selectedDates.contains(day)) { + _selectedDates.remove(day); + } else { + _selectedDates.add(day); + } + }); + } + + // Check if a day is selected + bool _isDaySelected(DateTime day) { + return _selectedDates.contains(day); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + CustomAppBar( + title: "Log Periods", + color: Constants.periodPlanner.withOpacity(1.0), + ), + TableCalendar( + focusedDay: DateTime.now(), + firstDay: DateTime(2010), + lastDay: DateTime(2100), + selectedDayPredicate: (day) => _isDaySelected(day), + onDaySelected: _onDaySelected, + calendarStyle: CalendarStyle( + todayDecoration: const BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + markerDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + border: Border.all(color: Colors.black, width: 2), + ), + selectedDecoration: const BoxDecoration( + color: Colors.transparent, + shape: BoxShape.circle, + ), + selectedTextStyle: const TextStyle(color: Colors.pink), + ), + headerStyle: const HeaderStyle( + formatButtonVisible: false, + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 75c4dacf..64add239 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; class PeriodCalendar extends StatelessWidget { @@ -9,16 +12,70 @@ class PeriodCalendar extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = Theme.of(context); return Scaffold( body: Column( children: [ CustomAppBar( title: "Calendar", color: Constants.periodPlanner.withOpacity(1.0), + ), + Expanded( + child: Column( + children: [ + CustomCalendar(initialFormat: CalendarFormat.month), + const SizedBox(height: 20), + const Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + "Key:", + style: TextStyle( + color: Constants.periodPlanner, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + const Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CalendarKey(color: Colors.red, label: 'Today'), + CalendarKey(color: Colors.green, label: 'Fertile Days'), + CalendarKey(color: Colors.pink, label: 'Period Days'), + CalendarKey(color: Colors.blue, label: 'Ovulation Day'), + ], + ), + ], ), - CustomCalendar(initialFormat: CalendarFormat.month,) + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // To add functionality later + context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); + }, + child: Text( + 'Edit period dates', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), ], ), ); } -} \ No newline at end of file +} diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index b0ff926f..4750932b 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class PeriodPlanner extends StatelessWidget { const PeriodPlanner({super.key}); @@ -65,12 +67,7 @@ class PeriodPlanner extends StatelessWidget { const SizedBox(height: 20.0), ElevatedButton( onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const PeriodPlannerMenu(), - ), - ); + context.goNamed(RouteNames.PERIOD_PLANNER_MENU); }, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric( diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart index 3e162a97..e614996b 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -44,24 +44,24 @@ _menuItems(BuildContext context) => [ onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR), color: Constants.periodPlanner.withOpacity(1.0), ), - MenuItem( - shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/partners2.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Partners", - onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), - color: Constants.periodPlanner.withOpacity(1.0), - ), + // MenuItem( + // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, + // icon: SvgPicture.asset( + // "assets/images/partners2.svg", + // semanticsLabel: "Periods", + // fit: BoxFit.contain, + // width: 80, + // height: 80, + // ), + // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", + // semanticsLabel: "Periods", + // fit: BoxFit.contain, + // width: Constants.shortcutIconSize, + // height: Constants.shortcutIconSize), + // title: "Partners", + // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), + // color: Constants.periodPlanner.withOpacity(1.0), + // ), ]; class PeriodPlannerMenu extends StatelessWidget { diff --git a/lib/src/features/period_planner/presentation/widgets/calendarKey.dart b/lib/src/features/period_planner/presentation/widgets/calendarKey.dart new file mode 100644 index 00000000..726c3d81 --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/calendarKey.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +class CalendarKey extends StatelessWidget { + final Color color; + final String label; + + const CalendarKey({ + super.key, + required this.color, + required this.label, + }); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Container( + width: 16, + height: 16, + margin: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + ), + ), + Text(label), + ], + ); + } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 72e22d4a..25bd3a14 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -57,6 +57,9 @@ class _CustomCalendarState extends State { }, calendarFormat: _calendarFormat, headerVisible: true, + headerStyle: const HeaderStyle( + formatButtonVisible: false, + ), calendarStyle: const CalendarStyle( isTodayHighlighted: true, // selectedDecoration: BoxDecoration( diff --git a/lib/src/features/period_planner/presentation/widgets/logItems.dart b/lib/src/features/period_planner/presentation/widgets/logItems.dart index f4f522f5..5af15dbd 100644 --- a/lib/src/features/period_planner/presentation/widgets/logItems.dart +++ b/lib/src/features/period_planner/presentation/widgets/logItems.dart @@ -34,7 +34,7 @@ class LogItems { ), Logger( icon: Icons.water_drop, - label: 'Spotting', + label: 'Egg whites', color: dischargeColor, ), Logger( @@ -44,7 +44,12 @@ class LogItems { ), Logger( icon: Icons.water_drop, - label: 'Creamy', + label: 'Brown', + color: dischargeColor, + ), + Logger( + icon: Icons.water_drop, + label: 'Yellow or Green', color: dischargeColor, ), // Add more discharge loggers as needed diff --git a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart index b283f49f..37e4048c 100644 --- a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart +++ b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; +import 'package:nishauri/src/utils/constants.dart'; class LoggerWidget extends StatefulWidget { final String heading; @@ -24,6 +25,7 @@ class _LoggerWidgetState extends State { @override Widget build(BuildContext context) { + final theme = Theme.of(context); return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ @@ -43,6 +45,26 @@ class _LoggerWidgetState extends State { .toList(), ), ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // To add functionality later + }, + child: Text( + 'Click to Apply', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), ], ); } diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 045d869e..e0cccacb 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -61,6 +61,7 @@ class RouteNames { static const PERIOD_PLANNER_SCREEN = "Period Planner Screen"; static const PERIOD_PLANNER_MENU = "Period Planner Menu"; static const PERIOD_PLANNER_CALENDAR = "Period Planner Calendar"; + static const PERIOD_PLANNER_EDIT_PERIOD_CALENDAR = "period-planner-edit-period-calendar"; } From 2edf0b23fd24adbcb4f3e9a91d5c5372321d3fbe Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 31 Jul 2024 20:06:25 +0300 Subject: [PATCH 009/140] Developed Algorithm for predicting various events in the menstrual cycle --- .../period_planner/data/models/cycle.dart | 42 ++++++ .../period_planner/data/models/logs.dart | 12 ++ .../pages/editPeriodsCalendar.dart | 107 +++++++++++---- .../presentation/pages/periodCalendar.dart | 2 +- .../presentation/pages/periodPlanner.dart | 2 +- .../pages/periodPlannerScreen.dart | 124 +++++++++++++----- .../presentation/widgets/customCalendar.dart | 85 ++++++++---- 7 files changed, 286 insertions(+), 88 deletions(-) create mode 100644 lib/src/features/period_planner/data/models/cycle.dart create mode 100644 lib/src/features/period_planner/data/models/logs.dart diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart new file mode 100644 index 00000000..2bbb1884 --- /dev/null +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -0,0 +1,42 @@ +// import 'package:freezed_annotation/freezed_annotation.dart'; + +// @Freezed() +// class Cycle with _$Cycle { +// const factory Cycle({ +// final String cycleId, +// final DateTime periodStart, +// final DateTime periodEnd, +// final DateTime fertileStart, +// final DateTime fertileEnd, +// final DateTime ovulation, +// final DateTime predictedPeriodStart, +// final DateTime predictedPeriodEnd, +// }) = _Cycle; + +// factory Cycle.fromJson(Map json)=> _$CycleFromJson(json); +// } + +class Cycle{ + final String cycleId; + final DateTime periodStart; + final DateTime periodEnd; + final DateTime fertileStart; + final DateTime fertileEnd; + final DateTime ovulation; + final DateTime predictedPeriodStart; + final DateTime predictedPeriodEnd; + + Cycle({ + required this.cycleId, + required this.periodStart, + required this.periodEnd, + required this.fertileStart, + required this.fertileEnd, + required this.ovulation, + required this.predictedPeriodStart, + required this.predictedPeriodEnd, + }); +} + +//Acting as database for now +List cycles = []; \ No newline at end of file diff --git a/lib/src/features/period_planner/data/models/logs.dart b/lib/src/features/period_planner/data/models/logs.dart new file mode 100644 index 00000000..5505f7cc --- /dev/null +++ b/lib/src/features/period_planner/data/models/logs.dart @@ -0,0 +1,12 @@ +// import 'package:freezed_annotation/freezed_annotation.dart'; + +// @Freezed() +// class Logs with _$Logs { +// const factory Logs({ +// final String moods, +// final String symptoms, +// final String discharge, +// }) = _Logs; + +// factory Logs.fromJson(Map json)=> _$LogsFromJson(json); +// } \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index 8e6dc6ea..8c547008 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -1,7 +1,27 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; +import 'package:uuid/uuid.dart'; + +//printing List which is acting as a Database +void printCycles(List cycles) { + for (var cycle in cycles) { + debugPrint('Cycle ID: ${cycle.cycleId}'); + debugPrint('Period Start: ${cycle.periodStart}'); + debugPrint('Period End: ${cycle.periodEnd}'); + debugPrint('Fertile Start: ${cycle.fertileStart}'); + debugPrint('Fertile End: ${cycle.fertileEnd}'); + debugPrint('Ovulation: ${cycle.ovulation}'); + debugPrint('Predicted Period Start: ${cycle.predictedPeriodStart}'); + debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); + debugPrint('---'); // Separator between cycles for clarity + } +} class EditPeriodCalendar extends StatefulWidget { @override @@ -9,60 +29,91 @@ class EditPeriodCalendar extends StatefulWidget { } class _EditPeriodCalendarState extends State { - // List of selected dates - final List _selectedDates = []; + DateTime _focusedDay = DateTime.now(); + DateTime? _startDate; + DateTime? _endDate; - // Callback when a day is selected - void _onDaySelected(DateTime day, DateTime focusedDay) { + void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { setState(() { - if (_selectedDates.contains(day)) { - _selectedDates.remove(day); - } else { - _selectedDates.add(day); - } + _startDate = start; + _endDate = end; + _focusedDay = focusedDay ?? _focusedDay; }); - } - - // Check if a day is selected - bool _isDaySelected(DateTime day) { - return _selectedDates.contains(day); - } + } @override Widget build(BuildContext context) { + final theme = Theme.of(context); return Scaffold( body: Column( children: [ CustomAppBar( - title: "Log Periods", + title: "Log Periods 📅", + subTitle: "Please Log the start and end date of your previous periods to get started.", color: Constants.periodPlanner.withOpacity(1.0), ), TableCalendar( - focusedDay: DateTime.now(), - firstDay: DateTime(2010), - lastDay: DateTime(2100), - selectedDayPredicate: (day) => _isDaySelected(day), - onDaySelected: _onDaySelected, - calendarStyle: CalendarStyle( - todayDecoration: const BoxDecoration( + focusedDay: _focusedDay, + firstDay: DateTime(2020), + lastDay: DateTime.now(), + rangeStartDay: _startDate, + rangeEndDay: _endDate, + onRangeSelected: _onRangeSelected, + rangeSelectionMode: RangeSelectionMode.toggledOn, + calendarStyle: const CalendarStyle( + todayDecoration: BoxDecoration( color: Colors.blue, shape: BoxShape.circle, ), - markerDecoration: BoxDecoration( + rangeStartDecoration: BoxDecoration( color: Colors.pink, shape: BoxShape.circle, - border: Border.all(color: Colors.black, width: 2), ), - selectedDecoration: const BoxDecoration( - color: Colors.transparent, + rangeEndDecoration: BoxDecoration( + color: Colors.pink, shape: BoxShape.circle, ), - selectedTextStyle: const TextStyle(color: Colors.pink), + rangeHighlightColor: Constants.periodPlanner, ), headerStyle: const HeaderStyle( formatButtonVisible: false, ), ), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + if (_startDate != null && _endDate != null) { + final Cycle predictedCycle = predictCycle( + _startDate!, + _endDate!, + ); + cycles.add(predictedCycle); + // Print the list of cycles + printCycles(cycles); + context.goNamed(RouteNames.PERIOD_PLANNER_MENU); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please select your Period start and end dates.')) + ); + } + }, + child: Text( + 'Apply', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), + ), ], ), ); diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 64add239..03e30de7 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -17,7 +17,7 @@ class PeriodCalendar extends StatelessWidget { body: Column( children: [ CustomAppBar( - title: "Calendar", + title: "Calendar 🗓️", color: Constants.periodPlanner.withOpacity(1.0), ), Expanded( diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index 4750932b..c7e3b7b0 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -67,7 +67,7 @@ class PeriodPlanner extends StatelessWidget { const SizedBox(height: 20.0), ElevatedButton( onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_MENU); + context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); }, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric( diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 643ff9e0..36860afe 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -1,5 +1,6 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; @@ -16,8 +17,68 @@ class PeriodPlannerScreen extends StatefulWidget { } class _PeriodPlannerScreenState extends State { + final DateTime _currentDate = DateTime.now(); + late DateTime _periodStart; + late DateTime _periodEnd; + late DateTime _ovulationDate; + late DateTime _nextPeriodStart; + + @override + void initState() { + super.initState(); + if (cycles.isNotEmpty) { + Cycle latestCycle = cycles.last; + _periodStart = latestCycle.periodStart; + _periodEnd = latestCycle.periodEnd; + _ovulationDate = latestCycle.ovulation; + _nextPeriodStart = latestCycle.predictedPeriodStart; + } + } + @override Widget build(BuildContext context) { + //handling the days before, after or during the various phases in the Menstrual Cycle + int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; + int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; + + bool isInPeriod = _currentDate.isAfter(_periodStart) && _currentDate.isBefore(_periodEnd); + bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && (daysToOvulation <= 5 && daysToOvulation>=1); + bool veryCloseToOvulation = _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; + bool isOvulation = (_ovulationDate == _currentDate) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); + //two days after ovulation -- I'm thinking about it + bool afterOvulation = _currentDate.isAfter(_ovulationDate) && _currentDate.isBefore(_nextPeriodStart); + + // Determine progress value and messages based on the current date + double progressValue = 0.0; + String message = ''; + String buttonText = ''; + + if (isInPeriod) { + progressValue = 0.2; + message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1} of your period'; + buttonText = 'Log End Period'; + } else if (isCloseToOvulation) { + progressValue = 0.3; + message = '$daysToOvulation days'; + buttonText = ''; + } else if (veryCloseToOvulation) { + progressValue = 0.4; + message = 'Tomorrow'; + buttonText = ''; + } else if (isOvulation) { + progressValue = 0.5; + message = 'Today'; + buttonText = ''; + } else if (afterOvulation) { + progressValue = 0.7; + message = '$daysToNextPeriod days'; + buttonText = 'Log Period'; + } else { + progressValue = 1.0; + message = 'Cycle Complete'; + buttonText = ''; + } + return Scaffold( body: Column( children: [ @@ -41,50 +102,53 @@ class _PeriodPlannerScreenState extends State { Stack( alignment: Alignment.center, children: [ - const SizedBox( + SizedBox( width: Constants.SPACING * 30, // Adjust the width as needed height: Constants.SPACING * 30, // Adjust the height as needed child: CircularProgressIndicator( - value: 0.5, // example value for the progress + value: progressValue, strokeWidth: 10, backgroundColor: Colors.grey, - valueColor: AlwaysStoppedAnimation(Constants.periodPlanner), + valueColor: const AlwaysStoppedAnimation(Constants.periodPlanner), ), ), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text( - 'Period', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + Text( + isInPeriod ? 'Period' : isCloseToOvulation ? 'Ovulation in': veryCloseToOvulation ? 'Ovulation is': isOvulation ? 'Ovulation is' : 'Next Period in', + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), - const SizedBox(height: Constants.SPACING), - const Text( - 'Day 3', - style: TextStyle(fontSize: 38, color: Constants.periodPlanner,fontWeight: FontWeight.bold), + const SizedBox(height: Constants.SPACING), + Text( + message, + style: const TextStyle(fontSize: 38, color: Constants.periodPlanner, fontWeight: FontWeight.bold), ), - const SizedBox(height: Constants.SPACING), - const Text( - 'Low Chances of getting Pregnant', - style: TextStyle(fontSize: 16), + const SizedBox(height: Constants.SPACING), + Text( + isInPeriod ? 'Low Chances of Getting Pregnant' : isCloseToOvulation ? 'High Chances of Getting Pregnant': veryCloseToOvulation ? 'High Chances of Getting Pregnant' : isOvulation ? 'High Chances of Getting Pregnant' : 'Low Chances of Getting Pregnant', + style: const TextStyle(fontSize: 16), ), - const SizedBox(height: Constants.SPACING), - ElevatedButton( - onPressed: () {}, - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: Constants.periodPlanner, // background - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), + const SizedBox(height: Constants.SPACING), + if (buttonText.isNotEmpty) + ElevatedButton( + onPressed: () { + // Handle button press + }, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Constants.periodPlanner, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + ), + child: Text( + buttonText, + style: const TextStyle(fontSize: 18), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), // Adjust padding as needed - ), - child: const Text( - 'Daily Log', - style: TextStyle(fontSize: 18), ), - ), - const SizedBox(height: 20,), + const SizedBox(height: 20), ], ), ], @@ -142,4 +206,4 @@ class _PeriodPlannerScreenState extends State { ), ); } -} +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 25bd3a14..6a3009e2 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -1,5 +1,34 @@ import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:table_calendar/table_calendar.dart'; +import 'package:uuid/uuid.dart'; + +//Algorithm +Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLength = 28, int averagePeriodLength = 7}) { + var uuid = const Uuid(); + String cycleId = uuid.v4(); //Generating a unique id + + DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength)); + DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength)); + + //calculating ovulation day (14 days before predicted period start) + DateTime ovulation = predictedPeriodStart.subtract(const Duration(days: 14)); + + //calculating fertile window (5 days leading up to and including ovulation day) + DateTime fertileStart = ovulation.subtract(const Duration(days: 5)); + DateTime fertileEnd = ovulation.subtract(const Duration(days: 1)); + + return Cycle( + cycleId: cycleId, + periodStart: periodStart, + periodEnd: periodEnd, + fertileStart: fertileStart, + fertileEnd: fertileEnd, + ovulation: ovulation, + predictedPeriodStart: predictedPeriodStart, + predictedPeriodEnd: predictedPeriodEnd, + ); +} class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; @@ -12,7 +41,6 @@ class CustomCalendar extends StatefulWidget { class _CustomCalendarState extends State { DateTime _focusedDay = DateTime.now(); - //DateTime _selectedDay = DateTime.now(); late CalendarFormat _calendarFormat; // Define ovulation and period days @@ -32,7 +60,7 @@ class _CustomCalendarState extends State { DateTime(2024, 8, 9), ]; - final DateTime ovulationDay = DateTime(2024, 8 ,18); + final DateTime ovulationDay = DateTime(2024, 8, 18); @override void initState() { @@ -40,18 +68,23 @@ class _CustomCalendarState extends State { _calendarFormat = widget.initialFormat; } + double _getOpacity(DateTime day, DateTime eventDay) { + // Calculate the number of days between the event and the current day + final difference = day.difference(eventDay).inDays; + // Adjust the opacity based on the difference + final maxDays = 5; // Maximum days after the event for full opacity + final opacity = (1 - (difference / maxDays)).clamp(0.2, 1.0); + return opacity; + } + @override Widget build(BuildContext context) { return TableCalendar( firstDay: DateTime(2010), lastDay: DateTime(2100), focusedDay: _focusedDay, - // selectedDayPredicate: (day) { - // return isSameDay(_selectedDay, day); - // }, onDaySelected: (selectedDay, focusedDay) { setState(() { - //_selectedDay = selectedDay; _focusedDay = focusedDay; }); }, @@ -62,10 +95,6 @@ class _CustomCalendarState extends State { ), calendarStyle: const CalendarStyle( isTodayHighlighted: true, - // selectedDecoration: BoxDecoration( - // color: Colors.pink, - // shape: BoxShape.circle, - // ), todayDecoration: BoxDecoration( color: Colors.red, shape: BoxShape.circle, @@ -83,12 +112,12 @@ class _CustomCalendarState extends State { ), calendarBuilders: CalendarBuilders( defaultBuilder: (context, day, focusedDay) { - for (DateTime ovulationDay in fertileDays) { - if (isSameDay(day, ovulationDay)) { + for (DateTime eventDay in fertileDays) { + if (isSameDay(day, eventDay)) { return Container( margin: const EdgeInsets.all(6.0), - decoration: const BoxDecoration( - color: Colors.green, + decoration: BoxDecoration( + color: Colors.green.withOpacity(_getOpacity(day, eventDay)), shape: BoxShape.circle, ), child: Center( @@ -101,12 +130,12 @@ class _CustomCalendarState extends State { } } - for (DateTime periodDay in periodDays) { - if (isSameDay(day, periodDay)) { + for (DateTime eventDay in periodDays) { + if (isSameDay(day, eventDay)) { return Container( margin: const EdgeInsets.all(6.0), - decoration: const BoxDecoration( - color: Colors.pink, + decoration: BoxDecoration( + color: Colors.pink.withOpacity(_getOpacity(day, eventDay)), shape: BoxShape.circle, ), child: Center( @@ -119,19 +148,19 @@ class _CustomCalendarState extends State { } } - if(isSameDay(day, ovulationDay)) { + if (isSameDay(day, ovulationDay)) { return Container( margin: const EdgeInsets.all(6.0), - decoration: const BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - child: Center( - child: Text( - '${day.day}', - style: const TextStyle(color: Colors.white), - ), + decoration: BoxDecoration( + color: Colors.blue.withOpacity(0.8), // Fixed opacity for ovulation day + shape: BoxShape.circle, + ), + child: Center( + child: Text( + '${day.day}', + style: const TextStyle(color: Colors.white), ), + ), ); } From 5808f638d468da919dbf5c102cd6a818c4b0856a Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 1 Aug 2024 14:08:11 +0300 Subject: [PATCH 010/140] Ensuring the various events are being displayed in the calendar --- .../period_planner/data/models/cycle.dart | 5 +- .../period_planner/data/models/events.dart | 17 +++ .../presentation/pages/periodCalendar.dart | 92 ++++++++++---- .../pages/periodPlannerScreen.dart | 38 +++++- .../presentation/widgets/customCalendar.dart | 113 ++++++------------ 5 files changed, 162 insertions(+), 103 deletions(-) create mode 100644 lib/src/features/period_planner/data/models/events.dart diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart index 2bbb1884..0767c0bf 100644 --- a/lib/src/features/period_planner/data/models/cycle.dart +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -16,6 +16,8 @@ // factory Cycle.fromJson(Map json)=> _$CycleFromJson(json); // } +import 'dart:ui'; + class Cycle{ final String cycleId; final DateTime periodStart; @@ -39,4 +41,5 @@ class Cycle{ } //Acting as database for now -List cycles = []; \ No newline at end of file +List cycles = []; + diff --git a/lib/src/features/period_planner/data/models/events.dart b/lib/src/features/period_planner/data/models/events.dart new file mode 100644 index 00000000..e2afa9da --- /dev/null +++ b/lib/src/features/period_planner/data/models/events.dart @@ -0,0 +1,17 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +//Event +class Event { + final String title; + final Color color; + + Event(this.title, this.color); + + @override + String toString() { + return 'Event(title: $title, color: $color)'; + } +} + diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 03e30de7..59e4d8f7 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -1,18 +1,21 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; - class PeriodCalendar extends StatelessWidget { const PeriodCalendar({super.key}); @override Widget build(BuildContext context) { final theme = Theme.of(context); + + Map> events = _generateEvents(cycles); return Scaffold( body: Column( children: [ @@ -23,7 +26,7 @@ class PeriodCalendar extends StatelessWidget { Expanded( child: Column( children: [ - CustomCalendar(initialFormat: CalendarFormat.month), + CustomCalendar(initialFormat: CalendarFormat.month, events: events,), const SizedBox(height: 20), const Row( mainAxisAlignment: MainAxisAlignment.start, @@ -45,37 +48,78 @@ class PeriodCalendar extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ CalendarKey(color: Colors.red, label: 'Today'), - CalendarKey(color: Colors.green, label: 'Fertile Days'), CalendarKey(color: Colors.pink, label: 'Period Days'), + CalendarKey(color: Colors.green, label: 'Fertile Days'), CalendarKey(color: Colors.blue, label: 'Ovulation Day'), + CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), ], ), ], ), ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); - }, - child: Text( - 'Edit period dates', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), + // Align( + // alignment: Alignment.bottomCenter, + // child: Padding( + // padding: const EdgeInsets.all(16.0), + // child: ElevatedButton( + // style: ElevatedButton.styleFrom( + // backgroundColor: Constants.periodPlanner, + // ), + // onPressed: () { + // // To add functionality later + // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); + // }, + // child: Text( + // 'Edit period dates', + // style: theme.textTheme.titleSmall?.copyWith( + // color: Colors.white, + // ), + // ), + // ), + // ), + // ), ], ), ); } + + //Generating Events from the Cycles List + Map> _generateEvents(List cycles) { + Map> events = {}; + + for (Cycle cycle in cycles) { + // Add period days + for (DateTime date = cycle.periodStart; + date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Period Day', Colors.pink)), ifAbsent: () => [Event('Period Day', Colors.pink)]); + } + + // Add fertile window days + for (DateTime date = cycle.fertileStart; + date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Fertile Day', Colors.green)), ifAbsent: () => [Event('Fertile Day', Colors.green)]); + } + + // Add ovulation day + events.update(cycle.ovulation, (existingEvents) => existingEvents..add(Event('Ovulation Day', Colors.blue)), ifAbsent: () => [Event('Ovulation Day', Colors.blue)]); + + // Add predicted period start + for (DateTime date = cycle.predictedPeriodStart; + date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.pink)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); + } + //events.update(cycle.predictedPeriodStart, (existingEvents) => existingEvents..add(Event('Predicted Period Start', Colors.orange)), ifAbsent: () => [Event('Predicted Period Start', Colors.orange)]); + } + + // Debugging: Print events map + events.forEach((key, value) { + debugPrint('Date: $key, Events: $value'); + }); + + return events; + } + } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 36860afe..033358bf 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -1,6 +1,7 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; @@ -79,6 +80,8 @@ class _PeriodPlannerScreenState extends State { buttonText = ''; } + Map> events = _generateEvents(cycles); + return Scaffold( body: Column( children: [ @@ -96,7 +99,7 @@ class _PeriodPlannerScreenState extends State { children: [ SizedBox( height: 150, - child: CustomCalendar(initialFormat: CalendarFormat.week,), + child: CustomCalendar(initialFormat: CalendarFormat.week, events: events), ), const SizedBox(height: 20), Stack( @@ -206,4 +209,37 @@ class _PeriodPlannerScreenState extends State { ), ); } + + Map> _generateEvents(List cycles) { + Map> events = {}; + + for (Cycle cycle in cycles) { + // Add period days + for (DateTime date = cycle.periodStart; + date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Period Day', Colors.pink)), ifAbsent: () => [Event('Period Day', Colors.pink)]); + } + + // Add fertile window days + for (DateTime date = cycle.fertileStart; + date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Fertile Day', Colors.green)), ifAbsent: () => [Event('Fertile Day', Colors.green)]); + } + + // Add ovulation day + events.update(cycle.ovulation, (existingEvents) => existingEvents..add(Event('Ovulation Day', Colors.blue)), ifAbsent: () => [Event('Ovulation Day', Colors.blue)]); + + // Add predicted period start + for (DateTime date = cycle.predictedPeriodStart; + date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.pink)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); + } + //events.update(cycle.predictedPeriodStart, (existingEvents) => existingEvents..add(Event('Predicted Period Start', Colors.orange)), ifAbsent: () => [Event('Predicted Period Start', Colors.orange)]); + } + + return events; + } } \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 6a3009e2..f15ec04e 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; -//Algorithm Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLength = 28, int averagePeriodLength = 7}) { var uuid = const Uuid(); String cycleId = uuid.v4(); //Generating a unique id @@ -32,8 +32,9 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; + final Map> events; - CustomCalendar({this.initialFormat = CalendarFormat.month}); + CustomCalendar({this.initialFormat = CalendarFormat.month, required this.events}); @override _CustomCalendarState createState() => _CustomCalendarState(); @@ -43,25 +44,6 @@ class _CustomCalendarState extends State { DateTime _focusedDay = DateTime.now(); late CalendarFormat _calendarFormat; - // Define ovulation and period days - final List fertileDays = [ - DateTime(2024, 8, 13), - DateTime(2024, 8, 14), - DateTime(2024, 8, 15), - DateTime(2024, 8, 16), - DateTime(2024, 8, 17), - ]; - - final List periodDays = [ - DateTime(2024, 8, 5), - DateTime(2024, 8, 6), - DateTime(2024, 8, 7), - DateTime(2024, 8, 8), - DateTime(2024, 8, 9), - ]; - - final DateTime ovulationDay = DateTime(2024, 8, 18); - @override void initState() { super.initState(); @@ -69,10 +51,8 @@ class _CustomCalendarState extends State { } double _getOpacity(DateTime day, DateTime eventDay) { - // Calculate the number of days between the event and the current day final difference = day.difference(eventDay).inDays; - // Adjust the opacity based on the difference - final maxDays = 5; // Maximum days after the event for full opacity + final maxDays = 5; final opacity = (1 - (difference / maxDays)).clamp(0.2, 1.0); return opacity; } @@ -89,6 +69,9 @@ class _CustomCalendarState extends State { }); }, calendarFormat: _calendarFormat, + eventLoader: (day) { + return widget.events[day] ?? []; + }, headerVisible: true, headerStyle: const HeaderStyle( formatButtonVisible: false, @@ -111,62 +94,38 @@ class _CustomCalendarState extends State { weekdayStyle: TextStyle(color: Colors.black), ), calendarBuilders: CalendarBuilders( - defaultBuilder: (context, day, focusedDay) { - for (DateTime eventDay in fertileDays) { - if (isSameDay(day, eventDay)) { - return Container( - margin: const EdgeInsets.all(6.0), - decoration: BoxDecoration( - color: Colors.green.withOpacity(_getOpacity(day, eventDay)), - shape: BoxShape.circle, - ), - child: Center( - child: Text( - '${day.day}', - style: const TextStyle(color: Colors.white), - ), - ), - ); - } + markerBuilder: (context, date, events) { + if (events.isEmpty) { + //debugPrint('Error getting Events!! - List is empty for date: $date'); + return null; } + final eventList = events.cast(); + //debugPrint('Successfully cast events for date: $date, events: $eventList'); - for (DateTime eventDay in periodDays) { - if (isSameDay(day, eventDay)) { - return Container( - margin: const EdgeInsets.all(6.0), - decoration: BoxDecoration( - color: Colors.pink.withOpacity(_getOpacity(day, eventDay)), - shape: BoxShape.circle, - ), - child: Center( - child: Text( - '${day.day}', - style: const TextStyle(color: Colors.white), - ), - ), - ); - } - } - - if (isSameDay(day, ovulationDay)) { - return Container( - margin: const EdgeInsets.all(6.0), - decoration: BoxDecoration( - color: Colors.blue.withOpacity(0.8), // Fixed opacity for ovulation day - shape: BoxShape.circle, - ), - child: Center( - child: Text( - '${day.day}', - style: const TextStyle(color: Colors.white), - ), - ), - ); - } - - return null; + return _buildEventsMarker(date, eventList); }, ), ); } -} + + Widget _buildEventsMarker(DateTime date, List events) { + return Positioned( + right: 1, + bottom: 1, + child: Row( + mainAxisSize: MainAxisSize.min, + children: events.map((event) { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 0.5), + width: 7.0, + height: 7.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: event.color, + ), + ); + }).toList(), + ), + ); + } +} \ No newline at end of file From 6c764b184e4af3a1649a09243c0b068a73e4d6f9 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 1 Aug 2024 21:14:11 +0300 Subject: [PATCH 011/140] Ensuring State of Track Period Screen responds to when user logs period early --- .../period_planner/data/models/logs.dart | 2 + .../pages/editPeriodsCalendar.dart | 6 +- .../presentation/pages/periodCalendar.dart | 12 +-- .../presentation/pages/periodPlanner.dart | 2 +- .../pages/periodPlannerScreen.dart | 83 +++++++++++++++++-- .../presentation/widgets/customCalendar.dart | 27 ++---- .../presentation/widgets/eventsMaker.dart | 35 ++++++++ .../presentation/widgets/periodInfoCard.dart | 38 --------- 8 files changed, 130 insertions(+), 75 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/widgets/eventsMaker.dart delete mode 100644 lib/src/features/period_planner/presentation/widgets/periodInfoCard.dart diff --git a/lib/src/features/period_planner/data/models/logs.dart b/lib/src/features/period_planner/data/models/logs.dart index 5505f7cc..68e177e4 100644 --- a/lib/src/features/period_planner/data/models/logs.dart +++ b/lib/src/features/period_planner/data/models/logs.dart @@ -3,9 +3,11 @@ // @Freezed() // class Logs with _$Logs { // const factory Logs({ +// final String id, // final String moods, // final String symptoms, // final String discharge, +// final String timestamp, // }) = _Logs; // factory Logs.fromJson(Map json)=> _$LogsFromJson(json); diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index 8c547008..c650da4e 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; @@ -49,13 +50,12 @@ class _EditPeriodCalendarState extends State { children: [ CustomAppBar( title: "Log Periods 📅", - subTitle: "Please Log the start and end date of your previous periods to get started.", color: Constants.periodPlanner.withOpacity(1.0), ), TableCalendar( focusedDay: _focusedDay, firstDay: DateTime(2020), - lastDay: DateTime.now(), + lastDay: DateTime(2100), rangeStartDay: _startDate, rangeEndDay: _endDate, onRangeSelected: _onRangeSelected, @@ -119,3 +119,5 @@ class _EditPeriodCalendarState extends State { ); } } + + diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 59e4d8f7..1fbd1bff 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -11,6 +11,8 @@ import 'package:table_calendar/table_calendar.dart'; class PeriodCalendar extends StatelessWidget { const PeriodCalendar({super.key}); + + @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -83,7 +85,6 @@ class PeriodCalendar extends StatelessWidget { ); } - //Generating Events from the Cycles List Map> _generateEvents(List cycles) { Map> events = {}; @@ -115,11 +116,12 @@ class PeriodCalendar extends StatelessWidget { } // Debugging: Print events map - events.forEach((key, value) { - debugPrint('Date: $key, Events: $value'); - }); + // events.forEach((key, value) { + // debugPrint('Date: $key, Events: $value'); + // }); return events; } - } + + diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index c7e3b7b0..3f2dc28d 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -37,7 +37,7 @@ class PeriodPlanner extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ DecoratedBox( - decoration: BoxDecoration(), + decoration: const BoxDecoration(), child: SvgPicture.asset( "assets/images/period_planner2.svg", fit: BoxFit.contain, diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 033358bf..d46ff765 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -1,13 +1,16 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/loggerWidget.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; class PeriodPlannerScreen extends StatefulWidget { @@ -18,7 +21,7 @@ class PeriodPlannerScreen extends StatefulWidget { } class _PeriodPlannerScreenState extends State { - final DateTime _currentDate = DateTime.now(); + DateTime _currentDate = DateTime.now(); late DateTime _periodStart; late DateTime _periodEnd; late DateTime _ovulationDate; @@ -36,17 +39,24 @@ class _PeriodPlannerScreenState extends State { } } + //Function to check if two dates are on the same day by truncating the time part + bool isSameDay(DateTime date1, DateTime date2) { + return date1.year == date2.year && + date1.month == date2.month && + date1.day == date2.day; + } + @override Widget build(BuildContext context) { //handling the days before, after or during the various phases in the Menstrual Cycle int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; - bool isInPeriod = _currentDate.isAfter(_periodStart) && _currentDate.isBefore(_periodEnd); + bool isInPeriod = (isSameDay(_currentDate, _periodStart) || _currentDate.isAfter(_periodStart)) && _currentDate.isBefore(_periodEnd); bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && (daysToOvulation <= 5 && daysToOvulation>=1); bool veryCloseToOvulation = _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; - bool isOvulation = (_ovulationDate == _currentDate) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); - //two days after ovulation -- I'm thinking about it + bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); + //two days after ovulation -- I'm thinking about it though bool afterOvulation = _currentDate.isAfter(_ovulationDate) && _currentDate.isBefore(_nextPeriodStart); // Determine progress value and messages based on the current date @@ -56,7 +66,7 @@ class _PeriodPlannerScreenState extends State { if (isInPeriod) { progressValue = 0.2; - message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1} of your period'; + message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; buttonText = 'Log End Period'; } else if (isCloseToOvulation) { progressValue = 0.3; @@ -80,6 +90,13 @@ class _PeriodPlannerScreenState extends State { buttonText = ''; } + // Debug prints to trace the logic + debugPrint('Current Date: $_currentDate'); + debugPrint('Period Start: $_periodStart'); + debugPrint('Period End: $_periodEnd'); + debugPrint('Is In Period: $isInPeriod'); + + //Mapping the events Map> events = _generateEvents(cycles); return Scaffold( @@ -136,7 +153,58 @@ class _PeriodPlannerScreenState extends State { if (buttonText.isNotEmpty) ElevatedButton( onPressed: () { - // Handle button press + if (afterOvulation == true) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Confirm Log Period'), + content: const Text('Are you sure you want to log your period?'), + actions: [ + TextButton( + child: const Text('Cancel'), + onPressed: () { + Navigator.of(context).pop(); // Close the dialog + }, + ), + TextButton( + child: const Text('Confirm'), + onPressed: () { + setState(() { + // Log the period start here + isInPeriod = true; + _currentDate = DateTime.now(); + + final Cycle predictedCycle = predictCycle( + _periodStart = DateTime.now(), + _periodEnd = DateTime.now().add(const Duration(days: 6)), + ); + cycles.add(predictedCycle); + + _ovulationDate = predictedCycle.ovulation; + _nextPeriodStart = predictedCycle.predictedPeriodStart; + + // Debug print to check the state update + debugPrint('Period Start after update: $_periodStart'); + debugPrint('Period End after update: $_periodEnd'); + debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); + debugPrint('Current Date after update: $_currentDate'); + debugPrint('Is In Period after update: $isInPeriod'); + }); + //printCycles(cycles); + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + + } + else{ + // Handle button press + } + }, style: ElevatedButton.styleFrom( foregroundColor: Colors.black, @@ -210,6 +278,7 @@ class _PeriodPlannerScreenState extends State { ); } + //Generating Events from the Cycles List Map> _generateEvents(List cycles) { Map> events = {}; @@ -235,7 +304,7 @@ class _PeriodPlannerScreenState extends State { for (DateTime date = cycle.predictedPeriodStart; date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.pink)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); + events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.orange)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); } //events.update(cycle.predictedPeriodStart, (existingEvents) => existingEvents..add(Event('Predicted Period Start', Colors.orange)), ifAbsent: () => [Event('Predicted Period Start', Colors.orange)]); } diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index f15ec04e..6ed0465e 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -1,9 +1,12 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; +//Algorithm +//Make the following parameter optional Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLength = 28, int averagePeriodLength = 7}) { var uuid = const Uuid(); String cycleId = uuid.v4(); //Generating a unique id @@ -102,30 +105,10 @@ class _CustomCalendarState extends State { final eventList = events.cast(); //debugPrint('Successfully cast events for date: $date, events: $eventList'); - return _buildEventsMarker(date, eventList); + return EventsMaker(date: date, events: eventList); }, ), ); } +} - Widget _buildEventsMarker(DateTime date, List events) { - return Positioned( - right: 1, - bottom: 1, - child: Row( - mainAxisSize: MainAxisSize.min, - children: events.map((event) { - return Container( - margin: const EdgeInsets.symmetric(horizontal: 0.5), - width: 7.0, - height: 7.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: event.color, - ), - ); - }).toList(), - ), - ); - } -} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart new file mode 100644 index 00000000..9293499b --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/data/models/events.dart'; + +class EventsMaker extends StatelessWidget { + const EventsMaker({ + super.key, + required this.date, + required this.events, + }); + + final DateTime date; + final List events; + + @override + Widget build(BuildContext context) { + return Positioned( + right: 1, + bottom: 1, + child: Row( + mainAxisSize: MainAxisSize.min, + children: events.map((event) { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 0.5), + width: 7.0, + height: 7.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: event.color, + ), + ); + }).toList(), + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/periodInfoCard.dart b/lib/src/features/period_planner/presentation/widgets/periodInfoCard.dart deleted file mode 100644 index 66995d7e..00000000 --- a/lib/src/features/period_planner/presentation/widgets/periodInfoCard.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; - -class PeriodInfoCard extends StatelessWidget { - PeriodInfoCard({super.key}); - - @override - Widget build(BuildContext context) { - return Card( - color: Colors.pink[50], // Set the card color to match the previous container color - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - elevation: 4, // Adjust the elevation to add shadow to the card - child: const Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - SizedBox(height: 10), - Text( - 'Day 5', - style: TextStyle(fontSize: 38, color: Colors.pink, fontWeight: FontWeight.bold), - ), - SizedBox(height: 10), - Text( - 'Low chance of getting pregnant', - style: TextStyle(fontSize: 16), - ), - ], - ), - ), - ); - } -} From 392b6c2bf03e00d4cf059c83ded7aa3e2524df15 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 2 Aug 2024 12:59:01 +0300 Subject: [PATCH 012/140] Managing state when user logs end of period --- .../period_planner/data/models/cycle.dart | 32 ++--- .../pages/periodPlannerScreen.dart | 109 ++++++++++++++++-- 2 files changed, 113 insertions(+), 28 deletions(-) diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart index 0767c0bf..07e85442 100644 --- a/lib/src/features/period_planner/data/models/cycle.dart +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -3,14 +3,14 @@ // @Freezed() // class Cycle with _$Cycle { // const factory Cycle({ -// final String cycleId, -// final DateTime periodStart, -// final DateTime periodEnd, -// final DateTime fertileStart, -// final DateTime fertileEnd, -// final DateTime ovulation, -// final DateTime predictedPeriodStart, -// final DateTime predictedPeriodEnd, +// String cycleId, +// DateTime periodStart, +// DateTime periodEnd, +// DateTime fertileStart, +// DateTime fertileEnd, +// DateTime ovulation, +// DateTime predictedPeriodStart, +// DateTime predictedPeriodEnd, // }) = _Cycle; // factory Cycle.fromJson(Map json)=> _$CycleFromJson(json); @@ -19,14 +19,14 @@ import 'dart:ui'; class Cycle{ - final String cycleId; - final DateTime periodStart; - final DateTime periodEnd; - final DateTime fertileStart; - final DateTime fertileEnd; - final DateTime ovulation; - final DateTime predictedPeriodStart; - final DateTime predictedPeriodEnd; + String cycleId; + DateTime periodStart; + DateTime periodEnd; + DateTime fertileStart; + DateTime fertileEnd; + DateTime ovulation; + DateTime predictedPeriodStart; + DateTime predictedPeriodEnd; Cycle({ required this.cycleId, diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index d46ff765..bc802f21 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -48,16 +48,19 @@ class _PeriodPlannerScreenState extends State { @override Widget build(BuildContext context) { + //late bool endOfPeriod; // handling when user has logged end of period //handling the days before, after or during the various phases in the Menstrual Cycle int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; bool isInPeriod = (isSameDay(_currentDate, _periodStart) || _currentDate.isAfter(_periodStart)) && _currentDate.isBefore(_periodEnd); - bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && (daysToOvulation <= 5 && daysToOvulation>=1); + bool veryCloseToPeriod = _currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod == 0; + bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && !isInPeriod && daysToOvulation>=1 ; bool veryCloseToOvulation = _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); //two days after ovulation -- I'm thinking about it though - bool afterOvulation = _currentDate.isAfter(_ovulationDate) && _currentDate.isBefore(_nextPeriodStart); + bool afterOvulation = _currentDate.isAfter(_ovulationDate) && (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod>0); + // Determine progress value and messages based on the current date double progressValue = 0.0; @@ -84,17 +87,26 @@ class _PeriodPlannerScreenState extends State { progressValue = 0.7; message = '$daysToNextPeriod days'; buttonText = 'Log Period'; - } else { + } else if (veryCloseToPeriod) { + progressValue = 0.7; + message = 'Tomorrow'; + buttonText = 'Log Period'; + } + else { progressValue = 1.0; message = 'Cycle Complete'; buttonText = ''; } - // Debug prints to trace the logic - debugPrint('Current Date: $_currentDate'); - debugPrint('Period Start: $_periodStart'); - debugPrint('Period End: $_periodEnd'); + //Debug prints to trace the logic + // debugPrint('Current Date: $_currentDate'); + // debugPrint('Period Start: $_periodStart'); + // debugPrint('Period End: $_periodEnd'); + // debugPrint('Is In Period: $isInPeriod'); + debugPrint('-----Widget Rebuild-----'); debugPrint('Is In Period: $isInPeriod'); + debugPrint('Is close to Ovulation: $isCloseToOvulation'); + //Mapping the events Map> events = _generateEvents(cycles); @@ -114,6 +126,15 @@ class _PeriodPlannerScreenState extends State { padding: const EdgeInsets.all(16.0), child: Column( children: [ + // Align( + // alignment: Alignment.topRight, + // child: IconButton( + // onPressed: () { + // context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); + // }, + // icon: const Icon(Icons.calendar_month), + // ), + // ), SizedBox( height: 150, child: CustomCalendar(initialFormat: CalendarFormat.week, events: events), @@ -136,7 +157,14 @@ class _PeriodPlannerScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - isInPeriod ? 'Period' : isCloseToOvulation ? 'Ovulation in': veryCloseToOvulation ? 'Ovulation is': isOvulation ? 'Ovulation is' : 'Next Period in', + isInPeriod + ? 'Period' : veryCloseToPeriod + ? 'Next Period is': isCloseToOvulation + ? 'Ovulation in': veryCloseToOvulation + ? 'Ovulation is': isOvulation + ? 'Ovulation is' : afterOvulation + ? 'Next Period in' + : 'Error', style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), const SizedBox(height: Constants.SPACING), @@ -146,14 +174,21 @@ class _PeriodPlannerScreenState extends State { ), const SizedBox(height: Constants.SPACING), Text( - isInPeriod ? 'Low Chances of Getting Pregnant' : isCloseToOvulation ? 'High Chances of Getting Pregnant': veryCloseToOvulation ? 'High Chances of Getting Pregnant' : isOvulation ? 'High Chances of Getting Pregnant' : 'Low Chances of Getting Pregnant', + isInPeriod + ? 'Low Chances of Getting Pregnant': veryCloseToPeriod + ? 'Low Chances of Getting Pregnant' : isCloseToOvulation + ? 'High Chances of Getting Pregnant': veryCloseToOvulation + ? 'High Chances of Getting Pregnant' : isOvulation + ? 'High Chances of Getting Pregnant' + : 'Low Chances of Getting Pregnant', style: const TextStyle(fontSize: 16), ), const SizedBox(height: Constants.SPACING), if (buttonText.isNotEmpty) ElevatedButton( onPressed: () { - if (afterOvulation == true) { + //Logging Start of new period + if (buttonText == 'Log Period') { showDialog( context: context, builder: (BuildContext context) { @@ -177,7 +212,7 @@ class _PeriodPlannerScreenState extends State { final Cycle predictedCycle = predictCycle( _periodStart = DateTime.now(), - _periodEnd = DateTime.now().add(const Duration(days: 6)), + _periodEnd = DateTime.now().add(const Duration(days: 7)), ); cycles.add(predictedCycle); @@ -185,11 +220,13 @@ class _PeriodPlannerScreenState extends State { _nextPeriodStart = predictedCycle.predictedPeriodStart; // Debug print to check the state update + debugPrint("After User has logged Period"); debugPrint('Period Start after update: $_periodStart'); debugPrint('Period End after update: $_periodEnd'); debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); debugPrint('Current Date after update: $_currentDate'); debugPrint('Is In Period after update: $isInPeriod'); + debugPrint("--------"); }); //printCycles(cycles); Navigator.of(context).pop(); @@ -201,8 +238,56 @@ class _PeriodPlannerScreenState extends State { ); } + //Logging end of new period else{ - // Handle button press + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Confirming End of Period'), + content: const Text('Are you sure you want to log the end of your period?'), + actions: [ + TextButton( + child: const Text('Cancel'), + onPressed: () { + Navigator.of(context).pop(); // Close the dialog + }, + ), + TextButton( + child: const Text('Confirm'), + onPressed: () { + setState(() { + // Log the period start here + isCloseToOvulation = true; + isInPeriod = false; + _currentDate = DateTime.now(); + _periodEnd = _currentDate; + + //updating period end in my List for now + for (var cycle in cycles) { + if (cycle.periodStart == _periodStart) { + cycle.periodEnd = _periodEnd; + } + } + + // Debug print to check the state update + debugPrint("After User has logged end of Period"); + debugPrint('Period Start after update: $_periodStart'); + debugPrint('Period End after update: $_periodEnd'); + debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); + debugPrint('Current Date after update: $_currentDate'); + debugPrint('Is In Period after update: $isInPeriod'); + debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); + debugPrint("--------"); + }); + //printCycles(cycles); + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); } }, From ffbf2294f679f5b333d2d57f6025692b222946db Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 5 Aug 2024 13:34:42 +0300 Subject: [PATCH 013/140] Enabling updating of period days for First Time users in Log Periods page. --- .../pages/editPeriodsCalendar.dart | 21 +++++++++++++------ .../presentation/pages/periodCalendar.dart | 9 ++++++++ .../pages/periodPlannerScreen.dart | 18 ++++++++-------- .../presentation/widgets/eventsMaker.dart | 18 ++++++++++++++-- 4 files changed, 49 insertions(+), 17 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index c650da4e..10559d9f 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -42,6 +42,18 @@ class _EditPeriodCalendarState extends State { }); } + //Function to handle adding and updating log entries in list Database + void _updateOrAddCycle(DateTime start, DateTime end) { + if (cycles.isNotEmpty) { + // Update existing cycle + cycles[0] = predictCycle(start, end); + } else { + // Add new cycle + final Cycle newCycle = predictCycle(start, end); + cycles.add(newCycle); + } + } + @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -55,7 +67,7 @@ class _EditPeriodCalendarState extends State { TableCalendar( focusedDay: _focusedDay, firstDay: DateTime(2020), - lastDay: DateTime(2100), + lastDay: DateTime.now(), rangeStartDay: _startDate, rangeEndDay: _endDate, onRangeSelected: _onRangeSelected, @@ -90,11 +102,8 @@ class _EditPeriodCalendarState extends State { ), onPressed: () { if (_startDate != null && _endDate != null) { - final Cycle predictedCycle = predictCycle( - _startDate!, - _endDate!, - ); - cycles.add(predictedCycle); + _updateOrAddCycle(_startDate!, _endDate!); + printCycles(cycles); // Print the list of cycles printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_MENU); diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 1fbd1bff..48f52ed5 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -25,6 +25,15 @@ class PeriodCalendar extends StatelessWidget { title: "Calendar 🗓️", color: Constants.periodPlanner.withOpacity(1.0), ), + Align( + alignment: Alignment.topRight, + child: IconButton( + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + }, + icon: const Icon(Icons.home), + ), + ), Expanded( child: Column( children: [ diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index bc802f21..0d7822ab 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -126,15 +126,15 @@ class _PeriodPlannerScreenState extends State { padding: const EdgeInsets.all(16.0), child: Column( children: [ - // Align( - // alignment: Alignment.topRight, - // child: IconButton( - // onPressed: () { - // context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); - // }, - // icon: const Icon(Icons.calendar_month), - // ), - // ), + Align( + alignment: Alignment.topRight, + child: IconButton( + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); + }, + icon: const Icon(Icons.calendar_month), + ), + ), SizedBox( height: 150, child: CustomCalendar(initialFormat: CalendarFormat.week, events: events), diff --git a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart index 9293499b..21d42c36 100644 --- a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart +++ b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart @@ -11,7 +11,14 @@ class EventsMaker extends StatelessWidget { final DateTime date; final List events; - @override + //Calculating Opacity + double _calculateOpacity(DateTime eventStart, DateTime eventEnd, DateTime currentDate) { + int totalDays = eventEnd.difference(eventStart).inDays + 1; + int currentDayIndex = currentDate.difference(eventStart).inDays; + return (1 - (currentDayIndex / totalDays)).clamp(0.2, 1.0); + } + + @override Widget build(BuildContext context) { return Positioned( right: 1, @@ -19,13 +26,20 @@ class EventsMaker extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, children: events.map((event) { + // Example: Assuming you have the start and end dates for the event + DateTime eventStart = date; // Update this to the actual event start date + DateTime eventEnd = date.add(Duration(days: events.length - 1)); // Update this to the actual event end date + + double opacity = _calculateOpacity(eventStart, eventEnd, date); + Color colorWithOpacity = event.color.withOpacity(opacity); + return Container( margin: const EdgeInsets.symmetric(horizontal: 0.5), width: 7.0, height: 7.0, decoration: BoxDecoration( shape: BoxShape.circle, - color: event.color, + color: colorWithOpacity, ), ); }).toList(), From 12c0a29ace387b44af13995de5cf81e69ee68d94 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 5 Aug 2024 15:50:54 +0300 Subject: [PATCH 014/140] Handling Overdue Period Days --- .../pages/periodPlannerScreen.dart | 83 ++++++++++++------- 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 0d7822ab..b61c1462 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; @@ -26,6 +25,7 @@ class _PeriodPlannerScreenState extends State { late DateTime _periodEnd; late DateTime _ovulationDate; late DateTime _nextPeriodStart; + late DateTime _nextPeriodEnd; @override void initState() { @@ -36,6 +36,7 @@ class _PeriodPlannerScreenState extends State { _periodEnd = latestCycle.periodEnd; _ovulationDate = latestCycle.ovulation; _nextPeriodStart = latestCycle.predictedPeriodStart; + _nextPeriodEnd = latestCycle.predictedPeriodEnd; } } @@ -52,6 +53,8 @@ class _PeriodPlannerScreenState extends State { //handling the days before, after or during the various phases in the Menstrual Cycle int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; + int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; + //int predictedDays = _nextPeriodEnd.difference(_nextPeriodStart).inDays; bool isInPeriod = (isSameDay(_currentDate, _periodStart) || _currentDate.isAfter(_periodStart)) && _currentDate.isBefore(_periodEnd); bool veryCloseToPeriod = _currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod == 0; @@ -60,52 +63,84 @@ class _PeriodPlannerScreenState extends State { bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); //two days after ovulation -- I'm thinking about it though bool afterOvulation = _currentDate.isAfter(_ovulationDate) && (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod>0); + bool duringPredictedPeriodRange = _currentDate.isAfter(_nextPeriodStart) && + _currentDate.isBefore(_nextPeriodEnd) || + isSameDay(_currentDate, _nextPeriodStart) || + isSameDay(_currentDate, _nextPeriodEnd); + bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); + // Determine progress value and messages based on the current date double progressValue = 0.0; String message = ''; String buttonText = ''; + String title = ''; + String chances = ''; if (isInPeriod) { progressValue = 0.2; + title = 'Period'; message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; buttonText = 'Log End Period'; + chances = 'Low Chances of Getting Pregnant'; } else if (isCloseToOvulation) { progressValue = 0.3; + title = 'Ovulation in'; message = '$daysToOvulation days'; buttonText = ''; + chances = 'High Chances of Getting Pregnant'; } else if (veryCloseToOvulation) { progressValue = 0.4; + title = 'Ovulation is'; message = 'Tomorrow'; buttonText = ''; + chances = 'High Chances of Getting Pregnant'; } else if (isOvulation) { progressValue = 0.5; + title = 'Ovulation is'; message = 'Today'; buttonText = ''; + chances = 'High Chances of Getting Pregnant'; } else if (afterOvulation) { - progressValue = 0.7; + progressValue = 0.7; + title = 'Next Period in'; message = '$daysToNextPeriod days'; buttonText = 'Log Period'; + chances = 'High Chances of Getting Pregnant'; } else if (veryCloseToPeriod) { progressValue = 0.7; + title = 'Next Period is'; message = 'Tomorrow'; buttonText = 'Log Period'; - } - else { + chances = 'Low Chances of Getting Pregnant'; + } else if (duringPredictedPeriodRange) { progressValue = 1.0; - message = 'Cycle Complete'; - buttonText = ''; + title = 'Periods May happen'; + message = 'Today'; + buttonText = 'Log Period'; + chances = 'Low Chances of Getting Pregnant'; + } else if(isDangerZone) { + progressValue = 1.0; + title = 'Periods Overdue by'; + message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; + buttonText = 'Log Period'; + chances = 'High Chances of Getting Pregnant'; } + // else { + // progressValue = 1.0; + // message = 'Cycle Complete'; + // buttonText = ''; + // } //Debug prints to trace the logic // debugPrint('Current Date: $_currentDate'); // debugPrint('Period Start: $_periodStart'); // debugPrint('Period End: $_periodEnd'); // debugPrint('Is In Period: $isInPeriod'); - debugPrint('-----Widget Rebuild-----'); - debugPrint('Is In Period: $isInPeriod'); - debugPrint('Is close to Ovulation: $isCloseToOvulation'); + // debugPrint('-----Widget Rebuild-----'); + // debugPrint('Is In Period: $isInPeriod'); + // debugPrint('Is close to Ovulation: $isCloseToOvulation'); //Mapping the events @@ -150,37 +185,29 @@ class _PeriodPlannerScreenState extends State { value: progressValue, strokeWidth: 10, backgroundColor: Colors.grey, - valueColor: const AlwaysStoppedAnimation(Constants.periodPlanner), + valueColor: AlwaysStoppedAnimation( + isDangerZone ? Colors.red : Constants.periodPlanner, + ) , ), ), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - isInPeriod - ? 'Period' : veryCloseToPeriod - ? 'Next Period is': isCloseToOvulation - ? 'Ovulation in': veryCloseToOvulation - ? 'Ovulation is': isOvulation - ? 'Ovulation is' : afterOvulation - ? 'Next Period in' - : 'Error', - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + title, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), const SizedBox(height: Constants.SPACING), Text( message, - style: const TextStyle(fontSize: 38, color: Constants.periodPlanner, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 38, color: isDangerZone ? Colors.red: Constants.periodPlanner, fontWeight: FontWeight.bold), ), const SizedBox(height: Constants.SPACING), Text( - isInPeriod - ? 'Low Chances of Getting Pregnant': veryCloseToPeriod - ? 'Low Chances of Getting Pregnant' : isCloseToOvulation - ? 'High Chances of Getting Pregnant': veryCloseToOvulation - ? 'High Chances of Getting Pregnant' : isOvulation - ? 'High Chances of Getting Pregnant' - : 'Low Chances of Getting Pregnant', + chances, style: const TextStyle(fontSize: 16), ), const SizedBox(height: Constants.SPACING), @@ -293,7 +320,7 @@ class _PeriodPlannerScreenState extends State { }, style: ElevatedButton.styleFrom( foregroundColor: Colors.black, - backgroundColor: Constants.periodPlanner, + backgroundColor: isDangerZone ? Colors.red: Constants.periodPlanner, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), From 3b5ef8b5717ac7ec93e5bd48663f92c2c9fc45fc Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 6 Aug 2024 19:23:52 +0300 Subject: [PATCH 015/140] Added event utils to handle generating of new events --- .../pages/editPeriodsCalendar.dart | 5 +- .../presentation/pages/periodCalendar.dart | 61 ++++-------------- .../pages/periodPlannerScreen.dart | 62 +++++++------------ .../presentation/widgets/customCalendar.dart | 25 +++----- .../period_planner/utility/event_utils.dart | 37 +++++++++++ 5 files changed, 81 insertions(+), 109 deletions(-) create mode 100644 lib/src/features/period_planner/utility/event_utils.dart diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index 10559d9f..0deee397 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; -import 'package:uuid/uuid.dart'; + + //printing List which is acting as a Database void printCycles(List cycles) { @@ -103,7 +103,6 @@ class _EditPeriodCalendarState extends State { onPressed: () { if (_startDate != null && _endDate != null) { _updateOrAddCycle(_startDate!, _endDate!); - printCycles(cycles); // Print the list of cycles printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_MENU); diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 48f52ed5..15b97f42 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -4,10 +4,11 @@ import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/features/period_planner/utility/event_utils.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -import 'package:table_calendar/table_calendar.dart'; + class PeriodCalendar extends StatelessWidget { const PeriodCalendar({super.key}); @@ -16,8 +17,7 @@ class PeriodCalendar extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); - - Map> events = _generateEvents(cycles); + Map> events = EventUtils.generateEvents(cycles); return Scaffold( body: Column( children: [ @@ -26,18 +26,18 @@ class PeriodCalendar extends StatelessWidget { color: Constants.periodPlanner.withOpacity(1.0), ), Align( - alignment: Alignment.topRight, - child: IconButton( - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - }, - icon: const Icon(Icons.home), - ), - ), + alignment: Alignment.topRight, + child: IconButton( + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + }, + icon: const Icon(Icons.home), + ), + ), Expanded( child: Column( children: [ - CustomCalendar(initialFormat: CalendarFormat.month, events: events,), + CustomCalendar(events: events), const SizedBox(height: 20), const Row( mainAxisAlignment: MainAxisAlignment.start, @@ -94,43 +94,6 @@ class PeriodCalendar extends StatelessWidget { ); } - Map> _generateEvents(List cycles) { - Map> events = {}; - - for (Cycle cycle in cycles) { - // Add period days - for (DateTime date = cycle.periodStart; - date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); - date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Period Day', Colors.pink)), ifAbsent: () => [Event('Period Day', Colors.pink)]); - } - - // Add fertile window days - for (DateTime date = cycle.fertileStart; - date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); - date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Fertile Day', Colors.green)), ifAbsent: () => [Event('Fertile Day', Colors.green)]); - } - - // Add ovulation day - events.update(cycle.ovulation, (existingEvents) => existingEvents..add(Event('Ovulation Day', Colors.blue)), ifAbsent: () => [Event('Ovulation Day', Colors.blue)]); - - // Add predicted period start - for (DateTime date = cycle.predictedPeriodStart; - date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); - date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.pink)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); - } - //events.update(cycle.predictedPeriodStart, (existingEvents) => existingEvents..add(Event('Predicted Period Start', Colors.orange)), ifAbsent: () => [Event('Predicted Period Start', Colors.orange)]); - } - - // Debugging: Print events map - // events.forEach((key, value) { - // debugPrint('Date: $key, Events: $value'); - // }); - - return events; - } } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index b61c1462..e9433417 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -7,6 +7,7 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/carous import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/loggerWidget.dart'; +import 'package:nishauri/src/features/period_planner/utility/event_utils.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; @@ -26,10 +27,14 @@ class _PeriodPlannerScreenState extends State { late DateTime _ovulationDate; late DateTime _nextPeriodStart; late DateTime _nextPeriodEnd; + Map> events = {}; + @override void initState() { super.initState(); + + //events = _generateEvents(cycles); if (cycles.isNotEmpty) { Cycle latestCycle = cycles.last; _periodStart = latestCycle.periodStart; @@ -37,6 +42,8 @@ class _PeriodPlannerScreenState extends State { _ovulationDate = latestCycle.ovulation; _nextPeriodStart = latestCycle.predictedPeriodStart; _nextPeriodEnd = latestCycle.predictedPeriodEnd; + + } } @@ -47,6 +54,12 @@ class _PeriodPlannerScreenState extends State { date1.day == date2.day; } + // void _updateEvents() { + // setState(() { + // events = _generateEvents(cycles); + // }); + // } + @override Widget build(BuildContext context) { //late bool endOfPeriod; // handling when user has logged end of period @@ -141,11 +154,8 @@ class _PeriodPlannerScreenState extends State { // debugPrint('-----Widget Rebuild-----'); // debugPrint('Is In Period: $isInPeriod'); // debugPrint('Is close to Ovulation: $isCloseToOvulation'); - - - //Mapping the events - Map> events = _generateEvents(cycles); + Map> events = EventUtils.generateEvents(cycles); return Scaffold( body: Column( children: [ @@ -172,7 +182,7 @@ class _PeriodPlannerScreenState extends State { ), SizedBox( height: 150, - child: CustomCalendar(initialFormat: CalendarFormat.week, events: events), + child: CustomCalendar(initialFormat: CalendarFormat.week, events: events,), ), const SizedBox(height: 20), Stack( @@ -246,6 +256,9 @@ class _PeriodPlannerScreenState extends State { _ovulationDate = predictedCycle.ovulation; _nextPeriodStart = predictedCycle.predictedPeriodStart; + //updating events + //_updateEvents(); + // Debug print to check the state update debugPrint("After User has logged Period"); debugPrint('Period Start after update: $_periodStart'); @@ -297,6 +310,9 @@ class _PeriodPlannerScreenState extends State { } } + //Upodating events + //_updateEvents(); + // Debug print to check the state update debugPrint("After User has logged end of Period"); debugPrint('Period Start after update: $_periodStart'); @@ -389,38 +405,4 @@ class _PeriodPlannerScreenState extends State { ), ); } - - //Generating Events from the Cycles List - Map> _generateEvents(List cycles) { - Map> events = {}; - - for (Cycle cycle in cycles) { - // Add period days - for (DateTime date = cycle.periodStart; - date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); - date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Period Day', Colors.pink)), ifAbsent: () => [Event('Period Day', Colors.pink)]); - } - - // Add fertile window days - for (DateTime date = cycle.fertileStart; - date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); - date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Fertile Day', Colors.green)), ifAbsent: () => [Event('Fertile Day', Colors.green)]); - } - - // Add ovulation day - events.update(cycle.ovulation, (existingEvents) => existingEvents..add(Event('Ovulation Day', Colors.blue)), ifAbsent: () => [Event('Ovulation Day', Colors.blue)]); - - // Add predicted period start - for (DateTime date = cycle.predictedPeriodStart; - date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); - date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.orange)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); - } - //events.update(cycle.predictedPeriodStart, (existingEvents) => existingEvents..add(Event('Predicted Period Start', Colors.orange)), ifAbsent: () => [Event('Predicted Period Start', Colors.orange)]); - } - - return events; - } -} \ No newline at end of file +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 6ed0465e..dd7e4324 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -42,35 +42,26 @@ class CustomCalendar extends StatefulWidget { @override _CustomCalendarState createState() => _CustomCalendarState(); } - -class _CustomCalendarState extends State { - DateTime _focusedDay = DateTime.now(); +class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; - @override + @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; } - double _getOpacity(DateTime day, DateTime eventDay) { - final difference = day.difference(eventDay).inDays; - final maxDays = 5; - final opacity = (1 - (difference / maxDays)).clamp(0.2, 1.0); - return opacity; - } - @override Widget build(BuildContext context) { return TableCalendar( firstDay: DateTime(2010), lastDay: DateTime(2100), - focusedDay: _focusedDay, - onDaySelected: (selectedDay, focusedDay) { - setState(() { - _focusedDay = focusedDay; - }); - }, + focusedDay: DateTime.now(), + // onDaySelected: (selectedDay, focusedDay) { + // setState(() { + // _focusedDay = focusedDay; + // }); + // }, calendarFormat: _calendarFormat, eventLoader: (day) { return widget.events[day] ?? []; diff --git a/lib/src/features/period_planner/utility/event_utils.dart b/lib/src/features/period_planner/utility/event_utils.dart new file mode 100644 index 00000000..be97731a --- /dev/null +++ b/lib/src/features/period_planner/utility/event_utils.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/models/events.dart'; + +class EventUtils { + static Map> generateEvents(List cycles) { + Map> events = {}; + + for (Cycle cycle in cycles) { + // Add period days + for (DateTime date = cycle.periodStart; + date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Period Day', Colors.pink)), ifAbsent: () => [Event('Period Day', Colors.pink)]); + } + + // Add fertile window days + for (DateTime date = cycle.fertileStart; + date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Fertile Day', Colors.green)), ifAbsent: () => [Event('Fertile Day', Colors.green)]); + } + + // Add ovulation day + events.update(cycle.ovulation, (existingEvents) => existingEvents..add(Event('Ovulation Day', Colors.blue)), ifAbsent: () => [Event('Ovulation Day', Colors.blue)]); + + // Add predicted period start + for (DateTime date = cycle.predictedPeriodStart; + date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); + date = date.add(const Duration(days: 1))) { + events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.pink)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); + } + } + + return events; + } +} From 132a68d2f29a83bd9521cf1fbdd171e66e86fd97 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 8 Aug 2024 12:55:31 +0300 Subject: [PATCH 016/140] Debugging --- .../period_planner/data/models/cycle.dart | 1 - .../period_planner/data/models/events.dart | 3 +- .../presentation/pages/periodCalendar.dart | 6 ++- .../pages/periodPlannerScreen.dart | 39 +++++++++++-------- .../presentation/widgets/customCalendar.dart | 24 +++++++++++- .../presentation/widgets/eventsMaker.dart | 22 ++++++----- .../{utility => utils}/event_utils.dart | 5 +++ 7 files changed, 66 insertions(+), 34 deletions(-) rename lib/src/features/period_planner/{utility => utils}/event_utils.dart (84%) diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart index 07e85442..ca7d416b 100644 --- a/lib/src/features/period_planner/data/models/cycle.dart +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -16,7 +16,6 @@ // factory Cycle.fromJson(Map json)=> _$CycleFromJson(json); // } -import 'dart:ui'; class Cycle{ String cycleId; diff --git a/lib/src/features/period_planner/data/models/events.dart b/lib/src/features/period_planner/data/models/events.dart index e2afa9da..81dadc35 100644 --- a/lib/src/features/period_planner/data/models/events.dart +++ b/lib/src/features/period_planner/data/models/events.dart @@ -1,7 +1,6 @@ import 'dart:ui'; - import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; + //Event class Event { final String title; diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 15b97f42..cadf657f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -4,7 +4,7 @@ import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/features/period_planner/utility/event_utils.dart'; +import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; @@ -37,7 +37,9 @@ class PeriodCalendar extends StatelessWidget { Expanded( child: Column( children: [ - CustomCalendar(events: events), + CustomCalendar( + events: events + ), const SizedBox(height: 20), const Row( mainAxisAlignment: MainAxisAlignment.start, diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index e9433417..66d9605b 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -7,7 +7,7 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/carous import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/loggerWidget.dart'; -import 'package:nishauri/src/features/period_planner/utility/event_utils.dart'; +import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; @@ -29,7 +29,7 @@ class _PeriodPlannerScreenState extends State { late DateTime _nextPeriodEnd; Map> events = {}; - + @override void initState() { super.initState(); @@ -40,11 +40,18 @@ class _PeriodPlannerScreenState extends State { _periodStart = latestCycle.periodStart; _periodEnd = latestCycle.periodEnd; _ovulationDate = latestCycle.ovulation; - _nextPeriodStart = latestCycle.predictedPeriodStart; - _nextPeriodEnd = latestCycle.predictedPeriodEnd; - - + _nextPeriodStart = latestCycle.predictedPeriodStart; + _nextPeriodEnd = latestCycle.predictedPeriodEnd; } + events = EventUtils.generateEvents(cycles); + //_updateEvents(); + } + + void _updateEvents() { + setState(() { + events = EventUtils.generateEvents(cycles); + debugPrint("Updated Events: $events"); + }); } //Function to check if two dates are on the same day by truncating the time part @@ -54,11 +61,6 @@ class _PeriodPlannerScreenState extends State { date1.day == date2.day; } - // void _updateEvents() { - // setState(() { - // events = _generateEvents(cycles); - // }); - // } @override Widget build(BuildContext context) { @@ -155,7 +157,8 @@ class _PeriodPlannerScreenState extends State { // debugPrint('Is In Period: $isInPeriod'); // debugPrint('Is close to Ovulation: $isCloseToOvulation'); - Map> events = EventUtils.generateEvents(cycles); + + return Scaffold( body: Column( children: [ @@ -182,7 +185,11 @@ class _PeriodPlannerScreenState extends State { ), SizedBox( height: 150, - child: CustomCalendar(initialFormat: CalendarFormat.week, events: events,), + child: CustomCalendar( + //key: ValueKey(events), + initialFormat: CalendarFormat.week, + events: events, + ), ), const SizedBox(height: 20), Stack( @@ -256,8 +263,7 @@ class _PeriodPlannerScreenState extends State { _ovulationDate = predictedCycle.ovulation; _nextPeriodStart = predictedCycle.predictedPeriodStart; - //updating events - //_updateEvents(); + _updateEvents(); // Debug print to check the state update debugPrint("After User has logged Period"); @@ -310,8 +316,7 @@ class _PeriodPlannerScreenState extends State { } } - //Upodating events - //_updateEvents(); + _updateEvents(); // Debug print to check the state update debugPrint("After User has logged end of Period"); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index dd7e4324..8cb86b12 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; +import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; @@ -37,23 +38,39 @@ class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map> events; - CustomCalendar({this.initialFormat = CalendarFormat.month, required this.events}); + CustomCalendar({ + //Key? key, + this.initialFormat = CalendarFormat.month, + required this.events, + }); @override _CustomCalendarState createState() => _CustomCalendarState(); } class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; + //late Map> _events; @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; + //events = EventUtils.generateEvents(cycles); + //events = widget.events; + //_events = widget.events; } + // void updateEvents(Map> newEvents) { + // setState(() { + // _events = newEvents; + // debugPrint("Updated Calendar Events: $_events"); + // }); + // } + @override Widget build(BuildContext context) { return TableCalendar( + //key: ValueKey(_events), firstDay: DateTime(2010), lastDay: DateTime(2100), focusedDay: DateTime.now(), @@ -64,6 +81,7 @@ class _CustomCalendarState extends State{ // }, calendarFormat: _calendarFormat, eventLoader: (day) { + // return widget.events[day] ?? []; return widget.events[day] ?? []; }, headerVisible: true, @@ -94,7 +112,9 @@ class _CustomCalendarState extends State{ return null; } final eventList = events.cast(); - //debugPrint('Successfully cast events for date: $date, events: $eventList'); + + debugPrint("-----From CustomCalendar------"); + debugPrint('Successfully cast events for date: $date, events: $eventList'); return EventsMaker(date: date, events: eventList); }, diff --git a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart index 21d42c36..628b8fc8 100644 --- a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart +++ b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart @@ -12,14 +12,16 @@ class EventsMaker extends StatelessWidget { final List events; //Calculating Opacity - double _calculateOpacity(DateTime eventStart, DateTime eventEnd, DateTime currentDate) { - int totalDays = eventEnd.difference(eventStart).inDays + 1; - int currentDayIndex = currentDate.difference(eventStart).inDays; - return (1 - (currentDayIndex / totalDays)).clamp(0.2, 1.0); - } + // double _calculateOpacity(DateTime eventStart, DateTime eventEnd, DateTime currentDate) { + // int totalDays = eventEnd.difference(eventStart).inDays + 1; + // int currentDayIndex = currentDate.difference(eventStart).inDays; + // return (1 - (currentDayIndex / totalDays)).clamp(0.2, 1.0); + // } @override Widget build(BuildContext context) { + //debugPrint("----From EventMaker Class----"); + //debugPrint("Coloured Events $events"); return Positioned( right: 1, bottom: 1, @@ -27,11 +29,11 @@ class EventsMaker extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: events.map((event) { // Example: Assuming you have the start and end dates for the event - DateTime eventStart = date; // Update this to the actual event start date - DateTime eventEnd = date.add(Duration(days: events.length - 1)); // Update this to the actual event end date + // DateTime eventStart = date; // Update this to the actual event start date + // DateTime eventEnd = date.add(Duration(days: events.length - 1)); // Update this to the actual event end date - double opacity = _calculateOpacity(eventStart, eventEnd, date); - Color colorWithOpacity = event.color.withOpacity(opacity); + // double opacity = _calculateOpacity(eventStart, eventEnd, date); + Color color = event.color; return Container( margin: const EdgeInsets.symmetric(horizontal: 0.5), @@ -39,7 +41,7 @@ class EventsMaker extends StatelessWidget { height: 7.0, decoration: BoxDecoration( shape: BoxShape.circle, - color: colorWithOpacity, + color: color, ), ); }).toList(), diff --git a/lib/src/features/period_planner/utility/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart similarity index 84% rename from lib/src/features/period_planner/utility/event_utils.dart rename to lib/src/features/period_planner/utils/event_utils.dart index be97731a..7d7a12db 100644 --- a/lib/src/features/period_planner/utility/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -5,6 +5,7 @@ import 'package:nishauri/src/features/period_planner/data/models/events.dart'; class EventUtils { static Map> generateEvents(List cycles) { Map> events = {}; + debugPrint("-----Generating New Events From Event Utils-----"); for (Cycle cycle in cycles) { // Add period days @@ -12,6 +13,7 @@ class EventUtils { date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); date = date.add(const Duration(days: 1))) { events.update(date, (existingEvents) => existingEvents..add(Event('Period Day', Colors.pink)), ifAbsent: () => [Event('Period Day', Colors.pink)]); + debugPrint("Successfully Added Period Days: $date"); } // Add fertile window days @@ -19,16 +21,19 @@ class EventUtils { date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); date = date.add(const Duration(days: 1))) { events.update(date, (existingEvents) => existingEvents..add(Event('Fertile Day', Colors.green)), ifAbsent: () => [Event('Fertile Day', Colors.green)]); + debugPrint("Successfully Added Fertile Days: $date"); } // Add ovulation day events.update(cycle.ovulation, (existingEvents) => existingEvents..add(Event('Ovulation Day', Colors.blue)), ifAbsent: () => [Event('Ovulation Day', Colors.blue)]); + debugPrint("Successfully Added Ovulation Day: ${cycle.ovulation}"); // Add predicted period start for (DateTime date = cycle.predictedPeriodStart; date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); date = date.add(const Duration(days: 1))) { events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.pink)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); + debugPrint("Successfully Added Predicted Period Days: $date"); } } From cb2433f2cc1a53cdb031c09409e3b7cb8b7d533b Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 9 Aug 2024 11:16:46 +0300 Subject: [PATCH 017/140] debugging2 --- .../period_planner/data/models/events.dart | 4 +- .../presentation/pages/periodCalendar.dart | 3 +- .../pages/periodPlannerScreen.dart | 22 +++++-- .../presentation/widgets/customCalendar.dart | 46 +++++++++------ .../period_planner/utils/event_utils.dart | 57 +++++++++++++++---- 5 files changed, 95 insertions(+), 37 deletions(-) diff --git a/lib/src/features/period_planner/data/models/events.dart b/lib/src/features/period_planner/data/models/events.dart index 81dadc35..9dc2930f 100644 --- a/lib/src/features/period_planner/data/models/events.dart +++ b/lib/src/features/period_planner/data/models/events.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; //Event class Event { - final String title; - final Color color; + String title; + Color color; Event(this.title, this.color); diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index cadf657f..d7204a94 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -17,7 +17,8 @@ class PeriodCalendar extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); - Map> events = EventUtils.generateEvents(cycles); + Map>> events = {}; + events = EventUtils.generateEvents(cycles); return Scaffold( body: Column( children: [ diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 66d9605b..f3d327c4 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; @@ -27,7 +28,8 @@ class _PeriodPlannerScreenState extends State { late DateTime _ovulationDate; late DateTime _nextPeriodStart; late DateTime _nextPeriodEnd; - Map> events = {}; + Map>> events = {}; + @override @@ -50,10 +52,20 @@ class _PeriodPlannerScreenState extends State { void _updateEvents() { setState(() { events = EventUtils.generateEvents(cycles); - debugPrint("Updated Events: $events"); + // print("Updated Events: $events"); + // print("Updated Events"); + // events.forEach((cycleId, dateMap) { + // dateMap.forEach((date, events) { + // print("Cycle ID $cycleId ,Date: $date, Events: $events"); + // }); + // }); + //print("Updated Events: $events"); + //print("-------------"); }); } + + //Function to check if two dates are on the same day by truncating the time part bool isSameDay(DateTime date1, DateTime date2) { return date1.year == date2.year && @@ -186,7 +198,7 @@ class _PeriodPlannerScreenState extends State { SizedBox( height: 150, child: CustomCalendar( - //key: ValueKey(events), + key: ValueKey(events), initialFormat: CalendarFormat.week, events: events, ), @@ -204,7 +216,7 @@ class _PeriodPlannerScreenState extends State { backgroundColor: Colors.grey, valueColor: AlwaysStoppedAnimation( isDangerZone ? Colors.red : Constants.periodPlanner, - ) , + ), ), ), Column( @@ -274,7 +286,7 @@ class _PeriodPlannerScreenState extends State { debugPrint('Is In Period after update: $isInPeriod'); debugPrint("--------"); }); - //printCycles(cycles); + printCycles(cycles); Navigator.of(context).pop(); }, ), diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 8cb86b12..dcbc468a 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; -import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; @@ -36,10 +35,10 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; - final Map> events; + final Map>> events; CustomCalendar({ - //Key? key, + Key? key, this.initialFormat = CalendarFormat.month, required this.events, }); @@ -49,28 +48,36 @@ class CustomCalendar extends StatefulWidget { } class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; - //late Map> _events; + late Map> _flatEvents; @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; - //events = EventUtils.generateEvents(cycles); - //events = widget.events; - //_events = widget.events; + _flatEvents = _flattenEvents(widget.events); } - // void updateEvents(Map> newEvents) { - // setState(() { - // _events = newEvents; - // debugPrint("Updated Calendar Events: $_events"); - // }); - // } + //To flatten the events so that it can be in the form of DateTime as the key and the events as the values + Map> _flattenEvents(Map>> nestedEvents) { + final Map> flattenedEvents = {}; + + nestedEvents.forEach((cycleId, dateMap) { + dateMap.forEach((date, events) { + if (flattenedEvents.containsKey(date)) { + flattenedEvents[date]!.addAll(events); + } else { + flattenedEvents[date] = List.from(events); + } + }); + }); + + return flattenedEvents; + } @override Widget build(BuildContext context) { return TableCalendar( - //key: ValueKey(_events), + key: ValueKey(widget.events), firstDay: DateTime(2010), lastDay: DateTime(2100), focusedDay: DateTime.now(), @@ -81,8 +88,9 @@ class _CustomCalendarState extends State{ // }, calendarFormat: _calendarFormat, eventLoader: (day) { - // return widget.events[day] ?? []; - return widget.events[day] ?? []; + print("---Event Loader"); + print(day); + return _flatEvents[day] ?? []; }, headerVisible: true, headerStyle: const HeaderStyle( @@ -107,14 +115,16 @@ class _CustomCalendarState extends State{ ), calendarBuilders: CalendarBuilders( markerBuilder: (context, date, events) { + //debugPrint("----From CustomCalendar-----"); + //print(events); if (events.isEmpty) { //debugPrint('Error getting Events!! - List is empty for date: $date'); return null; } final eventList = events.cast(); - debugPrint("-----From CustomCalendar------"); - debugPrint('Successfully cast events for date: $date, events: $eventList'); + // debugPrint("-----From CustomCalendar------"); + // debugPrint('Successfully cast events for date: $date, events: $eventList'); return EventsMaker(date: date, events: eventList); }, diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 7d7a12db..2fc25550 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -2,41 +2,76 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; + class EventUtils { - static Map> generateEvents(List cycles) { - Map> events = {}; + static Map>> generateEvents(List cycles) { + Map>> events= {}; + debugPrint("-----Generating New Events From Event Utils-----"); for (Cycle cycle in cycles) { + String cycleId = cycle.cycleId; + if(!events.containsKey(cycleId)) { + events[cycleId] = {}; + } + + Map> updatedEvents = events[cycleId]!; // Add period days for (DateTime date = cycle.periodStart; date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Period Day', Colors.pink)), ifAbsent: () => [Event('Period Day', Colors.pink)]); - debugPrint("Successfully Added Period Days: $date"); + updatedEvents.update( + date, + (existingEvents) => existingEvents + ..add(Event( 'Period Day', Colors.pink)), + ifAbsent: () => [Event( 'Period Day', Colors.pink)], + ); } // Add fertile window days for (DateTime date = cycle.fertileStart; date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Fertile Day', Colors.green)), ifAbsent: () => [Event('Fertile Day', Colors.green)]); - debugPrint("Successfully Added Fertile Days: $date"); + updatedEvents.update( + date, + (existingEvents) => existingEvents + ..add(Event( 'Fertile Day', Colors.green)), + ifAbsent: () => [Event( 'Fertile Day', Colors.green)], + ); } // Add ovulation day - events.update(cycle.ovulation, (existingEvents) => existingEvents..add(Event('Ovulation Day', Colors.blue)), ifAbsent: () => [Event('Ovulation Day', Colors.blue)]); - debugPrint("Successfully Added Ovulation Day: ${cycle.ovulation}"); + updatedEvents.update( + cycle.ovulation, + (existingEvents) => existingEvents + ..add(Event( 'Ovulation Day', Colors.blue)), + ifAbsent: () => [Event( 'Ovulation Day', Colors.blue)], + ); // Add predicted period start for (DateTime date = cycle.predictedPeriodStart; date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); date = date.add(const Duration(days: 1))) { - events.update(date, (existingEvents) => existingEvents..add(Event('Predicted Period Day', Colors.pink)), ifAbsent: () => [Event('Predicted Period Day', Colors.orange)]); - debugPrint("Successfully Added Predicted Period Days: $date"); + updatedEvents.update( + date, + (existingEvents) => existingEvents + ..add(Event( 'Predicted Period Day', Colors.pink)), + ifAbsent: () => [Event( 'Predicted Period Day', Colors.orange)], + ); } } - + + events.forEach((id, events) { + print("Cycle Id: $id"); + print("["); + events.forEach((date, event) { + print("Date: $date, Event: $event\n"); + }); + print("]"); + }); + + print("--------------"); return events; } } + From ceda6b1d533621ab9647289046b82d080fcd42e6 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 9 Aug 2024 15:21:45 +0300 Subject: [PATCH 018/140] Handled Routing, needs more work though --- lib/main.dart | 16 ++--- lib/src/app/navigation/app_router.dart | 69 +++++++++++-------- .../pages/editPeriodsCalendar.dart | 16 +++-- .../presentation/widgets/customCalendar.dart | 30 ++++---- 4 files changed, 73 insertions(+), 58 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 0a0f2c40..a4cbe3bc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,16 +6,16 @@ import 'package:nishauri/src/app/app.dart'; import 'package:nishauri/src/shared/interfaces/notification_service.dart'; Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform, - ); + // WidgetsFlutterBinding.ensureInitialized(); + // await Firebase.initializeApp( + // options: DefaultFirebaseOptions.currentPlatform, + // ); - // Initialize firebase messaging - await NotificationService.initializeFirebaseMessaging(); + // // Initialize firebase messaging + // await NotificationService.initializeFirebaseMessaging(); - // Initialize local notifications - await NotificationService.initializeLocalNotifications(); + // // Initialize local notifications + // await NotificationService.initializeLocalNotifications(); runApp( const ProviderScope(child: NishauriApp()), diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index a4e36b76..0b2ef196 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -384,38 +384,47 @@ final List secureRoutes = [ name: RouteNames.PERIOD_PLANNER, path: 'period-planner', builder: (BuildContext context, GoRouterState state) { - return const PeriodPlanner(); - }, - ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_SCREEN, - path: 'period-planner-screen', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerScreen(); - }, - ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_MENU, - path: 'period-planner-menu', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerMenu(); - }, - ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_CALENDAR, - path: 'period-planner-calendar', - builder: (BuildContext context, GoRouterState state) { - return const PeriodCalendar(); + return const PeriodPlanner(); + }, + routes: periodPlannerRoutes, + + ), +]; + +final List periodPlannerRoutes = [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_MENU, + path: 'period-planner-menu', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlannerMenu(); }, - ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR, - path: 'period-planner-edit-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return EditPeriodCalendar(); + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_SCREEN, + path: 'period-planner-screen', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlannerScreen(); + }, + ), + + GoRoute( + name: RouteNames.PERIOD_PLANNER_CALENDAR, + path: 'period-planner-calendar', + builder: (BuildContext context, GoRouterState state) { + return const PeriodCalendar(); + }, + ), + ]), + GoRoute( + name: RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR, + path: 'period-planner-edit-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return EditPeriodCalendar(); }, - ), -]; + ), + +]; + final List openRoutes = [ GoRoute( name: RouteNames.LOGIN_SCREEN, diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index 0deee397..5627688e 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -44,14 +44,16 @@ class _EditPeriodCalendarState extends State { //Function to handle adding and updating log entries in list Database void _updateOrAddCycle(DateTime start, DateTime end) { - if (cycles.isNotEmpty) { - // Update existing cycle - cycles[0] = predictCycle(start, end); - } else { - // Add new cycle - final Cycle newCycle = predictCycle(start, end); + // if (cycles.isNotEmpty) { + // // Update existing cycle + // cycles[0] = predictCycle(start, end); + // } else { + // // Add new cycle + // final Cycle newCycle = predictCycle(start, end); + // cycles.add(newCycle); + // } + final Cycle newCycle = predictCycle(start, end); cycles.add(newCycle); - } } @override diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index dcbc468a..e210c683 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -41,7 +41,7 @@ class CustomCalendar extends StatefulWidget { Key? key, this.initialFormat = CalendarFormat.month, required this.events, - }); + }) : super(key: key); @override _CustomCalendarState createState() => _CustomCalendarState(); @@ -59,20 +59,24 @@ class _CustomCalendarState extends State{ //To flatten the events so that it can be in the form of DateTime as the key and the events as the values Map> _flattenEvents(Map>> nestedEvents) { - final Map> flattenedEvents = {}; - - nestedEvents.forEach((cycleId, dateMap) { - dateMap.forEach((date, events) { - if (flattenedEvents.containsKey(date)) { - flattenedEvents[date]!.addAll(events); - } else { - flattenedEvents[date] = List.from(events); - } - }); + final Map> flattenedEvents = {}; + + nestedEvents.forEach((cycleId, dateMap) { + print("Processing cycle: $cycleId"); // Debug: Print current cycleId + dateMap.forEach((date, events) { + print("Date: $date, Events: $events"); // Debug: Print date and events being processed + if (flattenedEvents.containsKey(date)) { + flattenedEvents[date]!.addAll(events); + } else { + flattenedEvents[date] = List.from(events); + } }); + }); + + print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events + return flattenedEvents; +} - return flattenedEvents; - } @override Widget build(BuildContext context) { From 1989a7019677fea50b7f08d4a6af5c28dbcd0684 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 9 Aug 2024 19:18:43 +0300 Subject: [PATCH 019/140] Allowing users to add next period days manually --- lib/src/app/navigation/app_router.dart | 15 ++- .../pages/editPeriodsCalendar.dart | 65 +++++++-- .../presentation/pages/periodCalendar.dart | 14 +- .../presentation/pages/periodPlanner.dart | 2 +- .../presentation/pages/periodPlannerMenu.dart | 126 ++++++++++-------- .../pages/periodPlannerScreen.dart | 16 +-- 6 files changed, 138 insertions(+), 100 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 0b2ef196..57386f8b 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -414,14 +414,15 @@ final List periodPlannerRoutes = [ return const PeriodCalendar(); }, ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR, + path: 'period-planner-edit-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return EditPeriodCalendar(); + }, + ), ]), - GoRoute( - name: RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR, - path: 'period-planner-edit-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return EditPeriodCalendar(); - }, - ), + ]; diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index 5627688e..90ad4ee2 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; +import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; @@ -25,6 +28,7 @@ void printCycles(List cycles) { } class EditPeriodCalendar extends StatefulWidget { + @override State createState() => _EditPeriodCalendarState(); } @@ -33,6 +37,34 @@ class _EditPeriodCalendarState extends State { DateTime _focusedDay = DateTime.now(); DateTime? _startDate; DateTime? _endDate; + Map>> events = EventUtils.generateEvents(cycles); + late Map> _flatEvents; + + @override + void initState() { + super.initState(); + _flatEvents = _flattenEvents(events); + } + + //To flatten the events so that it can be in the form of DateTime as the key and the events as the values + Map> _flattenEvents(Map>> nestedEvents) { + final Map> flattenedEvents = {}; + + nestedEvents.forEach((cycleId, dateMap) { + print("Processing cycle: $cycleId"); // Debug: Print current cycleId + dateMap.forEach((date, events) { + print("Date: $date, Events: $events"); // Debug: Print date and events being processed + if (flattenedEvents.containsKey(date)) { + flattenedEvents[date]!.addAll(events); + } else { + flattenedEvents[date] = List.from(events); + } + }); + }); + + print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events + return flattenedEvents; +} void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { setState(() { @@ -44,20 +76,13 @@ class _EditPeriodCalendarState extends State { //Function to handle adding and updating log entries in list Database void _updateOrAddCycle(DateTime start, DateTime end) { - // if (cycles.isNotEmpty) { - // // Update existing cycle - // cycles[0] = predictCycle(start, end); - // } else { - // // Add new cycle - // final Cycle newCycle = predictCycle(start, end); - // cycles.add(newCycle); - // } final Cycle newCycle = predictCycle(start, end); cycles.add(newCycle); } @override Widget build(BuildContext context) { + //events = EventUtils.generateEvents(cycles); final theme = Theme.of(context); return Scaffold( body: Column( @@ -74,6 +99,25 @@ class _EditPeriodCalendarState extends State { rangeEndDay: _endDate, onRangeSelected: _onRangeSelected, rangeSelectionMode: RangeSelectionMode.toggledOn, + eventLoader: (day) { + return _flatEvents[day] ?? []; + }, + calendarBuilders: CalendarBuilders( + markerBuilder: (context, date, events) { + //debugPrint("----From CustomCalendar-----"); + //print(events); + if (events.isEmpty) { + //debugPrint('Error getting Events!! - List is empty for date: $date'); + return null; + } + final eventList = events.cast(); + + // debugPrint("-----From CustomCalendar------"); + // debugPrint('Successfully cast events for date: $date, events: $eventList'); + + return EventsMaker(date: date, events: eventList); + }, + ), calendarStyle: const CalendarStyle( todayDecoration: BoxDecoration( color: Colors.blue, @@ -107,7 +151,7 @@ class _EditPeriodCalendarState extends State { _updateOrAddCycle(_startDate!, _endDate!); // Print the list of cycles printCycles(cycles); - context.goNamed(RouteNames.PERIOD_PLANNER_MENU); + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Please select your Period start and end dates.')) @@ -131,3 +175,6 @@ class _EditPeriodCalendarState extends State { } + + + diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index d7204a94..56fd54a1 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -7,13 +7,10 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/custom import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; class PeriodCalendar extends StatelessWidget { const PeriodCalendar({super.key}); - - - + @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -26,15 +23,6 @@ class PeriodCalendar extends StatelessWidget { title: "Calendar 🗓️", color: Constants.periodPlanner.withOpacity(1.0), ), - Align( - alignment: Alignment.topRight, - child: IconButton( - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - }, - icon: const Icon(Icons.home), - ), - ), Expanded( child: Column( children: [ diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index 3f2dc28d..c93ad167 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -67,7 +67,7 @@ class PeriodPlanner extends StatelessWidget { const SizedBox(height: 20.0), ElevatedButton( onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); + context.goNamed(RouteNames.PERIOD_PLANNER_MENU); }, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric( diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart index e614996b..039edc19 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -6,64 +6,7 @@ import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; - -_menuItems(BuildContext context) => [ - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_planner4.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Track Periods", - onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN), - color: Constants.periodPlanner.withOpacity(1.0), - ), - MenuItem( - shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_calender1.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Calendar", - onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR), - color: Constants.periodPlanner.withOpacity(1.0), - ), - // MenuItem( - // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/partners2.svg", - // semanticsLabel: "Periods", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", - // semanticsLabel: "Periods", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize), - // title: "Partners", - // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), - // color: Constants.periodPlanner.withOpacity(1.0), - // ), - ]; - +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; class PeriodPlannerMenu extends StatelessWidget { const PeriodPlannerMenu({super.key}); @@ -127,4 +70,69 @@ class PeriodPlannerMenu extends StatelessWidget { ), ); } -} \ No newline at end of file +} + + +_menuItems(BuildContext context) => [ + MenuItem( + shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, + icon: SvgPicture.asset( + "assets/images/period_planner4.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Track Periods", + onPressed: () { + if(cycles.isEmpty) { + context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); + } + else { + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + } + } , + color: Constants.periodPlanner.withOpacity(1.0), + ), + MenuItem( + shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, + icon: SvgPicture.asset( + "assets/images/period_calender1.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", + semanticsLabel: "Periods", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Calendar", + onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR), + color: Constants.periodPlanner.withOpacity(1.0), + ), + // MenuItem( + // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, + // icon: SvgPicture.asset( + // "assets/images/partners2.svg", + // semanticsLabel: "Periods", + // fit: BoxFit.contain, + // width: 80, + // height: 80, + // ), + // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", + // semanticsLabel: "Periods", + // fit: BoxFit.contain, + // width: Constants.shortcutIconSize, + // height: Constants.shortcutIconSize), + // title: "Partners", + // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), + // color: Constants.periodPlanner.withOpacity(1.0), + // ), + ]; \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index f3d327c4..4ca84916 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -95,6 +95,7 @@ class _PeriodPlannerScreenState extends State { isSameDay(_currentDate, _nextPeriodStart) || isSameDay(_currentDate, _nextPeriodEnd); bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); + @@ -105,6 +106,7 @@ class _PeriodPlannerScreenState extends State { String title = ''; String chances = ''; + if (isInPeriod) { progressValue = 0.2; title = 'Period'; @@ -153,7 +155,7 @@ class _PeriodPlannerScreenState extends State { message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; buttonText = 'Log Period'; chances = 'High Chances of Getting Pregnant'; - } + } // else { // progressValue = 1.0; // message = 'Cycle Complete'; @@ -186,15 +188,6 @@ class _PeriodPlannerScreenState extends State { padding: const EdgeInsets.all(16.0), child: Column( children: [ - Align( - alignment: Alignment.topRight, - child: IconButton( - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); - }, - icon: const Icon(Icons.calendar_month), - ), - ), SizedBox( height: 150, child: CustomCalendar( @@ -264,6 +257,7 @@ class _PeriodPlannerScreenState extends State { setState(() { // Log the period start here isInPeriod = true; + isDangerZone = false; _currentDate = DateTime.now(); final Cycle predictedCycle = predictCycle( @@ -287,7 +281,7 @@ class _PeriodPlannerScreenState extends State { debugPrint("--------"); }); printCycles(cycles); - Navigator.of(context).pop(); + context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); }, ), ], From d0fe06093d06de46187320a920fd9e7c9f12a6f5 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 9 Aug 2024 22:04:35 +0300 Subject: [PATCH 020/140] Handling overlapping of previous cycles' predicted days and current cycles' period days --- .../pages/editPeriodsCalendar.dart | 2 + .../pages/periodPlannerScreen.dart | 3 +- .../presentation/widgets/customCalendar.dart | 51 +++++++++++++++---- .../period_planner/utils/event_utils.dart | 2 +- 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index 90ad4ee2..91893ea4 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; @@ -12,6 +13,7 @@ import 'package:table_calendar/table_calendar.dart'; + //printing List which is acting as a Database void printCycles(List cycles) { for (var cycle in cycles) { diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 4ca84916..cdce7b66 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -262,13 +262,12 @@ class _PeriodPlannerScreenState extends State { final Cycle predictedCycle = predictCycle( _periodStart = DateTime.now(), - _periodEnd = DateTime.now().add(const Duration(days: 7)), + _periodEnd = DateTime.now().add(const Duration(days: 6)), ); cycles.add(predictedCycle); _ovulationDate = predictedCycle.ovulation; _nextPeriodStart = predictedCycle.predictedPeriodStart; - _updateEvents(); // Debug print to check the state update diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index e210c683..dff5b6b7 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -6,8 +6,7 @@ import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; //Algorithm -//Make the following parameter optional -Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLength = 28, int averagePeriodLength = 7}) { +Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLength = 28, int averagePeriodLength = 6}) { var uuid = const Uuid(); String cycleId = uuid.v4(); //Generating a unique id @@ -49,12 +48,14 @@ class CustomCalendar extends StatefulWidget { class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; late Map> _flatEvents; + late Map> _filteredEvents; @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; _flatEvents = _flattenEvents(widget.events); + _filteredEvents = _filterEventsForLatestCycle(); } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -62,9 +63,7 @@ class _CustomCalendarState extends State{ final Map> flattenedEvents = {}; nestedEvents.forEach((cycleId, dateMap) { - print("Processing cycle: $cycleId"); // Debug: Print current cycleId dateMap.forEach((date, events) { - print("Date: $date, Events: $events"); // Debug: Print date and events being processed if (flattenedEvents.containsKey(date)) { flattenedEvents[date]!.addAll(events); } else { @@ -72,11 +71,45 @@ class _CustomCalendarState extends State{ } }); }); - - print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events return flattenedEvents; -} + } + Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; + + //Finding the latest cycleId + final latestCycleId = widget.events.keys.last; + + if (widget.events.containsKey(latestCycleId)) { + final latestCycleEvents = widget.events[latestCycleId]!; + + //Add events from the latest cycle + latestCycleEvents.forEach((date, events) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(events); + } else { + filteredEvents[date] = List.from(events); + } + }); + + //Removing predicted period days from previous cycles + widget.events.forEach((cycleId, dateMap) { + if (cycleId != latestCycleId) { + dateMap.forEach((date, events) { + final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); + if (newEventList.isNotEmpty) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(newEventList); + } else { + filteredEvents[date] = List.from(newEventList); + } + } + }); + } + }); + } + return filteredEvents; + } @override Widget build(BuildContext context) { @@ -92,9 +125,7 @@ class _CustomCalendarState extends State{ // }, calendarFormat: _calendarFormat, eventLoader: (day) { - print("---Event Loader"); - print(day); - return _flatEvents[day] ?? []; + return _filteredEvents[day] ?? []; }, headerVisible: true, headerStyle: const HeaderStyle( diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 2fc25550..e45ea97f 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -10,7 +10,7 @@ class EventUtils { debugPrint("-----Generating New Events From Event Utils-----"); for (Cycle cycle in cycles) { - String cycleId = cycle.cycleId; + String cycleId = cycle.cycleId; if(!events.containsKey(cycleId)) { events[cycleId] = {}; } From 68520d9d905ad8c9de790edea5eabe5fd00f6972 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 13 Aug 2024 16:02:16 +0300 Subject: [PATCH 021/140] Handling Selection of Multiple days by adding a Toggle Button --- .../pages/editPeriodsCalendar.dart | 131 ++++++++++++++++-- .../pages/periodPlannerScreen.dart | 58 ++++---- 2 files changed, 147 insertions(+), 42 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index 91893ea4..b985f0ac 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -11,11 +11,9 @@ import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; - - - //printing List which is acting as a Database void printCycles(List cycles) { + debugPrint('----Cycle Printed----'); for (var cycle in cycles) { debugPrint('Cycle ID: ${cycle.cycleId}'); debugPrint('Period Start: ${cycle.periodStart}'); @@ -29,6 +27,8 @@ void printCycles(List cycles) { } } +enum SelectionMode { range, multiple } + class EditPeriodCalendar extends StatefulWidget { @override @@ -41,6 +41,8 @@ class _EditPeriodCalendarState extends State { DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); late Map> _flatEvents; + SelectionMode _selectionMode = SelectionMode.range; + Set _selectedDates = {}; @override void initState() { @@ -76,12 +78,71 @@ class _EditPeriodCalendarState extends State { }); } + //Handling selection of individual dates + void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { + setState(() { + _focusedDay = focusedDay; + + // if (_selectionMode == SelectionMode.range) { + // if (_startDate == null) { + // _startDate = selectedDay; + // } else if (_endDate == null) { + // _endDate = selectedDay.isAfter(_startDate!) ? selectedDay : _startDate; + // _startDate = selectedDay.isAfter(_startDate!) ? _startDate : selectedDay; + // } else { + // _startDate = selectedDay; + // _endDate = null; + // } + // } + if (_selectedDates.contains(selectedDay)) { + _selectedDates.remove(selectedDay); + } else { + _selectedDates.add(selectedDay); + } + }); + } + + + //Function to handle adding and updating log entries in list Database void _updateOrAddCycle(DateTime start, DateTime end) { final Cycle newCycle = predictCycle(start, end); cycles.add(newCycle); } + // Logic to handle individual date addition + void _updateOrAddDates() { + if (_selectedDates.isNotEmpty) { + final List sortedDates = _selectedDates.toList()..sort(); + DateTime periodStart = sortedDates.first; + DateTime periodEnd = sortedDates.last; + + // If only one date is selected + if (_selectedDates.length == 1) { + // Check if the selected date is DateTime.now() + if (isSameDay(periodStart, DateTime.now())) { + // Set the end date to six days after the selected date + periodEnd = periodStart.add(const Duration(days: 6)); + } else { + // If not, just set periodEnd to periodStart (one-day period) + periodEnd = periodStart; + } + } + + final Cycle newCycle = predictCycle(periodStart, periodEnd); + cycles.add(newCycle); + + printCycles(cycles); + } else { + // Handle case where no dates are selected + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please select your Period start and end dates.')), + ); + } + } + + + @override Widget build(BuildContext context) { //events = EventUtils.generateEvents(cycles); @@ -93,14 +154,47 @@ class _EditPeriodCalendarState extends State { title: "Log Periods 📅", color: Constants.periodPlanner.withOpacity(1.0), ), + Padding( + padding: const EdgeInsets.all(8.0), + child: ToggleButtons( + isSelected: [ + _selectionMode == SelectionMode.range, + _selectionMode == SelectionMode.multiple, + ], + onPressed: (index) { + setState(() { + _selectionMode = index == 0 ? SelectionMode.range : SelectionMode.multiple; + _startDate = null; + _endDate = null; + _selectedDates.clear(); + }); + }, + children: const [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Text('Range'), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Text('Multiple Dates'), + ), + ], + ), + ), TableCalendar( focusedDay: _focusedDay, firstDay: DateTime(2020), lastDay: DateTime.now(), - rangeStartDay: _startDate, - rangeEndDay: _endDate, + rangeStartDay: _selectionMode == SelectionMode.range ? _startDate : null, + rangeEndDay: _selectionMode == SelectionMode.range ? _endDate : null, onRangeSelected: _onRangeSelected, - rangeSelectionMode: RangeSelectionMode.toggledOn, + onDaySelected: _onDaySelected, + selectedDayPredicate: (day) { + return _selectedDates.contains(day); + }, + rangeSelectionMode: _selectionMode == SelectionMode.range + ? RangeSelectionMode.toggledOn + : RangeSelectionMode.disabled, eventLoader: (day) { return _flatEvents[day] ?? []; }, @@ -134,6 +228,10 @@ class _EditPeriodCalendarState extends State { shape: BoxShape.circle, ), rangeHighlightColor: Constants.periodPlanner, + selectedDecoration: BoxDecoration( + color: Constants.periodPlanner, + shape: BoxShape.circle, + ), ), headerStyle: const HeaderStyle( formatButtonVisible: false, @@ -149,15 +247,20 @@ class _EditPeriodCalendarState extends State { backgroundColor: Constants.periodPlanner, ), onPressed: () { - if (_startDate != null && _endDate != null) { - _updateOrAddCycle(_startDate!, _endDate!); - // Print the list of cycles - printCycles(cycles); + if (_selectionMode == SelectionMode.range) { + if (_startDate != null) { + final endDate = _endDate ?? _startDate!; + _updateOrAddCycle(_startDate!, endDate); + printCycles(cycles); + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please select your Period start and end dates.')), + ); + } + } else if (_selectionMode == SelectionMode.multiple) { + _updateOrAddDates(); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select your Period start and end dates.')) - ); } }, child: Text( diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index cdce7b66..5dc58712 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -14,6 +14,13 @@ import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; + +//Function to check if two dates are on the same day by truncating the time part + bool isSameDay(DateTime date1, DateTime date2) { + return date1.year == date2.year && + date1.month == date2.month && + date1.day == date2.day; + } class PeriodPlannerScreen extends StatefulWidget { const PeriodPlannerScreen({super.key}); @@ -66,12 +73,7 @@ class _PeriodPlannerScreenState extends State { - //Function to check if two dates are on the same day by truncating the time part - bool isSameDay(DateTime date1, DateTime date2) { - return date1.year == date2.year && - date1.month == date2.month && - date1.day == date2.day; - } + @override @@ -254,31 +256,31 @@ class _PeriodPlannerScreenState extends State { TextButton( child: const Text('Confirm'), onPressed: () { - setState(() { - // Log the period start here - isInPeriod = true; - isDangerZone = false; - _currentDate = DateTime.now(); + // setState(() { + // // Log the period start here + // isInPeriod = true; + // isDangerZone = false; + // _currentDate = DateTime.now(); - final Cycle predictedCycle = predictCycle( - _periodStart = DateTime.now(), - _periodEnd = DateTime.now().add(const Duration(days: 6)), - ); - cycles.add(predictedCycle); + // final Cycle predictedCycle = predictCycle( + // _periodStart = DateTime.now(), + // _periodEnd = DateTime.now().add(const Duration(days: 6)), + // ); + // cycles.add(predictedCycle); - _ovulationDate = predictedCycle.ovulation; - _nextPeriodStart = predictedCycle.predictedPeriodStart; - _updateEvents(); + // _ovulationDate = predictedCycle.ovulation; + // _nextPeriodStart = predictedCycle.predictedPeriodStart; + // _updateEvents(); - // Debug print to check the state update - debugPrint("After User has logged Period"); - debugPrint('Period Start after update: $_periodStart'); - debugPrint('Period End after update: $_periodEnd'); - debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - debugPrint('Current Date after update: $_currentDate'); - debugPrint('Is In Period after update: $isInPeriod'); - debugPrint("--------"); - }); + // // Debug print to check the state update + // debugPrint("After User has logged Period"); + // debugPrint('Period Start after update: $_periodStart'); + // debugPrint('Period End after update: $_periodEnd'); + // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); + // debugPrint('Current Date after update: $_currentDate'); + // debugPrint('Is In Period after update: $isInPeriod'); + // debugPrint("--------"); + // }); printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); }, From e9b12a0c2294b2183d13aa6afc310419d33ad3f0 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 13 Aug 2024 19:45:13 +0300 Subject: [PATCH 022/140] Allowing autofilling of the next six period days if a user selects one period day --- .../pages/editPeriodsCalendar.dart | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index b985f0ac..d9da4d74 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -79,31 +79,30 @@ class _EditPeriodCalendarState extends State { } //Handling selection of individual dates - void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { - setState(() { - _focusedDay = focusedDay; + void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { + setState(() { + _focusedDay = focusedDay; - // if (_selectionMode == SelectionMode.range) { - // if (_startDate == null) { - // _startDate = selectedDay; - // } else if (_endDate == null) { - // _endDate = selectedDay.isAfter(_startDate!) ? selectedDay : _startDate; - // _startDate = selectedDay.isAfter(_startDate!) ? _startDate : selectedDay; - // } else { - // _startDate = selectedDay; - // _endDate = null; - // } - // } - if (_selectedDates.contains(selectedDay)) { - _selectedDates.remove(selectedDay); - } else { - _selectedDates.add(selectedDay); + if (_selectedDates.contains(selectedDay)) { + // If the selected day is already in the set, remove it (deselect) + _selectedDates.remove(selectedDay); + } else { + // If it's the first selection in a new series (or a standalone date), clear the set + if (_selectedDates.isEmpty || _selectedDates.last != selectedDay.subtract(const Duration(days: 4))) { + _selectedDates.clear(); + + // Add the selected day and the next four days + for (int i = 0; i <= 6; i++) { + _selectedDates.add(selectedDay.add(Duration(days: i))); } - }); + } else { + // Add the selected day if it’s a continuation of the previous selection + _selectedDates.add(selectedDay); + } + } + }); } - - //Function to handle adding and updating log entries in list Database void _updateOrAddCycle(DateTime start, DateTime end) { final Cycle newCycle = predictCycle(start, end); From 3994e969ee96925618d307453111bd3f6e7c018b Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 15 Aug 2024 12:01:59 +0300 Subject: [PATCH 023/140] Removed selection of Multiple days. Kept the range selection of days --- .../pages/editPeriodsCalendar.dart | 162 ++++++++---------- 1 file changed, 70 insertions(+), 92 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index d9da4d74..f8130704 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; @@ -79,66 +78,77 @@ class _EditPeriodCalendarState extends State { } //Handling selection of individual dates - void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { - setState(() { - _focusedDay = focusedDay; + // void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { + // setState(() { + // _focusedDay = focusedDay; - if (_selectedDates.contains(selectedDay)) { - // If the selected day is already in the set, remove it (deselect) - _selectedDates.remove(selectedDay); - } else { - // If it's the first selection in a new series (or a standalone date), clear the set - if (_selectedDates.isEmpty || _selectedDates.last != selectedDay.subtract(const Duration(days: 4))) { - _selectedDates.clear(); + // if (_selectedDates.contains(selectedDay)) { + // // If the selected day is already in the set, remove it (deselect) + // _selectedDates.remove(selectedDay); + // } else { + // // If it's the first selection in a new series (or a standalone date), clear the set + // if (_selectedDates.isEmpty || _selectedDates.last != selectedDay.subtract(const Duration(days: 6))) { + // _selectedDates.clear(); - // Add the selected day and the next four days - for (int i = 0; i <= 6; i++) { - _selectedDates.add(selectedDay.add(Duration(days: i))); - } - } else { - // Add the selected day if it’s a continuation of the previous selection - _selectedDates.add(selectedDay); - } - } - }); - } + // // Add the selected day and the next six days + // for (int i = 0; i <= 6; i++) { + // _selectedDates.add(selectedDay.add(Duration(days: i))); + // } + // } else { + // // Add the selected day if it’s a continuation of the previous selection + // _selectedDates.add(selectedDay); + // } + // } + // }); + // } //Function to handle adding and updating log entries in list Database - void _updateOrAddCycle(DateTime start, DateTime end) { + void _updateOrAddCycle(DateTime start, [DateTime? end]) { + // If end date is not provided, set it to the start date + end ??= start; + + // If either start or end date is the same as DateTime.now(), set end date to 6 days after start date + final DateTime now = DateTime.now(); + if (isSameDay(start, now) || isSameDay(end, now)) { + end = start.add(const Duration(days: 6)); + } + + // Predict the cycle with the (potentially modified) start and end dates final Cycle newCycle = predictCycle(start, end); - cycles.add(newCycle); + cycles.add(newCycle); } // Logic to handle individual date addition - void _updateOrAddDates() { - if (_selectedDates.isNotEmpty) { - final List sortedDates = _selectedDates.toList()..sort(); - DateTime periodStart = sortedDates.first; - DateTime periodEnd = sortedDates.last; + //Was for allowing selection of multiple dates + // void _updateOrAddDates() { + // if (_selectedDates.isNotEmpty) { + // final List sortedDates = _selectedDates.toList()..sort(); + // DateTime periodStart = sortedDates.first; + // DateTime periodEnd = sortedDates.last; - // If only one date is selected - if (_selectedDates.length == 1) { - // Check if the selected date is DateTime.now() - if (isSameDay(periodStart, DateTime.now())) { - // Set the end date to six days after the selected date - periodEnd = periodStart.add(const Duration(days: 6)); - } else { - // If not, just set periodEnd to periodStart (one-day period) - periodEnd = periodStart; - } - } + // // If only one date is selected + // if (_selectedDates.length == 1) { + // // Check if the selected date is DateTime.now() + // if (isSameDay(periodStart, DateTime.now())) { + // // Set the end date to six days after the selected date + // periodEnd = periodStart.add(const Duration(days: 6)); + // } else { + // // If not, just set periodEnd to periodStart (one-day period) + // periodEnd = periodStart; + // } + // } - final Cycle newCycle = predictCycle(periodStart, periodEnd); - cycles.add(newCycle); + // final Cycle newCycle = predictCycle(periodStart, periodEnd); + // cycles.add(newCycle); - printCycles(cycles); - } else { - // Handle case where no dates are selected - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select your Period start and end dates.')), - ); - } - } + // printCycles(cycles); + // } else { + // // Handle case where no dates are selected + // ScaffoldMessenger.of(context).showSnackBar( + // const SnackBar(content: Text('Please select your Period start and end dates.')), + // ); + // } + // } @@ -153,33 +163,6 @@ class _EditPeriodCalendarState extends State { title: "Log Periods 📅", color: Constants.periodPlanner.withOpacity(1.0), ), - Padding( - padding: const EdgeInsets.all(8.0), - child: ToggleButtons( - isSelected: [ - _selectionMode == SelectionMode.range, - _selectionMode == SelectionMode.multiple, - ], - onPressed: (index) { - setState(() { - _selectionMode = index == 0 ? SelectionMode.range : SelectionMode.multiple; - _startDate = null; - _endDate = null; - _selectedDates.clear(); - }); - }, - children: const [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0), - child: Text('Range'), - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0), - child: Text('Multiple Dates'), - ), - ], - ), - ), TableCalendar( focusedDay: _focusedDay, firstDay: DateTime(2020), @@ -187,7 +170,7 @@ class _EditPeriodCalendarState extends State { rangeStartDay: _selectionMode == SelectionMode.range ? _startDate : null, rangeEndDay: _selectionMode == SelectionMode.range ? _endDate : null, onRangeSelected: _onRangeSelected, - onDaySelected: _onDaySelected, + //onDaySelected: _onDaySelected, selectedDayPredicate: (day) { return _selectedDates.contains(day); }, @@ -246,22 +229,17 @@ class _EditPeriodCalendarState extends State { backgroundColor: Constants.periodPlanner, ), onPressed: () { - if (_selectionMode == SelectionMode.range) { - if (_startDate != null) { - final endDate = _endDate ?? _startDate!; - _updateOrAddCycle(_startDate!, endDate); - printCycles(cycles); - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select your Period start and end dates.')), - ); - } - } else if (_selectionMode == SelectionMode.multiple) { - _updateOrAddDates(); + if (_startDate != null) { + final endDate = _endDate ?? _startDate!; + _updateOrAddCycle(_startDate!, endDate); + printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please select your Period start and end dates.')), + ); } - }, + }, child: Text( 'Apply', style: theme.textTheme.titleSmall?.copyWith( From 9e756519869ad0568c9e81469fe02bc4855f0043 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 15 Aug 2024 13:04:16 +0300 Subject: [PATCH 024/140] Preventing user from logging already selected period date from previous cycle --- .../pages/editPeriodsCalendar.dart | 89 ++++--------------- 1 file changed, 19 insertions(+), 70 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index f8130704..23144261 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -26,8 +26,6 @@ void printCycles(List cycles) { } } -enum SelectionMode { range, multiple } - class EditPeriodCalendar extends StatefulWidget { @override @@ -40,8 +38,6 @@ class _EditPeriodCalendarState extends State { DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); late Map> _flatEvents; - SelectionMode _selectionMode = SelectionMode.range; - Set _selectedDates = {}; @override void initState() { @@ -77,30 +73,6 @@ class _EditPeriodCalendarState extends State { }); } - //Handling selection of individual dates - // void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { - // setState(() { - // _focusedDay = focusedDay; - - // if (_selectedDates.contains(selectedDay)) { - // // If the selected day is already in the set, remove it (deselect) - // _selectedDates.remove(selectedDay); - // } else { - // // If it's the first selection in a new series (or a standalone date), clear the set - // if (_selectedDates.isEmpty || _selectedDates.last != selectedDay.subtract(const Duration(days: 6))) { - // _selectedDates.clear(); - - // // Add the selected day and the next six days - // for (int i = 0; i <= 6; i++) { - // _selectedDates.add(selectedDay.add(Duration(days: i))); - // } - // } else { - // // Add the selected day if it’s a continuation of the previous selection - // _selectedDates.add(selectedDay); - // } - // } - // }); - // } //Function to handle adding and updating log entries in list Database void _updateOrAddCycle(DateTime start, [DateTime? end]) { @@ -113,44 +85,27 @@ class _EditPeriodCalendarState extends State { end = start.add(const Duration(days: 6)); } + for (Cycle cycle in cycles) { + if (_datesOverlap(cycle.periodStart, cycle.periodEnd, start, end)) { + // Show an alert or a Snackbar + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('The selected period overlaps with an existing cycle. Please choose different dates.'), + ), + ); + return; // Exit the function without adding the cycle + } + } + // Predict the cycle with the (potentially modified) start and end dates final Cycle newCycle = predictCycle(start, end); cycles.add(newCycle); } - // Logic to handle individual date addition - //Was for allowing selection of multiple dates - // void _updateOrAddDates() { - // if (_selectedDates.isNotEmpty) { - // final List sortedDates = _selectedDates.toList()..sort(); - // DateTime periodStart = sortedDates.first; - // DateTime periodEnd = sortedDates.last; - - // // If only one date is selected - // if (_selectedDates.length == 1) { - // // Check if the selected date is DateTime.now() - // if (isSameDay(periodStart, DateTime.now())) { - // // Set the end date to six days after the selected date - // periodEnd = periodStart.add(const Duration(days: 6)); - // } else { - // // If not, just set periodEnd to periodStart (one-day period) - // periodEnd = periodStart; - // } - // } - - // final Cycle newCycle = predictCycle(periodStart, periodEnd); - // cycles.add(newCycle); - - // printCycles(cycles); - // } else { - // // Handle case where no dates are selected - // ScaffoldMessenger.of(context).showSnackBar( - // const SnackBar(content: Text('Please select your Period start and end dates.')), - // ); - // } - // } - - + // Function to check if two date ranges overlap + bool _datesOverlap(DateTime start1, DateTime end1, DateTime start2, DateTime end2) { + return start1.isBefore(end2) && start2.isBefore(end1); + } @override Widget build(BuildContext context) { @@ -167,16 +122,10 @@ class _EditPeriodCalendarState extends State { focusedDay: _focusedDay, firstDay: DateTime(2020), lastDay: DateTime.now(), - rangeStartDay: _selectionMode == SelectionMode.range ? _startDate : null, - rangeEndDay: _selectionMode == SelectionMode.range ? _endDate : null, + rangeStartDay: _startDate, + rangeEndDay: _endDate, onRangeSelected: _onRangeSelected, - //onDaySelected: _onDaySelected, - selectedDayPredicate: (day) { - return _selectedDates.contains(day); - }, - rangeSelectionMode: _selectionMode == SelectionMode.range - ? RangeSelectionMode.toggledOn - : RangeSelectionMode.disabled, + rangeSelectionMode: RangeSelectionMode.toggledOn, eventLoader: (day) { return _flatEvents[day] ?? []; }, From 2d6858d4cc38ad8e75f70364dbeddb333c1e52a6 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 15 Aug 2024 18:36:17 +0300 Subject: [PATCH 025/140] Restricting Users from selecting more than 7 period days. --- .../pages/editPeriodsCalendar.dart | 66 ++++++++++++++----- .../period_planner/utils/event_utils.dart | 2 +- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart index 23144261..f9307b3b 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart @@ -65,12 +65,36 @@ class _EditPeriodCalendarState extends State { return flattenedEvents; } + // Method to validate date range + bool _isDateRangeValid(DateTime start, DateTime end) { + final difference = end.difference(start).inDays + 1; // +1 to include the start day + return difference <= 7; // Ensure the range does not exceed 7 days + } + void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { - setState(() { - _startDate = start; - _endDate = end; - _focusedDay = focusedDay ?? _focusedDay; - }); + if (start != null && end != null && !_isDateRangeValid(start, end)) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Invalid Selection'), + content: const Text('Please select a date range of 7 days or less. The average period typically lasts between 3 to 7 days.'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('OK'), + ), + ], + ), + ); + } else { + setState(() { + _startDate = start; + _endDate = end; + _focusedDay = focusedDay ?? _focusedDay; + }); + } } @@ -79,7 +103,6 @@ class _EditPeriodCalendarState extends State { // If end date is not provided, set it to the start date end ??= start; - // If either start or end date is the same as DateTime.now(), set end date to 6 days after start date final DateTime now = DateTime.now(); if (isSameDay(start, now) || isSameDay(end, now)) { end = start.add(const Duration(days: 6)); @@ -94,19 +117,37 @@ class _EditPeriodCalendarState extends State { ), ); return; // Exit the function without adding the cycle + } } - } - // Predict the cycle with the (potentially modified) start and end dates + // If no overlap, add a new cycle final Cycle newCycle = predictCycle(start, end); cycles.add(newCycle); + //_updateEventsForCycle(newCycle); } + // void _updateEventsForCycle(Cycle cycle) { + // // Remove old events for this cycle from the events map + // events.remove(cycle.cycleId); + + // // Generate and add new events for the updated cycle + // final newEvents = EventUtils.generateEvents([cycle]); + // events[cycle.cycleId] = newEvents[cycle.cycleId]!; + + // // Update the flattened events map for display + // setState(() { + // _flatEvents = _flattenEvents(events); + // }); + // } + // Function to check if two date ranges overlap bool _datesOverlap(DateTime start1, DateTime end1, DateTime start2, DateTime end2) { - return start1.isBefore(end2) && start2.isBefore(end1); + return (start1.isBefore(end2) || isSameDay(start1, end2)) && + (start2.isBefore(end1) || isSameDay(start2, end1)); } + + @override Widget build(BuildContext context) { //events = EventUtils.generateEvents(cycles); @@ -131,17 +172,10 @@ class _EditPeriodCalendarState extends State { }, calendarBuilders: CalendarBuilders( markerBuilder: (context, date, events) { - //debugPrint("----From CustomCalendar-----"); - //print(events); if (events.isEmpty) { - //debugPrint('Error getting Events!! - List is empty for date: $date'); return null; } final eventList = events.cast(); - - // debugPrint("-----From CustomCalendar------"); - // debugPrint('Successfully cast events for date: $date, events: $eventList'); - return EventsMaker(date: date, events: eventList); }, ), diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index e45ea97f..7352ddb7 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -55,7 +55,7 @@ class EventUtils { updatedEvents.update( date, (existingEvents) => existingEvents - ..add(Event( 'Predicted Period Day', Colors.pink)), + ..add(Event( 'Predicted Period Day', Colors.orange)), ifAbsent: () => [Event( 'Predicted Period Day', Colors.orange)], ); } From 0f59a2cd5666f5f92543adf122b05d07ce97beef Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 16 Aug 2024 18:50:05 +0300 Subject: [PATCH 026/140] Adding an edit Periods screen but still needs a lot of work though. --- lib/src/app/navigation/app_router.dart | 19 ++- .../presentation/pages/editPeriodsScreen.dart | 132 ++++++++++++++++++ ...itPeriodsCalendar.dart => logPeriods.dart} | 9 +- .../presentation/pages/periodCalendar.dart | 43 +++--- .../presentation/pages/periodPlannerMenu.dart | 11 +- .../pages/periodPlannerScreen.dart | 4 +- lib/src/utils/routes.dart | 3 +- 7 files changed, 188 insertions(+), 33 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart rename lib/src/features/period_planner/presentation/pages/{editPeriodsCalendar.dart => logPeriods.dart} (96%) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 57386f8b..db484489 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -53,7 +53,9 @@ import 'package:nishauri/src/features/hiv/presentation/pages/groups/ARTGroups.da import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrderWizardFormScreen.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart'; import 'package:nishauri/src/features/lab/presentation/pages/LabResultsScreen.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsScreen.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/logPeriods.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; @@ -413,12 +415,21 @@ final List periodPlannerRoutes = [ builder: (BuildContext context, GoRouterState state) { return const PeriodCalendar(); }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + path: 'period-planner-edit-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return EditPeriodsScreen(); + }, + ), + ] ), GoRoute( - name: RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR, - path: 'period-planner-edit-period-calendar', + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', builder: (BuildContext context, GoRouterState state) { - return EditPeriodCalendar(); + return LogPeriodScreen(); }, ), ]), diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart new file mode 100644 index 00000000..3eea31d5 --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:table_calendar/table_calendar.dart'; + +class EditPeriodsScreen extends StatefulWidget { + + const EditPeriodsScreen({super.key}); + + @override + State createState() => _EditPeriodsScreenState(); +} + +class _EditPeriodsScreenState extends State { + // DateTime? _periodStart; + // DateTime? _periodEnd; + // Cycle? _cycle; + Map _periodRanges = {}; + + @override + void initState() { + super.initState(); + + // Gather all period ranges from all cycles + for (Cycle cycle in cycles) { + _periodRanges[cycle.periodStart] = cycle.periodEnd; + } + + // Here, selecting the last cycle added to the list + // if (cycles.isNotEmpty) { + // _cycle = cycles.last; + // _periodStart = _cycle?.periodStart; + // _periodEnd = _cycle?.periodEnd; + // } + + } + + void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { + setState(() { + if (start != null && end != null) { + // Assuming you're editing the last cycle for simplicity + Cycle lastCycle = cycles.last; + lastCycle.periodStart = start; + lastCycle.periodEnd = end; + + // Update the period ranges map + _periodRanges[start] = end; + } + }); + } + + void _applyChanges() { + // Save the updated cycle list and recalculate important dates + for (Cycle cycle in cycles) { + Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); + cycle.fertileStart = updatedCycle.fertileStart; + cycle.fertileEnd = updatedCycle.fertileEnd; + cycle.ovulation = updatedCycle.ovulation; + cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; + cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; + } + + Navigator.of(context).pop(); // Go back to the previous screen + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + CustomAppBar( + title: "Edit Periods 📅", + color: Constants.periodPlanner.withOpacity(1.0), + ), + TableCalendar( + focusedDay: DateTime.now(), + firstDay: DateTime(2020), + lastDay: DateTime.now(), + rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, + rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, + onRangeSelected: _onRangeSelected, + calendarFormat: CalendarFormat.month, + headerStyle: const HeaderStyle( + formatButtonVisible: false, + ), + calendarStyle: const CalendarStyle( + todayDecoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + rangeStartDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeEndDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeHighlightColor: Constants.periodPlanner, + ), + ), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + _applyChanges(); + }, + child: Text( + 'Apply Changes', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart similarity index 96% rename from lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart rename to lib/src/features/period_planner/presentation/pages/logPeriods.dart index f9307b3b..70510baf 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -26,13 +26,13 @@ void printCycles(List cycles) { } } -class EditPeriodCalendar extends StatefulWidget { +class LogPeriodScreen extends StatefulWidget { @override - State createState() => _EditPeriodCalendarState(); + State createState() => _LogPeriodScreenState(); } -class _EditPeriodCalendarState extends State { +class _LogPeriodScreenState extends State { DateTime _focusedDay = DateTime.now(); DateTime? _startDate; DateTime? _endDate; @@ -167,6 +167,9 @@ class _EditPeriodCalendarState extends State { rangeEndDay: _endDate, onRangeSelected: _onRangeSelected, rangeSelectionMode: RangeSelectionMode.toggledOn, + onPageChanged: (focusedDay) { + _focusedDay = focusedDay; + }, eventLoader: (day) { return _flatEvents[day] ?? []; }, diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 56fd54a1..3bacf4f9 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -7,6 +7,7 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/custom import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class PeriodCalendar extends StatelessWidget { const PeriodCalendar({super.key}); @@ -59,27 +60,27 @@ class PeriodCalendar extends StatelessWidget { ], ), ), - // Align( - // alignment: Alignment.bottomCenter, - // child: Padding( - // padding: const EdgeInsets.all(16.0), - // child: ElevatedButton( - // style: ElevatedButton.styleFrom( - // backgroundColor: Constants.periodPlanner, - // ), - // onPressed: () { - // // To add functionality later - // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); - // }, - // child: Text( - // 'Edit period dates', - // style: theme.textTheme.titleSmall?.copyWith( - // color: Colors.white, - // ), - // ), - // ), - // ), - // ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // To add functionality later + context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + }, + child: Text( + 'Edit period dates', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), ], ), ); diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart index 039edc19..27a8c80f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -91,7 +91,7 @@ _menuItems(BuildContext context) => [ title: "Track Periods", onPressed: () { if(cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); } else { context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); @@ -114,7 +114,14 @@ _menuItems(BuildContext context) => [ width: Constants.shortcutIconSize, height: Constants.shortcutIconSize), title: "Calendar", - onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR), + onPressed: () { + if(cycles.isEmpty) { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + } + else { + context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); + } + }, color: Constants.periodPlanner.withOpacity(1.0), ), // MenuItem( diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 5dc58712..13162d23 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsCalendar.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/logPeriods.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; @@ -282,7 +282,7 @@ class _PeriodPlannerScreenState extends State { // debugPrint("--------"); // }); printCycles(cycles); - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIOD_CALENDAR); + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); }, ), ], diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index e0cccacb..9cd07029 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -61,7 +61,8 @@ class RouteNames { static const PERIOD_PLANNER_SCREEN = "Period Planner Screen"; static const PERIOD_PLANNER_MENU = "Period Planner Menu"; static const PERIOD_PLANNER_CALENDAR = "Period Planner Calendar"; - static const PERIOD_PLANNER_EDIT_PERIOD_CALENDAR = "period-planner-edit-period-calendar"; + static const PERIOD_PLANNER_LOG_PERIODS = "period-planner-log-periods"; + static const PERIOD_PLANNER_EDIT_PERIODS = "period-planner-edit-periods"; } From 7a7d4a0785d0547dec3b96353456d2d90f1599fa Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 19 Aug 2024 19:58:38 +0300 Subject: [PATCH 027/140] Calendar Showing Events to be displayed in a Modal Bottom Sheet --- assets/images/discharge2.svg | 1 - assets/images/discharge3.svg | 1 - assets/images/getting-started1.jpg | Bin 29134 -> 0 bytes assets/images/getting-started2.jpg | Bin 16897 -> 0 bytes assets/images/getting-started3.jpg | Bin 18302 -> 0 bytes assets/images/moods2.svg | 1 - assets/images/partners.webp | Bin 18894 -> 0 bytes assets/images/partners1.svg | 71 --- assets/images/partners3.svg | 1 - assets/images/period_calender1.png | Bin 26546 -> 0 bytes assets/images/period_calender2.png | Bin 17904 -> 0 bytes assets/images/period_calender2.svg | 35 -- assets/images/period_calender3.png | Bin 38293 -> 0 bytes assets/images/period_planner1.svg | 440 ------------------ assets/images/period_planner3.svg | 1 - .../presentation/pages/editPeriodsScreen.dart | 1 + .../pages/periodPlannerScreen.dart | 120 +++-- .../presentation/widgets/carouselCard.dart | 1 - .../presentation/widgets/customCalendar.dart | 18 +- .../presentation/widgets/modalContent.dart | 63 +++ 20 files changed, 149 insertions(+), 605 deletions(-) delete mode 100644 assets/images/discharge2.svg delete mode 100644 assets/images/discharge3.svg delete mode 100644 assets/images/getting-started1.jpg delete mode 100644 assets/images/getting-started2.jpg delete mode 100644 assets/images/getting-started3.jpg delete mode 100644 assets/images/moods2.svg delete mode 100644 assets/images/partners.webp delete mode 100644 assets/images/partners1.svg delete mode 100644 assets/images/partners3.svg delete mode 100644 assets/images/period_calender1.png delete mode 100644 assets/images/period_calender2.png delete mode 100644 assets/images/period_calender2.svg delete mode 100644 assets/images/period_calender3.png delete mode 100644 assets/images/period_planner1.svg delete mode 100644 assets/images/period_planner3.svg create mode 100644 lib/src/features/period_planner/presentation/widgets/modalContent.dart diff --git a/assets/images/discharge2.svg b/assets/images/discharge2.svg deleted file mode 100644 index fd0ee312..00000000 --- a/assets/images/discharge2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/discharge3.svg b/assets/images/discharge3.svg deleted file mode 100644 index 7654adf9..00000000 --- a/assets/images/discharge3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/getting-started1.jpg b/assets/images/getting-started1.jpg deleted file mode 100644 index 8c48368cb588df6c08cf56c49cb22fa1da46256d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29134 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≀$+#KV0p~v{>r5r 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 diff --git a/assets/images/getting-started2.jpg b/assets/images/getting-started2.jpg deleted file mode 100644 index 75d01d7e69277a9e5e39be462e9838150dc3a642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16897 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 M5I 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 \ No newline at end of file diff --git a/assets/images/partners.webp b/assets/images/partners.webp deleted file mode 100644 index 83a7795e74fef5e78a24e1c1d21958107324af27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18894 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 NW9xy2_5b*n{y*B8El&Ud diff --git a/assets/images/partners1.svg b/assets/images/partners1.svg deleted file mode 100644 index 4e102ee0..00000000 --- a/assets/images/partners1.svg +++ /dev/null @@ -1,71 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/partners3.svg b/assets/images/partners3.svg deleted file mode 100644 index c126e68f..00000000 --- a/assets/images/partners3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/period_calender1.png b/assets/images/period_calender1.png deleted file mode 100644 index 58efc6daeb609a81a3ea8d939010aec918cb21fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26546 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 diff --git a/assets/images/period_calender2.png b/assets/images/period_calender2.png deleted file mode 100644 index 331aeb4a7845062d0fd0e4b628f8528331283661..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17904 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 z 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 diff --git a/assets/images/period_calender2.svg b/assets/images/period_calender2.svg deleted file mode 100644 index e3bb9b11..00000000 --- a/assets/images/period_calender2.svg +++ /dev/null @@ -1,35 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/period_calender3.png b/assets/images/period_calender3.png deleted file mode 100644 index d7ada02d78f4568cb56558c9677218bd4c35129c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38293 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 \ No newline at end of file diff --git a/assets/images/period_planner3.svg b/assets/images/period_planner3.svg deleted file mode 100644 index ac257459..00000000 --- a/assets/images/period_planner3.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 3eea31d5..0731c3a4 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -18,6 +18,7 @@ class _EditPeriodsScreenState extends State { // DateTime? _periodEnd; // Cycle? _cycle; Map _periodRanges = {}; + @override void initState() { diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 13162d23..a144da92 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -158,11 +158,8 @@ class _PeriodPlannerScreenState extends State { buttonText = 'Log Period'; chances = 'High Chances of Getting Pregnant'; } - // else { - // progressValue = 1.0; - // message = 'Cycle Complete'; - // buttonText = ''; - // } + + final theme = Theme.of(context); //Debug prints to trace the logic // debugPrint('Current Date: $_currentDate'); @@ -196,9 +193,10 @@ class _PeriodPlannerScreenState extends State { key: ValueKey(events), initialFormat: CalendarFormat.week, events: events, + headerButton: true, ), ), - const SizedBox(height: 20), + const SizedBox(height: 40), Stack( alignment: Alignment.center, children: [ @@ -364,55 +362,77 @@ class _PeriodPlannerScreenState extends State { ), ], ), - const SizedBox(height: 20,), - const Text( - "Please give your Daily Insights:", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 15.0, - color: Constants.periodPlanner, - ), - ), - CarouselSlider( - options: CarouselOptions( - height: 150, - enlargeCenterPage: true, - enableInfiniteScroll: false, - initialPage: 0, - autoPlay: false, - ), - items: [ - CarouselCard( - svgPath: "assets/images/symptoms.svg", - title: "Symptoms", - destination: LoggerWidget( - heading: "Log Symptoms", - items: LogItems.getSymptoms(), - ) - ), - CarouselCard( - svgPath: "assets/images/discharge1.svg", - title: "Discharge", - destination: LoggerWidget( - heading: "Log Discharge", - items: LogItems.getDischarge(), - ) - ), - CarouselCard( - svgPath: "assets/images/moods1.svg", - title: "Mood", - destination: LoggerWidget( - heading: "How are you feeling?", - items: LogItems.getMoods(), - ), - ), - ], - ), + + //const SizedBox(height: 20,), + // const Text( + // "Please give your Daily Insights:", + // style: TextStyle( + // fontWeight: FontWeight.bold, + // fontSize: 15.0, + // color: Constants.periodPlanner, + // ), + // ), + // CarouselSlider( + // options: CarouselOptions( + // height: 150, + // enlargeCenterPage: true, + // enableInfiniteScroll: false, + // initialPage: 0, + // autoPlay: false, + // ), + // items: [ + // CarouselCard( + // svgPath: "assets/images/symptoms.svg", + // title: "Symptoms", + // destination: LoggerWidget( + // heading: "Log Symptoms", + // items: LogItems.getSymptoms(), + // ) + // ), + // CarouselCard( + // svgPath: "assets/images/discharge1.svg", + // title: "Discharge", + // destination: LoggerWidget( + // heading: "Log Discharge", + // items: LogItems.getDischarge(), + // ) + // ), + // CarouselCard( + // svgPath: "assets/images/moods1.svg", + // title: "Mood", + // destination: LoggerWidget( + // heading: "How are you feeling?", + // items: LogItems.getMoods(), + // ), + // ), + // ], + // ), ], ), ), ), ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // To add functionality later + context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + }, + child: Text( + 'Edit period dates', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), ], ), ); diff --git a/lib/src/features/period_planner/presentation/widgets/carouselCard.dart b/lib/src/features/period_planner/presentation/widgets/carouselCard.dart index 4e2a695d..e82b7917 100644 --- a/lib/src/features/period_planner/presentation/widgets/carouselCard.dart +++ b/lib/src/features/period_planner/presentation/widgets/carouselCard.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index dff5b6b7..80a690f3 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/modalContent.dart'; import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; @@ -35,11 +36,13 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; + final bool headerButton; CustomCalendar({ Key? key, this.initialFormat = CalendarFormat.month, - required this.events, + required this.events, + this.headerButton = false, }) : super(key: key); @override @@ -128,9 +131,18 @@ class _CustomCalendarState extends State{ return _filteredEvents[day] ?? []; }, headerVisible: true, - headerStyle: const HeaderStyle( - formatButtonVisible: false, + headerStyle: HeaderStyle( + formatButtonVisible: widget.headerButton, ), + onFormatChanged: (format) { + // Show the modal when the format button is pressed + showModalBottomSheet( + context: context, + builder: (context) => const ModalContent(), + showDragHandle: true, + isScrollControlled: true, + ); + }, calendarStyle: const CalendarStyle( isTodayHighlighted: true, todayDecoration: BoxDecoration( diff --git a/lib/src/features/period_planner/presentation/widgets/modalContent.dart b/lib/src/features/period_planner/presentation/widgets/modalContent.dart new file mode 100644 index 00000000..0c1e2c9b --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/modalContent.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class ModalContent extends StatefulWidget { + const ModalContent({super.key}); + + @override + State createState() => _ModalContentState(); +} + +class _ModalContentState extends State { + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + Map>> events = {}; + events = EventUtils.generateEvents(cycles); + return SizedBox( + //height: MediaQuery.of(context).size.height, + height: 600, + child: SingleChildScrollView( + child: Column( + children: [ + CustomCalendar( + events: events + ), + const SizedBox(height: 20), + const Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + "Key:", + style: TextStyle( + color: Constants.periodPlanner, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + const Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CalendarKey(color: Colors.red, label: 'Today'), + CalendarKey(color: Colors.pink, label: 'Period Days'), + CalendarKey(color: Colors.green, label: 'Fertile Days'), + CalendarKey(color: Colors.blue, label: 'Ovulation Day'), + CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), + ], + ), + ], + ), + ), + ); + } +} \ No newline at end of file From d9ad57f0823fa161ec88eb4ffa4ebb2c2e0dcc66 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 20 Aug 2024 11:43:33 +0300 Subject: [PATCH 028/140] Preparing to merge with dev branch --- lib/main.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index a4cbe3bc..0a0f2c40 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,16 +6,16 @@ import 'package:nishauri/src/app/app.dart'; import 'package:nishauri/src/shared/interfaces/notification_service.dart'; Future main() async { - // WidgetsFlutterBinding.ensureInitialized(); - // await Firebase.initializeApp( - // options: DefaultFirebaseOptions.currentPlatform, - // ); + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); - // // Initialize firebase messaging - // await NotificationService.initializeFirebaseMessaging(); + // Initialize firebase messaging + await NotificationService.initializeFirebaseMessaging(); - // // Initialize local notifications - // await NotificationService.initializeLocalNotifications(); + // Initialize local notifications + await NotificationService.initializeLocalNotifications(); runApp( const ProviderScope(child: NishauriApp()), From 15a590bf8bc8f2fec9336ff03a30c56226abb52f Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 20 Aug 2024 13:10:46 +0300 Subject: [PATCH 029/140] :ambulance: user provider refresh on login --- lib/src/features/common/presentation/pages/HomeScreen.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/features/common/presentation/pages/HomeScreen.dart b/lib/src/features/common/presentation/pages/HomeScreen.dart index b1ec5446..aed40d9f 100644 --- a/lib/src/features/common/presentation/pages/HomeScreen.dart +++ b/lib/src/features/common/presentation/pages/HomeScreen.dart @@ -51,6 +51,7 @@ class _HomeScreenState extends ConsumerState { void initState() { super.initState(); _loadVersion(); + ref.refresh(userProvider.notifier); } Future _loadVersion() async { From 1dce2b9b141c178611c1018f1cee4b7f9ef109cf Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 20 Aug 2024 13:10:46 +0300 Subject: [PATCH 030/140] :ambulance: user provider refresh on login --- lib/src/features/common/presentation/pages/HomeScreen.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/features/common/presentation/pages/HomeScreen.dart b/lib/src/features/common/presentation/pages/HomeScreen.dart index b1ec5446..aed40d9f 100644 --- a/lib/src/features/common/presentation/pages/HomeScreen.dart +++ b/lib/src/features/common/presentation/pages/HomeScreen.dart @@ -51,6 +51,7 @@ class _HomeScreenState extends ConsumerState { void initState() { super.initState(); _loadVersion(); + ref.refresh(userProvider.notifier); } Future _loadVersion() async { From ae2f6dd70bf42e68019cd3931e927cbd356237bf Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 21 Aug 2024 23:32:00 +0300 Subject: [PATCH 031/140] Worked on making Algorithm more flexible. Currently working on overlapping days between ovulation days. --- .../period_planner/data/models/cycle.dart | 20 +- .../presentation/pages/logPeriods.dart | 8 +- .../pages/periodPlannerScreen.dart | 17 +- .../presentation/widgets/customCalendar.dart | 190 ++++++++++++++---- .../period_planner/utils/event_utils.dart | 12 +- 5 files changed, 185 insertions(+), 62 deletions(-) diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart index ca7d416b..ff4a273c 100644 --- a/lib/src/features/period_planner/data/models/cycle.dart +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -18,14 +18,16 @@ class Cycle{ - String cycleId; - DateTime periodStart; - DateTime periodEnd; - DateTime fertileStart; - DateTime fertileEnd; - DateTime ovulation; - DateTime predictedPeriodStart; - DateTime predictedPeriodEnd; + String cycleId; + DateTime periodStart; + DateTime periodEnd; + DateTime fertileStart; + DateTime fertileEnd; + DateTime ovulation; + DateTime predictedPeriodStart; + DateTime predictedPeriodEnd; + int cycleLength; + int periodLength; Cycle({ required this.cycleId, @@ -36,6 +38,8 @@ class Cycle{ required this.ovulation, required this.predictedPeriodStart, required this.predictedPeriodEnd, + required this.cycleLength, + required this.periodLength, }); } diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 70510baf..f4d487c6 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -22,6 +22,8 @@ void printCycles(List cycles) { debugPrint('Ovulation: ${cycle.ovulation}'); debugPrint('Predicted Period Start: ${cycle.predictedPeriodStart}'); debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); + debugPrint('Cycle Length: ${cycle.cycleLength}'); + debugPrint('Period Length: ${cycle.periodLength}'); debugPrint('---'); // Separator between cycles for clarity } } @@ -50,9 +52,9 @@ class _LogPeriodScreenState extends State { final Map> flattenedEvents = {}; nestedEvents.forEach((cycleId, dateMap) { - print("Processing cycle: $cycleId"); // Debug: Print current cycleId + //print("Processing cycle: $cycleId"); // Debug: Print current cycleId dateMap.forEach((date, events) { - print("Date: $date, Events: $events"); // Debug: Print date and events being processed + //print("Date: $date, Events: $events"); // Debug: Print date and events being processed if (flattenedEvents.containsKey(date)) { flattenedEvents[date]!.addAll(events); } else { @@ -61,7 +63,7 @@ class _LogPeriodScreenState extends State { }); }); - print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events + //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events return flattenedEvents; } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index a144da92..fac59d9f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -322,16 +322,17 @@ class _PeriodPlannerScreenState extends State { } _updateEvents(); + printCycles(cycles); // Debug print to check the state update - debugPrint("After User has logged end of Period"); - debugPrint('Period Start after update: $_periodStart'); - debugPrint('Period End after update: $_periodEnd'); - debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - debugPrint('Current Date after update: $_currentDate'); - debugPrint('Is In Period after update: $isInPeriod'); - debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); - debugPrint("--------"); + // debugPrint("After User has logged end of Period"); + // debugPrint('Period Start after update: $_periodStart'); + // debugPrint('Period End after update: $_periodEnd'); + // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); + // debugPrint('Current Date after update: $_currentDate'); + // debugPrint('Is In Period after update: $isInPeriod'); + // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); + // debugPrint("--------"); }); //printCycles(cycles); Navigator.of(context).pop(); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 80a690f3..f2ecc243 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -6,13 +6,62 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/modalC import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; -//Algorithm -Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLength = 28, int averagePeriodLength = 6}) { +//Function to calculate Average Cycle days +int calculateAverageCycleLength(List cycles) { + if (cycles.length < 2) return 28; // Default to 28 if there aren't enough cycles + + int totalLength = 0; + for (int i = 1; i < cycles.length; i++) { + int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; + debugPrint("Cycle Length $i: $cycleLength"); + totalLength += cycleLength; + } + int averageCycle = (totalLength / (cycles.length - 1)).round(); + debugPrint("Total Length: $totalLength"); + debugPrint("Cycles.Length: ${cycles.length - 1}"); + debugPrint("Average Cycle Length: $averageCycle"); + return averageCycle; +} + +//Function for calculating Average Period days +int calculateAveragePeriodLength(List cycles) { + if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles + + int totalPeriodLength = 0; + for (Cycle cycle in cycles) { + debugPrint("Period Length : ${cycle.periodLength}"); + totalPeriodLength += cycle.periodLength; + } + int averagePeriodLength = (totalPeriodLength / cycles.length).round(); + debugPrint("Total Period Length: $totalPeriodLength"); + debugPrint("Number of Cycles: ${cycles.length}"); + debugPrint("Average Period Length: $averagePeriodLength"); + return averagePeriodLength; +} + + + + +// DateTime normalizeToMidnight(DateTime dateTime) { +// return DateTime(dateTime.year, dateTime.month, dateTime.day); +// } + + + + +//Algorithm for calculating Next Period Days, Ovulation and Fertile Days +Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { var uuid = const Uuid(); String cycleId = uuid.v4(); //Generating a unique id + // Calculate average cycle length from previous cycles + int averageCycleLength = calculateAverageCycleLength(cycles); + + // Calculate average period length from the period Start to the Period End + int averagePeriodLength = calculateAveragePeriodLength(cycles); + DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength)); - DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength)); + DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) DateTime ovulation = predictedPeriodStart.subtract(const Duration(days: 14)); @@ -21,6 +70,14 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe DateTime fertileStart = ovulation.subtract(const Duration(days: 5)); DateTime fertileEnd = ovulation.subtract(const Duration(days: 1)); + //Calculating cycle Length between the previous cycle start and the latest cycle start + int cycleLength = (cycles.isNotEmpty) + ? periodStart.difference(cycles.last.periodStart).inDays + : averageCycleLength; // Calculate cycle length only if there are previous cycles + + //Calculating period Length of each cycle + int periodLength = periodEnd.difference(periodStart).inDays + 1; + return Cycle( cycleId: cycleId, periodStart: periodStart, @@ -30,6 +87,8 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe ovulation: ovulation, predictedPeriodStart: predictedPeriodStart, predictedPeriodEnd: predictedPeriodEnd, + cycleLength: cycleLength, + periodLength: periodLength, ); } @@ -38,7 +97,7 @@ class CustomCalendar extends StatefulWidget { final Map>> events; final bool headerButton; - CustomCalendar({ + const CustomCalendar({ Key? key, this.initialFormat = CalendarFormat.month, required this.events, @@ -77,43 +136,100 @@ class _CustomCalendarState extends State{ return flattenedEvents; } - Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; - - //Finding the latest cycleId - final latestCycleId = widget.events.keys.last; - - if (widget.events.containsKey(latestCycleId)) { - final latestCycleEvents = widget.events[latestCycleId]!; - - //Add events from the latest cycle - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { - filteredEvents[date] = List.from(events); - } - }); - - //Removing predicted period days from previous cycles - widget.events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - dateMap.forEach((date, events) { - final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - if (newEventList.isNotEmpty) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } + // Map> _filterEventsForLatestCycle() { + // final Map> filteredEvents = {}; + + // //Finding the latest cycleId + // final latestCycleId = widget.events.keys.last; + + // if (widget.events.containsKey(latestCycleId)) { + // final latestCycleEvents = widget.events[latestCycleId]!; + + // //Add events from the latest cycle + // latestCycleEvents.forEach((date, events) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(events); + // } else { + // filteredEvents[date] = List.from(events); + // } + // }); + + // //Removing predicted period days from previous cycles + // widget.events.forEach((cycleId, dateMap) { + // if (cycleId != latestCycleId) { + // dateMap.forEach((date, events) { + // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); + // if (newEventList.isNotEmpty) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(newEventList); + // } else { + // filteredEvents[date] = List.from(newEventList); + // } + // } + // }); + // } + // }); + // } + // return filteredEvents; + // } + +Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; + + // Find the latest cycleId + final latestCycleId = widget.events.keys.last; + + if (widget.events.containsKey(latestCycleId)) { + // Get events from the latest cycle + final latestCycleEvents = widget.events[latestCycleId]!; + + // Add all events from the latest cycle to the filtered events + latestCycleEvents.forEach((date, events) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(events); + } else { + filteredEvents[date] = List.from(events); + } + }); + + // Now process previous cycles + widget.events.forEach((cycleId, dateMap) { + if (cycleId != latestCycleId) { + dateMap.forEach((date, events) { + // Check if this date is already occupied by a 'Period Day' from the latest cycle + final isCollision = filteredEvents.containsKey(date) && + filteredEvents[date]!.any((event) => event.title == 'Period Day'); + + // We only add events that are not 'Predicted Period Day' and that do not collide with new period days + final filteredEventList = events.where((event) { + // Remove all 'Predicted Period Day' events + if (event.title == 'Predicted Period Day') { + return false; + } + // If there's a collision, don't include 'Fertile Day' or 'Ovulation Day' + if (isCollision && (event.title == 'Fertile Day' || event.title == 'Ovulation Day')) { + return false; } - }); - } + return true; // Keep all other events + }).toList(); + + // Add these filtered events to the final list if they aren't empty + if (filteredEventList.isNotEmpty) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(filteredEventList); + } else { + filteredEvents[date] = List.from(filteredEventList); + } + } }); - } - return filteredEvents; + } + }); } + return filteredEvents; +} + + @override Widget build(BuildContext context) { return TableCalendar( diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 7352ddb7..82b647cc 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -7,7 +7,7 @@ class EventUtils { static Map>> generateEvents(List cycles) { Map>> events= {}; - debugPrint("-----Generating New Events From Event Utils-----"); + //debugPrint("-----Generating New Events From Event Utils-----"); for (Cycle cycle in cycles) { String cycleId = cycle.cycleId; @@ -62,15 +62,15 @@ class EventUtils { } events.forEach((id, events) { - print("Cycle Id: $id"); - print("["); + //print("Cycle Id: $id"); + //print("["); events.forEach((date, event) { - print("Date: $date, Event: $event\n"); + //print("Date: $date, Event: $event\n"); }); - print("]"); + //print("]"); }); - print("--------------"); + //print("--------------"); return events; } } From f2e8a2d23c460cd8f78e41dda9df0ca04c6998c0 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 22 Aug 2024 09:22:45 +0300 Subject: [PATCH 032/140] :construction: Add chat hcw --- assets/images/chat/userImage1.png | Bin 0 -> 213284 bytes assets/images/chat/userImage2.png | Bin 0 -> 260587 bytes assets/images/chat/userImage3.png | Bin 0 -> 254692 bytes assets/images/chat/userImage4.png | Bin 0 -> 433524 bytes assets/images/chat/userImage5.png | Bin 0 -> 131214 bytes assets/images/chat/userImage6.png | Bin 0 -> 83176 bytes assets/images/chat/userImage7.png | Bin 0 -> 114006 bytes assets/images/chat/userImage8.png | Bin 0 -> 739951 bytes lib/src/app/navigation/app_router.dart | 21 ++- .../app/navigation/drawer/customeDrawer.dart | 9 ++ lib/src/app/navigation/menu/menuItems.dart | 45 +++---- .../nishauri_chat/chat/models/chat_hcw.dart | 16 +++ .../chat/models/chat_message.dart | 7 + .../presentation/pages/ChatDetailScreen.dart | 127 ++++++++++++++++++ .../presentation/pages/ConversationList.dart | 82 +++++++++++ .../presentation/widget/conversationList.dart | 52 +++++++ .../presentation/self_screening_menu.dart | 9 ++ lib/src/shared/input/Search.dart | 15 ++- lib/src/utils/routes.dart | 8 +- pubspec.yaml | 1 + 20 files changed, 361 insertions(+), 31 deletions(-) create mode 100644 assets/images/chat/userImage1.png create mode 100644 assets/images/chat/userImage2.png create mode 100644 assets/images/chat/userImage3.png create mode 100644 assets/images/chat/userImage4.png create mode 100644 assets/images/chat/userImage5.png create mode 100644 assets/images/chat/userImage6.png create mode 100644 assets/images/chat/userImage7.png create mode 100644 assets/images/chat/userImage8.png create mode 100644 lib/src/features/nishauri_chat/chat/models/chat_hcw.dart create mode 100644 lib/src/features/nishauri_chat/chat/models/chat_message.dart create mode 100644 lib/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart create mode 100644 lib/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart create mode 100644 lib/src/features/nishauri_chat/chat/presentation/widget/conversationList.dart diff --git a/assets/images/chat/userImage1.png b/assets/images/chat/userImage1.png new file mode 100644 index 0000000000000000000000000000000000000000..c17f92333aef3a283471e2741515490f60a034f4 GIT binary patch literal 213284 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%0D95L?+9Uf#Dsi$oMk6Oc;;&9dXd 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
)3dP6)=QYqpo~r`I)5 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%0A`-7xX-9T#81lQRbM6SFUc|U#tu5J_C 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�jPXzgfqe-46Teud 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Ήt0g~w3X}@M@%)IK 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

yFCf)~ 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

    OQ4|dkgq_374cvN%yBe>|n*k%Csp22au1~7wy{P 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

    cu^#z5NvVdJ22=cKEa=)pJ}zILM9$Ze{_AA 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�f&E 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 Llq5?fj067yjRy# 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 c*fxF(>@MsHMPdzr1o)q(nx1O&V~6! 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⪙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

    %Lyw!aqUxNs2yxE5I==f#*llrfB#B-!h>CR>s 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�J$ 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 literal 0 HcmV?d00001 diff --git a/assets/images/chat/userImage8.png b/assets/images/chat/userImage8.png new file mode 100644 index 0000000000000000000000000000000000000000..9d75c8e6db2a8b09af25a0ced7306d80a26a42fc GIT binary patch literal 739951 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�#C+KFRmPC^D22#Ga}`T|*$3<88wM*$g!sW02zKzmI%v_W&9 zx-v6f0S&IjNLyNNn1f;F;XtdkmCUIX9#*sh5e;7$MG>3J7ytm4c|k+~&SgI5vLo~p z8RMrW@uYY8I8TRM`V=9q4X-%igcICPhRsVo=Q+=LVFdB%XP$ZHK?V|GYb?fKHT$K+POmP7m32;E${{I*4PmFFv>Y8WdJsvAp zLySn}5Ggl5G1zI}tJNpY_0Rq9fB$QSUM{eQ;vdHo*=K(KY;v?Qye|~5o3BS1x^QTG z95>O?L=pT%j#q^qz7%Em@ACau0cTlL-xDMJTPch7s3@S^{v|dv?3fab-f#0k>YibDa zw@hVsn5;WIk)cM(ukqD)@PGHOQQQQC9={JTY`qn1Xo*TZXr{W*(a;Jq1VBK$b(Lo@ zjw63YlTxd{a>f~FJUfQw85!%xAAkJuW1f*spqe#u*mjVQ=2kG2VJ-|!_$z*hFV!=k zJQmL?pjo5L`H|H?S3HV0fa_X5+V-TYfED`S{`j_jp|9%C?(JRhZ}+A%dcNn;k?1~$Eo`E#RXRHUQ=DIU zQr#CYAZHetTMfv= z;Kj$Ad||@Wf`vN!ds_yqN>w8!2H$_45rlEXFxuZen6edYK;(8_Ui6|DE#Ldz_nu38 z6Wtw8I+Q9DF;uxkx!>|C_xQ2wLR=%e!wYtnbIyfw?!_{{7m1L$ZkW+&In1SrltF&T zB%9Q4nV^!$FUr1M&3ULTm;V|GtI+mpnRwlUQjYl<6T6iJ7Uo))%)^FGZlL(rFu}kJ zJa8$U?AiiK z75bD6ZkQBF^FbMLFZ0GThw!HyGgDG znotTpozJ`F+~=*JkN--)K9l$S39fy{HrIS_#`4GW+vjrLUIiN3zUkN_AVb??=DOqF z@><6y?B~t_nSNv9qW-PW{ z0A2Eg;Ku8dGF-sHy(!N<-@PcXcuau=H0|%+d#JQiU`v-(%Kg?_^wx#-XwCRP#n#^d zkji2Jvc52Wt;Yhf&Tk^GeVI9%R;7MVm0aA7%?`A&1lURDoYp)e{~hnV_XeE%c4Wpy z&^i}&YYza(yCJ-u{FrG{^8L24u|!|ObL2`0s4MKH-dy!suqo1HiFi(dB|GNyF#MSA zRbJ`vH~Rul^*jDY7g1gq|775|RHh9Fx(L4OndRrhoLdc(pwl$0VO8Cj-oyI=FJ)lk z;qK9}HqZ9XcUeE7p3{+F3#K*J^1xrDO6**9$#_{OHreCO8$)RlTt;_^rO zTbR~g0~zER2#~UCCTg#=jBOd|Tny9Ycrsij#@B=L)8h{XiCx2k2Kro@Tq_;-)5F~V zBy;)LNp*%AwN1F@T1i0{BE$$DivB<6yZ_ApkEcWvHq8?-pob#obz>$7DKUhWexYGP zi=s|Y5h@Je!>TOS*j@*8X#a-gi(J!por@q8hd$1GEy?W=C62elPe!;u12~iK|12II zZ_2wr2OcTU!Q`;+9vN`qHx|>f))oj}*EBIDIPzsfS)_8IX1Ov_75%%VCKF`-TbNS;DlE2JLBiDI9p(a0?SNKu%k)v_; zl!E8x{LkjUANHsyJIjXj8P9me%R)bobZvGf7J1ra*ZOAx4HTli+^nn2;?SL6jlc}*zDQj*Ueo86>uMA1EOo+ec&yr%>3sV%@5!XGY|&+AWI zLk}=$D2ffyDgai{0ew>_(I%H*hE1M@wuLZIatr!7{2$HBV2(x^PH5D9n_q-CgMKrf z>bm~G*2SKflDly{2bew%GOobqC? zw|d<$=CZcQ1N@49V*Qgh7YMlc$DwiS%J<~KsG(0;!;RBN=i9RBwcoxYcE3ry@fV?9 zc$Ay~4O_sc@I*Y5tS+xKH`P zOI}iDkLadx`>6p(C}1RrXy#zU#FeKA+a>ya7}?*3c`ynk%hQjeM!3w%d!vcfWc!E4 zhE5(A#%h=M>)Dl__3rKXp$~m1rGKSY(VQ z91GdO{#JJBo*Me(7XOtT82`tDq+cZlz+#Nng`o#TcP3lCp+Ew9LbEclQ~YZP{bT(7erV-Rd4Gy2 zaDrFIcj1*e2ND8sd&600o%P6g$Sg#eI5);Cdbw$SdvWePQv*HE-02(%+ZIN*O>Lyl z0sRgH?0IdBixV<06if=_xuMAe+0~zq9Qd;&JH3vupnw5NXtk<~qie{*L9Z99uADaS z)K-vigzvN*r01Z!@(l_oeqrA1rc%V*#PwZs1+y4J_>yz{4x~Vv{SDACjCC!&>!0VM z&sL@AE)(F)Iz*3sW_Qr+AObObQv97~?YK`}hJkuOJ4!d@e&&grx3gso_6_+Xv~@Q% z{2xz7>u8p|LC5%g%g-)_AJ5^#SqlpR6Rk1p6>VELfIaf*ytTF8wx=~57N5aS%n?3F z=Ho|n4Km$);D`8~|C<*w+I+i5L%Uq7)dNDSK0#*z+VXmAsF(B1w|nEycr#j{8=wcY z(bU=c8;GfkEd6_j&RSjq7&jM(ySL%+1>Q>LRt_sqz<2vRI z0h2<5YXv9k;>pewhrpikfLyox|L!d!&wy(tPpMkPq_c07+bTq{0l}TephdS1E zYZvDjCcG2{c0Pc^YwY+<=wQ}{(Acp`;x}NzL7R-}!<`d9d=kSzMS>U-BL+c)20H%j z+uY_hkIi|7zxy7K&O4kPlzX0WTjsc$kxrQ>tf04c(g~EbqVA0WJS;J`c^=`buY~lH zxO1Kf`A(lI$j4qwS;`GuM297%9A)_KC&WS-$fYO=bJ>BI%Q#z0SC3JD^^6Z;T0n2q zdogH2AI6H&Q(^0SpaZ%jq&nu_g)&0XFxKA5eE=Gb0rbhZv(wPL47^P!B%UP(Ud0UO zHp{;GV?=pgtB<(O&IWTm<7aPe~{Nd-^OF2(N#_;_rtIWhP7?FpZ;GuC7x zf1cky6+`x?LsQE+^!sL=q8YA<{RFmaw*mvp0evo!x&DjH)rAr^W3Cqi8qM=Y$W++5 zzZ0B12V;IsaMZaIuZZuO81IXrvH2=n=9!X8xvaaaWMfU>h(_(!HIW(R*3MmbxLjZ3 zU29^x?!p1v?7De2V6(N!+ngs9$vRAPjdPm89mv+q=*@Co+1MnkzO&A)L2=3YERO}( zWUxLJD+kYSP){cd?j0^!`$ zkH?%AVrYEirZ>ImsrmUIb5JlAEapjd0--Z+i4tx194Ikngjb+7p$(ywb13o{Yh5of zSb_s6XKX3zhix|`LXyxF=STq0Q?zPWVEp>o5>1SK=NFydh;9bW`+4sXX4ve`dH-<) z={N@Va)b{Wn-7>U%25>GcjqZ|Ng&!-MLBaOkK0+Es9rcI#DR zp1ha-INul?bEiAq$u;Ez#-fUZ=MUrQ{U*uXe3T04yz2`tEj#ZX_qfLaNl9~@v9;G?i4(9c|t1-44PJaXdZ-y?w~(3_ zJMa~Bn79MOi_s{lAf=svY*Iz%9Tpc|eFPfV)j9d(lN;0h#k@Zw>w@|FSn*#uj(w&nqZ~`W(=O=KvaG=;#mQ$IdRr!uYudP(+`b9FGD( z0iiSymVgO{I+`5{ZRaq~{M~-kfMfgs3S38#Fh5lQnn+4K=rDO?ODB03{h-W9vc_V@6T_) zdMLRXlvnip%-x9@=hxoqR=2v4lrs_fJF(7oTN|$g83vU-$dx|}9bF)_vZ%650Jx?3 zw25K;&8+X^LTgXXsW&mV*|lGD3@70fvY3DN1uuAkkOnlen0qW#c6IIJhZHch4$x(s zqqEjf_ZzxLn?QD?({PJneuuV}+;ptg`g^MuSZ|bCK!^UI=T?|#KODp7G*PARDDc*p zdwB;6WW5dbbK(i&Z|^p9rE*4%a^Ku7^@gI%)#I$=a74@eBe|i&HZq$YNw!#z=$Vn& zq=94&d5&hu2Tzn0`0$fZTCeek8XhVB}#{eq_Gz83~}tbbQrsLjcqK(Fc6i zh&PAMEtuHyx(%n`F#(LIUf0sS?t{^tY4$D4ljlNPHCNyz*W4u{=edy6}xIG)T3^bf_$|>_I0BoSdZl%PP0qPF$wleg| zZd0=nR}r;fKA1&vDG4EubdX`lkhq9*CwIg^$M_CKS;SZ{8#@8YA}+;{T6pYZA1ibF zEe!uJ|MD+SWdxmg;)&>VX_|9~F6d{UefG_wOusIIbK|dZY^SgY@?lBn<+&}Pbn9E+dNBsV zLi*W?2&*-M_GTHYHv<9)heK(lnSu^g@CoTwgrMXxeu_#r90S<#mbbjcnAO9;&IN#h zKw%(2|AAP}?;H`P-;sYptFQ+ipl1dg5VOD4t3qG=&g+BgCE-j#F}D;7*E0ks3B=}e zjq$o;-s#!->VrrnbN-`Ia-K4&GYx<^IUv@8q0Rg15PtHr0bahAaao8lrt-l;jGkWs zG#nxz;KhsV|1+nsV~*k$8dE;>GdX~4qprh%0r$%8)x`tuESZDsXj6>l(ZnRt=W%J) z^NkY@W5WM&z1rM^{2E`(HGdyv`A5(x+GK1GWtdM%&;BJ&<< zDBcuJAGSUDVT}(vq;kCAC3v(x`Yv=)&=K#{k0W08A1SS1UK2ex$uDr*cLnUx)8F*5fUOaO+-VI3|*KOMYG;G54eR%_6eK@l%kHQq{Qu-q;%NL{U?CeV2 zF$TcF2%%=vp6No_P0f2XNfNXl(-(XDzW2QkliI3)?R_b?nCV;;Rm}J18Q)*Z&rc3x zoi2oel0RjuvG%&xz3yRopGRc=7?A%RMe_bh?DM)+T&&JrvA~DrSkVU1fFb&{2~D1F z5+}VJ1;o2Gzd#if!l=ysu!T!>2Q@q91lTAIbG~T=-}6@(wA}UzvYqpLzxR6>xbw$p zKG%-{+Zasj_XQO6Lns7eoPYu#Q1(2xN`g7-dvs^EJ02|yw< z^%RL=U!6;VL7T1xei$=KDr3qVi$`aS5S)~T(IlbXe1N47BrnAW?s&&Lo~Xh`p5I*= zyu{!0x!1BbdED3IKK~P;sSo727tPn6E$re@TkrpVEbJ%^rIm+^{;L;VSK?_nUc+hkEU0Ui7^Qdb@*&PkQ&dQJXj6Qu@CWddQ~QesarIb8WQTodccL z_*@y6?*H}lVMGGs%|C$II%E(sG8;nC&zbHv@3*u`vmODNmHCz5#@rgkQyBcfh01jy zE%XKeC*6yzZmujI3qsUdm8bcs$bI*+zVWb@zclxBi-sC7jPbP_-}uJPw*kjfwMnYW zH}Phh7XBWF>;M;(+8fg6|B3**pz?G{)-^YYquq7yFsoKj!0xT_Abew(0~-z{F0t8mF>G=9 z<1mF$nA0By9sbjnq^#TbYMJ3DyO6({#rAq7=HiL4o*VN#5`FD!Uwfq(36Ge#2&*FT zkQ{A*qyytL&twQjvACHU`Ms~tDE}j$QTpE=Atl7(K@l?F7lHG(iu2haASh3X(Y%~_{#pd!%VI#iDW|<-V5Cygz8+!u-F2V#xmMWG zQd&_~#?~PI&~@uot{{L6K7mA7>l-78@b1p3qr0LGLe2kO+mMv*I{F^n@^4Hu%rBHBtZ^((m-#{keHGMusw7|(&Xh?p))@xq#nolFG>t6S|KbrSB z0T|s4j#Z}SuX22ULNLxqe{K+?r}TNKVGeRnjF91Z0NPR3CLVT_NW9|A(A1|U-!FAc zGNhb4t{iqsq#i^V^SQUauCu1rWX86z-Vg!S&B`gifB7HFx*W@M4tY zg;r}pqpk9Q*8PoE8S!Xu0FcT1LZS9I9^)F`4qM{K1?%uEyKC;-IAz~6y#2rH%=4OI z-5P3`p~e7jBD3;0*IO41w~c02jOmzXH6?TuEx*^|_k{1%bVzcV{5@yL@74 zY1`8X&9qH;GJ4rI<6<{8b7<|9ei}>f|C0TpqcuE$3iP301|V7>e;AV7PcOh1tx5mKEAbhIEf;;~I?VHsCd?xMf{{;#<6n3yp5%A> zg>&4io{D&#^VtJ`gx^Wt}YLc++>j2 z_z{nI#AXy?=OKWZD-Va*y34_xS+;${-vsKlafhF&M^$fbTYXbCW+F1;W^KF&KvSO_xEcJs;IQxcw$uk ze2n7vrQgP993yrVumSz}Z3w10X6`Ds*;XdcC?L$<{`R-q%^OE(j>4e7FYkN5yu zZjAo!u7;z+zX}S&&G=KSTMjTlls<6XBmB^Bl?2~6w?<DU?))-o&u|Yr9?th% z;G5^wEztXovlD%86p9}RuedjWVRC5lo!lb#x>S^@CzltVbka%nAbFl+#@+|xqY-3S zF@EATpE~?r%O{ulHwHMSKq_B31~L?U6c@>6&Ro7C;M~2vcizc6?kVLTt%lyvtNA_R%W~Hx+}r^M&`v9{nA3s?T~q5+0dPK$ z%($Ul>y#H;Js5hAJqJAP_ExV;{I0v;@*x0N=>pbccg3~NC)r-mfUZh+z(e|bJPhfq z)-e5`VG4LZI-v(KP_1>>(2;-)=G>=idTpys@SZ?t1u9yNq`J*_Y@*PE{NL~1=|(rY zk?*{#XWG28Ug;yQ-*X^VL86Q!&kb`0yf!D+Qgym*E1zH9X5*5#ZpQGN)96q;loxIm zjg3@&<5n5huVf8e6r10K&2BA>cLT_`)Vcdkk2-pw?E;IbI^7jp+ zWXhNDm34Lrzju?gw`}8W0x-1x{n9F+gm?OQ3}yo2nnAT6l&>D2?;4X$k-2Gv!V9v) z_x%K#?7b>0panvs^_Mpp>Qkn>t*CDi^cchq4;W4QI1U{zB?fX7H2UIsx4+IfeGj+( z9N)Ljdw6Ft*eXO2EdLu}c|J@rf*xaR9A&);{C}KrJy&;})0pr+qwk*IngQB%3>M!p z%(y`UoG2g#0lb@|c~-i+)y&`pChTxI#CuW>2!4I@9;NG+^c&{W=sIAKGD2NT39|dq zcwh1MXhHbZfsCQ+AD`bpmDv6-$E)VL0kNJC9&+I*v5dxtCfCT1;4gjWxMnUO1tl=| zhydIZEehc%uCQIhZHwp>KZ($OP3ZFED4mj&zDRk}NzzBZqoWUp2AV|d4*BY#8v)G1 zjk*(&xXQPOZ(KCj0tb#wU%E>UFtB?@siiPmALtLQcXv&`v4 zl&rVjM9p~aKIKD>Ro=747+R;OI~r$=gw`OcD*NKLELTztdbkU_uJ}5z0<8Fh#8OgFwtZ zMLl=WEg8|Z;5n5~Gf!rBv^V2xz1zey<_&S+eOWJ2^HJT?TsXA1zV)q56^sjmA}Vq%C!F)V()`bR-t*oQ zT0J%IxwjCh%>oVgzW2RHCMiU<@QPQw;@l|hx8!P`ftX*#fZH}CYnCkp-`!F>S(K%l zN8z~P#FboQSUf&V;W1%O<1ndhHw<@6tJ^36fGLzg7J=P@z-$*(&c+2p^XJ6y zfKD@@m!ovfd4IxXi|)1VKNM{4vu(RirSm~+DX#^{f8J*?$s!kGG<-b$dTIswC~Xx` zj^VTzgKQzYw_nWq|M82ZWek4kjcpxr&1YkJJ!6HdS@Sq>ZDe>f zc9W6keq!>+p%-2p`ZXt4Mq1bb-dU#sK>;Ce`s%Km=<3hQK@IU9HP z-~kVKz;$x%Pv#!qNJ!0fa@C;RWb0aM7}0t;k@{WN3|ejuk|s498hE|mX5>THs5K{kH36er1Th0#R1bM8k1vtZiFjxSeW^#Rni4WbjV@MyD;cI;EacP=OA} zW2pL0E1os)Pj}XLH7)FwW(+%Dz&~SMpfTVtxjEDWeDD849vng;fCZ}pn&nFc4LZl} zYc7Z7hKK8?*ZJ&k`q#eF2f~x9UpT5$;2%KA=7GXH046@^jqcY_E$_K!=%_lX{yVx+ zWW3B#L$%h(Uor%UnrzcL+bW;$dc>=FR4mcQLmO|&Pr_x^l+RjZ@kP$_cHARv;(ZOQ z`X}B!bDKnoE1P#i63GP%c#2jETFm5P3~%rrQzr6L`*YVNDGK9g$s>xN-BL=_+p`<> zjO?&eJpVlByfA%#49h4BWmoloyITc!#)g6`96{0@$}*OXZn=K(JEW%GBE`w0VfcI3qM(JQ?FJO^%gK z$iW2zAe|6n?eqxZ>t|QsxJmh`8eA(Cg(BjmL53g&nmaW?Lbw!+sM}$a$u-k-4VNLn zg@&6y131tfswV6dk6XmORcJgLuwk444vV?>0&onlK)}UIp#}>hY*{#kvY^6Ku#6}e z^I0o$lg#CP#~HJqNk8r)?Z}a`v$$89IV)d@!g)LN5aE4p=o!#_cD}v@kRgZp{%Y4v zj2Q|f0P-3WdS5SuqJ;c+lSBJJjMi(0_D>5Z9r z%%fHG+1)uVs<|JpqSkOfBu_KP28!MAbFJjIhZ-)nt>q*K03z9C{o}pe6$1)3e@5M} z(EyNXrhIri+ZrAzO`Ilg37S#5cvpt8ZlTraX$T%3PPU*?-%b0DH6*P)*9dnaFWjR> zC>;PjIQ9fR?3GqMvouL3pd*;qRxM-50{qEao<^1R^wBluVpZ^=AvK;;j{~5Eu!x3a z)&TZgJivw$4+tI><-=Mx-q4-3cOR2Aww=L`Thu{3>H~&MtO1Z3kF6Zur zFbe%M=6_=>Hwc5+)t($v`>-^=B}rI*;QjA^|Ec|QJ6loHY^4nW0EpS z(HqD38%6QFR}|5E<@p~9gE<(+Qjf+yJ@e)fIYJ z<9WMU=b=?HV!SL((BkE|EhYl8cLdA#$T@7%RMEJONVIbP{VlEm{R zapwIZfFGR_l3doua&~y{f;H>8w(6(2a0*}J0E@KuAQTg}05mao#t)rxMW_l>WQV zI6$TcJS#f^udrDXuaLPTrS9`?Z(U2_^A8FTbd%79zm>g3`#+rD@gD@DeIqpa-=WtF zL_RD&Cl7@=9#yL9&=W#0$5C)Y_j742CCq3M>cjO^Unr&MdOXQ( z^5yhP2*<6<3jhn0Sqic+9zbXMx1$x2_7d3M-MHp>u?}k#;9*sE@rr&nQEc)80fU^k zV`IA=E$`Kk5qy5vWh380>pKCUTe^_((w*_mg8xH00X$j1zAlJdePvG>iF>JaOgk3^ zPswwjs{AeZC!Plc!aEtP=wP!zplkZc6Cw7D1kwem+;14l#y0RfJq_>e#z=Sa(H%Z+ z<3-=-Dw4~4O(VP%yb0bru^pYrv`*Qtcq@BT3*(yx~}`up8td{5bo)`|I-98bwHZQE>q1_W+_A}WNvE$);iqHazMMmwxw5QNNPp1lx5@)}_p6gk3- zP}7g2PS7;Ij8co40vn9md*1UN1{+4QS)txJcGx*Ska4E`{mMk>%rfKBytpQ}oszcu zS#OA6iE;4WcwpQi0K?D!P@3BNp%XN-l>g3SoGnc>g>v4qP0(QmF}J9eIVvM9a?Ut4 zzT2i4wlC(POsu8CR!N#FSHV(*rd$i}03ww4uT=}U%rVLF41k+HCS&oQthJBWwQY8A z=e11}Tdv;#iXlxke8NtGu`QV3{m^a=xw>Jt1eN>QNnYVy;nVpA*xdV11F}4DQa*Cn z`kcq+oCjz8MhUlC%p5Kh_19NGM3j%k2;BpD=QDE2)52r+frcGuqcl^R5Qv`%KYv`5 z6!Es>%#jK>%b^v(ze z&i4*1!x5hu-NiH3A zGHD7WyQI(E~>DQ z3+AgbV6%p2-Q($;c=g-f_BM%K0T@8NCjKL*oxf+iT=r@kf(+T9FxU7cUMHN_!Ruiw z`nY=+P;%hE%_n8<&3DTQH+-gH5&plLrxeh`x}wjyXN|ljnFMIi^XM7t?d0p1=T_gT zhs9y3B2!PE>s{}9KD*Isb9N(p&Up=k1FrKvAkPZkmanc>-nd~HYb7!^Ce|t0H=ns- zul>d(m)bO8{O>ttZ?zK2Kj+wNJM0PR4<#8S1aQvI%qCpZmsi9+O(g({Kz6@KoL>ZO zyIKWSljeny0UQ>xYsxKWDLY@7-9n5MjK(6^H50c}t=YOUcH?13$U90bX=LXY>#``;mBF%QIu@;2Attxc@t+uAAbpDZbm1jI3*nU~HcUNfn0~yKCH!W!2A`!~-5VDHXR-%(|wE z#eBcCa~z=qs2N9b8xdgBDu+F%IUd>urKMUirTurHTOf(=3kp!WC3Hf+l#Eq(E_rYS z7*M4{sMxJmGL?aq#q8JMhhALPv<)Ko_g&Vfu+)RFc3)&`Cpg zd@A=y*KwZ1v)8JAhyDN(uB%4?{m(|pj)yxHkfE>Wll}>t1~hEsLD!rnHj{w*_%4uz zN9f9H>oMdR#>V}t6RzOz=zy+ltu97Z@)-R@et!P6y8i8Mce{By`(E;9nAi=Y>fxK+ z)ZGS~YV9^lph2fM+3|%<)Hf}XRyU>{NnF%LT;(DHWt3wfF<>R~ZB5v>o15`y9bk;c zPOu%fx|Bg}H|ud?0jNe0hBBW8gaN2kk5Mno()fx%`a!7{a%{D!3^1on`t<=vnD1}A z>s{}9OVIYqXDk?!i(#%#GZy18)A?p~rvx!%jS*T#ON^ai=4=9nqQf=M|BW}pLZyT} zXIm5-_pA{sllU~6pPgsHzO z#?39|unB;q#OGp^gn6Y<{hk9~(Z@><1npjk72LCJQsRkm|HjPog;M5qIcssDvAX$t zKJ;O&{bUTypUJ78jIvoibW-N;Q&}TF^^SMEW1O5Lqwu}EMVVBg<<_QN^o-9H#*y!q za=#yMWtu$eKs|^UHk7gMmX%(se7oMKTX}`_k;I09C&Q9bk3Sr-sJqEE^n}Yg;NLn_>XGX`Io%SZZNpq{)~%!Y z0q6?WEnRAQkYVHSY`ob$-P?WXb2Wa+Y6h}?uUAgE31;bf)rG5HO~CBhHEZ%P{YXBm zme#F2P(g|8l6Y~)K`!%_@ImsWbGdFG3KBU_NJ`5F8(T8ge0OZS#vAV1q}#vk5-5ZaGy{%=3&N6+$tlRblfu~K{cTX6|+>{LZu$6x4 z0$O4GY-_CiUT96?NGZm6n>>emVdI3S+yTN&ic$j`mMQ8%gD=Yi?WQ-q=^-OILK_$f zFMa7t?-1tvk_e8M=l{2#WP{&|QMc@15YDH$_axEVPXtJKM0T$q7GbbJC~>hQY%oPM zQ(yr=gIPDrd28wWe}$`^ObRboK4VNc@ub z?`5}AIkfIpI0l{^;=d#bt$$a|xAA@JC>AjKG7kOjG=}LLmKj94(*IwiKtx5UM z`GjBCo!(VK;0SNV*V??;#2Dp;w45E91#2+JD2B^&_}E8v zj|O!5S(S2xTjV|`zxc&3{#3kVt|5dd$}<3Nn44s&u9~68TZC>d9NPL;KA#+V`+=+- zz z-QpIv8104~`)zI*(^kTSM!QAF+zHP4-N)>)w$lrGuQWn~q1c#L3=u=Y2shE{Dm)6q zVAah95V$*_A?spRh@(aJcQNQ7;kPT$;8}-&YPOOEl(`7%Z^nRrdlc0dM;ZCS7%~45 z&x8x)ea?@$8YhgD(i>yNdmAst0R@L(X^4;{hY(xBl`v*B=pABUem~=kGuHLCDKkIy)Kk&MpCuo_kK|q7n(_VVtP^qnc1z6X zw{!2?POjPaX4w8VGR86Puao(Ich=sOLT3~jz}}dbN#-06GWS0oqvlt0zH*jJ0Y1CV ze=c`%bxpTkLla5U0 zI<8NQ-8~t4veT`*)bY|}aN<#TEg+QPDQvA9i9Ns7U|Ipj|9P#*mErg9q!&yA(|^zOSw44I zL9T(Gwo$GVfPm@}bS=3n05tj!Fcgx~P!;^zIZadxaPKp^&YDYWDc%wDN#;F2Nvi$u zoc4&LZKGzBUJTCPRUY`;MZHy^8w4eIBpwUrCW%v6sHvbU8bX-6V z2J@V8BXlWHm@wnMXfc6i3@OOD7Lye#xUF&5HSF#90YTDNOzD&9)6WDn;%#8p*8J$- zI3WWnvbg4+ld_d-x~jEoP*Cc*DEJ?WqIkZ9ODre0ayiD*0)U~3j_N^>&vD*$DF)O5 z)g2;i(Gt&(#-|;O;N=Oi7z1HG!fG^dnH?LmNlulqF-EG~&*g@gpzLZb19Td~(h!v% zb+!I#6q-Lze?A((=#9D0hgZ0nW^~p~eXE8)TA;I7dw_py zr}C(~?Vd;GGzmucIT2V}6Xk898B~PD5Q2R9|DITIM|x`#AI!D8Yjzz9CT*g* zhO#h6qo}{3TQ5 zTOr|9UHIYL=X??&zTpjT@Z1FoMeff-VJX6e5CSTUlnTxJ&!tb4%+F@M|6Ru5lj(!{ z!9SAS=F3Eooh)1npkc zm-9CW{Y#mTf604)E`R&~|7j_Sv=xE29M6UVQ6HNeZTQ;0C&Lc6B=78)zt<7^xnF>( zzYmRm*K%6Gwz;f<o*0vpV&qOoB^R0gX zmcIBKxL|VypRF$Hqe!)emR04QK*Ks{soVoW*`m`+` z+xjcKNeOX!Es#O8rYh^K?Q_mK2j4aCt8Gly)0W)A%hAOs`ry~IF(>)*t9xGL^zQ~N z{>|upCeUucOmn;K^_DT+b!CjV1!(9CW+!jd7<7M3x!a8pTQ}Fv#DIBhD7bbkf#lKL zFbK?1{FV7392%q6Hig@(c~y15_46^#O)#B*W=2?clNWq$GZR{lfEa20e~#yc8J-Xj z=H$@vQpUy(dv{A127rXtX(ur4%n^VT9Lf!0OL$rboAPY%97hG`ide|*4pFX_8C4Ou z5aL&yeDcZHf9-2uOW_;yBoHo|f{CSkKwR^FE7vaM{84u+bMLR` z^TVN~4`u8=k^6i#Jmg=~7rWU1zDc0Ke4xeorL;pp&BsDC%su+3LJ_5C>1aaYcTpQp zWYB!_bc}h|hkjlb{&lZ_d%PJ`1ewdOjOr>^2@r9&ob%ihPdstXe90eE52jQXxmZBK zk7YhD!4o1z$Xsaq_yAxZ%=e$pZrr1D-b=GqTr2tHQ?d?zBj+5j-tj)ARqH;ggd1=` z(ytrb;0C}p0K$2Sr}Mk(YaMgvts63>l-sGDK!#e4Frel;-}z4R@Q9a%KnCw0K-6v; zo@Y#qk$1;G_WpHgnlhv%H$Z695Z#W$W2cda)K6Pct{rj-*!IhT&g8Az&<>rWHI^4Ku(8 z=>T{cT@nqT4P(7>r@LWe&X-q#-UK}0`M^u5V9_w=0}$dm*SQX!%C4YSdCpp!I0Y|< zyU44a(?s6D;d*Fl{Tn!iZ*O3?G;~BLoO|KxcI#)(Q#_~ML9_Cda8J5FPck5bwGQVIYnu`ku6r{h1Tk+EA7^oMwMOI?>&zGGe)~W3)3Q&P zKjAOY&IkDRg}1#aoqZL0t{_k$PP+xcffBQ#`($6?Bj_Of zgbSg}HJU&IDi{w4I)N%q+uw{4|8L2p_0~@XqjT$)YF$`6W%LySc9DP#6una>$?}Yq z|LZ%!JQtzw9%tsiPxak>?sK1M=7vEx?@>|Q9vTJmIeC}!4H5uRK>pdzaE_N3sU9@S z-hl~I^{f%)FHQA_M>@h2?jj^6_f!Ss)6+~)o~7>#178oUG+nqB~(Yr3b)~u!?vZT>4e7dey&VU0ozb zy=^vz%6tr>D@2ifNsK7D8JbA+VOayelU=&cX3bqjNll3!DOMD(fO$M;j!9(;3N%Ga zAGnSVl`{N5XasP=I_A}be+mbneB%wgqO30=TEI*1w5xVDX4PtV2t%Xfnm^;oIO#4L zBg9Us5_P^ej+<20Y6vvJZ|mCoyHyIR!0&rquA}T0Xh*Nc&L$EW*D6Om-vDk5ejxn7 zP2QL@B&`YGH>B>6cYG_473*+q5FE}>T`^b3I8;&zyf@TL2viD zVPLCnHqm*kQR8ktn}cJeo@4CIfA}u_$?y1^!+Ch#N>8Kam=cO=9`Ornwd;62J!)NJ zy(Qh7pqd`%{qY&J+1xMQdx};)8gFk-gIR!D-oIm^Kl(=2&^7&bDEYt2e*xUqi!md+ z%zKmauJx{~Ch~03RUkuvp;6W)-T3F7lMuxw9v|vbPoI3sw{sCH>@nNlwiU>jb<4Q! z>GGD-5cmSZU~Em?(3V+Q(}E0*twd}siK1-~^UpxBn}OK(6Zh;;t10sx(PsTrxo*-!a!_pS5m&BpxVy=? zvEC`@l3~^ZgdD>67(2cj@XKkH^Cqctz1??wwVBd~anyF<%?ktJh#KcZY1PThML`2& zCzhVaUU!(uqZ<3b1OOR>h}>#YKH-G!V=mFY%_r>;Lu%2DwPAArtpKLn+d3wDJ(E1P zj=al0khFTMPJ*AxabW!L9phWjU@aGZYqqpu{j3&`-f{Q4`!eKxR~_H=tKPdbX#UC< z(NEiyo1eWWos6ttTnp2{8(e2Ii06cR``d5R0#ZZoUI3fx4i(Jm`?zO4;m8+WL)H}8 z!1JI$>83p#%75Jx$YAchH(AwiiD_EFN9)Ym(?39?^^YIK%T^K&=X}TH@OB8G4}JgU zS!bPfm&nuSM`oU?y!bKO&>r-l2aQZs^0nL~z!oBX^D#TnlIv-!g$i2D?#Qh=!S%fg zeFVdOvKT2!+(#w;o7R=HF_ultvLV50O+K^VcBXYlAoELk;G!nhxNdaQFhfG%+?;zb zisE(i^|SN$k+A)?eD8bT8=)`ey?!Rb@ryB%=VEX#D|0x>rb`Gm0VH~7Ty*!$_mmt+ zG^NMxrkzZ?m&+Nm#R$Cx+4AeXNoDvuc>YWd4TX0e?F{pS4zf_{j*ug}k5Nzdpszzx&z2WTeec z=x2GGJQ4QWk=;roZ^}CQbUYERkhT$y6Z!LG%Ib7#{c*v2|>S9ab2dWx}f-QJq#?_8p^#Efr6#y{Ies3IG z&MmZo_u@N#!#Jzi|)yu%R82?FC+MHc%xzGw0xiOt6Zpl zNHzg)>_(GcfcS>S`v0MBB(++L{sHV5k^1A_`iXArPNz zy?fKq@SScHmFH}t8NXR=jy9PhgB{J%HSx>l_5siW)Vu?Ik|zS5=9+2wuXO_$FfZmr z_>ueheVTg=OTYseguS_EE1)gsySW#q<@A$R(GACEo_Qt)4sya```h16Nv6yiOF|983xJ?h zb1fB%JeOok2eb3TLuk?cjJLym8A|S_*0}q<@r`dJ1S&YoI1f^&a=bdv`$}TYAK~}O zE-&VP(+SA1;5{|~80LTzbxSvYL*}arM~t{rk}T-S+3onyBOm$5zkAf99`(&fJmL|5 z{*a6*hQUeK)VN6c<)cb4m}+sx(+#qbyI z$BpkcHq$8l9eek)yIsC(=gi-fbaJS>^X9`m;Imw}n}cet>OMY?Xnmxz#ky(uighG! z2ASn=a{;tL-#{TC7!MJiki11S#twsx!OsA)X<^(X7wj{-dtR{TP+E7Afe3Xa&$?uU znO6XV@AV%IIQNJQLz+c1E|Ub$=4Lf7fr3wfoX%yBwTw~YZXMS9q(JIw^H2jAsD)2# z*xx24w2^}*hrHPLjwa5QBSeSl)e7YCh|{Ix;ZjpYKiJPiGPQu=+5HSR&6@dA8F zfDZkqL!UY6=S-RHC~X3ME=E3(!@uSKqa9=h#%z-`qJKwbjs~T>d?d^KsUhO~BEV*% zouaj5m4$CNc52tSW|^m8rENH8h;8Pbdi@sGkb5u?B^y5^X0>| z&Wp7QVmvol#EV@dGtS+xQ*C_fTi+T1zyD2ddegnaT%V!RhKdPFG)D32cwznoRvEvs zYq>Aw8%G(V_lF_hKD2$;fHK#Qx6pN>kS##b^EZHCS-H^0AU6KH%sWTj2f3n3G-q92 zVNyqYImg^2vCnPN-?y%nH1EZH)ftr&%LE9>ekPV@zH+z^B{|^D!ocPB4^?i}L!D zlL|KTtE~z5@J|v(9`JjTs-7>dso$`ZWIblR;)5?wDAK+2`(NgsmyS{V=i!?d0W=l} zD0q-{Ls9nWI-X1vIy=Mo1dog6BWjseMxNdE<|JrBvF_|uLEqDcQnSc21_80%;WoZx z5BXe~Gwse!>%ZIO3!sE2nlnl?gVUJX!DL8K);*`?^Ni=ZGOoad>&?rN(z>xT%)4Mb z7&MG8pZ;GDk!ImH2CbB0=hxpu&p02%)9)HoZVL_bZ@-@zhJ2SO$ybY^y_91?yecJ&P-{GBv-0|6 z=wvN%Q8P|IAK`ZG+~*OF?4n*c*_Q7Sx8C0gBR*fwpNo>T9AkejYlqMzWa=fPA02N( z8=5>0EuR|!c`$Bkb5Z`@7j*eVRT|b>-)Zx1H#s!BdOsH7^NUI5bz_Myn^9cSxOh7o0+=1?YI3lMH^3K;5V*$&1+shZrcAC#dBUvs5}Z$ zSihZhbTHll2b_G9o80982$=^z_`##Jxx{fU57x#1WXJ2%S#wtiAkf{p+r_)#w1i-s zUn$juQhi^-nLe2Hdv%H`1&-py$N@OI#v1Y+FR{kiHkSnB$hu;511Hl*F1$cI_iFa{ zo)28)3E{gvE5o{>K*nf5R)%47GHtS)r*n;?F>JK~e3Nm*0I7>VK8&XUe8eI9-WYC_ zShBmH45~e?B=%hf#*)MPpihPxK-?~`?`wGUog0>dPI)TSd!U{q!%}w*84|7{F|lzj zP|-~dfLaqLuRq^Ymg=sTOy%yRv~&Bef9Bn}`g7E8I&HDcr*UiI>l*DF%@0GE4%D!k z^=Q-iXpA0eepWlbd=;(IfzU5K$r>HzxxsUtQ@%hq!1#5EkynaQ!<{5KB!A|>GF^2b= zLCTxLQAXB?3OGdvE}Pmqy7(+^?7_kY>NTfMq)0rF0Ptgo0plK&-|?SsucBOx`~MZ5S3ebxrPE>v z-#N5@v+Mxb9h;A$Cx^o?PtLhU*2kB!hAs|-%X*r#vnCrqL#tWYc|HLn$wP`aFv1S} z^{;<@$|6@z>kp5hP}T@;!ont>Wh_x{t?NCRAhH_~#sKdmkMXCv(N7z$*8@)k_TohV zhPrDP0A_qJiX4m#d~{g)u5E*)Y1`&yxm``aOE;C#1sA%@jHfqQanG$0Nw&EL4cl}; z!{*4iS_hQ_#@DzvY^Ay%ndoS~hxViK@J;YJi>4orD)Z!TWFs#_&nBbjG(1|+L_?8| z+D)f|a~%Vpn`z4UY8|^N!7b;nvjQU5l4!=2t_LegiO| zcRUzx1qw&^k+ihHq<&8IE{<-#Fj&#|EONV;gFb^ikk^CG1povcb&)#n% zu+F^;1O|*Zc0g@9t8v*1=rr7zTpmk!b3izYzBu)Q$K@{0q`Jt55cesKYwpCmPFjBwqIeeZsr^_2)B zv1ZTcO>&O~E^C9(2!|#+^zkuN9uxt2LKMnNr2hmaK}<+5M}RIzai5p3p}=4iO+u~; zWOomixuz2|;SKl9trkl5X7d8BphAZc6E+*5?b`C3}H#{?EuPO*AnepsTyQ zM_a>37=z|v6D1PYPRzJ5U9Pp38UJ({bG6}I)UyUXqD8#6Np$V3n_J)`-Nu^d6@~|x z=YqKC+cjt%Sdoy}X}p!1BY|!VC~KMTL*c)Drv4SQpi9xa%#Y1c{VlN9&~(q_QDH8o z0U6xay8;=EO~azM>e=EtV{Kivx*+~A4sbaNaN}KWnbY3r+y^}10d&gd;yPSq#QW@j z12Sxv=fno~m1DCx8cLh(=QoczOzn`R;Go7hl zTBkKJ79n9r*LAZJ@)oUwaNE`pjlJHCHzgPoHV>3!0vU?ChCu3W$!MZTTrtdli~+}} zb?u@ujA20T`>e@=+jdu_?Pw{1hj5n9KKtw&McDjv;>s{kc@@;~U+I3wK(_-*@Ks3s zWfZal5h8z`pE3N$L{Pjpf1Y#08{Y7^2@|=0JR4pZu;)X$_SjsrlsTElXtIV>diZn{ z>*r=HmF@dd`*z1W-qH2LI>kP%ql?Gg`{X?5!SXMpuY?R2;xVs@%6$z0Xd zmB1ssyR+)RAG{yM)Oio}8oQ;=?|wV#+W~7J%G4vW=I)erHlLlLacFuJUPK0+`K)I> z>*n!5xKqyi09KUpTk9%8$pO(M$UutwWeuGWPlQWnxAZOHd;bsx`J5te!;kCbXQOTEi(8+^W=H|UjxPeecup> zj&T$6)rfa61ktGb4}ouT!u_jPp=okY0zkXdi}zlRi(;@Xw@9?ZMl z+HQDxhMiaEGE#jq7_+fPKBJiYq(MYg&JWk#$XM6=Y~7H6bMC zPKcD}NNP@(d<>A`?svaCz1TB$O~UVZO^j^fZ8NAbs~ipHz5w~R{r@+A^EZDf9%gjz zS55Sj9m{*SaHtHjM#2-H_{1lNXfA9LqWl~PAu}+4KLme^5YZL9P};PkWI)BHTMQO- z2YFq_g;8J#5JL$0A-1~n5hfLbTc~1=p$*+^HRykyPXTTDBkqDr0bJ%YuOB%N8QyREZTGb1 zSNMGB`_nOYu8=jhn6+>q$^|-Jj*)-KfB^50!gcn|Zg#V~2-}>j*;PGqs*p%cV&f@m z;$8t8-kx95B>?w2UnZs@ka zTIbW;(yi%v4U64m8`6N!dNFTQ4zam3oZB%+2jSr6{RJ5`9o>Iv^RUaQ8=TCgUpQ-(W$ z&ix(!F34A}aNfo|gsnHvT#s%G+6b3$FYkjV9+JFhN!gYrZaxX z&xwsfC(z4gWMKK(w=&j3rvGpv=j61wWPk?u*%7eeP`3Paa^9Ls2H7jv@tL4zl6XLV z8H=yZV*OUmyMo=-DV~SuYSddq7Dg4UjhG;V2q-}i`Tr~cfhuPhj0JbZ3zS1`RhAi+ z=7EyTNCi9e2QB=+h<9|v% zM=`t?Gd?BoR*j%YsWUzgu!)g#^Q^J|%J_aWOyfA;<(ePJ^|y?X@(&rSFJ-LHpL<;_ z;XU`sxx5d6H3a2>(6D)Vb%ezOB0N5t@BSm}>gy4J-xp)%l5wTGOrCo}nEfy0JnPQ9 zdH%WS=e&6Jv;}k3dg2xC&R>b*+Zm9wjnSkcM*be1dg`h3>EnMyDBd`y0uuK_CidH| zY1ti{LyzH8cZqTIvC!&)tif>%icx5OF7jnj?vc3Eo|=$_QzL8clk=ZG1r2|zxl?19 z{Bd~R&o&eyYvtSnX?As5&%K7zaOak?i+^%mrQibm{Eo+xOI&0dLrf8@^2+1E+P8z} zoA6=<*h~xP|*SXGvq}(Xf6tsoqwM-g*(X4=vM2ZkC4nE@*}^YQ0qNJgW4;=E=ZM ztQYgY+1Bb1collkl!~nZzj8cl@P}Ulc&uGINdZ8cBIc*`xU!mz^Xi3zmg=QKCn?~e z40yo|=k3z|=eppk&ueX#(&V3uo!;=HhFwqTL z%D4Q@I(4r8;%PiSyfZI1W8JX1wLBSo;*E4~e-{uuWKi1p7+244C66RE$9s&=7YC>6 z=dmt1X1{HP*9?={UeGPFhR%py|L}pn;)Xl2W4>jeLA3xMIS86pM|tT2{(KO^>&mR1 z0~)P#-qaZ{omS>@&N=5abYhx8wa^GCi+rYvK<;CqHu=fEH^atW4LlkMWnhuHTys}Q zC`670wd{cm8SCp#cJ#lU-IRl&vwz9=XFGR!mRUXzQ%kjoB8X2-7{zx-QF~+r=t2yL z<&4u@!wg!ZICMu@BQVBMszzb_$3ewh`Ps=(w zGhpAXcpR;F<1@}UqwD_XUiZ4!-6256{d4_Qvp#_gcqA_eiLfYN00wJ{!9!61`dMH2 z0WiVZ@_)NScAcFI+-H2@8_us%O1br&^C`{11$>#33hc9EO_9VOD9?M^c&b}-6Q5PV zcT|b)`x$5BWK4`FPdxg=S``gyU~4r@{J-P2*IGdah6>klG~_dKhJk?wCHF>0#>4N9 z8uZ@T_daV-bvM+}9biU;5FkbydTibWGNN(*9oOm)-R*8d$hwPHan^5r9EW~whnhFP zZC2+iu;F>0>v?oo@6MpLzVscf)Wg;HKoxyBDs{nOlG!aZ*P^kh5+UM;c$It!0M)Kr z{HzrgN|S9ZyUG~nIbeO`1&nce4&A6pbbEc*an}Uic#UgZ!}FUgwBZ8h@#GUuIDuzJ zH_)p4pqJ*bx%nL*46o*Sj9Q%RTj<$C~%5=Z5c%86D9( z0SM5nHR8PWLVXITNa*fa#>2Hj$PP89k1_UavPS=EOX=T|5b1>beav}xxyxM^U{Xms z{@4H`SFNU@I9FA&!TLv1cls)^|&wg2m=Et)536+-$ z`OZP%Ie>1nvpufyGi9?_EM_~R2z=UWEyiuh1RO!w?EQOEp*S23Q)0BX1kgH_CtCj( zFa@-F%tUb!qh%*V=2@=3M+&3)|Jl0_Fx$?uZ2Z}?=Nt%xDpdh#ih|+?7J|qJgd}tl zdJ9ELgn+aU2%=P__ZC2qA`qnpNI(b(QZENOJ{6|stblWKv_k|5eWmXp-vtlqUg7?H zj%-jltdny?y!YlXH(k5nez6%sysb%$Q<<;{4XSl7u0l;hv+12{e$&>nB2jYxUiEhq z9-!R>9hBzntjx+93%}OR z&1Z%-9T_XDCx!uYMx$9Hr9Bdu)&B#dlLlpQovm~K{PG|u)i zbOsZSdG*fd2td;_cP-dZ&1S}o)*S65(D3a?qx7B63bN=OKpX8McmNyFyA}P9L#OqX z=eQ4j#iQuwT@&~b9dG*yZ-4;60zisTW*#*irTOH4eLB?kDzyq>eW=u32jF0j(5JV! z#Vu%}2^NG5zt?QtzNF8Li8h&co}pcY8}qmtW&K+KL!0+yOy@GjbFR+;7#~@aYtXn> z3tm8_DVdwzQeEbe{|S(u+T}pY^{2Ipjspk$4nX$K=)69|TdtI4Vi+jW zeo@fS8fI}&3ylpZ!=S3xHV|o?HI0@I^L-k(-^#~rj@X@Lq)f9stS1|W3Jz-B_5KEf ze9U7Wvuze4>)9Dc?X=TQJMH;dOm~ZE4uT*e_e-V|WGEDl*Ac0?0Ygl58`8F> zofNUS0Eqhq@(Dw@kBde&`1x#bo^4G3G{Vetr_uKnAj8aEVpeu?nM7FX9`~d$k1Q3Q zl0E1h(ImZ8itkw30SNCA=4~9N^#>8cY~XJXb9SYCesL~^@8fdw97q^zo(7b1+$$i$ z$D`$Wd4#<^(L!NH&kN%?l7=?cN~08l-U#rn)W5wMWdI2L;4zVW#|d?%uNCSrpk3qQ z6kv4Gm!@E(X~y{HeRd_-P)#>bfmWU-5fe**)*tAq{;DQA{f)2iz3)4WH?zNIxZh{3 zP0+zzpR(ZWfLEkm5VRN59)o76XcyU}sYbgK-UmF^5{BSB6#|oV0hA~{ulEM7p`c+y-&<9lQ7no?Bbrmz;%qwvh2-*r@ z5UniWRZ9W$%6f2bfedrLt`L3)WEt}U5(OQGt{Q+1a~uE0`mL5g1@{zut-4pT5NK=( z_m(d+KkWh9giZq)n&Q{|N9W8(01GQO04R$s?efkm0H_63#7+RJX{$DJf%T3Xu^&{a zXpI32y^Cip+Ap~j=8|U(l-LcT{5!tvLM7wGu~EFPzU#4$q7C|ffeetcWtI%<1{$F>oN|iuCWTMs>TX$MAjqbgLGUfi!y>Zp;Z!n~Wk5#L zG+9Swj34QDd0w;8%!d&F?pB-lY;}n%#XL8o#5uWI7^kmiV;W}@T+C)S$3?+rWrGt? z(?((QC5&L49qFTjf8%9R;q-fnd;tf?sHugPL~~v-6=}_d)6T^(m5b5#&PPZY1zgyZ z|7oE#a|}^PTVHHuzV)@PrdiXk3})0!kIoctx1QKgl|OewfFbWL@s5Z>;r>J~r38G+?ow z7!k5C$X%D!P!H3X)e=wi^ah=5{(DTG{na%U@-VU(Zh}<7^=a9W0q<&U)r=Z=1@sb= zT@5B7R*V6Hq3;A&!3FD&jsBslO6yu_&wBT}-(5jNe|Btkw7}VZsxU$L!R(s@`oWlc z7x6m^Ca~Nf+|!cQHN<`ch%i?=Zz`xaRi*w_x4EehxBwY|EOSwxJKWQHGnawatQgd7 z>>32R;Kf4L!I%X@o`E0yQrh)O0ASAlbcD!HPh&w%QqO3uW8oRJ-VL7GW9VAwy}ZA7 z0hV;{ot5>MWyY!NiqPNGjK;$Ht+2eT(y`VqXc#&`!ynUow4jy~1ZQ)nG}5?wmN^c{ zMMEmkH)c&O!_>iDg8Mm`rn|z5 zvX(pd$LVuz_>0U>nUl`S z(ejzJstYI*3XVu3maLs8%*^4 zf(7Cum@E1mxCPh&AS|Z@=@^Qo5fGMOY|hHqW3Coxt7hK+1!BoGta^;S-=%UiSLCdrOO_0*-XTCl-eENek7Ob)#8ld4ow{Lhr$eohGW34cJ-}1lY?ytW`L5BS> zYuC2;))L)PXBO!;>2v>K=?8bHmlD+Yk=e*?;M^z{vvG(Oz&hp+rUYvHcE2qsbqk45 z{_bpIw~#v0|CnOvcQ;8J0!GLGjl8|IY@}ahp3}_?^Cz(5I2*%Un7X+zue3~O=CbDr z9K94=;HSQg>40WsR@PMnrZs27EdD~6w0A|YA%y*G=JU<-`|ZdkVm4$wn%nQNzsXP$ z26t~vRTsio(!Ab0Cg6V;M&ljvMLreapz1`=9}6nE%w8!5Or!@`q2XsXiy1sO?BDerLH67m{Ux)0Y1j%p7*>bVV%IEKI24yv9FnX z4Z>%PSQQWyop%rdC%Jx3c#>>QgY`1+K5O+^&wAE(^E`7wWcAgiU99V0HQ0nY z?bjZlhHMC8nrKt~@$H5B%lAWuCmn#4JH|!WIA~L2eJmGy!}#^nT=O2TZ(J&4v=j(L z&#Vc+l6%zIpo~DbW*ag8Lu)BJ9ToK3E@RJKfi;2WkbzvItxfk@m#l(P+#Sd?1sM*+ z7qd!m_->9`AJ(h3`=6C-Efq@p1o~w;WGz}l_JtKe2JeoBTGO2eao1DVhJy_03wu;) zx4uG?M|qb?z{pYP!@INhT+Z<4eRidbZTf3p<1pnNelqj$F4;@JUjBQXWp14rCp>f8 ztQa;b7~~H!Iobh>%cZ@H8R<>45HMG31sW_~1j7W~(PoLWvhLCd(~ZQ7uwif)rIHI# zm1*KXvKh=B%ED^qw_q`Qxfx_r_?A8hQ-$bu6YczO0E0k$zvhlj*QBVwfg%GYI3_v9 z(|qdxmQCVO@$>$@0RgjF?U@Qc3y1P}&C2dB)1a#393xD@U=DYUnZKB=w}kN|G<`ps z@C$}6ofs{Tz_h>4eZhT9J84w2elHe);X|qK=m@q1vL6T-83yXatfLdd%>7H5VofqA~8r#HXDVHXJpFcTPQoPo~K3-In+bwXDiJGjk?5qmzU{bgKF9n_Agt zBgA`ujC0>0+s9Q7SeQdP4B2* zYfUm25DE##~Z z`zFEb8|wF5fCj@2c?|BlXqrIt{HYP6j|?wz?hG;>9*4a9IkQvhUjky3wC zX1ZSd1NS!_IB-^W3~fbktfN|mSvThBYO+k!CC)RvgJ-bvX}VbFtr_hFTr>c%HLR@# zp8Kp7(pXx9)~@Fi+yK((^9`r*RT$SbFY5_V<6TDCw-!SK$dkwC(%0wwt^^vE@Dsn` z*Z}wMj>T&Crwz@zxVo}QKtm?ya>1^2NMkf0$S(+iwg~pE<5?EB3At;u2(z;0VtmWs z5NH>|EX;>F`cAYN_si)+g7G^*S+uuIQT!jy257@rh#)X;!(F0%+Y*qWzNzt%#DHNW zM`_1DhVgo+;FSaI;^neNFJP%3!mcf|a%h$PS=nHOYMF=ezEWt9z3T#Dye6SffQiS2 zxqQ4eYfVhShBwd5M=7S#e zpgpNa@X1>L6kxEn_E=L9x{l6$e;mg9v-$t0pZw$}zcv{u{vpigSEIFhS{T~n!&EMW z@g5g6NL#x;fw;6s1jD*f03)i!V>N}59hv}_#xzAC%@Y>{LP$Y|<%ILzx8V$`QpQ_w zLV_U%S(~+SnlT5zKojjSZgs7osjlF$Qs$#tj;&f7zTNwiXFIf|M?nU(J7BOr@_PYl zN9Q^qfS^K1(}&gCs?&VY&z(ojssT_ougwSb)&+w#gmX0ht;akg1QC9QbEt7K8aKo| zq!AW`QhUwW#q5D|)4BBuAVUC#aq3;{`WRR`YUe)!BmfgR){=FisWuBJFikgK2#NMR zbE+v~D}e6^jsHQGVX9YqeEs~55utcnvuV`gs`GZaG_&T9Hk-HBdb4n~wC!Er!&I*3 z89}{3TGxCJKoUR+twcZ3RK?ii&l-%|b>=mI!5lGXn$4oXN5MJsYZ;KC?dyBh!p2(C zPIG%0aMCrN<6Qt9K!MW60)oCDDBet6?*xGb(0MLv2$m3=0x}H74miwO$@|s%2=71g z%tJ{@^{|IMYm``yqFkYgL_Vh`e>J;nky0bks>g?E_na@ z-+$F?n)lBCKM^8-3)(|MLl~`YLR;oLS`VVJ5m{O^V5(2$?;-%5e9}oLy|-?QIk=S3ay>a3uH&TwuD04fndkbfHd)<# zo(YdMR+viXn_7?wE|Xl$d$nk#&1g~0fR_fpYY@hvnP#&H_gM?#{Cv+ESs>@2ps8K)p9% z%x}HELWqNP0nM%cEBL@Hn;_5_9(6?kNC9wYc?E7%H=*3Kj0r6z;VAnTVazqIH5Wan zQT7XjX-kDZeXowm*=L_UNqv*dcb!kje_K8t*w@}qj1%quCu3_JtkTW4fO<8*+DNeU z4%RzCh(Jf{%9Tj}vBapQ#)i-BtuE6+{bC!h*z^QRh8h?SXZ_TLRTr&67>wmEh z3hM5+eM9=GepaMP>93>lakzg0)d~ofX1Bgo#GEPUVyy#6d2I}Gw3`rmCbfWuxokW()T6@;em`x!0LIZcLGp8s zwiHnGbARv$fAHy4b0zN<4asgbdz+O*w@mzb(TiU6iLA5hPyMq$F$Ef$ZgR*3UMlmv z0@o;Oz<%_&oFaHE4NmLcuJ1px4#G@5IE>pfvX+j@{#CGi5)IPPVXi)t_5OQVQ@te5H0((nI~LoiCk8vUWH@t+BUefKcN_tHLVcM#aHRtdC|&RL%T2O4hKUkHB~ zX$&jyp$s-bW60oFOJ1$7`u~SER6)PdjOLohWTR)*6jt!>eU5`D=;P3RY$!xDa9ZDC zIc-pBWQA)&F~*)Y7d>MtEyBIJ_D4(oPOwlfL1W7`+{P3T3`}So9fE&-*?~qFcyrcy zV1W0ob%C)nM*goBlt4|8B5--11{rl7Fh|`|PZCB7MzKQZJW;2TXa#w1=_B zcNycMHI(Zb@KoOvWYllKTW&V~S2tm~JexjjUFOnqAVb@SheB_xJ=aTPx2u44!H10nOIjrdl#AV@*?wB9Kjpa4X7Y01ab%VJ7XXvH~MSy`zxu+&*+opnPXLm1D6(4TRbtbgscGrTSq50}n&>(ZJLpM-_c zBHUWl>@DC(u zsx=IE(?$=0f&BviEd?_w>^8lo`~4qUrfxL8e$6#gJ{b3}f*wBi*T(&&i>oHI{?CM6 zrtv=O@2zg_UX?XubE6nkU(P#>HUn)7Qp_3ePzGlkW3*wz3v7~_6!B-nA_ zvc*7ym1#3MCEAC7$mDv)5o<3)->Gd0KDCpJzCdsgNkn3|l?EXSpnzy&4ro2@D%jbf z1~P<@&LNi3q#m6O=>0*Ck7};wY;ZO_xxdHJJ_@#2Z51t41Gr%x1*x(LmC-JPss9jd z*Fxnniq0+FeAQF)+M#K2*OfqA1@s6eHb0xFItg5p01JF>M``O^*5lr(C4&tMBRL<< zEo9nSf8}g*n3bJW8dxeq`^__Vt&eka9GUt5rCu_;F6-?^)6{&Etks1G&vUu{Pbgkj zv2pJk0Pd_Fe%p~K`9Be$;(v2DQcu>(X?acqj$JL!xmuX8>xBl~J8SbBY3JW(tzRwR zz-6*_t>@-cZxBAm-{zezkn69CIkmnq!00RHn#PU$p<z==BcFH`;`;tr_TA%h26H9o`uoJAlQX_jG83K18=zVpIsP%L)30 z2|l1{yz4*kfe*N5%d8pN@1Ex!s%3Q)DCTeNTzLfV23!C#xYxeZYXJ*rH~<@+XM(O@ z%^&*=p{p9)KEGgrdX2loo?$HPW$LpJ_}&1Dzy|ZHf|vAxO=)d!VJ(zB5HIi}EE)U0 zGPKyXR#{+nr zuVzEobl?1qF15Bg0Igt2W^NJG(K>XC_T2yGpZ-99%~>?kJzYBuDp_#P;X1!rC;H9* zz_Z5r@Vk4}RX}7}%VXzCJFN|K3rz|z?Kx;A%c{o3L031#g1J@%)_1H>{l8`7UO?ME z1n?gGX072pn|}F7K*JHUVuJIv-m}K>>0CJ^vQ8{p-u&h_Uop(n`?An}GKBjEdC|Yf zWWMfVN|BiZlwp7)9X3mExui5$Qx@f}0~#`(WfCzS;xf#Is4}~M(@sI(Hn@xpS%~Mg zvZ);vRH z{>_^6x#^)0YX2s*`<-EYFJ{dV2r-qp$9nsr(8%j^cfb$=M)KQ21fWsY-`+5&|CZ~n z&XXbn!Z_{yMg+-=W!*1CfCE_42v+jeEG(Spw#y@K7>v85Ui@` z>3yzY#ewhWys3Y=^ZJ#Af_Bu>0 zPddc{B7HT-WzrvuY5SbEtuU`E0J37xm)b>OG*9YE0$}L-()jEDp}G35bmeU@zVHeJ zJ^<5}X|%VpRDf;3M(=0L90d-1_o*)&#<^=6Pzrn+1lDz5W8XAIBYJH;T5qf(d^*r7 z>(O_0FYEqct#VuNiT(qCnhKUBgQDH*vS3)5o|MLIx%;(eR^c_+pN60NQvTzJSsBu* zJ;Qx%HBkEMgIn`5%d3Ec^p`wy7_q#Ih&KQ(9c zeOH+E#|%FFwB_m z5|0K`D`Q@Z1I#3i3hkr~u>FTYz#RL(j9<+OTdGNtcBu%xdubM%-p(^I9E1^!mp0kp zYBi%^Z~-3!Cf+8jt^2}c&QGnTJ3}Nd4A2vJ5Ob>XyM`!egeE4j+bFgi*ap7}jfMonI?;Uprc? ztK_;L&a*FQs0llJ(_X@S-48Au`v0i>_CvY$E@65v7I1PgfbAHaptU2|0W7U= z%r>B~Omyi={qxtMEorX%GK>wNrk~K4(lK<2u!~+a^TVp2vDDOYY?AY90{n};iyHNezuMp zm!Y79HrX#4WVEK{EFAQ`u~et|;kx>ttTpPqcIZ%`{Tnm3j|k8<$@>8@wBbPG1~4}k z+F^}YGlWNdOcQP&Zh$}iqK|eZz>rb}g?BXHjfFlsWCN|6hvuGjz=CF28l$1XPF;(3 zp;^{NLA+XvDs@>hKML?E`V=qaK66{F2kWga82c&K5g-EKhdvnx?X(sP4sQCmYceJ7uM@)5IAWo0e6st;LlOgAG=!~x5u0u6boW(FXr zoSjKz0)5{)$|U-QBGs$3W+>y*U`;j2+%oOKZYWbka@TEmWf*f{Ko-NCj6+xf3?FcQ zaqG-h<~nD$AYbpkxs-fe|FO%2TFGJomlQz9*D>1|vAR8TF z2!p6EhmqDD?jQQ&*&H$5m?_r_4A-d0U2olxfmfI-jG*9gHMOgmaW$0PAQr-W&ST^Q zn*5)fdfpMcu%ypsz{nw9nhhz(Vn@s`}Yn@x~*7s1ud(c|4GVx1&ztdhcW2uW)Q_ro&HKPFzTStX` zRvPFROA10#g@p141!`GlVOXW@V||5|Rx^l4VV3M5aMgvxyR;5{hsN5Y2*?G4H)Oxn z{$UjP1C^R#19}NB#+)$2dVqCVvt(e>y_0?d!f2~LsMP`gXJ8cz1N2@0xemS8mZh50 zVaiYY6u?G*h-Ki~VK6#}=agq_JxbjKwXOS1iszc2i)qt1&yf~nJ*CevH=dO}@)7A5 z=-@=$2k*BZVa>Z0G%3Jhf7IVVcb~v{f}cKjoog~zc6S!%j2nKVaRUx{x8%|gfT+L;6@6=iD%Z2|8m; zx<0A;E`2M@nGItxeK6zAvTV(>HOvWf?9htQkQW-G z+p%W&#VpdF&Ze>uB7ebbJQmP648|RL=_;x#Ua7)m=S=qdjc~WyV#GAHY zZc1$Ki~q{J*~(Owi~X_{&&<4?^PDiRPYL6HGr~FT6F~sOSEfhbv^0M=#!fWoYU*gQ z+>5D0p!MMjDWP10xrEGnmhbhcHYUrV{Kf<$YZI*hpbdd$RQY)T>Mj^#k75bIVgOiEv+9H4K^g!V z{Z!|Qftj^g6QlM9R(cua|1e~VjbiMrn-()|jHGy%bW%UjOe*K^hQxJHubgXNU z;2>-R8K!Ao?E}_GgK9R|Co7X$ywz37G0Jsg;|SoXyTTv_SF@3ceX`!Nc)Q!(PNiQ7 zpmuiZJ3i~;yu9aL@3;&=RI3&5uAj^m{pdaT#nVpfAAJwNVBSs$EYP6NU9I?<&btjY z$KUF*jBC@HXjMxCBi3?3zuI7|7!Z=u;r$aEvaM13Kf_PP0hO_kD3;I62k<&j@k<)-7*&OFr7433IZUmJKxr{Y2*QpG8Rj z`7q84VGhS7v}xN))+^4J33gzR`ul-QB>{Cd&H5uQHI*#GSWBX=H}^Ye(8^d&;-_oF zoS&lauRHO?6Ca)`{!@BVbybMk#J=3fGTCV+X0x)nCG)k6%Uc~w_QHKHeBld!V!F=G zv%$M|YBluDgPbGoTNuy-jB8!R7MHABZFI~l%wRCH`H|}Ay;56_AeKbj5HFiK< z$1v@fd;&E=fi(xf!8vUP&=MHyVnMK^&1WKCEj~fA!Qr?Qcvb`Cv5Y|b&`;MN6#r2- z2AWgvCJuzS@IbxIB*K5(TtLV5pXYWz z*x z+X_wjl)7B;J>e=zb9fKAnwh z9Lt1Bm_`91Ysxs(_+WBrSLzZm6a?17EVSM-%Z{Z!z&2af6U=En(|Gkcn0*_;LL!Eb z^U1XEuLCyRo6q}@6zmlA^gv~ZlE3t&FMVbD<^Ev;&P~*ISpm+8@UbQHaaOjabn;io zS87dVo?oG6`;P8e$VQGem!Xx+Ti^QDM+OkMVO$(uB+G4|ADTEnecnQEb7<2t`)wsS zE*_K6lQ9FRWVLwi>t6S|$HaX1()o_5B@7b6tz}H`zN~X?8P~cjN6!&1efOL1_H6%S zihUotW%*nRf(}z{DyyPXy%*z&t~9-FHG#D6v6S>4O>JH6Idgv35`>!u)Zx9g1+$Nq zsh1F0`j3`1E`@s?XfJDs2L7w>G%J8=8&^vCIShVTm$K!8Q`+a6F@oTYjxMdUV1jXz zeaL(217p#C)=$O(XaY##Qs<~(Y&`8Z7sqAe(7m#8;W9GeCLX@YgTMaWGpE6FYw|H;s2w-rD z%>P=T_`PGXUq)PiG`0~SC2LbGjP|wpR0~2D8x15lOSOJ*WvzTn0k8(6ZTu*8G=S+^ zz=j6HHP-=(1tW(*pE(V*s%gJ#%ws^GwMe|%)u1z zj%J}x)?L;sT2ePFK+JpqN#lF@d|oO)e?9$uxC0IIYXzZPzm-rXRoXWi);;R17qz~SgXWuM@6zDRa{{?5X36%+~d0zcwyK$|_yv{vE>fN){ zY|>|$zyK|-qrK5T)q(;cdVZYmi(!yO==q&N^!$5eqrK6YXP$W-ubJ!qB6Yqa-`{h@ z4lTzWciebt+46`W=l2h@Vbj~2biC%mIq_$n0S$+K0s4))hlTO0W!{fibEA~$8W>GM zzV-T%k5n6w;gkqK&yBERt)H0r_PNl5r{&!12Y?3w&)gfk4?UVFOPB_0*&o1Zj(ut0 z9`x&^lTP}n2&Kn`*8W`P^tIFWV;Yn($2{RV^BtXOu(D<%AiS3@SPO(;OtVk-q67YS zG~i$93Ys!BhhJ)bzZ_%je1Q&(J`frx0CYf;3I7Dg{@-@dtlKj%s!Wv6um64Td*2a? zm<5Dm*U>x{WGF2irkhg=un<}Z!5G{jD7#E4K+|`13@yPbz`K7aNV$#xZ0ubRL{^9P z)Yn^EJ65d52trKx2~y7KE5GX#eWQ+;34KbKau5azI(d$<6FX>}{xd$OB<9lVgqMir$YnFvz5)=cWzBT%c0BxM9P0nK zYWFpf*u@C4IJ$mP*VWALJa<%=q2*!_cz&b%n@83{gVT8jbEsA`K==2*|NZ)wP-LtQ zdCl`ylv+_LU32>>r6uSD>zW2iv~G>D@ln?SU7Lo%P1RYt)A$^n7o~$$z?i?as45r; z(9?$Le6tn-aR5K-##&q2mR)ZJbC5-UG&Lw7x8R+=Y|AICzIYrrm7mOQAB}6& zrYZqe=1>Uq zB*diI9{zMXSGJOXbisWo4AEV)N&J2`m1~4SKOZ^Gv1veqdQ;|n#^mn)VT8UIB0CS| z#&r4|Y?Ng{i`qBCLn9gcTutuyYHez2ThrNL@H5O|wU%Y}{a=O`vTuX&|z+^Oj{2Swm@io*z@$KMtdL<$zy*od5sX zk2|ovv$8p5vgEt3iyHeQMvB#NuK!ohu&;*uV|(KL+*P)40n7 zk$xZfUVx#XLe^OOfhFv}u7R1hxv5KKlK@4RP90a#2YJ?9=D7Y@$!uQ#a+l%qVIH6V z{_c-uTLA?C6hYJ6D=@aJvV85-qJPVGn9uruSccXp4&Tj{X5VT2DAoh$%W5)b7+-VM z+5j%O2hB0(xiqPZw!L&M#d-6j>!-XGcO~@0Ide(CU2D5>vu0q_0W|IUNdKWVzN0fh z)nku6)_5+6{TCYgi-3lFKioTWuKl)#%#GVkq$V3}(Xf>GFD>7g5{uD{Kp%buQMNfm z!$uP_iEup%Vfo`7;1~ZU{-iONd`p<7s{k4@M>kuO-MYV&et1Ke#FN6rFJ#ja#I2iU z5qv(Qn4Fq0+vv*BFHK|FQu9K6PRoQrDmY;ibe;yx=57|~JK91h#++l=`TrAi-CIpP zO<@HzG>g`;{ejk~gK$ltE@;uXO!@{*A^@nfz$cKw9zy8#{0hLBRX{B|iS||&}aIxZY9VDb)#smfdVzX|9;lh1tSn%F+%edBY1fZ z2Hg2!s;ZjV4^8f?y|1uL2zPz0lrYrXg|z!~v1IW7D5j|b_l?j1LNSKALTd$L{m{A{ zr85=4fC}D0TPl>g4}j3D2z60V8e>85#bb^+Mm7Zj4At#D2&C006GAE+02CU{-TjzR zhv%b*+UfT)I_;m*G_=pVRbXkH0_S{pIOp(twUQ3^YF|?V8WZjh1Y|c_@YXdQ$e0*#`ND}435_W8YljrP#!8_Pc90Hwi()#Ls2VL^>r zI8?)H{3Zc?STcClgY)xgISPFI$lKrk_BZ7I8yllo>kueLgMfVnc8s-mKQC);Z|1?R zra;3=G`JRrz^zB5jz?q;otl52^`7^<=c-eneP70E@BYAm0tT!;00`b~2s~()zEcM0 z+Ly*+X3=nvrE~J^v(NT#L57|y5ZUyy=5=WsAa1zM&HYtB)7mh$>IN1n;-9F~oB%ig z`S4DFRscekKV5I=r+MwS#%39~O3grq1JfD(T?;Kdsl7*^+Dp(1G-NcjayzE?ZKhlE zE-2$+mb6ur&d)6e8nPbd0mT6XkI5Q3y)=6(fQCKw3tS@-T(iQW|1$!=%Sy*C%oyUb z7zT74!h(@}@lJ?*e1|*SVLO11eN!#xw;~X{NXokS9Zqa&WsYkJVuJ-X_@p%?6zH>p z4=vS+ATB8Ly*q?PaE>u6I8D^waNL!3G27 z+CIlnhAG&WvL|hI|8a~SwwlPTv&;a7Ss4OiABkZ5fe0bT%0y#bW(|Cg_k)uM8Ba#e z$r~qC+K)wRe7~%tUk2P|-CQut7N#1L{k^PBfX4_R5PCV6H8!$Ffst8%4M^vIpY8$T zE(XYG8r(%O8Kxk~Vg&TLZ2APkmxPJ?X0E@aIxu{!nD`;r|5)*fHW0?pYi* z*0V9=81V*PB&0Hj26VcQ(2a3y&_nm|u@++iLl59UFKCfz5uIlxp$;?+D2>ixLe=G6 zwb}ESDmNJ6Q0s{{Vps|0t}RgD{4mZ1Bu@ZErm-cv>k#l1tpM;j^> zEmvxOUm!^RjjaHnK<}HfxYig1V*RClpo;zgY`9mS5uWS~O|AI) z+5+qWBuz3mM(O8A6=VqbaN)G!x6(%s2g=y5!fZArXX|UxKQ%d@&sK~5u^yeDo{eYTs#tD2tz=#7sSDpKt{rBL+BTV) z^+m>c(_AN3@Gn_&u?YxHhsm)CV;W`zewUPL+Ug%0qOpirgn4=)H-#M%*?(J}KZx%3 zuxxS<$s8ZYWOy+Q_Z%j<0)vHW?%VJhdA*zMas&nwkGR;JtCg&_acKHHj5?pvKu64- zMqwDgm}fsP*Ip^l`_+u!k-47*#yE`qD0RE`+(hS|%LY6bALluF`_twg_^gY2#LeKl(SFH}Lx4RPn#J;`_kTXeV;vEYE|+zBpByJf zAio~>Rhm4)_Xj`t!KO8|z89O7q5?H~piN=QXn?plF;T}XR}a6BY>Ag)shK^$hwX3l!2zvHq47lsiE7!zi61_TKC{xtqJ!rshb*oze zH@HZMkHEr8-878O+v8o^poN4E0-@&u0bEb$_x`T;%(j!Og?AZ7e6Qt)&sumDKyVKs zqI`vC_7hNoj`k9@H+ybkY+N<2c8|~a+{bvQ z{e<+z%!@hwRE_Wo7LSu$%d+9J0sdJf2tmKUb=J&fvaNhL^W;XUe_sSrft8Jub_3-q z)GYT*bJO^?Z3WOeKN>@$AWQFaojI}Xt`pPe?|NQXe=nJ1co_7d>yTiNK5RsK`_2gf zs&NK_na>?(=g}AI9B_t4SgYtA_p+vr-F5}pZY>ppjjQ#gf3v@GS)mLAHlyYC4FNV6 zxa|f+eITF#`3yjRxLGxfDyJW$Vs^4s@=gQp2N*vy`_n~y-xAjekuSTD*IL|%$uTh@ zU$e41N|*=C7-CJkMccg)W$|Mo4J9mH6vBAKk`vDH~Ied3~CC4)y5#TOy z)>&sA9bx8rVXS{K)=9qit=Fvq*g(V0^?jyP&)TLng`%c8C5{s2yf)@X6AEaNl?c=u6GYOM5CD_^rTbBlr^{JXbrJ z%lb`U5Hbl8_6xL+7E!w~pJ)&vAJEW%YnW47e)VfN;ay$coiH#IGTV0N9qRSjcm%bS zXc|v~B%r40K^?BszPdB0d%4t!em{_3x_Ar%IJTc1ZL@uHBtUR2F{*8KzHxTYTz&61 z@o_xgwVP!jsNLF{{kthe_hi5Fu0NhWI`fP(&bW15@&aNl02o*#w2$}GCcoFmey%}| zVR=1&pmedZeEF3Cai2?{&1Y_$8yAf|_Aq^{zJdtLJ=6RJ;+aGC*|t*~Scf!NU|o;Y zX|CZx&3WIqt1LUVPvZL;<^%6g#67PJIlr|+7|7_H;R#gZji zQ>=M(0R3s2+gXsugDiD1LEnLb)|qt*Ox4%jQ;c^k{>H{4;P_QTXJj<{OS0rvxHs>> zGS+uJ_FHy9jE2Fp{<}YHnd`(lJExm-1KRC+1ov<#)vg37CXg;>^S~U_wtXp#irmlH~(N?92!qf0%Lovt0X$914)( zupir5+0|uo;)y4YQpT8?01pJGjn)S28_-MXGs{3(@P9Bp6nXuDe4=mPAZzibVvc_4 z+;g!AOFxKt@xSH!H?x-S9bx&%ti?rv@DfL$OdY|HFpqH~q+WvWD+UjZ#>^AW{qI_g zHnV)|9UZs!SrO0x0s+t%g+QPHLD3I%#q|X>>(4xJ%TfoLL2z)b@4a3-2u*+p3}@Xm z2-4`3^9_b*@8DL_JofylwcRsZTVcXcfE5Vie%GjrP~-n$ybGTWzgNTAy1b+B)n*UD zlfLVU8e8|)N~3^?J`*=W-vflu*J*&duX0_>byrB;SEwbMwgw0Wwg5-e(Kc+F@Y9$C z>1TAEFlH`|rm-9@nQ^*xghB1vmvNm>8^;B8R>>3()1xZiTt&0G4*xDG)UTJIkmscT z_SS_)d-c^yE+gi*@i4#akLHs96+nY=0;{{nEcFU%%v%{_E&rg2xlhzm7 z=6^IDEyu&6Gide*T>;96&H>_Yc9?<;m7zQTR%21MX~6R;i#>C6``h1sbJAPx=Vj*( zf+!bgI3$qUL%kFsj>ZY$@HsctoIf$ApW>RNI~;8=)4p5FBql{;Q#|IccgqI*H}QR) zkNNZ@-$$5Zo7+%x*0gIql%fA94PZ5oy|2F51?y4>4;Wkw*T+KWuMqV9%3)l`(@Ycq z225kMcn#u46EMjpFfx95&cpKgPdmjOWmaZo1Iq+clfbRZ(kfcj4b&7&%0R_Gf9}5b zz3&)J7(Caxk2qEk)}EZT`){nISRIMt52OTE5|r|t5RW!5i215qbn6KOEb_NrqHaO)JZ$YS^!{xR-sQ7+&tfBedL+a z>XT~i34iMGE;N#^7ykh;K}$wRK{JQiYc!Fd=-nGNz7`lu8Maz|wT{xzx|s3ZZhO2N zEq;SD`fb_0uyope+OAE&ABX;8$siU->iMsX#Z3loXR`l%E<)us0ub$s27Vr}Q$e~G zY)gIKJ8qtH5JeqzcL6f^-}|dyp8`520maXYmVZy$G~cWgs{|O@uij%Zd(c?@)66Q$ zY63zkf0|&v*NTPACo?CG%y>-fU)|>pq`(5io4u;$dN7{eHSIF5eOg0+I(@z^ zAVZ4ru(wktSfhkBYus3Gt59)}r52e5(wa$PQ!EHF_Ub0k0v%ZxRlXqLnhVBUJJ3Gu znq`vMz@i_U{S1xAhZ_IvNi4m9K+SSwz0GHw06@n}2Q8TK7G#FoiDhn$u2PNDupJf+ zTaw;#xiWtci?k+U{k|H&q2}Ygb_P;xQE9NQFrJHHQ0B7ffBeQbzVWRDKHMfVo*i38 zDTClPe;elL)nOv;3#4hFu>u8%GNPexi|`j^uVCQt|Imc_EpK@X;!PXr9?ULn$U??v z9PQaZ#5DUPK^qhO`G+!Izn5!|o1}=<5XPM_u@57ipXO6AVxtg#O#WPc|Hl;1Z}i|l zjt`v_n17#R<~lJeheDaG@VoW7(M->xV`;i51%t)K>4rDFVFOZn_GtR~l|=eKCTsD7 zv2vgZS`2t7hKk(e1aLyTbvkaKL!bd+9Y}!5YhL=gRuu#&&vO2?@XgUJ}w=Lttk;Ftil&xs;jnTie4T1K3il1_Ft9XNErnCKUbX zowOUxCD3XErdk_}OHKSUHvadl|IU5?xHRUWcVXuLM}PE3M<_!9tblU^ggQLa`3Co0 zM^R@3cgloeTpKUQd}@}GQQE$@zSe6r>m6py;I^lazk^TM-{k|dX%8_E3&{OVVsv`CyOJcgCS^GWzesAO5g&=BwZRMpL&fLgz4etMO^d>qDjBPp0d+ zeY|P?TsH{wnY*g>iAU0>1YN(UShJhfhQqm3rUTqrUuZwN#kvTniN{1|?NQ=`h3?O1 zTm+CmE@O8%W}vvBKhw-;t0C%@e|L=XZ_|MWLP|IDb(Cr$)&w*l%3-(&KbV_Y5Xmhl zW%x2y(x%O2vt}A~Tg*eW15AJR9cIKqS*;L*ae82)xZgW{C9U3KgoWk;$0XCdV2=D> zkfBUr*T&Ek*#GtMZM+7|60N~FsqWNw^=Qn#koEM{Y`SL$MgC$@Q0v9|5sU}ApY~wj z)QO45sA~%b%wa=tT>lUM@DD$OchsB+7>CT4M@(hmhhyl>X&t0NH4MeDo>oB#|Ewi{2OE(kThryV7fTl?0%wT-?A&^6qDF@k6T zfghczpk7cy09(SaJ=Z;iRL=%N_zexBu_Vli=< zE%PXX>AZJQ51Ldnef7Iu@xBFIy&u}if}jGqwn}S<9#$xIC`;WgN)sEyq2}u>Gk_*_ zohTsDAe!hWAV)hC8grmST`*ju-$htYs!w3gWfNWho9UC6=kf6 z`j-Ol!}T2GIN44YiKuVl>vThV9q z3vEN|eKs(p)YACNV-pYNy1Df);?6ieoH9^k9$xGq*TuGL+BY3&;OBj?3$~`6t1UKT z6W4QTQf6gq$~0Q@LKv+1Fs2{obBQ_3?=z5LT4>`;(J*a498JuZGq3+L|0AI1<=jKV zaKALn{0Pe1obnjzpSjG)1LPjCWIE7JQ(I!yd(2s*eCOPRUw5vXWX$&ll(<8xd0Xy1Tm$#a%As54t@0iuZ8{5($_>NzeK?G=Ss~PVSO=cbi`GH zmIzbVKyqk=wd|8cLxBiB$~6ynpdSGcT|;=TS!>PS8ys<{Wk;`Ei*}(E1Yd#?0SU-p zkD$e>n*z-;Z5D=;w!GF900sxkhz9L*-|yv~TL&z-NPO%k0VYOhA5Aa1mSCFNp`GX< zQ+ObT`k9$Ci9R1RVHu)b&Cy@MSseu{D&RSUJcX$@-2k-Bbc{}$N zrS2rn@Dci}ukSxoZmrk8OJx%d;Q|$>oodiVK=UPm+SPrG(?Vo1CaJ}~a2#vGnX}|sj2%XbZZr0dRSGEc%wb&bGtCmh3QwE&8$+RBJguoYVEz{TG54HHP)YAcNupiexvnzXW*IwG;Ft?i z%G!5pZM1D|IuuHQg#ui5CHXGpIF(q{B;?wy!S#iCuKYjbATZwEs(16KW@1iZbT!y5kRR<`psek*n zry@FBN&`p5%xN6L4S{_AbOO%=&i^^5Ed~t3Z%lKcUndO1)AG~fra8$^4pIG?FjET{ zOAIe&7<1Vmk4$i@d9$Gfw5a(RpIXclM%d95ZUhBP8Roc}O{T{PSAE3iH4kCu_Z+b3 z5&8cGIe-d_*$76mhs4Zq?3oxd?Fz_XBk(@^1o@2ca(h6-Y~9VuAy}*x4AHAH&z}}| zf$zpD;8@lK&c$DRFU$EQ^sd$jXyI09VxAY;`-w1Y@5p+;EXx42BpTc?`cZ(;r!|T; zVCo{wqD=&4w4?zU(F;}#);hX@UQHs1EkuwWM*tl)vjl+}O-MF?^XW`7XsCzgpWrL7 znsew7YXuA?dWH^h>rih~N_wVG^h`bI-6YKCD8ki~LjOLK=iNHrwYv-{AVP3ILcezb zPS}Ig(dRVNgHLTH+%}_60}0lDSeyO_AEHexKos{@8>%#r838r)(frVl00y9h_VGt% zNihLFsUp9PLZ=se&-jSH!Gxp*5c1NP?*B?G3y#uuiW5LhgY$O3)rJB*gk->gwyjeD zRaXPFq3P&*tyDJDU%hqYz4oT~`iIM9qk7Yu-gLECXM7-IdgY8wP1-9N>f3!4=7qrTPG+saEehDz3wHg8J&g2T0}!`iu) zEyM41bwzKiQMAsSbIibo{aESfD|-!|6TN1UmG$1ZBX!G_vUV}F^%7Z!@8?1>6}mT7 zINt73dJ};BqV|@8SF62ujqd7#z;9ZAZUxZLtP^W~ftuGT6_8eOPf^5e-53t1qR(xD zAp{GF1U=4o;mO}QCBmD{SnsxC9bkYj9rH{~4yN+4Q=kFkd`t++H^T6Yvq7DgYxdAm zVWRRsCLa1*jRpc;6H3fEMnrv>U)N(6jSYrQ-2e-WyE;4@*udgs?-Ye!%(b#h$X)!3 z9L(8HpcS1m>lTz}W5%?Fpi%~Ygb`0Y$JR=9vr*DnnU$?9p>w5WPmhpzD`{(&vZierqV7qY49G83k^Pm5`d_E#; zcsvc%xG&7yID*!wE`^xk3UFnZE5y>`6P9Vy^S(e#*Nz1L0{{?!8+U;P6uP563?q6Z zjU`Y6*dXW{;f>{ix&RH07vbJo7ob~cB4OS0oCh*Y-Nk+*v}Qh*I{eYUx>H-HaXeCK6`(tNo{=FaV-Rlj3Eoa@H=;fks6Liix>fUXy021v8s z^e*cJ8EU}-WKo~@EbySt4fUH(-Nx3~HBQ3&daBkzZ+`Qeua!OJvkfHLctrtb9^HB} z=HF?c&lS==Hk~s?h%qu&0P;W$zv}TDLC09B+kR&*)$O*o`)%8W#m?7^(+p(TrqcOk z%_#*s2O4@N`^%iSE@S;W7h1?- z@Yv9Vhf{(b>Oe!^E%fQajX|?Y+CJ>VW%_69(_n5o&;VQ+e6FR`qM-z~i+i<;t_;*H zKEo!K`m9Efog91Yv4V{;nPvWox!mYrX@^1?>9+LQyJMbu$Mn|(VjJe0mgc(*2tsfL z(0q58`90aV_JvWOub*=@kR>EcTFvvO?4nu2EY(aDBZ?`u>G>Tq3NgkU(^TeJf?iFc zIh%y}vME|G-_CO{l=|)+EzfE0f7Y{}HQ{OzM!wfHTC|PAI&Ir#=-#Xxs%5A}`IQJs zZwt`(jtI!7W!*hG%+SZ9*}rBOqwChSAZvoa{rH^!qxj%IGxxo>77tl-gwDmR>&XUg z^6IJO#3MtCpB=FBX<4iHi2yu5^*>&WKtESO+@UnqK{fWk1ZMN-M!?5O3Q!V=@zUJ$ z(g^Ms4akXZj4;;#ga$iIzW@%<2K0xOK`jt~pPpG)2?8Bvk_!dFlcfPVX1{lx_7Fq? zIPNmg8@aDcJzC`63S#dZ##{TE#uLb}kn6^I)~f*Up{r-++}?ZwWnK)My3?KRG{>FIyDph$Z=W8R z@;juy*XA9MlC2{D19yQm`f?)z71mO&O#X%g3@Pd?&#;(&5wuhw$glS_o+0CL;mo~{ z=Nj{%flA*UWyY`P{9olz00Q5g0^Jh;RNKDvdG0r-Su8YFYlR(sXr87m<_ZA9y!4xU z9j@QDw3gE{<7KzGbl#dv04w|w05@PWOCodt&udMW_d?q?GzINo4i@xu_`a)BaBAl; z#WJ8_7&E8uXnk6@)}++yv5MnX{18CHp)6Yrg2kIZ7qU;SGuFa>d5cBTI|F3wD!!!-itQ`7fxB;Kdk~>1?gR*8$%bL4NgiWT7OwPX- zP5<67o{M2h_e3DNaRkE~XRUoD!uf9`*y8H|4ojGejk0uD017{Qef91#@Lilf40;AXb3v2ADrq0cb-lmC%(*KGBDT(3hv?zJJV`zhGSn2-D~S zI)w%R81#ex{Z3#LC=zpCSFrR4A;0lt#BM;Ne0L83)j14iL5s$S8382Q)~C-T!Et>yv8OHPxV(Au9kwi10jZC0O*kXJdp}msL~F z!mnu(Su%JgYp(|+nAybx9=|?qBQQUHKYQh*Kz)FsOXuF#=Xp1)+ghwIM%ro&rkNi$ zRLIy&EoniFSSrYXG?%e`QGV99QlXboyt=F#83XfVlE9Rg%l}_pQWbZRYi8Z)hdH17 zNi}LL0b$0hTGD;v6fT4T-OO9_*u0gAU}zcJtSH-V(J(99R|+FX)0fgC-rJ z07}t3vQO9$YaQXCH(V&*LB)INp9`&l7VFnlxlT|xOkF|W6Oj59ssH<%m8EejfQCKm z$n8ATBCHjy^DK+b!rYXNa#oHgx=V{9aMUDB!YE7wllxEQ|Cx}v!t@+ytBwwX`rvF_ zf0pmGhW%an$Q|x*hs%aRe||QOyJK+Wzz@;gJJr_h3p33m8p2yYVrI-X8osF34#vqE zFh&T9wYF$Fowt!rpv+09Lycu|ae9Q7WAlFc7g&SN zH!H%fijZ$E7`v>I2>>pF8(`~=RZ8W2*T7!|RKIOB!Z*&iyrLjOK)rd^3+8q*Mf^<6 ziZ2)-i&lB0ZpU)`V6!&V*BMyvTmz5Rg~(VE99`#kbI80gr?hoe4!=^6A!`@S7bp~P zYMxm4)}y)Wlc3Bx3ccBo^q9jyq`*{j5Pbx^0y$YyHNy^I1HgeUn9IAN6wGsQ5k`Bh zIs9eTzC8wQr@*qGP>8ul|NmTW|72X(4rQRBeRSkOSe2c(LX5mt$eQedo9RNa6+pw> zLHH*j_GR?YYy@eU3*hj7`Ss7t`&LyZC!c(B3FJ#xSm2nedxW8W zU>KpJ)34W$ChS((WPTyc?0f_RZV)z}ec6o0A<`p+If4XW0dcl=oX40V+Kmv8m}9PN zhBhW#+L!on=OExP-R1v0hbgQUs6-y)rR3Z~81AtRFCY_>)~EUX7Pq*?Ay52gWmalA zfF$~!;|-1ghYyHg{e&x|V4kL07@E>aEEzDO3jqj^iuU_10Uho#4XF5zFjucjK*^7$ zj&BT^gH)q_RtReb9xANfBFhhZwf0v#=`#juMZQHuxf@A=xBek!By-bPG!-6V7u9rXV5 ztR{SSuXZUka;(B=kkX&O7?A0y`T5r${NM*)AoZNP%$TZw&PV3Rr9!`t%{v%}h0GD@ z-WtSk!`<q8QKg(|Or9_69upe17^Hzb}&l`%K4@ep$%7TXVpLCu9ulf%~KY?f5Rk zLz+K5nvvukx&E>lyX$9P`$5{Y7g$jtv9UGG*8qmbZd3j2XO_1+vlJM^D@pf?9{RsA zI|#%0BD4X0L%Xca{eTSW>*tCtG0r!`m>4B^InS_H0Bi-{MIRd@OIx@FSp#UzZYkbV z`&q`Km)0Ijt@dyGmV2CY6l@s_aeD3oXvmt`c=h|vC_^6l$ibd)AbERfjE3`a-%7y^ z1-+#x9OGd&i*MfwpkZ9bWgVpfRxIAt)KQC{wv4(r^izs_`nBVI@+8&=KRw`BrYa6TNos0`a-l{ ze#RvMJ#3%IR^h(8uRy9bGDGaz5)1^K>3CFM{K~ zsY}3o+>QvQCuZ%Pm|Wr3;5ms?@b=JJYl^m^^nu_!Cg`sda3J_!fPz2AU1REhm$-b4 z!xWzz0ef%F!^;2`d?1|Brsq7`KaZJ3D=@u;a7?vxb!l+kcK`(j8I7Rbw{HMF0hQ{+ zKsQQzfdTYN38gniGgJBbVudG35H!t{wY5DX^F|3h;DDekMK2-g!zxKUxL8$#GMF=YZ^TqTZtH96Z)a^1aFP;7Ds~PVLOtV%jj8i`Hk&jTI zn6vgf<7ggkYJaC+Iwu{oVCLIU1|Vc*h5}A_U33AEz%>pJWKPK>gVv!%eyiEKy87v8 zef@0R6$q=@FRe2deD_>IY|W3-N&J>)H#<+kVc+rN+KXPGbsIWoOM`uGKv7pMzM3_r z+04*%?eE&~zGy2DWib{dxy=l`1l_>kLksPFWB@_$Jj(_IGMe(t~zq}{I77rql--G`o) zVFy|`$D)Jg%=H9?x^a||bxu7%)${8Iz$SPnz!n|E+?Uy1oGL!%@}BeQANPMD|Gyzj zGCKIMwC#T-hJs*?_5XM8cXI7fp||?%Yl&qvzZ!p7pptRX4*j66efu_*C)~7BcgxIa ziV5#;&b_pgZ8?M1C4JEVX~ypiU{v~fG5s>PzjTikfa`C5Xd-ZJT1FOvqj3g^5gh9VW4>CSn^794q<-po4i^q>-xPo8S^0lU!O7Bs3cAJsO#w8a zB~_ZDZ2+lepi$~hWnTJySg$qQ&w>gC4e@2xwK@xKQV0o(Yc6U}K{NHS0y9tB-joXJ zlVk{qz^B+&!`KvL=5tAdH~%pP?7i z)kp09vQ$Z{zb`H@`&!46^_-8*1`vj2TY-iwg!Ni9xMy9i6Ba&(0uqR!NSUF-2UmomPCBWA%^Mvt)xJTZxj!iz;<3@j z%p=@lFfg5(ri7cbhO7gdChcD%mg8kpd`H+SEL1~hvzrJONg&C0j3U$TC+4|KfNAXx zSwwkOW@Q~^A!fD(2KTY{aXjQ95BbTn&p!L^5n>({q4a`TbNtP%!+jAXxhV-~N042x zAZcH7?h0XGpPY60WbRE7=mCsRLkp&W!xI|0JT7ePnHaTiZZi=1q^%B1_Mrj4-0uV*M&0Q&rI7+ z&(}{!5Ir(&|J%HWbROy&0a!A269ETP$2%h&JUX=V8)VDX0<)}Nrq*VY-E5s%{vrKK z&|eI2HJ9=DVq-5Hh;JBbEnoS{SH3&K#uYQJive!tRtSXIAf5yh?k&JQR)L>8;e-=v zE%;#`pmG1aX4b)JSzk9wA@C7&&i}l@4Q?RDh`GF>83fWN<|6@%rIB@FE;bPAOi8u{ z#acB6`kuv^en-1lfTCjs`Ko1iZE2EuS2~t;ZLK%xEX_OmR|Svf6lfTNrUeV|U7pSQ zl=Y~?b80wrLZ(hW1ltZ3NIzAk8`>Tj*!+h(85n z7i9LXwdRoFh*jX8xCq}fw>~BofrpB6b749sS-;KOCqk31I^Cxha;&<;^;umfc7hUc zQ-FpByX*ILPIw*O^et;L6|^X_aUk9p228~aXgJ8ybfMYc5gGlv7^V_4{QYQWPIt}X zZsme@S6ONWQE*3)vExFZuawQ|83Mm$j4qZj+nXhb>Bhk93-de%8ZbGv(b*Ks@Yo~~ z^xSW=WimWrP8z{rKKIeMd^jlkn^X5`ITRqnEb!;7%*qPuG@wJ*=-+cF#pRztYHP@Y*dYS}B4wPm{UDYp`uzzx6u`+9BbfY4>d_V%I#@E) z)OeJ4RR299tp0r3@~{T~T%iCp$^(7Xdt$Idi`Bhrd71R3@gzjB-kFPK$4l}v!R1$@ z5Mn3&+yks9`_%I@=C{l^O=5{K*SHM(;X~`=Ztt3(3WSeZ!b`HaxrS!w_RQ=5OxrG& zF`We58fDMK@0g1;&Kqhvu0PDXC=cp>Wd7(6r#C$&#Nkqg7E}GKJA-o_2io+^Nwm&< zX+|x-p)C|_Kq0gNjWd@DPO1xiA~2%|Xnw7@oa<3uy25)cB;4!yo`LVuCN$vuIq;tM zyhmO5G9YQwlA}-VV{JpuK?}8OL#-K7AHdZb5-8WZZm3H}=eYe~X^?re*`9*_S{ug5 zvkBq(?);+x4O9Me*DJd+zL%K-uakn&*-x(@@KYZVg4d4hsAmV1O#vE)rHsouiE~p+ ztz~m9dT7ET3{Cs8YqbG8rPORTLMj1uUl@kH>C?Y}#L=wH1kPEPz2;zOh{YVe)^F z??=lh(uYRtGdD?@jrpw1$^py1q;DLtM7rla@7Z_@A9BS1`(iQwzD+bYj}CKt?d(%x zFc7vEV&XrJU?nIkA#9TW7jpfa;Jf+lnGuR^mV1s}MjMPV+|&ItpvJ=f)@igsjoI*k zm;#>@AOHjRWmSa9`-?Ej*NI8_Ldtl!570Pa#tC{&Z%Lb0O&Wo?87CZ=WP&&bS)2IT za&Z7IRI5kGr@?Yg-F^cy&@c-ShN-rXqf;1q^H8ODJ(5?G_J}^uxcW?=GA7TM+AGBem*VRhpF~!pcOS zX1v7nd1U~j%b#}IX)gk70UDnCe~oA(Kx zoa^u^pB|=P&X`~0WiNZ#=cX1jU&_9Bv5XmkZlt~TMQzR6+ptUmO6LfL7@^ACwioB! z%#sg^IH$As82ATpltx>>avv>g)jeqDOVP2*K=h0Sc8z4aFM{m@R zJ_y8(-nhRM+i&6VRZ zco%a~b|UYic&2k35WKWOc+qL~de^2_*1z7(_;@w|NPh^bJfZ{xz6M-j)$sZ#z{b1L znmT=eRSIAhl-!nZYdX3(>G8yDQrF7n_xup(<3iNu z!#p*|J@eCj(qv{68%0|;AB`WgUojYLw11G_5c6-`|Ni#}F3_|t%m9X2nU$8ct!{i2kCSLP_XasF60IBw|^8U#2n zW_58f&wxe7%WoBwDQ^H0*1w~mSluBM;|;_BAe3&oSDlL3Fof&G!2))nbAS!jHGnVk zvKdr1Ea-ioZB8~AFi<(ARCHB$Y(C$YA z8tknBLw222L;BmGnNy!V{`li>((F5#i(ko{*keu|*fU^e(QvS+mwVTG|1kILESSy) zmW-uEj?hhL2&P#IolbIU6sYSTr_t)?)H4GZW@T13q%@0!b=sg!|DNMfVV<6l0FloQ zqjw6oikx4J0J6xXVw(GZB$aJk5+*U-{h`$Hws*bjT^Pgf;a{_MzaD1rn_&?DEyB{5 z!l1oQ{5;Q$rPF+9!*Cr>5>%@U+MPd{lJh?sI)BG%i&<5a{+BUq%1f357;?gT!HC9j zkdh2zk9nr0WfJbQe#(k-m`vAIuyemsO9z$@1TfDd0AS$#UWY}E<3dUfP&p@vC z15C{ur;PF6MN|57=_B`SD3ib0CGYHgy}!94rqg`(9p8c1iaCF+Wh^<&laYRS`O9B^ z=k(`k0U6ANNd&af3YG<)S#XD7wh(ZAK5h6yPJO`nfqRkf7n%ZA-_IECjplj|m}Q<3 z?95m5sn#zWQR>nGtgD5Ox-+MIp8*XASFEk3?X&*SmC`2X8lcgb3MSg1wZ@s77-1Uy zGKaWL7z^_kpn&$c@BHy=b}#GO9BRGRc;`;j?kei};0HfQa97{?;~aX7ZY}3qZw^uh z0lCcM^MiMP^rIj3eBWKe0tS%b8B3Lco!=|DEG%mQQp+8gSJ3cUaG>ATvh&_^gG%2O zu%eIkKTsU-U~KTE`WC>^*cCvXz0)ieKb?2{#Z>c&y!URjYUlucetIZ>bCzMP>B<= zeI*mN>2nC7P~S-iX}>2tjx;hlto7a-eHzlr{;KYG+oaN^Y!L1%GXUmI$C**E$us6yf0-w zOy(ran0Ps~v`0>l%jcl|$7Iv~KPvm_SqXM_r&>HH4}bW>3m#4YlfFlL_VaIe!yCRB zhVMth+@Tla<@WC~?9Ta~y6xFC!I)o+xU3DseY}=%_LKS*V_Mx0Xu#N(fo+B(j4g)K zz9R}d4I4(Y7K`F7IHx~o2;Ha73A5U0A2G~a9e#f*Xxu;TcqPpwSB$Cq17?~l3SQ++ z>2vWHnAlgd_r8D=?+HWu3Gdb{SOf*_bM&2!kM?2Ay@yN}p{J8+J?9A?nKt}R-t*f` zVWM>4!Jb;Id>0FmynWp&Db_Y2eW`qr;Q^mNc|u&&mBhm2XcY+F!6SLI^$P zCIQcUH8(c0GGRHaA$4ns~N~}5XD%dDa`Hx4QORe@*T#u7E>%&n%O{~_Zo5o zfPf$?t_;mO%Yp`EbgjB+-;JZ^m1Y4w(HBCw@$@Xu?7VD-o@v|_-_fmRrKnXyv+I~2 z3xckP{){7lkAPF^ZvaX3#xp967VvPs@7wde#`y*t?QfpnxHR55*;oX!)IN1Iz^-?4 z-KGGZ>aDydrkMRJ?+p;Pe$hX)-e>8seQz#n6_Ea8yAWh(VP#bs$kfs2_p#nlIJ`XX z{3{)&wUz=6+a1GVQ-B7Y(z4zT8ZtE9+*eVWiyPyCz%(-J%za}0r9NoP9xZqpmbvsR zCh5*ot=udi;Lb0YIE?vxtQLGnbpCRBJZ{OgK!~}iAM3vDBv7+5D~C~;SZ~pgm7e}z z%tn~0+XPIwbLi}`VNNfXJrOfJA4VC|$hu)1?U{QWqWKqW$7GDd5YI*Ex^=X5-;D76 z%rG*qXQ{M=X0vt}qZ1L%u9N5eYXn?EnmR{i0J|U1%GI^88Yw~(rn!4?Eh3g`>Krt= z4%gCPX)j=)S*DZ*ViX{)On3`{)$`I$hyO9f0FMbxcm#}v2)9=f;~@3iE${woY2#0; zgI1iiLxhFV)F=Am>Ej0o*4g@#m7omAKjrwz2!eNs17C@-eY9)<0vgf$CcWY! z?O*B~r>&y~ZDb8XgP!lK#vY&J=sfQ=sq^<%5eQd zPQ7+|zScPnR{n39t3U}N z5gO4sNq_|=G|N`+Yhc>xT6QlwhUSqej2SBfG(&wr2;eEi>Y6VR`W*vfD}jD&pLuI&I+KeI0d#G?Hgc%>-;7z zm-?+2>qeFp&qs^fhpY|sfqv5u8)|h^3#3>pcwd08{?LzrKVXn|)UKwP)o#Df`5sz+ z_0(~PRQ0xi(YrPCUFl%I1ELMs1JmdC$on0&#(C&vMs~|QOHj{d&?j!_gE<{YAtsC^38OX4!%D!sR95kpwQx`0osX(#7 z>}uvFF)OpOZDnz)vaE&mR9p)GJ3W6_d92N`!Q#`Wk(IdieQ}Yf14F5X{ zel+d}P(xkKw!@ObeT|dw;ao2;;5}03oVIYu@C*gW3OHbWKxW&ntU#&4)RRd+J)1!yoH1NEQHWg?PYsVyCXG)*~ z1}4+GQDqCy!JAg8M%QOc)24kk)oyePK$`^||b; zKNcYVpTpq&@BIEz=kNpECGLFZJC6jBebI|v^vN)-KR1n=uo&iV4&y$J?b2xKBO0j0 zeL0sFCXA}K{69X&jmyvo@HOGZFiPL%9?Y|672vMm=pI@$*W1f6o(Y`Am4Y@46Wt(e z?i-~IXxg)K?Qx#N3PJxRc-WXLLo{Wy+^)ZE0i2`j^Gp3~r=R~a z1ZPrqG{|6_%?W}}0ICVsl$d*ezAk&Go_gv^7Lb!@VXqJ+)n6NI3H+aMC zKJT@mW7SM{b&*5QJ-Y$@J4VeOVtp29bsjJXPzl(3nZcfU$jBvmXJF~LebTZ9kYThF zT-!GrXt-d3hV_>E9GP5eKy%y!m9$U<*+CFCYI8Q=hsDNVA=i8m11g0~h~N8j>V-Kr zbt9gYEiJQwoRwMGnWfn(hS?)36hA!-^)zE94*CYAy}o>XX` zN>29+O_};K+lygz7YSm~rhX)X@x#&d!E@$)Pn?Ed4%7LuShHOW?(hBxeV9%fDD_~{ zeQMKQpO{-fgngr0Jz86);c27)t95i#b5|ef?mGn{)PtD>F3`wf{;R#ipiap9VaEP2 z{K32P|C7T!UqnE^04m32-%=03fM5SO^@}Ssnz~dH@XvhM!yYzr&9IM0DW!=oe({U{ zPwKf(nCzdTwan)tp;fxiJoDW2!>>%u@>_l-LhE~@HI#aEg6Unt^Z|49$(JI4KhASk zpuw(J#}zAN=lMID_ZS9$1TusN)87jLhW^)7Q@kw5fSES*0TwQrfOnrERNd&L+BE$&*Y1~;1{JS}&4#MFB9`Jzo@xG~gQ2Y}7A%#kwJpoo_9&Knp zFT*pMznf+?vD1q+M>s}D(2NS{2U%(@f=03YGB1X4FU-xx45@%^3|L>Y#;VH~d4uH? z6Mi&@X1yu%3BTt9omuDT()rh-H8lQcU+67*r(Sci;2@yEJ!nr4R#?q`QCA85!P;dM zp&OmMX`X-6Jo~?M{Wo(E_D8h;H2dC5o!Y8s4|zvhLW5X~saqTC`au>VzydVt65@R0 z?lhpTcP%~Eu1!n1>ivOk34RDDiuhpbXp4v=o@s=;@qGzjQOyk z$lgvXMSc-Grnw<%n5*-Gy58LR5V~1hhFO`FS(%lsFZ+@Tl2lHhdP%Ga?j1m3F3i{{ zLN$i$S%3yntZ#V38(usN_Xk45SuT_*!{pDUEJRyG)BA#0FFYyQuP2bL2g2`X?|tuk zUos5l<d*=G|Z-xmh);$eIja8;O7`=vdE z^#NwGKEoCK8sDK>O~8U<>U+y9xPH{W*Oa!}yWVrvoWE0;e^}Mj=Ejk{I`Gm zx4)MAE=4oh-yQjXK1Bu$eSM%Z=brTSl?Lu38!7;AWU0jpo-2J%%gE|uKI8l_GF||H z{ecW#Xd#v-^AYs_A$-Th^L<}HhI#M1KYwt))n7g1?RgWxM*f#QVmS?;x$q_+Lj>Hh z^^>`B;b=)ePq1Rj4rDN=2&x+u+pF<9y7pQQcV&%!Xd#cUlP4zytSQ|J>OT~s@HGy6Y!Q8GPt|01EKajYYGM2iw zIco9HKH1c{Y7J{k*NV>q#lR?_itm6NK#c3{1KdfxyS*WM5I3~Pt`cMrhsRpqDn;9R zfsc`+{l5lfd#~LQo5f}U4V|DzcCxRtm~2qRqH(Jw{GMsyW2g|4jo2_sl%RzCv}kB{ zMNp>olt!YJ$})(myyB3>n>ZEZaJ&N%!&#Y?S(%l?qGWF^81Tt3v|k8KzA`{qe1Lpj zD#D)BiO-$}l)6zshFh%lJeA#{RROsPG?CFP1Kj8f&NzNy12bJz=ZumAjfLMXy-807!zd7#0J8b%p;6qPC5S zXPXz!HKi}XnU#TS$J5Mx=(BJckR z3<>zm;f0o37i_9blRfI{+|7L_PpuZ*Xza9s9KBX6sD-|t{cwvwm8}IDSTr2WMD2uw zde+Z#6{Q5jCISg-P#2rv!7dsLf)5koaL9rTHGd3ahQSl)3PF8lPJP_@&0LVPGApw( zE3!w`$Hu(#&B zVLp#eU1B!eFo%?k^O&{lr&k$dff6YnBTJKfn>_C}Om*}8GQ8vL9g{}*FVjxz*OYI~ zTH$)fGK_8aA@LyOjkoXm-!p4k3-DL3be4;G<~U3>fMWy$_U#L^?4~sxR7}4(k$p`Ha7ti#yX916BjHSQc7yfH+0IWBf zKVhzy&2e9l;rY*h{u$}>pNar6$uVY8;GLHN8EUGo{|Oq*ttYX}8Kr-|mhnHXsWT5y zSggD@bN9+IJ7;; zaYDkFY$7xW#X**4!LZm5X^DiBN8e#v>!+Zf5CixUB?1K@+uD~K8>1y}nnxU5CPjXy5Oxtb4nB6#9v zgtlMG?|+2c4;U02vpsMT^GkTg91|47AnptEK1Zm=%=;c~(ugI1YcShs8;x~^QF}7R zeJQw5Eo1{>VLSCoGJ@go?o+P$S^vTiN>sXuN#t+neK6ssk`A zmrY0JoidtnA-QMn``s|Pp6Rz6Ea~q(GV`pEmB+hXK-C5ws=2*7#+q0AheLN9|Ny4{$CEi@Tlqd zPL|xK_&RyZTi){2wDCkh5{)eZY6XyifC0=fFMt9Bl=IRzd&8$Z0LXCi$tTZGre$fj z%%vFXm%j9+w~qqq-hi*H7bz{vrvjyD9r1Y-O3piXFagbJG!I#xagAleT}L`DwQ@0* z<_6G_AnvF;1)73}H2tJ_1_eA?&ye=8$Wq@s-tms}?{9_)^M)H(h4s3EnYV;r{IkP# zVh^BS5jI)i06K>*PzA972k5G6>#oqYi`ifv^?d*l+Ck1)5iDq%rll?r8w&1hM5zl2 zw+`T;SPbZi?}~G*NA$mb12#8ajXn-I?ppm}ulbUD07Od)fc!cEZ|{*lynFVh%TKM{ zKNcE$dj?KNY;0*Ke?5VSpOm?D=2}6GWGlp@Xfb^)75j%$hJ0eUHD05cW3_!mb(Sc`=OBB+T}FG*~Rr zPLleP8TpbRQ{T$*`su;H_-Df4VY-e=z_S}Y``OPH`1iP}&++T??sv^zx;M<(B-)u# zm|e^qAbM}>Ei;ZO#0V19fD8(&1k8I=G-Bqf)oa0|W29-fXx}2VsuQEha)Yll4V`;w zj9A>c4TDaxun@q3X{`78)x?juC@`h&63dMFoZk%VRKxwUFscs>b5`H#4@|)Yg6m?6 zYtLJ0ZcY34Q&RzGPXz9BV>W-Af)x2!Zk`MSP~tBhk$&LHQr=}EkR?stDokhVR-%8T zhBRk4G$q~AXElxG(MKN*_!(s%ieYoKGD?{CYz^-Qina{w_K(fYFEdk8b!b_p^omBXE9 z+|DwzU?4P_7hI>To1QbaKuYrz?I0Jpw&24u^|>FtLaWR%bWDr}YnYI4UHKels%Q*^ zT76l!fC}ya1ZXr&``qW6&I$Amt!ylaX4rAge0SbFMLW^kT0^Yl*0bfV4;xVQ2k^%G z=_jr#1Z86ZpaC4AYt93$feYvkP>_WR_wL2)TcZFwFOo>ba;u;tvZ=6F%|lL>8nnf!v;+Lt=^5u(FPj|qACUM8tb zd;_QX9iu;qMv6%-h7zM$rj$wTB$^}FHJ|mj9m_Cyod?F0w(=JutiCnxbj33Lsh_F! zXx#xpV6AuG|mr>RupyL5c$u@BHl?7tis7^ub;~5j51d%E<2xOs9`U zq{pmpxWG~CN7*%!VPZ5jP5(%g6yEvYra_~ZTXTL}OdOA2h^GGy0=#jV$ovpwbj3_! z1P&G+fGquxc{Pc^v4`-G=R;zQ|B5gAjAuOKjk%xO&4QGc_(K8?fCPwvIj3C~^TS+d zYRvy-bI&+Q?TNe!Uv~{+g zrC?Z}QQ#Ck09bKBCO8xPn&|<(RHwNp7EIkFeAZg1zyy~HZK+VcY2e{@730w?8t7JN zsP%0v+FJkv-dSH5_huAy9a<*{@Lc*6%{?*e_{X?Ul-76Y-{dAYd3E~mX`x&9%NW(_ zjO*3j>?dTMSH>c0tw4h|t;kzQrHhYPr-Ea&P8zacf6pHL##n%H-TQzaHvvRRN!bRV zVdy$xu^P+uA`P8@Ygt$g!c*U=4Fx)iLWWQrGK+l>F`AZWG3eo3&{O`EZ`-cPIV-a= zE8AB>+cpE)-_9~QkhQ}USg26A6i{IPda>*+$K{%9=if^TWS{R}4Kw-neE;YX+fb&~ z6zKQqIsOkVNCeGAG(CaCR?4GY(4;X6=B7ckZWm_nj4)pWyPJif`$DvNw+rKbQA}RW z&DFFu*DPj#pTiIatk5T)8SKGth#>hQ))m=HFx4Y|$h6l|#09+8MzIuJ+r6~F0Rd&s8M3k0_6_BImc((=#}gm}!60pw?c~&6!|G)}RwRpWd)wPC9|7VVV;r}g z#iRqAtN-{4#k^?nJKuo|4w_(DRzAHyw-nYTZV$Ne;{nj_p7{e<7}bS`wz~bS9ZIu} z%*xIyP4#N+0|f~0=7ZuB7=X?Y*zxL10EHE^$@wI>T5qfwfR5@Hm&UnfIvHx0YY73s z;?`4(ET2+mx`&&W`F8BF$I707hM{rdEqK0j1y+adPoA~wtP|E)8Vr&Z3CkjVS1T2t z_7434fM}3ReT&A4-D96}4~vpX%7|s(6lhpVx4)X>{;Bh<)N@Aa*#nnNKLa(cbr7=7 z1iz$>%ih0!<;2)KG(Gidi%!V=9Rs|5ECm=E)X8LA?R_R} zBe+_?8)AjfNV7J#bIv(uQ#1wJQTh&9$csT<=Q2sZ6Gq{lehcVus0kdiGApxk;IbG$ z{~rm>1uuBPzl7<#M8006znyyOsWJj|1FrU(AadC-n%9W%as4nP z$K;x0qFs`%Z#ix2!^8NTl7C%`{|2d5G9BYCw^t98X{7#G4=fORa{gb5v2HLCo@RRy;s9*x<+4Pz^hf=P#&d1RoX)^7{!7Ck9JZ{ zz0vt-4g0>6CBj612Uczk_xDO=S|$VU#}qDOj>=h9xP9 z=Mpz&Vvh?iaL3Tq*M`;}mFJOt&YsSZ_3qz`%ecZFY?-VlriMPPg*ulLC3Nrq&vLX4 zWm9ec^Rl&QSZ^R53)u$1WOB8!9-4=>07K1@4tBw|Ugnd2Zu75`MkmKi5!uT+M-IwFM96!kM{cPahoBDgcxbvo$<7g^WelX9r=k1H|Z||+Jy{h)u-|ADEz3pA8ZU^R)!t^*lk(D6ADQ2Dq{K_$T{;mAZEO;^XVd94==q9QA z+@y#*Z|b{ytz7>M`*{G61@R(M?GnXzF4Ff147ax3o_jM-uGVieTS(n zLr*@Qd3m|K+d_oGx#>7B7ni|NAjot3JPh8fuVti<^jThmbYl5_-+^Ptwb!%`aE2Y?EDRqlm+yZD;3k6mN z;sBs`=H@W4C;HEN3!rxXCpue;2!(rtd!?52-S6fs00LArnc#;KSav#yA$p z78}L*c1=dvq3?`q&K@+yCByGTP%PE4RRa`C4FjfLIW3q#PV5uhefwpXrvb40EbGYSA{_H+$YDjwu~SBZJZSyQWLrV5Vcg#r|q+!gxJ3?|F=v z2U9D)wMtBrff@e^0Z_h~{q_>kz%7P}pUZws!{ngtTg=`u@~(~8?U}8opZKs`^S`ox z-);&x>pR;VJo1^}eA~XK~(v|I;_~nSy+A_0Iny?WOjB+D(*9Y9ChSsqpJzmq#UkUp0O@uFp+dDQW z<2S;0Tqy1VHx09U)0e&MW&cM^F%~Q8dh1)?`jl8MJU(^Qhg#bk1aYlnZ(?DpUlG2A zHNrxyNapj7=I@4s1?wzTO3?mIV$Cwjd^=rsO6L+xt^K}VZC`+!*9SEC#Ryr8nLlGf zLW4gp$Cv0=LYh7iR1YtR?-D~QV=g|#@y6n@kA3Wc0#!H0)SsrV69O`Q7aysvw87k> z1>Z6KJS)n|ZqdMi(q_NaGGML#?B)U4qIIA>EL_Zm^7y6wu8XTsQ%};svsh?gNcZ5S zm$tX@7Od~mNOjHPcT7ty&g(wXzV;h{+aaJPIZ!{M-}a0Exqff(O!v&?++yazHA1JJ zAzR-5+}j`i@Q05KE1KZ{wbE?+o@?Lx-uGTC?YdRy3Q+iS2`c=A{QjG+dFVqQdeD{) z?VGg}AnYL1&bCjm%>o+wl1DaB#sQ-xube@`1gd${Y7ju@3rOg66PS6;!I}|P%c36b zFv0!5Yl%e(U^a0PTgUNDTZs89YX*q%mYM+1%B;-F_LcgZM>}-!&@~_fn#tVoHO_Cb zmVP74q*=>YvM)KuFZ;-V3||T3@`qfrF_1ZMtPY%}&pp%o+1Gw=$>(>(A&S8C2_Qqa zuEAck>2$Pl8d5%(w*PSivg_y5-gl+)$z_aIQ{63Zc}v_G;Q6@p&nF}F&qZTDVc`&g z%-+DNLpBBip?z@VzU(FA6!^xR`9xlfAbypY%HNLGDZ=4i8pPatsc5u6HH}43?fXcZ zeWzW_vqur$|1*3315)p$^6Z!8{7C{MM%$0sA7!uFL!%ji_eC0ht6SZw=ApxRJzsz< ze%3D{BnSkU`sO0AVpyN%+#??Gh~7H~;K=9igmGLN__YWc z&93oR$$D@*meDz6Y8nc@EB1T+h+}E-kT9#)$uj{B^8v-QeaG+@jpLNLH96*(V}L@; za_?1>i-e zC`8%@=e7Mw5e$D7Kj?Qth<0QS`SgsLHN!3_gV-ZJ``ema4hmQZ1PUx5yf)3H-z!H9 zpHZHlHJ8JE=vrlx6`osdyt;N|iplLP1sAx#0eSRQwfF@b{4ZXH?`R^+H|LH!?zm<$ zLZj6&61yP^g;N0ywJ=}`Mxtr>MxM7F;r_9!-aqi>ihEu zyzdO-bVBxtg_LsmMw84nkHrWE ze=(-9`(i3P7ng{|)Fo!aynN_+7PpLdv8qr{?z!4D034T)xd`>6)G;EE=6^uJ%L=IM zFA!JETJIEw^lq_2AXKo*7^mI;np1D+I}h64@)}0~jax_fIH!H>IeG49S!(3{Wi-*p z=Vp%8e18GJBz}hf_vf=KW|#H_borsw|KhLyf9#zHm~3U0uGv-9eGoB#0Tl&C1yM1L zpdtc-g5)R&3I-%Ah@xP`gi279DA9x`O6_T-XPAHRbf593mL@ zU6=1tN_L`d?KQwK&R7ay11t*|WGuo*V&qkiGfYpw&~v;-j|O>@*Qp=M*Y&jWH^=J9 zre-1ETx*QIp)*AzK()HfFW}R*Q{cTL7|-W7(B7NeTLj#vpi70PO{L<5ZJV{kk29X5 z!O#gOM`s!kaW)z6qwwKkpUCYz&rRFw;?dyeX^_tiA{noSdCfH9(xo>8eXHgs?DJMX;nb9mm5%00IU5YfQ;RA4z0WN?1I zhhr=fVA$f5pZw&v3AZ?(XDJtSP-L5BNyLpkXO~@eDI%0zdF7S=Mtt@5cui~x2(m38 z!^Q#<^v9Zj3R@Fqvl-zwJJ83gl`g)=xOO;KZy4{>@)!{h+#O934+uhkUC;l`MBgD~ zqTziNq~{7HbOl*q2mnBDguD3q)bh9SJQ+;9xh;M4S*^c<49t~LK?ZNbnEDLMl(tFq z*Cm&Nc{v0eQt85H4X8vgE*HdOXpHB3IQ|bR`iF0DkfI2lz zo>+GRMe;l6g&tAL{S(m@oL3WGYw$bgiF!bi;MU!+sz4}`!fg~@7IUF>K z+V6sdj(g69$Gdk37z$kb|IY=0e%ssL*6V@lR_4$>rGnpu9w@7hytfCsR1stSB=a10 zW=Q6MN}4T?20HrD6_19gSpL1nBh?-zbbThK=%d$W^2Qx!isU5nT|CmRdFy7E@>B?1 z9Tu;pEEVt+>_i0n?&@1pO*PFa>Yx~}fs6Zp5JL4(1aRG=w271cl6OmTl(+WKKC8(c*jJa zpZEC!0KvBr-d15Bz7GY>at06Lo$xTgguun9`|PvN zsP9C)?3+!}$^PbE-Bl>n>%jYA^?D7b{B+Mf_bifsgnrtSc7H)7H14|j8;hp*5TsD4 zL3w@<*VrSIR-iJUj4NLL>Z`B*1mkcZ9)oY-tIzGe`|gbqLZAsHj{-n>9$pMxLOUAt zrTsQ1l-|fsytAN8hxqgsWFkCygC$DG;tk!h|3Aw7dl$;Q*2S*nR%4(UCHI5#qr1&E z+Y|r{%@TO%0DLx*o1p>eK~jdWd_Da=7RYhxsi*E_(l_U*;Y|V0V#y{JzhXbgZR5OlpxMDCx8UQ*{*=pniGSl5Et@_c!L<0gokq@C(;R;v*h z9Nt5+C!`c6xf0~*0@>zc(nDLXh7AeT(t!F>jt*fKz21A99Bp{qmdv+X+23T92&=lrr^wWjy(U3$G4Dd=?5M=OET#zZHlnFIakA{>?iICv`dxcp0K4D(- z7R_{FD$KB7Z`kLyZQ-;0iV)}W6H}|R`a_>9~et+gPtQ-Or*OxKz z526e|6^s905va6McTkYKy2b0ps`6&3NaiH zAmNZyrgs4t`S`KN9(y$a!k@YKfr1h!*vF>tRfG+hDA(PZSl|v9*yH`Y=bQo=N+8I* z2yK!-HsA~Y3&^mBl{iOp%}pK`-f0Cu26KhH3wg;(6V8u98IHak)#zbA5w4@#v$EUw z$}*=702t*J5C4B3z|odmc4+mnqk#-3pM3J(^y@{;H{Zcp`E5^$EUD5W$Y4x(j8iqu zFG?r^p;Yp_{NMFv-VODIIkA>%f+hfHvS(C7)AdMje{uh?l85|A9w5K?|BTnk>tooR zz_!=mN$CAt>l?FIU7sn_<6Kh#Ilm2H{Yd8FO94jThzFKN+x?S1#mH;?7(@R*U|=$fE3dK2SiJ?Vi+$d%I4-Y?-*GG z2o`0B_t2Z+?ur}a{Cb(1YN}}}l#+U8&tDzu>+O1sxv3%G8*Bgey3AWo=$BekQ2w99 zKKRs`*zm){QCQDK!Fo5!UaL%^^+qhlH(QFZ0ZjrxvKqtiT%l4xK_bN?*@xea(rF1d zmH38&VY0NVD3d6$KtXH)T>F15Q|`qkaU8ZZ0>F5UfW+P?@awp>vY$SSJ$jLXB8T1) zDuQhl1``mjx#pS;!%~nd9z-GC!2A)x%|}+3V2^$h0LSHk1wP~JSmMuQjvtBw{LJ#y zBO)k{7?XQAR!30$ch3JbLh1`TP-14uPtf2UTZEGQ6_DX2#{Y5%5UdWc@eST_6+Ua} zS2h@yeK=Pyig#A4gOrDT_bK{K0HaMt`lfv{n-sZ;S5B<7zB2jh%3c>wE3Ox~iHAaBp$*qKhI#i6K?ao#-eJ%%j3gVC&p9qCEu2$(Gt5&; zRXTw{<#FdM>&SdC^_b2hk|(%#SY5*XLC+MciUbPANZf)V`eC0 z_MfFkp%$SfSo{VU_frKLJO`S{_?qZ2d%BjQA0h0mDPVxo-RAyHEzbh^A+1e-5r#Ut z&kXOo)1FW~Yn++4 zM#>$MKm^p`{6*aBX5RT@r6-0;$aehxOcYQpopV%Y|HCkn=6RGBTIwZvTu z&iMHsJpYg7&-Vf-J)Sx90R3yo#h3kZ-+lLOc;R{Qk0R-+-#U7sj z{O8voLk}p*k5*y3eWsJ_vPWHnptUo98~iot?}}%gb=DiqZBXVlSSrOG9nY74WA9s& zxua0$9@xZFpbe^OCV?s&RHMje?<%w5!kx?u25@riaj~%-MJW-_^Sr8Hm?Jvye2p)t-wSPWYN3ibg) z`a3xFK@NxzT7`b#h8$uD~|&>I*<9Z5!b1J{1;z8edKwJ)i!wBTyDE`&F20y*6%g- zp33#4DET4|RGiGieZ-!d$jLW<6Y@-#|mvrEbOPl(r1e5Y)8pdmHB z)A7k%I^A-VGZ1In7m7Cnip6jONaACy`F&KK)TXAImJQO9oWyqs<(sonA1HVW4XE@0 zFuc1Cndl33XA)!pL>N#;JM+vl&*!f|LxIAsLaE^PNr492Q;lh#fQQ7-*+-9L-&hOf z^M9B-hgt;!&w!4~a=F)bnPXi-CI$hm3QJb<*L_<>aI`Q=1;jxp@zsTvEdKvP_WY~4 z_vL^Sw^rMT_e~=njujVJb3m-i^EN?2-54eJ={)Dj$_;u}*oJ`YP+QBB%CCxaSsBaZ zhM|) z?~VdxKP<3SK%weE5Wziw53-fYe%rE@cowu66J@WT(RW)4JeJ_jSS7E$UqCe9=Qss> z^JeR&<@%IA$+N=u z-7ox&d^lDa@pt*K=USP<-&1;2@S*TLJhSv}_&tF6+QU3;eo(8DqhX@DtLJ&lnd*W4 z02-<<`;c-ooAM4C#NFgBSWmoHI&dPcfGK^FIG<&j36&s=mL~Hus8nd#GFL-$u1v_9 zYO1L}1P_eDGelCpwTNTC4C|g7_Ji=nMJQdmCf_%gT<&U`8YNEy3jZa<%MT%dwNTzn zsHmIzBN*%545c@5Gv`jmo9%u1Kytv309IX$GWSxFC^jMtRjg3XxqJEiYo7lLT-blW zT>CD2(D#jG;QYl1lutqsJOz;JxquP6!~T@>woo7B2wC1xZLsaFt8KmOuDhN>Ebn2+ z8T%?^s<<+*b-PuO)IiZ@uj>%!-x9=tY+JJ|(dk<7`?NKRN(8%t?*=$urTc?E@36xT zdnkYYPMhzKcLeur@f_RuB7XZu2`*Iob*LiGH2pso^%wHKPqMAFrAhl^S)Zr?>9fc6 zTC9E!u%IUs&ru22!q-vB*VDw%DFCD#esgmIjn%+yS=sV?L~f zr$>jp42^_?jF-qy3#ILe_o~$?@TO>&@?I-o2<@`(LVuvYze^u(0%seWV(fTUzYLo-Rp#rA$lNpWjGAVSqUWh(3kGkn!3L>j zr14n(E}*EVpnNmDPQcQ0y)K}(;DdQshP@rO-+ucB9#cOCOnr_Cjsdafl;>sx;@z`% z*#6cOjoZsa=!Ap1q8<&|=%z^VMDTus1|E~?a3^IDvJwSbHuY)xEM>Xc2y!iiif<-1 zwNslfYpQ8MQ|ZYtRF<4OkpG_y$PnRtuq-9_ER=+YTYYA^n&vwVmB~Jr=oLV6#vQv5 zR`d=^q{7UXsCe+}&@ZZ(anCCO||3I_uT1e)W;`!Cw>&1YrW1|9azFhIhr-2Rxwn2dAOj^j1L%#GEKvbO_uhl}tiT+wV?3qI-vZ!xcwS_q zT$iI;hKhDnwmCXwymA+T-D42tybxe;9+YKR<4y1bl>U!cje|oHWXQXWNmZbV@i>*f zFz-vD%*M0Fe6Lt5mCXbsAi)pao(uR;3y{G3{fPEnLq9!~keV-)N=TH0O=gMlIT0m z^N2LmoliaW)K$12CYbR31?w7pRWx7Zk5@AwF?`>v!Lqtt3ibrglzUeT(8h|OSxMufA z>5ccS?-iMKnU^=6uU2Q%TgEx(95ON6Ml`0cXNU!M?nwq#q?>{eUFQ-m5o(x*Etc86! zU;kh(Azn4rR8wzBgghG!Aj3|$4_?IPt2MQQP`?Cz*eo;TH?nbq_8$kY{mER~q-vTn zg}46}g?u{{tgoQ>6$t&t&g)j*z(Vv+Xp3-nd&4;P^P{)amE2tj3N5^kAR1!($P zW&X4SDvYG-ufP6C6!z5sy}BrwTC!JR&%T6^4ENXwSSr^EZBTjjH?3SlD6|3$E#(8N z2WYX<+U2?YHB4lEep}&N-}=^C%>4%gh+qjDaK1xJc-9VhRGi0J7$g+KXLzq)5Lzf8 zaU=gf2@RMA+hQS9xmqCu&;YknIPVxtRIz{;pb9m!!el`^5Hb8 zT1u}9j2RQJcaOi@7v}Dm(Qu0SPV`y&HTeb>tTza}AnPRnU3D(W*94TUNF+ZTE`6Cw zM)DdH@G9GQuJ^FSsbOh&^T{&}z4!Mf{M+AOM>U+?c;27MBl9cfsa|v!E;mcG%PzY( zs9lmOuSR=*DL4ZEdOhEL-aV-ded|te{Hp-!!q3sbX7@;6)((QEogaaFiFi+jaR)U| zc55eEPZp}+g)Te_=epuK0p>FC{t828{T9u4L)?$AEn`<(ENiN10a6pnCWDv42iT0? zZ;~VxB(0nXfQ#gbD0jLL-;O0$1?)3(5e=`YCv-Xc?|a$1jzke^AZWE!aG4Kn6tNa_ zU@MgAtyEG~o)O6YhCugi_RAjtQhygg?njif{58VaA9Yc;x`W{eV_3cYE~FJxIb#vB zfX5*7ZxGOH4H9(i&9n9t1h)j@7F%pFtW4syxCF&>fahob?xI+?xz@c`#k|Q;K&{ep z+AUpd3+FWNvl)B+s^9(YcR$B>FXP#U1Kc!17)xk_o;{an5mV4r>D7}0T7!1qz%sg@ zdpr!~)oXmH;U@)PLlZq*=C!iCDx3xEPWop;0;)NH%5+V^S7liZ2PMU zTe7New9!WXrb0U$MrwNiLQI7Cb7Yb8Ip+@Aa`&W4s0MI>eCGXjGbwLId4duwIuDZ&wl}dk4jT|H9rq8yNtzY@sF;dy_{tGg(ZoqHrtx|Pak0~{2BA$9Ogk21+C5J z28vwNSixeuoheD+Hb?;OmBvfKpc*MJ+z;kiXd;%3$QU4k6b3!6KXuH>T@YXN} z{{il|JWAv*4Fh=XYhT;qUZ111<&m#@-Rr){{eNv@!LrTWtP?*2yuS=#^krPX3H$i^ z1w^~L^n-%k!)&8rACZ@E!|l>H1?Or>Ti@@t+itswg7)2bHE`{LD8=7*EO=jKm4C71 zITmJBx8LG*WS%7y@h0s(ol`Lyj7usjsWek`p;CrP7|T@aeW%hy2cYJW2*`T_TB!^* z{cF3q{Zi#9flieRj39b5bog$7`KZ^yRb@X6Rj*4p*Lmli_ZYlzu7H2Nz`j!s1E4B= zrXd?7d^9Os6kEZrC@?B(hP(8_BQ-JLi4}K@1c5S^M8dy*S+gK`$as#1g?hgLR9{cH&4LCR94HfYJWh8%Ef3Q~;Jk+dvaT{B=c4)(jem2oW>f1)Y?$}5EmG-* zGp9ESH$f9YVXvs|8u0W9cHw8N_$O>VWX+-cU5YANG6zmkz{C^k4%sJFj zu~1kuT!HiTD5&nQ&c9fr{^kE(o05{8-&WAm^&YQ46;3~!s95g`1qp7rJw@uW&0}g)Sd$k*$C*ACuPH&ZqUE5cdr%}`TK3yew&Z3k<>$_OYwL{WUK{7+;h){ zN`%Ut*UYh`NHz6|-t?w76(!L0WU~8jhhlgviqTpqy$vfeWWN-Y)+3SMmf(uoh&m!8du28Y&m=F-d?I_JYG*XWhu`K1>{0F_v+Pv*Dt1R16w-#pCs&He4m^qqaGAPrEck-!q2 zEj>=?i^L=k3&$krYz_k`Jtp6MJiZXm0{VO<_{%=JDXU=mSAjTvGEUAY`_Omx9aFZ> za+NK?P{H-(+;ac$JJ+`0LcFH{ISpe^r4!3KTl!KE!t;kcA=oFJ z!+BmuU=zL}pcyiRY&OA$jz`%q1En54Q1Y!V>ujQBE|;Ag4aQ^oHv>Bz3eb@3$rHR^ z%ATa2>a-L81W8IbhG_g;rJ&}t(cBEWX1dVcUye<)RxE0&Y2i@Zz)5sm*jOJ` zCdd0aUQFBb+aIe{W;|-JahaqpN9Mp+JaAcmF3Q6;#Hwz9SHPO=wU0Gq086m@?SM%S z^-k1hs(T5T>u3W`gzYT?X@a_pAVq@r*cTTzTW7E(4mJO8u?}@@9clByzt$i1A8a z+NKK~3&zT_q7C~hR#%VFD6$h^k@KhvAX=a}TosUkQmZ3{{di#domu8jW$vhGbOagf zFDcJ+e)*Yu>RF&=T_r>-e9x8Ml${gEAml@Nb2RVScnsOMf<#t=abDRbztdHG&U!Ue z3|4|)0wwYTE0+l_`EK$6l{!B!IM@E!q|yR!pU!E|>FH4NoWwA#Lajj=J|C|bzw@(m zZ)7;VYb{~&8dThe{7oyq_mM}*D+C+^lDRLn0Q3BGHH8S zCaG7H*g-2zU@>U0vFQ%_7e3F4nz1$2R8wy#AOphcGl}E;Pu=9Og2~9?2Y9nLTf1_LoQS z|CLcPS4L@kB+942*27cJ+|W|1TbS!W%d-|4l96ha=~`wCLGKUT>$iXq_W)Sj$^5*k z8q(uuyeM`+34MMW(%V7TS?;GYE_h*iW))xe<8_Wb_SkP7al{d8^50(=P7!Ooc?2Z? z&;1@wR_{xA?@a|p_*(EpcgF$R`161aS6_Yg%_$dY$;>XqbB6#n2C&-xjhqMTmthT4 zO{P4&UZKCL0OPUH^e+a12g%vc&?TMz9KbETiGrsRcLMvi`}bXyG3t3D=V~cjz{)35 zj_@MJ>jk{GjWtGm9X*Um@;Cf!`e_>k^-Wba0d6dpnu-`>mJ^Q~F!#^{paXE?b@%hr z*8cvkcfG4I8hBD#8iy{u^wNzOm$jWwjC<32ja2&WOMxSmc=}TSz>uWUx zChu#1C@bpm5U<=+NrAjB<;UloG8yj^+s(T2vtA9(RTVeKT~CI1ar6{qn2$Lu`aui* z{e8a}Z{hcrq!m;UY<2DUS)j``?EeGEWu2ve5_aKvf{b3H_gRw7nsC_lnbN>|;rLmg z_gR48SDtv{iN9lwzEw{(?>C#q7(C_tW3IzR@eGPbL-@o*)=s7Uvl=SjPoN=8w5JSy zMC{*0Cvi5u>9!?FMPlLb{&NzEP9|3tYm1G|w!UpyU|KcRv@B7@lVLrSgKuJKQh@Cu z6mC-@^k!x5xl&Toyr*seXF@0%f(|P3N$|+=`{84T3DCiEjSY>!%2uU7*@67qM$u`q zj~^P4LE`*-Q2yU3$dGM6uKnd<;^r5TAn;a22-b=gEcQO4 zEcsCm+gi2A2QYvFdk<^rg|^Mmjoe!>Bg=7w8|-LFRnso%uPEHlM3%U8O$cSqN-%nQ zsIY07|00zvUSBz1mtgZ^^gNe};~xc|a-aMB@P|JWP+L=DSv4b9@b3id{qI zy)cYNS=h0UY(7nj*Kl&Nc<<@R*xs)W;aECV0kXasPm`o@B+DL*2Zrt03!JR3dQmH z36;Q;sm{kzQ)sENp(Z|*_-GCf1-;_UZ+>%xluqVc4+R&W70dJxe^V|~A@EUU4v0os zN4~*#3SDbpiP|&?9G&Y4CkUmjH{X2olK>4q%6sjB(xiL0&uF4RTe-nX8v`h>Dp9MV zP#p{?ujQ+Qz}Y}Kw4_)Q?;xM~K8v_iUHOqMTIF-v`FfPSIKV(x0Htz{!t`ng$G_v_ zTKn$1?=#6&u{O&4lX%u&Xh*zEbWtDfBP_}7et07`p-PpSa}cn1Gc3kxB9H*f?-9hG zpUmviDW{wwDDzN+bwegvoacSa{%(#9g?W>)sW8S1HFAkyl4IExRN}lJS$eesn*IwV zaW%OaHse0)0T6lr7S9fl;d2BR1dQ}zP${w0ra#R}?gQmj-&K%-{3DLxu(E(h&9L%b z$<5*a=bQnknny!$!Eg^<*;#jj3<7b6OBu$Jc>3w~aTQ=l?hfaPfSdg}+0f_6`bjdl z;PM;vitMKVbREaoDA)MAz^{NpKswjD zps}710to^L&Q+hGH$(W2^T~DQ-12^T-vE6L`4!aV9tFQYR-oZipZe4VeE)Lh;1~G+ z>)?%zeuS!xV+gRFgC&n>Or{7z`lr&~Sv5BG6KLpW1AwNTgb@m}n9RMZKtr!K9PcU8 zG$-AflA8g+slz7ML}(D%y{=2ceW7wD;b7KSF_! z@W2Mjkk_^2{tsC2ILXin=Dj3|4fT-m9ml5yQK`?#-irNQwhkdN^ z?(=EiF8p?3o)M~m4BdY0+q5Nz49gOELdfPORYyqV{`;uWtL zKA-cRhTL;7)N?awrYEi-hjU1U)Abv` zYC`u)g25=3&VwkZHKmWbDzeT?`$zt2z7&DLLU{uIWOz(Z!j6*X!})?i#BokSVR@Wu zVwewym&6kxhu`VhkZ^V9f{7sSxZ@7NaKVLyBgM-+o3r4z<2@rw*`_2d z_PW27Wr5$o+}nWX-7t$r+T|-bUZxUW)g5Dv7toA(IrIZ)2y(Jygh#`4CTkW&N@Y#7 zvpv7+f|Yhm5UiMgaZ}0ett$`AA*!UAeQ;SpHw_C{_v11}1H8$!-%m2SHKFWDv_!+3igrrA}9;^sJIFi01g!?Th4nPe%^WK?N5K~oqkB4 zXKeA}v@v0&o(zHvD*n##o`p)-2hN4{*I(af+lPj|2xR%J341a} zp|vjsDg;Oz2lI%K)YSPoqw`^|5&e_AA@L^YlHjv#sbG`FYnU_#j-D!d9;I5#bSUF1 ze|gDEULt=T<_8ITO2Gh<%{uN;s)u>D>s(4$7XO!bc#hzJV1VF5KnAb(S$a1(4?G<6 zB-N~XxTG)qD{rzL2_3wjL;5wxdA;1A%~5J69+aX*A!71JREVPo;#`vn<>01KS!w*~Vb#Q&w(GZKT=6n?Xl~MBE&pBys}jK2dqMoXPtD?NoOES z?5)tNaH{~UB~T$(H*X2>uYo}PTm<&#((aG*es}SAJ%nPFwj~I|13a%$$|cYI;upX8 z=?ypB@ND+&UvR(Q_i+u!Bcn|T&((N`3wZYzL}{m8Ev$Io+zv{P4*I`{z{Ucntd&EmqWofVLw^d>c7qJYY<_l9#x7jR`W$bPY%g2eWd z{WqiS9Ix&6qaFn$B6Yk}`c?SscP+w(quAD-DC|-6>lH()Z9uoyg zRA>cA1Qi_%!HT=@zFQ@2*86$3C^}TUyWy=}#Tql+a8Y6yTJpnyP!6@qe3uJK+;3MoISdM+dhr2Ilp2jwH*U9Sn( zWR!KUN$5m?hK~GLa3Q)YUUChIckc_}J3(4x-{+VB<-GiDX9|>k)bu-e&r9)4+mp|4 zTy6%auRuePm|ifX)a6d>NhaSolyjU^eM@dKmnfhL3u=gsLQBK9bjO@Ux1XA7s;T!> zWvGwO2iyT?H4d+)nx;VR%~5_O75P`9d>v4_v05^*Knc>)b~D1`w#pV`+^6cv^NI2p zjf|ULq)?6Gd=D~$fI+8JXqOlli?V;Sl`jApY}=9smhh zzIF?4^$!I9UajjQ{e1Do7k?N);k_tgKF`V^1)0~iVw*JjlO<^BJ4N454v$my7BD`) zEPoo=O64$~qxrrX@~VQJgpHnWpZi;fz8Fy1q+dTE$PjrYpa|X!>z5_ztYjk45P2}b zQWOyt6)oZR^NcI-X$wk?N|FGL@2gTLaHfK#V&vS=<$G4zI9{lP-amRV5IQ8tAW&mF zwIT~Jn20l88NHC{W4YFq-MQxY2~-IR2r@X96V@MWzv~FaSx+I?aY8+G|95^Yb3jA% zqW}!fMFAbbBSW$PU7e?Y=eJ`}$S^gYuudNCT5#?Q$_6kPRey6% zRI5rP(QEWR+a!SG9E=x(<1D`k(3ld-@D%|B-^DPC+}Cqb;?jAR_v@5=>}PxyB=qE- zC*7R_#iL;|9#6hU`nWUN_kaw~V{C`~{I<8ft?x-L`vEi*<>bCUUI;x<@a^Q(5cSA} z^f?n!z85-$al>G>0yS7fBD+WU+qTNJ z0#2Kl`W3$V)vtbneQW<%F;##$nkcsJ^=~oBHDEf_t#?HMR;xT*SrHN zHxXKsd`!@xfikb#|8Qwfyew3<8z`E33OufS{$CJ=A3^?z#VB-5K!qmx3LZuqHvICJ zzr2S|1SI2ZPG@Z=nW6{Y2I~^`aRCb58Y&c8{8Ty+-oFb_xxJM;0y5;82&;qY02f_! z(OYP{mhCP_LEEbWt+Gco`HWXFN%_@1GnLDmW@Xsqb$;J7<{NdVQ$8`~GvnjX!SmjK2md!wggk z^*YhxLZwV^48aEH?zBUot6mHO8_YSqK2lLYmwmwo$JRcYkTMmIBG$W#rPtZd0t~)~ z?RLJ*dSA~Z1zbqtMb?jF>)$S3&IRl4e%9PpoO(NBzbb3yX!_|jdVlCepjT4X_jJg$ zYXAG}l)bGcOHICokpGXD813}80E$Tr>bS}`oHHuS%K?!39C@}NS@LOCra*!Wh4W`7 zHjA2S>IqeqUx;b~dtk-955;qTg;I`g8SAc<{riLz{98bVU3cAeEReyx4BH=n{PA}l zd+f3IzVn^$yy=4<{NSyWeBG*y%Pms6(}V8^@MgG$=RBTgbdeEMU==!5R{YyaE|ka{ zSjJ987*!~3+kVgYTm@h5q2d^2%;zZxYcW&+HvYL$Kq$g0+edRd6|GavL&4Vyy@R}G z6J<#t-B*l~A`WwisSqfDn^je-Rkck4j^wnZwx)&SM?|rmn^P6q-IWt~qA|jSRgYPIfrt7($40?JvH}q(@{r1~E zcgDjy#xvfjbQvG7;-%tm+f_83tMVNG{k=s}UNW<8c1;|V7p^j<2Z z=3+6=N*R_k+~!+uxh2Ueofos-*E30usfXZ;3b_D`eeM4R!R+%6MBnVjocuQY;MV}A zues)$YYdIDRJQA9_?Qma@A5&P=lqc$O39t#_x_C%9WVjl*LCBXajmEPYrLiO5K09J zb9y*;P1VE7c4Y1ai1ImtTDDVI z929gFRtv0OLnt{-;=`L*()|842*>*+X9QIl9)=+LdX+DZ!cuE0Ih>==t74;~qZ_!& zrb4jRF)eKI>g)=fVAcMT)}%f5*keue9caxpF9dBdkAyOc;S__M>$MSjrz{YrpHGA6 z(|uJS^(vrxM-zqa=Ok0xS`39lg;V4}V5J=oDG$Jj)llHR%<&NVsEbvxFg>ZlYNJ5ryrA0U5Bm2V@uvv`|pJ63h2*5k!B7wfkr?yU-r z#~gFawJ4(}D0Hg)DZuhP0fH8mu|k0p#Ybg(kQ@x>3&r14^uJ}7>?)P3nX1t zSX2$WB?X4=l+K~MTNd6r_e`K#-w_o-^P1Z}#QB+0TAs zy(@S+-z!GV1sjUABIy+9c`~C zb>=(o>P$JTv(FKlc7be`$b4!!Bv(I3P8!OVNxeaYCSO0Oh<% zM)x(oB~kzm77&x22Se68Sw|rJojkg<%S`0Y1E|g28Ucf|#qwLhF2evJ{L)4&lgTag z^lO0&$swfi8Gheq3D}bi7#l_B61b8ap!L9O`|$t^e|)VCLX*md=0!5$l|11a6JF2V zv7yIQM@t*?%D*rQa*qScjNcl5^UUTqNwNlyVthez zG3!r{zNPtT47}pz3erY4@dH4w_2yPFY9UO7+lHxaKp%EjN7ch9?hW0bAXjN=1Dqoj z(zms-Pxye*SNRo0zf`MYLa}&Fh_O$M{bCZ-vR*jZ=cS({6XLgLO2u*BnMT5E%Wxn` z>{pmGRS`KC#{7E68D4vp+%doYG@8A8y{DVu*qDNxbT3*8#*xJCSxXZsNVd8NfDM7=FuLS4A}58MCYj?*|!FcN9LKz_I;?>7Ur|-##q*g0;i+W$24ecYNnC z{L5@v#jqO*t2}X!NbL$IMNbv`@PksK-uNZISLpSqiI-_fMr(MQ>#A^gqrhWsb;)p_ zGk<-58-EpoDOZA?@+dS5c59cWI*P;@9TXb-A(Q(XcEq-jO6yO+YNl2pZOQZB7N32vQ6Wb>~6Fn*iB4?J=2UHF{@6xj{gR-pxT}kA%h8^LFqM=VLR= zRB}1vAlT9C`{zXga>XT$F+fk%nKQHA1_px%{;j+x(d!dm1RU(jSxiPNzCvNXAAfUg z_s1?x3+GGf%ghDO8qBmGPKGoB*w8PMOWYR0+*zlWEHf~hDmiEYBX@&TbTtb6V0O`` zAF~~jUP~hToTi)DqlGGp8g!CQ#HPBws`uN8N4PMQGNAZTYQ~>d#=uHa3MVC>lOXGd z&$xocS}Cmj`LZPn5^eu<(jYov>hxHjnJI@=cqUccsU z-tZl>mweQ~t~SzNr_p|;abG=Jy2;knPv5Q;?$Nq9HS?g<28jSMh1uPD_-W zjfD$@y`(`6dvzuM?j-0AY#ZF?)!ycSU>4Uz_l4Fp$?lXuQXTd#*nZ(0{K!9mXR=fe z>xXASsT$G8F1>*)y3Vo7WUP#HQxr3Qwnr;hHhE$1()QjsNZZ5?ecWHcf>|Q-*`k)tim~A?IZl(WLIIS9&;S>*;PfdQ-a%~oO;_`8}R;L!H+Wb4Yb6esz zT`~Vu`BWfAZAJzU;0)>;Z}|DVAo%Jifkv2A{m|=Cz7{&UvGj=T^C^sgZn{FfC`@7P zy}!06y%1$qgs;<&K|xB_@Gv4~@@xOsz1-B-1qnk=Prad70%gIv3$LxXv$f?2b(+{6 zv!*(VG0>lR{I1Xj^B=QCfpq;@1H%4=AmGG8R2WG{7I0#lLC#(kWjiT@y5yJPdZs_| zNjcQMDru@1u;XS0%R5qpxD#F6&wygdJ$c6su{|~p3v4If2{e!^q#HuMsh6MBaw$1y zzadhY^V^+|*HdUAQdn?p9>{l&$c%YCDyhy(Fuv-4oLd*bCl`F&lhk9&LSgqOrl>Ti z$t>3>OwP3uScqeFy zRH3M;&aUWkUxyakuW^`b^Pk-^uLNkF-iv{o|7$vkLh>QL)kvk7*$75)3xzNS`Ao7g zPZX^T21MYn6F1R&k9U)vEu&)QI22bwt9MHTD$mV;KM@*toGo9nQV1H82f2oXwwYzYmz27<(M+`BN>X`}m>%A}Ak@z6ZlI`oR&lepFF<;We zaLZle7NQ!+tTX&UwcA_leM)GuHsRVY@oHU$Dm=R3I)vj2?5TS#csr0iX~=>iKJElT zIahJi?W7fDr6Kai(-gdaf)2|1_O_V2t{UjS(R`vbh5QRC@pCYB9425hL zoz}A_NuFhbNBuC&`OL>hOKuIfM%XDTrI-YKtUy^1W@E*NcxYB;3d5w?tn`P%qaQ`y z67eRFHeaAD7a+mKu`mJlUjf0)+K8^RgF2`9Sm(MYWz=(R?!JK&%4ZyL!fGe^se=Tx zC;a;_NyvO|3R|FG=XU%KnVMG)>@vWc@k$62WlVK5Gxqyo!>+&RLgwE2_ojU}CqCt0d)nZvuOsmfu`(c*Probi#ajjhb35%+A_C zl*$a4C7j7J6X1qPI+O0EeFp^sc;SBak@#n&xSjp2YEcBS-SV0N+ zlq9ghpgGK(33#qIN!K4shJD8^W#!2K)b0r?Pjyw5r`9I*)W;P2G&A4fKeznO^)wOx$VlH0&{WXV2s+e75+#IP+0%KWom67@cwC97TOL&8loN4`I!xg1yyF{q|?TUza z$eizr+My2;%KD*13JBxJI~I`1-37|T zw7;VFFFXJXsoD9#3gb?{;_1KNID^AXTewG z7gd`fSW=ROmf!fCBy{6^jW=iq+n0ermeARp`eRe!+Hyq~#fC!$o2KR=B%L>jzVSwf z7h@oW#rVJ-F~Y6XkVmR;`B|1CP?fD~Kb@aK)!V4O>zC|!&fKEnm#^1Me&d&J=AnlD zw?eJGf|e9DEYQLBEjjWG(alnSG_NVL-f^A$a%G(O4gm#zkn!>~9en-qZU9~BS>G@9 zPot8!CD5Ny$E9mTQ9PuO6-0_<|K)%7>TI89g{D1oV7TQC&_w zv*bH}B1-+y%cg?=sBMHeK~ybDlm0fcYXc3GD^bqjT_;i= zb%8a;TqFrH%o7J|$-8q8EwTkFEftSwe6~+$NobJ$jCM|d*IjXU5>i;VCi4r6NVvb7nbV3)IsAWV+l*)&ljDop zYuE(4h%D6n@9UE>dq1nxhOnU7D3C6{Ru6w9oqiHgl|TYUuc2I zz^s?8lQfEX=brqPL+Is%_!+cab{RgWS7%L_imrgC6yDZrPmPZ>f=luzkTlOCW9VC5 zk8=aNTnyRSM1AxA-t^sl=D+s!2J3Z|X}XJJ?a&8CxyXW}cL!8kJ!+EwBuOJ%v?g`^ z=ddrPbi^Ht3^ZA=-v7=BMz}dOHJ|X;z#^dK#tBpL_bAsy?p!X$4}NuSNVe0n+6+b8 zj}%ij;*-pY*R*qAO!aXbBEL}xl46;31YoihBjR{exP)x_kN63KIT?V0uSUOgEbnF% zLBjtLIigN@qm{hXx=?n41cwa^6~e|QwfeOS?) zqc!Du)q1knZX7Oyv?yMs>?763E#o4Fv~k<+{k}JYN2!!*bpk8#(d@ZrAAS$rR8A^9 zuuXtJ*tf-xed>Dt^GgZW-7n)PqbD+xZ zaLmxQk{=Nwi-SbSCW#$|(gp|zBVU3~=W8E>LMw5L?QpkA7Zi?eEGu(AFa-Dr_mh1* z2rhLjqx+A7DXlY1=d7SX;v*jeVx3Lg8AsKNciapASvFvHodJc3%M5U1i5AZ}-ZQ_b0fsk(q9Z2mT$KD zo2+h5oA9&8rE!NWCxjT|kCF~;F%1h}2XpUn(V^rUx_%Y?Yq`BwF_jEua zihTa$fWApGxbB(a?8Sya3r2zeVUCI|`sb26YVZn6Q(jT0<*Pgo3R*teiK5H)IA?q% zxhG6Oi@HVKl+60RfAt6Jyys8laTx@f#%x
    WGH3Mjb6pVwZeU^R~4+*Y%TZoL}R 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
    GT9eY@A*cH3b;{}?*8wuDBuKR+ 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

    Q+dhnf(tE= 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�W4?)NDIe~b;i0!qPzbj;) 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

    -!AkbN(OKR7kh20F@&YA`-aj$x!sj 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

    <$we z`i!*Aq^Y{E%ImApY<+N#``>&C^mPFZEW;hTL5P}lX-9faOF5_gEkBowV8hk}IL!+bQ<9?r)#QDzAGZ|gapMaLxla}W z1u<|0&fmARDyn^PXD1H?4mTw*dD10rJ|}thUE8{C`lFcEY_Y^DUaYJ$F)v8)J|3@1 zpE7AN1zT<4DQsnKBhMwnqh?C`;Hb>g{A;@yk`Q@HxLmhu-B@6qEn%+I-P==9aG>*s zsHSCb|DoXTbL}u(9KXuvI4mPPf;Ug1Y#YsH-N4iEHVAh>dcS3a_N2$j9_Y8-FykMD?JS z+1!&$h3|(4kZ4N{UdpX-@<@VC&Q@PPlq)0T%>4H53vESVVw35vp~H_AY^k6-RkQQY zNNnDm=%k+@=1SHDfgrMcxP&gXeQ`ITOY3IS=IrdLz0_Ijr{hqLj1I46AKwE7??WT$ z^g8~dd=ZnD?8{C}=|6HJF9s5Cp6=J+A-Ge1$P>upNf}pD;D7tgo_LdWzmC|*vT}Fc zR<|7=)T@p5qkvA?b_SRIgZWG1n8x_D1 z{l&waFQOu+-ZC#tvC$Ma^E2!9&po2h&7T(+G>bRLkbn>GWyiyX;z%r%U3AkP8ab7{ zmM2NnT$$ysYR}Hq;&=6Ix(%kzG%>wmtmG6J3*Xl<7QEN78JA1P#D8)?6RIHkwy-oc1|R04?ndXPbM0MfT9YL|R)7j*G&5C@Ny`X8r8P?@El*9IHH^(X&aMP2GCRPXLo$w?EU z`nI6EDg3LsrlOER*l7%S;~`g(S?3sO@VHx| z)n9@`h}Ze40VnDFOBsPE3mL}D0){+Ef}dZFY}Z0g+$uMVncC6OjJn9hQe}gK1;MkK zbl&~@zQQ-skuzi^g18P1%r1sgvFdwP&+INL0ibeFI5}8~5wxykVBG;0`qLiOXpTB7 znz830r6ygU5iXf&=(|}nYG>m|`gN`x@e|6M?!@wiHW#)z>ndbTBNN}1c}9o24dbf9Nlk8P2-E#$u^xH0sVwY2hcH*6 zLZ&0X^8EC54lC|)1`41ql*5v92KhDF-J1wn(3&d_QFBTe4_S?T^V@|K-W0iQ*QSvH z-2B3R!?p_Rn30oRDKiIroMgTvFtJl-c{HKyJ_?uVq$Vh(-$4=Zcxa9cTfIi}bF1Lo z%T^*gqNDDzEdP%7=!hX1_??E%TxQdGP6J6HI9QnT6m3$HJDr=OfZgC3A9 zA+V5X}Ag zJt{L=Gx^(@L)E<8pPiR1T6NEVUp8Z60$&60$zm{O9`2|MfXAaPyv3DJj4Wij(A-Uo zfe}~nyS*O51bLqruK0}6@Me-?m)ZT3aPl|Q7f=x4+Yq`)jw+CVlA1i4TeG{*U$|e=l1>*z?KE=Q`mg@KJ zM4o4iw$!A%B6_cS(9Y;@-XzJ*++Gn|f!StNHYo_Y||n%y2-{j zN<+C6^lxJ_NF=_GVGKY&d1)klF(#PdLOqbR`3dL%r<0MvW|%`@cenpdBP9CyK`oj> zG$jSzz46+QZ@oRsbT=57;H&&AJ1VB`62w*!-DS3i@8;Jh8^dds!FkgAV-v|l{wW0= zA^mA@`>R8{;r-s&cUU4G6FJ&@B3juP7g~`m~&{F!-;b0tHdk7+I!XLh7pv@5SW{ao%mg2@eFcR*|Nu3pt)$a zXMvHrovqL&BYi`u$$!MR!;MM(V^|CCRRF_7Gkbgy3%TuVc20fq%`Y z*N>H>n#Mzap*MoTmy(;Y`oqia+ZEgk7=Qg)Z$uZ{8z2h0%xLciZirE9*<ww*6cw>fyvLU-xV~6gITvj`Vq7$ZuXAM9++pK4`$K2Z-J67YfG^@t>B!p+r#NhJdvn>@NP z5dhQk+v50X%q^Vrg}JkDWXxKwuO*QdeNnX%M^5%a=oB8V{4!5ete|^#$zFm#uh;Z#~x4z!k+ttQv*RlP``!LP$I9>Q+ z@oMP)N1hGdIa|{`{gpyfJO8qXe^Vwyy!|gsRlS?$|C_fuL44ongAG zV!=uFgWQYYNer{zcaZjoJxPiRV%cXa1(`vuZSZzq!=>dSZZ1OfkIpJ1on703LA-<# zWE@qlE})X(;U2~Cq`K?*gKr*ABln{(hBiv*c)Ck!+)>9kHFN>jO0wSkWR}8(dDzpQ z5wEUWhd}nw%c|!z064wac-1l)eBz=znN&;<_}huTVwJ$Jy&z=Mr0yJz&N;iz8#$2x zKi9Rkdia%dKLu0^8u0dWUVh&oHgQ51m!IwmbAeXBk365{F2cz0W zKi&)`s(Z9(XCWy!O;-HzVypivSQW6n!#bRf!6n%sB-Z>E@@_2s7~@>|gkbeOU6{EH zsnXh|&q@i~qVsa18Aa0N-)QlxcXrB!H72hm*)fdIA24(~PU5edD4a&BtGR_Q`v2d? zg%c>Q6MBi1Ntj`xpUMQY;9OP~9?6RK&if8>d6QqXMe4hYj_4wq!o9^K`JI`r!xljM@cjQ96I*Z z96GJa3|@JL+7ttd>K*e<2Q)&7Y$EPu6$; z4!7)u_4(SbytC3x_Y3x^+zoDL_VT@>L+`Vu_`!Abwn=V$k zFR?Lk35ACfeqTVkX4qHM=q%cve^~swjL`1)(oe&SuP5cn=3cNXj;(x`cdfL>-`W|V zb8bD1FX5`tf?YODdo*hF5a)Jm;50^EE4TIm=KFS*fM6_&ADIEmW8W-Q!{boHtHXkm z1<^D&IcOZV!OLrly#rqs%B^=kZ5bx|$vu(-J7n&RQ7jbkgEoI$KNmW9AIe!XLjRVp zu^6)IXmZ!GU5>a&jICob7RwH8A6ed7;S z5*W1POa;?A4xD-3B^`h3HRPXrD8*F>D=l@B;PCdBupB)ZnPtq6vTV_z47@C`+HLNi1%>mRxj^%eD&y&?SK>yJf zZi_EL)z3#hN)kATQICh3;z)0%cgIp$ien3CdzNCtTf38WLSMz|>Ch8D zNq}=vlJu*`AxAdf(fGg1tJzwMpt#u=1(pIu11lu6IXv&Kz|LNDeZ6l*6S;vhs3-Pr zSM`=Fs7GTMKr@)|Fss05Qm_i-M@5zSJI@R(P6O7F*cdsy(~JFt|(v za5j^C4?TL?F!8UhJrl*LX~a$)?)N4jt8WkY?^fo)lW_v_@yxa@iChOi3pSBW9cl;< z9C9qpRT6W#8=)V6GaWT=@cT8Xmd+!DD5!->=o;*NBiCGZK$3d2Q-2lQlE@j`0ET$f zV0FOg3sT+NL2UB`*5$NUbWn3Kw^bP`CO-!H3<0w#FQ7|^P+Q=vRHePvj!9u~(-M_ncUyRK&4<>}<;Oo4M~qgB$h?ypBP&3RhaUE;}q zxehN_&JLI)7H;s2ON!nlZDSqu(Gr$cK1=6MYTeOT0FK0mMKAdn3KdCvyVO9jA{*r` zV`CT9C37MeLv#ist>mVcNK`>ChoHqqF$~U3ddc%*qp4VB@bR~s(bew!wC9?{X0b~} zYqt$2gpmR`T@{#ZW>-J-fo#n(eqBe;$Dg^4xR??c5Z#R5F1(IK(BC|wv=VEIA=;DF z-EZHify2G2c1g|DtdOn2_3%RPj1UzJl+fVlm>*fzyo#m&25HGwy5G5sQo5HO<{kg zh_j9lg4wPfb)JwDdplhyrWpUyyB?IQdf9a(u=cihEu7##FzG)?%hQpQ*+rJuXN_}q zLtPE?7^*{Pm%LUZyLjyub%Z5>?X8wmCzaRP4aZi zaD?ByY9kBvUh|Bp#F|2$k{VvRhGqJLcM^h&eqk$k=ZaCs zMQ@8z?l3mH#2WY8O*>#F7fe3*%$W8o7zhhBNrQtNKh!>*c+V*$Ban@pqieZ%7Z;Ai z)gM-cOY_hk=@*r!jVV^E?kV!u)>CNQx9gFB6dHsq|N{vwXKzNN&`Tk+~CyX%$)4!z8r zV0Q{B;5eQ!5$QldoC{6y1;k4_b;qo-A8lWO-_#HAkT2q3rWgVF8p7U&J(0h06bFz! zS|}Y#SkG0w@_zm2{wV7;)|6)rK%}nz3YY!jf+}NlFEA`&ZSV&_b9|*tIpMspV&G#* zJ2AU?8_zS0d)Rt-$c1RA*Dd9m zw&4`ET12>nG~Vo)B1R0InxSeQeWzb0)A3I3|79G90VsUPWb!Vkk)DsG+w{aUgV}52 zb~5xS$!_s6c+)KdCqEC{m6H=JigiMA!&5C6l;^SGjp-SZa1U5_mi}{xCY6Uy8=?-` z7~T7<>1>Pf!C=|N+a%H-rUTDK8~iYj?rblAvuPP*hw0wL$gnDb>{322GR2j!{KK|2 zF}~VKx~)LxOKk-H)wk*m*JZxx)MTUu4pYaU5}`YMnO7FSyt^BsE278S^|G9kX%a?$ zzf-`MXsTdf!kzshBaL2doFH!rTzP+(I%jG5gW>LFZx@nPAr*O-^E*l4Fv?|Rn7@7~`8#?c4OD@}7 z$L&V9B!Ftce%tjkk_jwbhWLsOAnbgW7=Aiq#G!=~jSy$HFL4-&0K(ozA+yb9eY-|a z3i5q^t&X0*Xqh+k0=!KXY&!Ws$ZgxT5hh@uM>!Oy1nqQ|$=;1^h@p)}9&recka$@Qb{FT%%qaB zPuv$`_suzy8z(N=;ymh;f7|*HobouE?*to58L1H&nGiZxJ>ex{;FnA{lP6_#Z ztV>2-zx1j}yk4;nJIC9~zfBFfIA!D;+edY27iW;benh&xcpuq5SI+O04yxp*xgL6z zbErYPyRm)v>Shg5qlSlPgE6o=!9ONOd~|$cC}nq>^G_&vGoKTnLSQ$vZ>N0Ss_mLy zck29+S;3Jkeu5v3$HwwrW%=~cu}@r^Ph;|10}1$@(NA=603D63Rp0 zxqf;iI0?Di%*x+&skCZdj1i<3{bG#CY~=;e3$j2DrU#`@b{=x> zHerw@H>zbHEzX8?Omtwp(4nH~4=f!nEGWK-+$Hfd2Vhn8$>};l%N#gRNXeV(tnD03 zY$yCxhKK0jOO&3V%&bk_mwvL0hUgj_^@Zzkmah-6k3$b%3wX4w9M!c}_o~SOUcNr7 zK8rZdC;O|`PoQ*9p?+0?=74CFp1D)JyBbwDS@(yoDz8tEvTS@84_>J1D}vp3z*g|b zaQSXnfl}~KzI#o@YIvuO?S8zCIUImso}qc`zt?@A%;BV*O>t3}vi`YkIpy}b-g=d| zRZll4>qsX1K1E%$dRRqlf}pvv&Ph&;=+k6CS=i?_(bM@f8?t56>Km8ESuO>|JG_0T<0x}0q7IJg!|uWeQJr4-V8gX9|9m?j?49I4@LiyTc@ zs+P?_E76h*(JwZMCppE~cMZK?`5EI8EQK&poT^RjIu?xBkR3VSxCm74@iNOB*qk1UQ7;S%EqqHOMMv1@|D)>RvDd6gn`Snh-G6eFvQf0n7J^ zaKV6nKLi7eV>li0Y3u$eC(wT6M$sbd0{on9X_c9+cNL56?>hDsTex551Rt@l%vEUC%5%LH{WV9BkSb{}66#uj^mFT*N%Ys}xa~s063o`; zbX29q;eAeiiH%QABS8*{aUd$41(kz4qXVQ}r=WjutP=$}9D^|#WYceN zn|ikm@FWf)3C(U=A9AJ1$unFx6#)XnC(k&QH`Z%)h&YChdy|k{uy*#$uQTwO_(-y7H(3e*xa@nGi^R^3-u(6<~&S1Yz5oejo z_4D+m9NCl#2Dj1sYp7CLf0914-Y7QMLW;;& zG_6_Aa7MW_&86s@rNzj+so+Q<&9-g9@N+85|4@p*R<-|FHj-xg5+X{7>+Ok6N-a$y z5wbMo%f%6lceX_g3DxCebi__jt=vwWG8XBXq4U`YrBbAHumGwvv&(Lo7s^hHrCX6) z`>XMjO5-uE{lSsJ)`q^xlC|>HPi)SIybmxUWw_rUD^OxPIhSE)i%~a4qwHNTmlbJ-& ztHZn_1F^zKWY}aqd5%fdNZdEuOhXYkLD*8=glA;rWE1*-QlnL-l!LkW;t3B>gvFoy z^alajPjjY1kO37gf%L8Ofg!|DZ^lXTg?&jrObv$RX)dF+;x)O37B3|-X-S@imrf9P zai4dz(ZP(A5ma{EOzAAx{=|{rE+J>t<+S)o8y42(<(%Pv7yiVcINmCN|GQ1-ixmS8 zTdTy!XQ!elr=rl|{QBuUwtLu^nMDiZtgH^hDSXb}$`Em@I zcq*atF zF09rm{74LRp#C$F=;2Lx?Hk#p+u6aa`vq3&!iMr@QM*nntl_UuO@%jjF&}yEYJjNf zwJm=|V1mftd*}0Jx;E5h$`sHtfG&Q?~SsSC>pq*E2~7N5sv)s z{bngAncnI|h_z7y`973=*I9#Ju#r8qYrKksvN0?kf1I)%QeME}r>kP{nhhKhuwZ{P zkTV()$hLQ*QyIV4wHwe`4MA6tJp?SEuM(Ydf)WvH!al`p>$UpspFmF_z-gO;-4Ai( z!vzrJSM(eAE;7dbP^&}$D{X!Du7tx}dik$W&>QnK<}7hJg+SAlxvm4!KzV0Wj$VxM zzN*E{_MWp5^iFG!es?_DoT0MM(H6Q&{AXtSndRf@R)CuP1G=bZH@@dy zAN^LpNwr0|Yx*2sE3$X_pKJ~-+!Ma5rHp>eUlwB{Tq)seI>CA*yO;ig%(TzD{aR9? z(zSQ2Zjsfb?ARQ#tOor31~(q{55iZuUG>RAscYfVC|s7d@mXTS>t|3wIMaDcROmFf8Q?! zAQIF3YD+-fU-9;myg!dig2>`XlLQLc6cEiEKx0#I*CYS+&C>G?gOJloxfJf+E0EJU>Hc6_nPtC`PNX4*l|P(p0EEZ6>&jEfs45XLwV>}+S&-LowHDb=0vVb2R`DYk z>3Av#<2qGLo16D=+5VSb@H&U{$xL%^PpVa0T%Lr{rubq>1blPw}WjPi7 zo<^kYP8D!D8wFy59V7tM2;6S3+=7ja*w0#wuW@wtMdn+rP$LHU1F2n>9sywUvPF!a zF6%O2x7|31xIQu?q@3hc%4N9?PgP7 zD}s=M8$I}jv1^+Iz6R;8U!KWBVocNe1~=SygbRcZTS^SbRbvLS)KtL%!A7#pi|QBb zc72yW71-hX=;~7UM|Gm9@RB@z%<7OL$i5+A#y&ZNv2q=$n!ijCNFb-+eQFiyde4Zx zB*FXNsA=XTlZ2-G%i-AS#9wpy8GIbiXuf8+t2Ikm6?@Ry(p58Q$Unh44u>5?WyJvJZvOQN=oK!&J1_4g0h(UBO_uQzdwVzL3@zv{ZkG`Wf&GPM%iA zH#r8!3(icbqq0vUWVf)_d8L50=BOxxR?oqpiNMX=>IlLwWwvB-Kg6r$05+CW2&_r( ziH>!;Hf?m-jqko6YZC}{pXT?e)3L!s3+KH1XU^%kCSy>_1FDNhwgVJ~@mr+EgL$Z- zkpso1ZvOnVXXeTlEP)vKW{SbOIG7WXQI8mZ{pq&)5Sh< zb1ehJq0lER-a zQ0isWea)21pmpbC7??+u>`&6!j&jR3C~fX9@C4INIE|=&sDv7;0`xG^mD|iChYQDT3PNz$l^V0G6TA0r zdbJs^=?#YVnZ-lIhZ4M2d1Bi8HQ9!Vs)&Lkb!&*dCn!ho%BCI`6Afwez~34 zNB`>D;wM-H=*Po_CWTl=vyq8Di|MulY|5RDb6GZD0bCA4x_j)lnIul7L#veqwnH%1 zILsQ%ERlHQOfeDk7clmr^+`|-05=_z%n|;oPL=2!+F~8q)}}tv{o>5pJ9eeJSM7cd zXrV=KRuE*NJbe}pBkj7k@F^hYCGUAwyQttiH+QS-ze zkCa_h5N0aC_`?=_oVG|O^LK*nG4eeGy4F}+_~lJA6Gp2PcBP!2{nuytF@~K2SBN-q ztd-?SVN2tJQcIo10LXzD&X60vA*-IU#T@H-g-kwpcSTf^(x%MCvw|z?TTq4FB7$Dq zjQ&$A@9^$RoKetcv#CVZ2kyNr6Q)x(IE8H+k19IvM^RjmMHbk4pzVXK$)VBWmIR|6 znwGpc04?lA@bcr3KDO2>g8}Z1*~>N+SwL^cf#b;QuDX)4U4=^Kxk3$B7w*y?{rO)b z@>I(>em1v7^z92B1d9tZ^3ET!Mrtj(HFJL!V=%qt`q=t$tltc)nJ)p1O4gPH)R~MO zaCjR9`P;W31;sn-*k?VF@4{^~>M(-Z9QIoCFGkssbF21vbBJVqhR#vbliD`zrI<_i zMU_W}u|?!^!@pG^YKf#e`D^(!;dG9|13VE>m!;mvZU!@uOXK`?zkmxBFoTK76o0Z+ z5KT6jthG!Rb|>L%&yd+=*KBd&32r=u`wdCb&nF_V|J-*Kgk`-w<$c=X4Pi?EoWGyt zh0>C{`9-Hh%*3=7?V<9WkKAmPuweqrWJ%{h47#rzP}zU zZ@|L469vr&ckvBWc19uImB!8viR z;N6PuKAIPX0=gPP79DAPu{N*)eOFaz@&K}C??2`L%|PS)2R~?S|EcErV%%Vg8Vl={ zKrPW{URN-r12{M3V5!rr)?mnbt`oYeGb|{C!kyV7GT=B}9Zjg><1vYrFfz=^}nT+KUGy~JwPtQi$bv-oA8l{dSyTk|F+TX*&yYjV!%qL&K zr6kj{kze5YlQ}EwUKXD9Ki=KdT64FHzNEAPFGL(`taQ9Hs?X{t{7bSg57$m^2!U zN>K8{U{=d&iJ>qa%QC)?sCqV=PSO!5L-AO)(9cALCHa;Xm1E!|Hvj%jvT{3zSH|dD z-TDBy9gy^>`~GQP`z}-%p>}*8CQC-6kLS&hYBi#KIsdJF0KOLZl`UDnyQ~w~P_Wl+Ue3b}M^%sV8C#12fEYj! zsqB3%d59|)9)=3xslBP9Mf`qTE_5a*9^@fcC&Y)kx18o0+i{(aya+whGaKOmd9DV*LM=SYPnwf$4iXaEZN7!m1<7Zf#RU5*zvu51oaH7scez zF=642J!x&J2Dz}ppLiU$9e*dUiW=C5yg2XE_c`X17`gpJw^HMwoT%3_U$eF*E`d(T zm-x{TW~w$EA#3%rgn0hg)jr1AP%`8n@njm6b(#1^K08i&>;{*3n15l(=eagjUkTH> z$rtB9mW;U17vI^?7t5Xgqr9Y$5>=VeBf8kn+DiB~ts{nx^G#^{SwrOqiW=1P4ZN9@ z>KIPIoD~@6kB?ViunjC%AdgXwqImcvL^c{u#R-t93Wgg9w4bN_T)p~A7>tEH^pF;Hi!#EQx)mmYlr;|K6V1WJaMAd0APf9+R>R;XrW#<-@AOd z%XL-+u@hEa=PENjbU38T=y|=+WeCA@8eteZdQ6J3O6*^wtPY;7zj&)4P2>8#y&zY! zPHS%i)AzU16FRtdx6YWCTWW{FYDeJ>G2>H0`8dGNOCF68e1C!-5V+Pye_egQR~w^LhBP6g z+nY!kcXnD6zxgwd$NPR71A$ljn8U`^L^y>yqEX)(zf8F%r#3!o^wE;ueD{I<`+cL|k6}3PC-Jb@B*>IqB{F&ajOe9+q@4q7Bx; z>sdLMz90kvB03sqKALO~=PXc>yC%S@7j~y4#IR-aUSH96J{gDpLtnMz$Q068_;wtc z62>TZ*<%_@@;Y2N$SD8cB5BNUo*ZK$=5@l}N4p}WxW`xKb>=r7T}!<3r)?39qh7poF% zqzw3l$SbUsRW>%I{1LBj@y@Zgij`DB(Nz)>SJYjG{olIB&L5kD#3|lC5Qi{VK~k*> z!kTdaXjKI3KX*^VyW&-QniQKs|EZb4gfeO+0eD0iU`eHfq}f|dEwABqA_jdPe8267 z4kZY|36=?UI~)*(iZVX%Bc_)k6u2!B?TED~TW`!HD#Oe7NpCjVsIgL?ql?fgbKNE4 zFih88-ACXDp=nODF!p_9jQ@*>Y)kiM%7=ADYnn0f5S8vOAA*yc^@BKzXPe)zY0ab) zVxar0CQhJo`3_I8IXYh|MuS0U+r@yXlor~Btaq64)@%QbWN@3=71>9!906Rh02 zV}cF0?M!8puK<1okyz$Kfw%(k-vdA$J$va_Gs~W{6~f3I0p2xR?~X|paW4?WS1_a9I<~W>H8&c=e=|uaOlTjzqYZ^&Qq%fZEXQYP`uV}3YZ3kT-vXS zIoHVPEBFzG1C}CXZuISGoBy&M*nQOjXZCRtXLm*2UnJR9r3X)8@TMw>ByP|(5S_uqb#R{xv7c?1ID zmwz?&X#&kLAnp6o@XX!TD#{xLZd~g6w^CpLGXR7vY}V~G9a?$C*lA!1(! z(E>{gk&!)ab%oLtjH^WMyms(~5}-C~bMUW5k^HRZn|xlo`5x8cz87Fa z)-AU03G8;`IFRMnH9KghC@+Zo}{Z3$)*@J*yZi? ze*glZvs)|46+t6+mcoF+XVy{In-wnzhiwVRHdkM@Y0TNz6`<+pUS+FZ_6^S9CICF#}|ij;QY=xl0z($ z^FErQOftR=GxFX$Ttm%T6xQ0~p~oodg^ z*PP-$d-jlI?x|nhwk>l)+>Hy3azfYa*F9Yp?>#U9z1rj!H7MeQW-UG>&zu{NR8?gAfg;9s}@t#t2e}JS2dcXP| zq+2UxGLnogblU;N84<#moX}W`0r9Nnmw$Mw0eq6@-VF+_9&1L1KrmeL?s6gryFn7D zc`a{x%}rW=lb^=H)BBOus;8>xE%N8ddqRg86rUGacjtGb4J0IA6B+)yV!a%J+Bz>~amv-1^6|Zb;;ZmI%Uwa1ur0 z3PgXo()Uo$wD5F?JZ{03N|90v4 z1sFfUWW%2~0&fe%C)O-H3u)Gdk$W=WP7f*oo_7+Fvc*%N>BNXAIQA$|D-Pss(0rQ~vL=!zE2|uvbZ|dR=+}~Jh{eWFQ+Bw( z)7MVK-bFc8OumMx=p_7Rk_+lsX4(>_P43ec}R0zhus9wb8NVJZe-ghn>} zku3iR=&Il_5GqqOT*h_QLcUyN+ds0GxyZDyv!Z;$)KUWh#%eE^mBw@;-&*sLwmm<# z0#6IIGn9+(oW`bOPFb1*vUhEo{R{_Bl)zdunCUcifaO3#*sY6r>Qf*&Z`UrjoBzt{ z{caEUj^7&s)Jq1tkfi+_qP-`t$qI14nPByy+rLEC__Anye)D!c>BHDNceGa?eT28} z5bakG2zV(Qr9oGE9|=@^Lqx2oNR~z%?LqkowWR+Ysq_lsvqS-YrKLqo7Dk+=uIQe8 zG7=9*jFKX9Zbl9c4ywkg#(p4V_utyt4xT?3SZ_l-!Awndv>Pg^4z*{R`<+faVek&b zy6TU?>AZBm?!%*UqHYS0&~&@7$^nzLWGPD2#z8tGTOc_Yx7|q9OU}K5fl=Y7f<{O` zPh?G0(C6b24F6g#`k)c9d!}XoE{uBC_oTT4A5fSCYf17qJj*UkYv~K+VFNiK7ka5T zMsqgFHPt(vkEy=j0>6?H?0}hTuoRzJPlcJmL- zxU1SDF~D+5@p6;&VevN@Et8)E<6lX#bWvxX@{u}Ip4jr@U!QdcR`gU&%bS~3a#3wA z)R6@@b=59NGgCr{v~Ayh-BJ7>01iR%zPP(NNdz9}nfev|@VRLtgceJG5)vkYAX+uN z!)?@8Ll-p6&BTq7YzTx+rOlOoNlE8E6)m^(e-$sip-d#{F-G+Q^Z4-^UJ{Yq5u;mD zKu-zhXFr#$@cbr|bWU=vbw5dk@Op|l+5bnKLnIF*f0>&Nm2fV%ubm{5mtK0Q*W`Ix zT*olR|6DvHN>{ZY7ThOipGK{MM$R?=k-F_?K}KHy3A2rgLY2^~T>wQ)cs8I+yagBA zM|iu9o)vmS7+%G7c+YYa;2D-Z#+#!_GR^-bq2;b@yMrVHWOb2&L^32KBrGJ#&`W6h z(SAM+<`S>19HHYzXxkaFR#e#lA((E!Bkg6(zrSGqZBPo+sz+_)(YPwtg{^_!tSmE> zB8RvrFTC(V=l6{uj&DbkY>c%U?{_Mt#s!;&-1yv3YC&7#0bEO+^p)6VeH8GY zS#C}DVHC?!B|28yK&jG*;@V#kd;8l=&w=Y{Ju-}ij5Ruv~qOc@>_OH~8vIlf|a++x3B zwI{VaXhH%Q_cJZAX!$S3nRA=t%T@F!{pe?|zH9JDg&wzwva=EddKCDX^Pipy;pH{z zx%_;jN0^^WSa`lj`sld!yyjg9B9Y^ptH5Shg^3&WuJD*+c_BHEL|IJ92Fc*gzCh*B zxuroB4J!rB;CwlRfaNt+a3nU|H!9!UT@jw|tV)_)IzlkF@dC-uIp>_u9COSucb|6J zX+I(t#j<$CwIwh(W|Mo^7HguwxGOXIM^ z4l5uqCr6R%0~~wov4;OOMl+BU20*{(aho(K3#ZV%iO|Y3_uY5j zwIu@kG%V6QeG>_tP&e#bkA`l9PGn=Kha!yiJ4R-BLsGcEuCBV;cLCp(m60-oZ8T063(-*BA6tZ%NHlm}Pi!{&i}-9W zzH4L&2?GL+{3!E_vZaTB3Rq_hN-}74yBhCf9#wgKulIu68iFA4s#0d2gb*;c07{i% z7be*?Za5p6FxB&TEK6V-^Xm9QAv3pvgstHWj&WC;9QU3pLMim1a2_9R1Jy<5}g)o zw`bD>eV3!58=(_HCXDGStfH#Y8UKUfYQM`R8FXpgVTT=zrxE+21n;AwtUImBCliNk zvF*E%5VP3kWs(ei?8z`v@O*-HNZdA*>!OOU{<($(*NW{hxz9(`r^oPU04MQx;yJR6 z_I~wSuT~inEn3#gY7epUYRRH`fc|)|v_PVis?XHLRbsiE*GUgONk|wE97Exm5dZre z3#%+x%|S06lrUd4#I1_ZAsFf*LhfTO1Pyk_%gBV2&YR)UFcOg$!aiv1>t$dWGQAcc zawQ@B-oEI4APHevObJuNJUpi7nV+|YVG_pCdL9X8=V(3DBmvyd_mVCQ7En!Syxcao&Lk z9vG|r-{65ihgJ1$QMUh%()*{8j1(Dt3nz?z_GG97*PXaFVc$(+c&98Z*Ep$zIpTXX zP>f~9&}d_T6oh;D`>b9~K-(e&B4*px(*%|k(IBBG)7^Cc_YUeZ9Kf^ueF zXPhg%AWZD20#h>Aw3GuTf26-TVHqWTFDfEs9h!Mro}`Zlu>I>G4?OlAB$7Ow0b&d~X zmpq^R84p$ZN@EJh%Yl&jVJ}a>v)%prjzn7|q9JZTBca29 zT|qR&F10ief2YkE;p*xa4F<&^y1SMm@8L!pZFDbg!x|1vSLL~`Ng*5}Gd)Iqc%KyX z$r5sJU^VkLT)V%GLI3J1M?)hjf;f@)DiNd4fL!Twr? zQ_nQX47Z06jIfUueQrQ3H2q#Og)tq3YgCw6hHLl(gv$pw?*42q@i7nYg(1fK=iJBR z@xJ6Z4M+>`q38d1Na)Y1%=WW8VM0Pe!Zb&l7U64KA!9zpJpb>^>jiS5Q*d6{r-*WAg|%=%_$scv0=g<*)F)y`m$oy zA`uNLnSoF^LwOwu2fPZQt82bj`BY)7;V*Hh5eB)5yK*zrR>q?_9m+vrrogz!8WiOF zG#)gZG2q)67WrhY%17OO3=o?!)!~x1HmithYkbhZlGmITrSf`~S0YO3X=DNW^2*wv z^x2(9jQge3+J6tLpe4!edeV=Cgl;2pqA<=h@=cVhVXZfTVFI1xkdd24XoO4FuC>-$ zZm-vZhQA>Ro%uCF5+YfvB!eV|hIkMVo{JdR$itFFP8gLj$qdhLwFteIRMLd!(v!it zKqFp60?SD18;H-$J0Zd0c7|_6bque?^GGaM8ja7~|99ltxsmI>f_?8IcfB%4*YVb1^SmSQPoz{WxezEUg z2Ho9d5fKl=pD_sT#b{VXqQR;U81R#3Ff&1GQ20B=ie;(d&Lr<^lYUA3xT@;5Jk`sQRGcE?L-_lS!WF@!i++`gxGTLH5}XLm}*^ z6)D^%yeNE)#E*Jvc?{1dxnLjNSI>wNZ;hPoFQt;j$8?*e1x$o_9M^Iz*D;SdX9k2x zoB2qx!&>PQFv^kwJcl{c@CylsuS3*W;`q^sDRmXA9|dkgLPA2qKcPfk1le#s^Z7F5 z2D%-Yw5nu-Ng@sFW1De>QUu|ymz!mxT^xg~P$vF6&C;V6)ymB)FOorB0bN9Il41(m zUVV!Ng-%S{91XP_G}bD)nja$aGeJLV)DB8)*J-)Gt9-%1pC?qm`2AT;PBVV1|yd%z}vpi(w6VXvMKCSi1Y z_topcF>T%j^Fnw&2?byEV6cp(<6XkSzD4$KJ%^&Igz&xnw9od(*MI~AVORFcK7?0- z$3H$uh8nz%)vDyU1$`@3GRf1Ew*kaN(|+UDIhXD3BE;hc!b}b`#4gHmmB3q@l*WXF zgh53PD*b$3HhoaiEQPFKd4{R{jfC7iip*LDIWP~Mvx$d-`NNbq<02c}PPs|RV-tq! z6{sw`kVKIW5O(-=LJ-el)B9AfZzTuJ(j50ajCVsTaum$myerH-lAB(agvFlJT|b{gKSc}Jw<0M= z2?+^P1m!d%8R{_Byy^8L4_7Bw&~G7^hmSH}Ak z?aD3rDvWls%ome=A0n|QMo4M63zPDH@bPD#Prq~$)1%+>}S+`WqzeX zZfv%>5Qc{*|2e^kX;%#J${Be3+u#0NRvnk*t*eT6U}zW{-Rz}NU-M`Pqvl1m?;-|U z4~&bASGOz@>^0l=o##+O!u-m&)}MDvT)Nt?!WkhA8vEuVu@qRg%{JRunL?qWcRMzeOV60a1+k|g36mADTN6M(-W^XfL8ygWK0V8v1h4Wun&oQWL59siGRl^JzJzK2G-YD#QLqd?(RR^s3@Sg;?p0GM8B(>hV|j11@#X z+9!mOM9rk$zl4PGpl*!EdkHh<0pB~mtOB93<(TvN*I0Ko$M+JG^(sJN(EA$mYm}6f z95laz+e$=q!ZbGAa6<_KkLh^t5EqW22&;%34I2L@TosNjJu0FZsw5F&$cM+WUokGd z4nLEyh|-!8CcEsiOGbX09P+YB9~$&;h%r6{v9JUo8guFYm)QNSw1;TI+ znScD_ANRMtgZ6r4$pLsbv`IKzP-Uo8zJ#Y8SWpf!<)QK~Are2I3_YmNVU3p&?`!l zW!GMNt(7V|ef!Bzev+|L*9iqF0m@!c<%GEgl4Pgdci;V`bn7FufXO6xo-=38!>mAk znESLO%AuYfNAcCqQrJX7!n8!gKc}90>VMJh&ZZ7RrOdEhz#u`w63i5)dlIIQI$!#Ch4G@(vvVJL1ak?pE7BauYUEbN7Q7?lnKpA=v(BA zxab}sv3*^2VxmOD()G}Zal)H1oxK=FJ|s?JD)m<}>A6bT&kRwjoJ^d}KsuQvD`|=S3(@y#Qb+y&tNh4|!5*7xr%HoPYo|41c9KgH1DsuT)m5IeLn3Iv z`<>^qJf&mX{q%H@=#Z??!@}1{4(b2ys|SShR^(NYJTMo7M1vJD%qQV>N|fNL+R51f za`Hz!1;Mc`?>D7gK>KS3_S$Q&mGGq47!u}mw)q}?i|Q99#rzJN9Gb!=5)!5-BHg13-yQ7vtO zWdPY$nWQXI_A2jkWL1e5uX6XWGtM|;pMK5apD^Xn&Bc<*GakE4G!)fj^@4gbNM9F( z*sj+u_k)6PmBWSjS1QsH4QAG5vYZt6|1f;4^ng2ci@vxb`MSEhqM(02;yYI|TcBsZ zC4GrH{Pw9%G!%8BW{WMh_;KX@Kxp)=KM4ulfX^!9U4vX=A<9A;qF^orlQ+g3c_`2R z1&jd=`W7ub79`c8d8{~YjAJV|SSn0Ug-AN-c+yxmPE{p6+j7e-Gpe`f^Fo zfXO90c^Al~ASq$r^nwV_2ajuCJJl|>-F90mVHoNpIia_MV^J>+n{!5o#Mo@J&9W6& zTv0EsJKph*cNl|w2~BT^=W)K%AsBvl_St9umLy%*p!~fH0?{xM^F^4P_S0;-2hH~> zJ9t9E^h7A;SJ6)ESC`=lpzN`M+wMn$WSkf#oFYh={gFAlD^Db5@Ng*gsEZK3(GYoq zl!1ElNrJPFpD8Q#uqz48lOR9!m}8FlAM#}Ekb%V!riUKTq%D5MKVhIz+2K<*M?-it zlwRO?!L~hJ0UuC2%0%}k6m*$Y4eCiVmcyl6q5;F*l6D(bzgvrmyr^QeZ{j|Z zkPs?X5(%B-k*Lvd3cUxS%7x=l4~b6rgR4GPx$yi!is&U_3Ci$lFwA0y9d?jJ^)tt) z@7tWy@Q@#HZEMv^ioKI-dzx!}7uT^O+t|-`RL+3h_!Ie8X0qMCyD=daiDXDfnC8IS zvO(+F%Kuaai$@#b@umSCC{G|-;XfTB;X@V0p#d(xkTgltgp85_R;Zw!xWt6bu`3DSSg4PiI7f^PTPR~NIs~f+3zSz>uZEPNm@u=mcV^($pBspt8qP-v&|V0Cz2M!%qPx0 zk{SgB%QI|tIL&c?RR%u!$xjXv$xzUmJyuQ=5~eGrTGff3qN>)VoH+6P^UuG4GLP$o z9yNgXvGfnQ8wy_Tft+6s+4ab}>#kc6F4!idLV2Yu8I^4CGv%6aJH7bG17ygbvNlJK z7Rb1{$X^%RzDS;+piSE9k35@oM4 zK1VDahKS@r0hXW7Wc?)f?V0BQgh!qdjV25VG{hweP>?jz^;T%|nM%<67=znkY%h;% zs06?aDlVuv8S>!&k<>9rNez9;g2?Yk?`<9VsCNU2A(d}4 z2-7GD`O7)h0Y@Eml;z&H4pQb*pZZjDf*~joj!|B6$tANm?}_#WY(cy7@WT%;`q6Mq z=r8ch#Pi&jIT{v~Xvm}LMEvgsjuQ@c72v*PUM3SfEGpSPER*8RFrqK6jOG!CO`Mv) z^;5*bMaLe*z<31X{-vyVw(NT^jC-DwD5+Q4CzDf-$QKd)`3KL{UopI%qenwpK};AF zsMu)0>ycyr1dVq+6Hss@@|F(|Ft;&BgE8;p`0Q)UNB$IZDwrps<0;@c zRDp_PI0p27a2pXJ6ed-Sl^yY_SG`K2AXa+ZH`=J<$Mc&f!g;|k4@--g3&PM2`{nzs zw%W?%tiGBJJR`455Dzgn?X#_o=S9it(-7s#X7Jt$8E=tfApW+w%{JQ<-Si4rT!>^| zgtx4Tl6n!|C~KnZu3IBW7Z%EfrF>1wXF|f%fQvKCyM^z0U94mJ;DZm&ciCl^p(>2x zI6dR^ObZNXjw^FCDA>#av@Y_+JVeE+tFAf>Nw3GCImOg#7g#ARWS{a%*#^;&S8}+G z99^C;z;l?}e@4>c*SdKv1Y%*KY;=F|ZTfjC?caERZZ8RDWKvFv>?W^^^|?z}ELA6Z z^2{s%y(1b>Mmtp}qAfs&^83j68t><22|3OCprP=Bs=C6Y5B~VA=u5kbC10;r7OC(( z6S#GrU3D#bY1CIMws}Rs1k*duiM=8|nn5&ZM43!45e*500-sa!Dul7G5+nhjcasW^ zVG8DBkW@gy@x2uwOz71y`f<55dv@o05k|fLdyEKi&_iP9op-iOrbL0HgNA*O9G!h4 zp=6ZW4A>`Eyd)PS1gt2b7lcVGB|zw7tOR)s`(V?9!E;4|NIfxB_Uub*lT9`$-u&h_ z=N#*4&izReRK7?qV+th2DylG+S^TbE^CR5fD3!J_GOs~1N$9rJb$^l!=m%wBz>>Bl zBqWT01VhYmlaZs0`8M=U!`9YE1`H~>FcK}2gL-ctL%zMuM8&Up&1;&F>BExXk`0m$ zAd)1H=eLryHy@F?8w$ww_M?wJs-C$zB*d@2``z!pzqSasD7t&S6Yr&cE9*Tx=kVfw z?h@vU2=`u;MN;>%wS5K8W_^ZbbRK!Hj5-_5yYp^)EFFhZjDSQ0@LO?^Nr^H7> zLbnj4fK?18B~Z|VY0-ep%0bkkV>H?Fnz`??-)rQ9ea`$X3;jOr1=i?81Q?K zA6^o+Nct$z;CCuq9^Y*}hTanOm{my#$Di9vF!;WnsoVazeRw`a>99`U<5)p<;Jr}N zZ|9H(*F2AFv|Q!UG~xGy=CV85Z`!I>jgIE}uGP6An*ar5648!?<%Brw zPU7OTslL>N+_nsJ8`;^$p(_{21&c52DIu8q?z7K6Ul?FQe@dZ?w$ndodXz4% zxkPlIXb4vy%9%Z1mn-$2aS{z~=fLjUdY_Yk25lHaemU;Va#eD*Mi}jrrBg<{j|m}} zq%|5|kbzmVX4T_luCENBoaVM&87#4?8wL`mlkh0KH((hIrH+8a@X6g=R0{b08b1&p zy~z&N0ymcfj@0hd;)P3XsOUuM!6u z{VGT?CM5;Tp6&k<1}a?=80`lz`CEmyh6q za42$XbCW|NrwT&REd4x8C`41aD5)QL8AgHfRB~SOJ}M|l>KDkdHpF?sexDpWh;hPLthqISX7UOlIB2L zlGW}78N=a{<#x7k@o4mVPz?ftoFU%pm9cWqq&Mjv4gO9+Dq#R=K>VrhN*0PV#=~67 z0?lBOF6nnZL2@L#C}dtue5ZT3_d>(Oe)wL(!wLP*qxAVM`k{+=9wqh~jpSvV(BJU+ zj@&HHr+OdRNaT%pD!^7duJMZjxI7G+>a9@wx zB4neX%PETAJNWqQiePA3_qj`z8JvF_)jZOw#m+V+BW`i^)mP8)&?vf8Ey6iCDT4_K z0}AFy_3hzPPd)Vr=Fr1fqbT#uDdSIxvHcE_MXB-=C!tsHrl8G z0e%qr>Ym8J)sSaRA15lB(gT z`#mi^+%=*BX7NoJ%1&H!G1zA~sZBO2<6#B{jrkZZs*L%P7h5RzH^35ahR|%`hSt>Z z=msJ&9f;C=1%_96&MYI*5X^gJsAzcoh(3phh5suYCY`iNNLUc5XZQnfb<25DQo-hX z$Dw%bc-N8zB%j-@9M1-EJ3EAUu}u{XD!EtXSdaZWly>+emy$ z6qx+gKI!$~`RsEDx6Xby-E>nVkF{T($Nw$C*(RSuV=lmp!eozkR2~o$Ee$qurDoXH zN6C@OZk?O_42fh&NSFdJxQANo)Z2C;PTxUl=~yN7IO(f-Q@!SjZj zZ@&3(!W4Hg)YgRN$hI60hde4GjZv9GDAy$2O^~dNbRjH zgXqgLh|?Go8Fvwa8}{TsvOdE^t=T+`!UZUSuE5n-ze-=hP?pfD5-QHbt3l&fgW8F1 z(!wUf$j3x=81I#1NC+_cdQQFe6VJ-y6nd3YNL&*z2bNslktzKeQg-Y)P_b~}% zoZs(5F;j{5`yfIbuae9KWAQhTB$5nI;2Ipt*Mt?F9Moc34dqw^(sm=}jkW39+fW4W z-*U?>-_2JKXM>G2i6tZqHipBtj}J(QJA+n&)+BlolznUrcLT$fZfWA-M)m()v{?}Q z+aNo?O(^1vAr6#Z!|1flsNBRpW9q6AGE9QzyjpZEAsaSF=HAXGZ;JbhjBNV8pXTut zE-|$bi`GFj^izr22``&RjPQcMU^d1n6w{(wVVjX9l+{DBDayHue4|=HoD>6@enf_O z$&WTDn2evS;*CYS=8o)2SxJ(dH=RaK4!qCYvpyv9_&|Vmuj#R?w!!IzD zUQgdkG6he1^^SxDu)z2_6_y|YBnq4-U;XM=8xkQ|5alU@tnIx1_{TpsG$O(reD=+a zV1{g!pCEN@b?-7s3*Gv&k%(LhX6n`zG^${LAT|uUkT{SK@%(x+)N}6GZ<`4%OUUKi zc??KW?ohb~7mKLW=FCe?&QqT=Ly5F9!#;Q4efNhs_i9|9M2q<-%s9RxWhNi6e5U(R z<)UwdZ$d)C^u)(M{_$MHw;$b{r!Y#Ir7k1HPT6q@Z8>D@myuZ?LXI}|&c(Z-fj%By zd-K!9{oHMogN74Evh_ zegdm@ktoYHTx;2vzx?HsAXrW%)_FC&8M4z)Km8vz@>R@*0QFupx$fn%goK2I{y;g2 z9t@KPs|}G$XmXU>K+OZL@^BCbLZGkvFaPo{j~M1hej~l{h9&(YNpoO6l_|V7?Hu#1 z<;bHF+4y4KUrvRJYmkrY$M!qyutUD%jyo1KUsDpX#fSD(F6mhU(3d$HifrPDgkodG zk3_tGtg;15IQfYPCK0l#)$6RPgj`AN9-aY{7g6Ga>dGbMe@YC68T8HA?eA3I6{Exw z{+imv$|J=N|D>g{NewGT43}?-Ec_)$w9p&>f^%w9bZqEegqCwFdXI;>F7@ zyX>-WLa-bGneahMjqO2O?}{s~_!8%TzxU)BAR$97^Cb^H_~0c!_OXx6pkER<+i{3T zr{gM4LPA19A7QbqCKH}lP%5-Z8`3Lxtp3y%&~9_hibb=NNY0tfoH?^eNJSf6GC~2B znPZU+%0gwMM0`%zV+*}lFTjnFnKvREH>idCwMT}mY`5KZIV~xxU54bAujih7?mqwh z-~au4@&v9}ebrC*x(r=#3=FJC!$b}JVj*MTBhgsg&>8;ew|J7p1@3{@t5LBxMzNFA zJQV5~7#x$5pCKwf5O!cr4a-M1F)V(=SJ!1Ak}d}L-T~agp!pq>>GBv!ZQPc-?nS`h zaRRp)KH&=QD@J*)a$jMHe|F9}=jht4hef9xQ9mTsOh_1G+}V7t!vn!NLDzq)ub7C{ z&mEHy!k|&@Ys?d&==gc(GslUm`Gz_8xm7Hz{T-oEdOWzl<2~ShG56SF>;-w@epa<` zKjFAi0YibZkDj|plPGx*(&6oF^3#X~T?mrFV;LrqH$Ww$o|!XejyY`hg1~To((}Xn z<*W0MNiw}}&*A)D<74#kK0f;i#LA(a5}FAK2?+_43Uu5TB6FV67}{^Y{d%eMx2rb3 zZNXMsZ53qr2l1Lc2N`lcI_rLIl~I%Qsi!!Ul@fXzNP>5LTsRiTCM3B2#4of ze);7~#`#V@`Q#1pNZgA>fKQu0D3Rd32Rh6=p13i0y)bnZ_t+EgpQ8>5X_ebbGec+oV)V2m?kC!&aiCH&Nm>Znmn0 zO|(a>at?V7teXB3Bj#B@<&pk~50%)$H)k?%oe z$N44u#V>x5X{>v`HP%=|Wk@dt|F4(siaZb=+kTk0!Q*&t_pu-L!9JJtHz#Dme*Om@ z1jeIYQ;~k5NYciQdiHZ)=h5uT>Qzb4XDLHAL*hg-0wu78$5jIl54ZWRop##k>ui2c zRs;R(r9zvKkdTltc8G8ZZ#;D5kw^X+J#jz&KjpB)4r_EfcR@u?w+KgG3wd`ca_sl$ zr=KuS@aCIuz92c!ro}eb(_VxO{WiyVH-tlhd~Mx(@4XEcuatXZ=4?Pd87i(kmk=K! zXM=s4Wu!DDL=)M09mms4(S(t2taR#^BZHN9k7o(pM34!m*(S5XOV)!N4Po1aT@9Yi z`V8Gz>Ro6f&Kn{tDDxM!W?QX(`ptWfC?`bXwl`oDJO@SI$tic9oCxa1!btaL{~u}G z#Cwev&h6@C8=|2gK22BXkMQ+x=Tlp`3>O`Y`rA1EzU5xUqBGVnx#W^ew@#}^2+4-XpBjti_>@i%pj-7-bxLZA+1C@^uiHZ>Gt=ISaW94zvD!o!;~ESq z@3BJZZ{z=ERad`VC3`H~hE>R1rQPjZrIciVc`aQ1L~;KQ4*MmVE1&s@-@L?7c||p7 zAK|!nGU@8ZoMQl0#!q*1+*Dy5WtC0;WuvjtOeBS`eE&bRm*P6Ek&!B!B=j|c^m7bF zWeCUXy6dj1t7+#u6&$l#yHesf4=;u&XX!o~{x-u0Bq0oykW>io1j$3kkM5i#yz(>0 zRFu+`&~V&(JP8erdHZ3G2TN<(7jr~Jc$LR4@xGc%|CWSk_T{7>esRUlrL(5uSpcV6@w<38z00ZEcWHq3*3SlL`L%u_{0F0?(~ zR8uMv5)u*y5TQF7!uHu7S3SsS<`?@Nr1)Da+1b%!YaR{bL2KJ>w+*uVQuO0xA>B_y z?(EL78xrw)2r6s&tgf?1SfO&)P(x*Mj!d*4dKup6cl7NJ^CQy&KSvJlBIhs3P%Rp! z6|(N4)yE}0%aOL+I8m<*W}A{Z8obDbsgmG!(MpiBTD7`FL$~8eP-Gh(uTLK;5i5sz z5CjWIs5x3$yzo?T!t;NPeUGVPZfl{87Z?_K=Cfz#J6+H}H08+E3Wm^LiYO6jx`v>Pb)~yDR9gzwKy5LnIfSyVhE3-9wDs+VrKM zA3Y&H5)!(E5EL;cBO$Br9gB`ny$kdtP(hJE&~w2&3(gykJCi)B#JJibK@i>v?(6D~ znXnCs(zC&_WF7?1(IFxpd+ag28_eh6Sn>GoE5Yb_oFh!e==hVIRB;-%$_!&GXVqm% z_WwId*}I~G<~Ziuq8=7epZ7_ibt$*RRqjW=9E`LnP#K_o11&7M8`Ll6Uh;r%yhw=W8@5$9HK zu4L6akU`(M^UgcZgP3p9+Q`-dl6@rE;QP?C&F`T6wMvsDxuJ$7ME#n`&tDP}`Gy)H z{=IINJWS|rh{B+N=kD2lOLjRvqG4j?Ek`CB3j=u`gKY-xMO*OI*H9R{eNzTyHES+L zfyRQ_Z6yqRU%zKj+R^tx*3=Wg`Kt1-5ux$n{gpJZj(vmuWLG`rT(tc8eaeiajHbn9ND@M>VR;yrA?e=dOHU7iJd+FMs z%4_)%>PwLN^g(+3`5C)U3~aj8|9leV+Afu+*gFg7by@Q;k7G zJ(5aB7HpNAPFMv7x^bgHDjGJS!QQEIL825pSf08p|WBT?OpKXI%?RvaQnhbO9qN*}81H!>` zwINXp2?&UYVYX>J|1o6vR-tq6vBw@W z7NR_%^0{AE=o1zrs>S;@O&e*-gih43(4iAC7~}nmvL1j{^%tA1Tz4%(6Z&>AVnno6 z_U$9}g|oZwzT4G2?`c_OO3j_X+{OvZR}BJ<4r8V@5+cLAuF-lEKo*!3F2^`|loiQC zILx=RQNROffcA=pve1v8d%wnF|1>rN^l`|TarWDQ{+*A3lIu;O0fJ%BRii$R#p^ENkT$D!@1Bg9j`$?{OCtN@_BbmsmOH3{;XNEBm|k%whwOL1``sl7)A$X?c_oC0*K1$zrcd@$60-qm z>VEdIT>!nA2ru(^*@hc#Xf+)By-T(7)m3k}goK2IgvmiH9#K8)oy_?sA|F)XR?Wr_ zWk`;fU9*c`ZtY6e3~62#mk7|a;DQS-kX#FI2fY>C zUZY#GQANfT|2lb5FUQp(EMo4c^0c@r;&vgdJdVb^#ASqElqf|x=lB(bf(ailh`w*R z<(AGzWn}EG^20b!6%v@BRWCJ04u+Lk{rM^Vc|Igc%Y=@cyI>xCJ+F~mEBD$#o6npN zB|P50_10UT!||75UU?a$Z+^E zt*`{Edm6@0F!A7cubLS1PEPftAEgbWq=*{#DDApV8}3l>xrrS=$EF$#OH?drS!ayH zSOIzTXFRTL8V_!VqJJLy@4~qYTFLQTd2HzAV4qw84FjhOu+JJ{uEw@J4+hG{5)Hg> zj^b)I&wJ^!h5*2b>gi*ikT79HSu9riO%R(AW9m54&C=BmLnVCvBR5NjgoxMcufM)S z7GQ|$&EV$}ejYPg%p384u-}%cGIvZ1W1y{(BJ{|GYp-`Mn9v^E~ed90t+6Xu_I z;)(A?mL7_XUJ)D1g@}zT$qDg4+-9`5Vl=#Nn{Bpv4HL)) zxc<-P;rRp;%IPpxEnYh-h8PnqRv3MtWU=%z(5TL<(xJZ^BRN}HYwd+dni;>d2GDLW zu*cKqr!WS54jLLk#(z7B_5#%)>bz3V_!E)ig4UF{veoWuhv=AYWm6Ld6XBuY96595 z%y6}|#H=0$dMy~z;AfJzoiT5mrxjvw5mnLfSvU8BuM!gVlD3gBHY!wj44d1>m90wpWI`s%COcxMgM*MfQPDZ({g7bF9Obra98CVd)$oM_G` z%qnDBi972Mec6TMeT4qJhu7t@goK2IgoVOomt8iK_FfVpE{-Z*Ay57w$A>{3en+nzUHC*^!}D_}{3yEV590NV%RP9~*c!x6F+MzKM78kMVd|A@p=m z&^qTk;)o;8MZf>5Bm-oBknbrzc(5@c63>O_0#wi1Gg+Tu!b`nlF^%=itG>$eIq)=w zE5-V^S&x9S-stlrVeKjh!_ye-hEA++_ViJH+NbC1$eXdIiLh?qk-rHzvEQc^ZJn^BHPrbdi8=ne)#- z{}&{m+@`j|SytN}NMF3SCHE%pCnh{0VSe5^5&;r*j3NJbTwC46@CiTbC@hhWMPa{3EtFrCu_5%Ori z{r1z=c#QTos|3PerAM(*}2QUeKLif=w01Lf+7b-p>qCu8z45A?vW9!ZOYFxd8E|T`S z?;|v`r}rX}Nna1R2%T`{jy6Y<0k@~ZnBw{-R^!mM8N_63JDy4DJ7lr_923n4n3NhM zh|#0K`>cU&k~F;>dL{@+3YXie&($$#S75Yhdpw9SV~AYZm*Mby$*uo z0SuTU+2m7IiNIZOMLSkw%;!%7!`0!0gnmUuzFNXkBVXg(CJ_(`8{HUnH` z+MGFa9DkA>L5kQPS8;6Sekgfu8CHSd(>tNT_cI_NJ+9ZQ2UgpV3C`Q3PlZGX+y9mE z`q@~?s*w!i0v-{sB5%!qavi(br(18m)$o#G!}TCAhIqe4+;*dAt7NZpiMLE z`DPOJZlTNo&(iWPx_i$T0~Gq!LS7D49)3F_C(l9N?q(PT&Co{^vj_1%U+)IPAbJ%Y?p0Jlj@Bajq0Tzb1HP^(b2;odsK4%@&1mcemoM z!KHX`hf-V%E$;3fT#G|-C@t>p4#kSQy99T+>38!B@|-zmX3yI1THEKWfsWSfBR*kd z1QBWy^li)H1u77y+{BFN`w$mq@Q@=0MiP5FC0XG)E*)!#dBT+A=MlTt4Y12ZF(7N` z!DbtJx}fWh3Q;=6my^rkAg1rzTH*HHibH&7JtaO#avdvLhRKBWOgt&2WT$z-NT#-4 zXQ1F8|2Aa_8^6nFV_^d7-R{zfpr#?f0nUS3A=S$3pk8S%^J!loQ$c&ZS875e&b9Y$<0X+% zj&uZRqVa|d{kcsufHt(&9YNW-@Q3+Qw^;!~)TG+t3d`+qmfzbU=QNh?+t3$1O(8RB zy|0t^oQrQc$(<3>r2Gn`F;?X_B9b2&vxJj-`IY=B2Ig!CKyvwC!2KlbX1HNP7dq8# zBz#<*mEDohib3e|BIaAM@F`qj7R#o1^V)e%#M$ z)3`RT;PZ5eLBT$^U@eHGU3s%9B!9e$d4wef=N#xxY~3qIAb_{b66h&R+Q4^K?U3%0 zq+}N`Ndm^Z_2lFlDBo;+xCa)$TMt)y8jaME8Z6!&$0?*(~(YSbfh@S-OVJ63kJIqO`=qI8`B~+?R}2CeqV8r+LVd}7382f zLr3&8HZDFKvG$-fMsumxTYU?@-?HBC#>vl{GgAfCEH)!%Xo3gOZSiBG`D|^mGtS$B zkOq(osB}K6ReS%!u8ToHJ-2W<8cHC?3{AmHQS>(c%BCVmgidnCOxpE&=HPdRg($jW zT0SIveBIuIK&mq$`&VLX`v8O?r=WwO;Q$vuEsw_pXh$FTi#u%o+grv{bVwuASfDco z(~TlB979(wLJNtzX?iNnb@wy7D~RT3N0{Yd^C++Oj>nG=ZHFkc+TClicjTYeR6>m*bePvp zorD-x#P$cC2RWbcEOYCfST5)!K{<`8EX(sLGp#iCbk080;qe|RO-e=YhddZW-`|Of zP?4f-v@|uq9dHpsaT+4K*%tf)JucroAG%ICNr1!q(ZKL*Pd7Jzm>$$zZJUj>KhUE| zLvlEDBSXv^S{Eiei<)zCV$L-E4DRakTey9K!Sgd~3YXB1eMV}DJbfhZf+A8->HX;S zH2UL-Qj7O2WF(aOE!NNHgGPEnwIxy&95O62)QRo0Z*(GW%j;@8G7bU`@+}yxZt9~% za4)z*rcgU5S5Zky4gsH-?BfAKApCi0IC?cPD?v%lf;R=-pmBZ zeU9G9_Bn3}2)S8|@i}O~Of2j@c_fQktd-!x>RZlBQWe#`Hv6X+K^4}cBaKilf4B5Z z8_rYXt6Fv%`j95AVwCT(rtqn(f8cshaObR4+=TIrq)UDt%U`C6;kW8aj= zK!U3=-qeH#kkG2Y(_dFo15?JrS%@kd1nsKL)~KI7>@g$>Aj(?f^i-0|Oqi+?mzauJ z_}=r`3*BW*@Yv8K2O;)8o&RH1W!x-~X;lnIsI?+D^1ji?2jN{FT!WZ1EYMsLAFpS(|Y%5`X-O_Ditnl!2__)sH{Pg_$c-(0G#n&- zu9uYb5J~oX1mtG_Rz5u52x$%SB(;+YB;RiMQDJ-M4U2E2TpE>=qbC}6lytv|C=SDv z|6xl(XVly;L!tI~m@?bs2i&ZbOS#W|hx#TEfw1Dp+ug}MigHLyBp~X*7R%LmB6I{X z4J-FEBg`2H3F6J`JBXm)d4G-!j0zu>|MSb6xc{KW?gypXuMu+ZL#mVayKctZsfWboT-4%UtA%vgkg2Q$ z6#lMk{m$&iLT#q~tyMt#p;2}a5JS+sR_keunN}@ZdcE-LAx?~FZ^W=)qW#;^s^P=6Z7InqbJBemP*k0a*U1MkYv5X zNq-{G5}fC0&6zTCq@P~@N1Hx6ElGcKqz_ZHjf;w_+x z8@TK%G)1BryMMk~(y|9ePUS-kSq8C`Pl;xsg7S5K)LytxxLB4X+w|5vO~L&^qv1u% zrEnSN-?dU4Nt>j%hUM_Ss=&wJs^;J%GmH)Uig3+RZxa1RZ9$3#sPMEi?WgT6u43Y# z<*X#YAMkYfpk00W0kO-CEf5E;t&iPn!U$Dw*zqqh1@TX<& z4oMgYq$>7)1X1#Vkm4;iEPhro)n&_O|Nxp z?ko5y9({44w-YjCqID1wn%|Px6#uLgiC3()hkkKVSV`;GXrd3iP+$)BF)U)z`_|+? zuES!!vLz8IJV;y@6Vq5O#z4+c=!6?@so$ia>e8E63LeFHMO@l_Ib7u;us_xZuF-`L z?eyn%4@*>#f}#5McpjDM;M0Z>@fW;$32hPNW(M_=$y5ko%ko$2_jlu)y$NQ%b~D!^ z^91Bql-x1z0_j|R^p^{EB4l6^8nH=O*LT*alvt!D07v9dX*}VO{Ln)HB(E_!Rw_m{ zNlJlnR)od3LG!O~M-a8~=s5p|t@Fr*fu*B=(?;N{N>wB2xAmq;X8&!a<%JUkqMDyR z+YQw!u@LC%GS-1?d~}@SvUiaYHo4LcD3IKoyYK$}nY-#Y*Co;xj(5n~l*3Z$f6)Or z;-ti63a{Ca#)+5i?x~k%^04Q|rM!ngW^icxH0^63~IUq+*hBDsHy`>{5Vt5ri%I{0X_hIoikqW{b1wE4q z$^+X?kNU2`P(qwd-#cfgCADqHp+ExWU)KbkiG=&4e*RA941QeXqEAW}?fZouT>r zneFhwU%t0-yZ2c`2 zxZ?g>%`&;nHGNI5S6q6)PdW7Ir`Rh~;b0RL22N0`p%94rje9TxE(d%|e&KT;4?tjR^O?K@GO_;d5Vuuk@eR32-}QL@`MpYz3bPzBH*esL7JN6`_GQCJbYWzPMW;r_E(}qfT5_M zr)Crqc)}t}?jSetORQ%2;`6eFj~G2@fl38rDaX)%5HOQ zJ?78>Z|%Mfkr{~%iTE8&A{w$EEPT{DGSP%LkL81G!6$rp7aBR7!&nmxm=1T=t@K1V zPO|~(HV8QTvTm`Awvq(@f!g$k+kA~w@j5b9y;9tw;J1{#xy!>wkceyC2NwDuli4-n zzrccEsfG_prVv24>cG+RB4go_RG1k<+_beehaw0knN(cGH^k)~bp<>m`?KF5o}t$$ z`wL?l|&= z_fV@^_A?z4c0E;hU4zi<@)3D1c*thj@^kW*s!M#Q*8mdtX>_0kp{gURHJ^39EYyb0$Ap?DqY~LoNS%@PUkAO}b z;9xe`wx^tjjVBc%lYubuorc~Py^x!;(a1iS3@r_YhT-3n4FAonfErYl&=qO1yx96f zQCxCv)ne@c5(TTCA{nwFw5+Zy=^@|9ix@(M>&-4l+rN71o--7M6(@V27@82s?Mtm- z9(U}wFGwd`ZokzD0skv#K~!iUQ_pM*N*GNol{i27(Zh!NIKlmN*rj)!cJkBcl^ol@ zTEkt%L``km@HJ$)#PP>3YL0eypD;nD+NO>acBQN}XA@-L=g;%@V~fcWtT9}ed%gU0 zhlEuB(Ju+rlwc5qieW-~>!2i=kn9r4g>O4x-k>5?kfd?>x<@oJ{whp>{H3NKh>YVh zfsu+#k5vYZ>fVE)=IVS{+a=2nkcbw7>3>~|lJ6;S!mSixS#7JJ`9mkc#=AdTDnnv} z!Q)2{eC2ZPK7U6>PJZwjEyzv~Y z!iFd{aX%;BQd51E?3Kbwp$C-GA!mQ2`$Jyt%vn!$Na78^s{7RxybcXwxAc@HlBU(? zQ4OZT@4SCjKQI~!EXpmT);4te>`B+3Epq%2QJV@<5QzKHbSv8J(_`Lg_jE7A*B1Xx zEQOA3<#LE304lVn=9HrcK0GAJdz_)n|0wg2#WEeiiSBb<+mH6mW(rKxYCdaKD;m>igvv4 z`PxyiDfj-&0bn5Ju3eaUFoGZ-lq)_vC@+-PH zBqVJcrjK)4!%NXj9w#EI;aVf)r!rk-d~t!8pej_zZV$ka|I)XAP488{87udF6H)Ae7We3Yts#6Y{e0=$_Sta@E>3F@Qr1*fkhV5?3Y36oO@7zMIRC+y`s zc%+jc^9evs3UZ91`yDg1r`>s#l40vYW+aV6LdTxRT^gs3#jSVs4uIPPNQD#?nUWcK ztYERU6J_pOi${7VoP3OO(W|_gZC28^d*NRynR#jIq;~B^W+3xggXf({p+nI z02nQ`A7db4O?RP6=dqP}5_FCd3* zeF?KY^h=_CFqxyI%a@t%p2Y>EV~~YJf+mS1dJMf`tMTOy#k;2u5~#w|Z^PkFGXln- z(nQO%bu}GrMCq(q60i>oO>ycW&ER5*PomI^$e`iEFNPsD!1yErEGf_uuxpQ%6YgYM z8bXe?g^t}{wGy9Q2DFr)6&zH4vOK}UP5r*-OPAY)q*@HSbTd}pN;*K+PLDQj>C)ND z33ii{;*m&s&xf-s`#Xh}<`^dsE~+Q8Jvcqex8zCswZ+y=VBa|CV2C&S3qE*Hn$U39 zX<}&QH|OW1Q~G~9rV?p=Lgd!kh4Sw5z#)p5lz&%{HjsII&itJAtIt}SsS+ll8@veZ zt1)ITgmClHagdCA{vi6yl(imRlZhk6ZWJo(iBTJ-Y-9}Mzd}V=!g&39Fk#_m{(`pz zmk@FZVAyIc8?#NefsM2z0)!%>;I11IF_Vav&Bj6-TTc#d_|EYf6y)oFW$#Pps;gva z37(rlk}0up^R!w9H=QJJ_IE{#$aI>v=3#Bn~dzjJuu67R1sFnIE)AH=a-Fvzb(PzNc`eLxn zoRDSDqQSQEuUio+A=8!=iL)R7S1SM#DeW1zSAI({cs&VTrEMo2EEZ$Azm%J};L$AM zr()F`wQ46(S|r0Si()mcf&RdRxJ2E%F$Yh4R@Y_j2O8L(#){(79sDd)2f-m}aG9V- zx~a;ubIqWv1T3rDXP?^J_a%6w_K=NIsWHmUVa9lkvWHutV+rC2d0%;#%`Npq74brq zcdOeB*?wj~Zt)L)^pty;u`2gv+2L>nHKG)N>yz2sAIwtAW@&n&(0&M`tK%1ll2c0! zFNm|{7w$;It_dzW5t$DeOr+IOCjprSa&8P5sd!dPdfvnQk~FI`!|(xU+6C)PL&>x? zliKr#iw_yYL$L8?xcK41aHsB=fA znQb?x$4>`+Z{aQLxP*FWyL0UxkA-7hb>t0Nv;V3n1mX&agN&DMg=(I|0@|UmHRvgD zB=6S#VQJF8L>TRZiG<8ARP<3NHy9u%iX_XN7#}FGdUU4A668)l2^xUHH7I;uB#Hjg zR;}6w{rg_^ZbkAfbWHzmf3Sgw`M4|o{O6zOpZ3R3%SaOeqEZiVBWB;QYcCAxsd-;y zU#$Dx<1>VfX~K|M(c&t-hy~O|?-tE)&;~PXW_hw*iEWr3%_NPfujl~owjXLGq#`#N z-I!_|_foWlEUbrZ0<(nGfg7)D=eZHl|A-qPo*dM13IvybCcP3@Dybr$;mRP{PeSDW zLh1ro>?)Ns)k!k@b3ubo!lJimA&-TO+QCsuxpmh^^hTfJokAN@L{U|<{I_5umQ1`f zIVsWh*|4>pMOjXc=djH_AQ2+s`9Tl)@7yjJi+wj67rN}nH3sv-C-(XP759&N%+ukn z`gfZ6mMshaF)X~{i?py1gO0;SvWLQdCz%eOCaPB->nyv(N9n)o(!#FmNz$Q`KQ`?g zeDvKR#T-l9P($fY;jm=w&Nj~k8W+Xu%>1$dT(1}3Pvl{-^HuqHr365dqu0fzFe$~_ z!1-YUbgz^Gan&n^I#EbICyb`!5TxSIpK;@pT~f}+4T*jjp8zHr&-}*a1>?o0_S)&x zw1*sQ+YwQ-)y;AXy7T%Wyyg;JAt8`jEl;<=3f{@5b>_IVmI$W zigKfm0lxly==|v%5?}M`UcY78?b~?rSz3lK=p;9w)Q;n$eixHhb8V!d&F{yR=v#di z`(q7)Ip?*l`ZB%Ud{0u?0!f}Bj&fXqRQVWtZ5)o}ru*mg_E|{-AQr*58%Im$RUDi` z_{XVkd~Vq-E8U!=6D#Kqrw@W~!T7AA89_~*w-rG0?{Bg?p;DtU+>^rBJWtiA3oGRZ zS*4N<3UZ)SDPAHNqq6&Q^A-9beyQCKVv}2oQlJ5?5^_5455nBYEh%yckf6lfpMB3t z6<$UeP$juurO9Sge=CX>FLwifYqq!F>}IuFJy+q3%S*H4vU_?teBPmJvbbce!xOt% zBIB1k-t|dx5JEsZ1=sr4i_YoQY^dLGhiDr^C)?W3m#E2QiR{8Uwz>oT2~**_wQyZk+zg3Ngz0P$P-Q1lOs)XQmEWpLG{-?IoB3f1rUSD<$KNKRTdFBg2OFaYf@(sdw2iJI9xFcG4 zzBhFeId5q^wKf{bSEf6PfOMMuLR{qQrG}+e`JavdQasOY*1d zQu=^b&xfpGJap|xJNf?c@f{qBTf89vY4$Fg-kmOC4_@$+3Uw3eMm#WH)mg#6cSB*^MrBk-TnF zf4BHYZ;f3p?bJ)8pziBf4t<%Cq`n#aCC@`tMR7T>(=Nz7m;ccCiEB7$=)xDNRPMZy zaOvV5A6OE^sgZOkdVjwFIEKOLNtn7fF-nF4+y|SYHVzl&nM|3?kLBYkNN7km#d7XG zOm{cJl_0y0Cqg29jbQHY+mLb{m5w?#?~_n-_5BZ9cR zILzGXgqaoE6NQab>Nd^~T3-K{Csf+Y`N|1f-iQTqQTI4XxSerOC2uPHV;Ox|kN&TO_PY?3Zb19-0fo}5Z;UR1>L<> zsjm9-J#4X!NN+BQL|497CqW)M-NM%{pojiqw)?S4{>(4cE$HRz+=94uZ1lW{aF=X$ zAsqCccGlEzE>jJYKdwWLroBSR7CUm02r*HsSKcJ7uRKWfq$q(XN1aMkp$tGQ_yjZ* zs7RQuXe_u`*FIV_#S7i31dkXwQA=}04FQK%NmC=ZSa%m1&lokN0vyF`ZH=BuI%wgl zDyMaVm7~aA&fH%)Eh^~WmM$RVO90DL8;&1fq%a@DYxeLiy)q#^Lctk|3M_b<_9~q8 zif)MIe}^u~^oAaf6c2WL>tyz5<9R-PE9US!GI{FcVwp8kMD-X4(aP->Uv$cUlk0uR z5iR3s2^i^Mdf0da4^gR(bVJNd#0qK82i@;9Ibv{^d6n);7WJ0fW1fw>n-;`}h)rw% zN^#}0<}fV%9;U+P-(0_SO{tPR7rNNGcI5Z>-k+?%2uLzQ&c zB*P?cD?w_RL!4zdKT@tYk6}n+xx_~MUaG#*s;vs6 zyf=_iIkR$A%NQws7#;z=>$VB{%G#o&Ck9=ZlI@ueZ0~-d4>;WPI#{AwF~eZ zlm?8CS##fw@PTv;>RY!mWK1y_p$+HH7uu1O4dME!Q(}@1%bwn%C3!-jnXV{F27`vl z&(W31(LYhxX=!{!d3(Lzcz44IA}`9~1%W2Txk`dS1?+Yt<|H2KbmG7%c^Xpyb`Baz z|345?xld3SRYE%G4w=4xJH61* zd`EC_m1J)7CY+AqH*!;;w`nU3E_uE(z0>z-z~CoefbuY%Ue7=6cRMo2gD+_*R#lxP zRO3o#q1)F9Xv2*#wJI0W<15FYqCklCuHUfe*W-(wNME6b)-#^31Dew~w$|U{KF7N~ zJaN!$8-_3Pf95)L@x80d9haavLjNZ@7m}7ka@&V8htGM_S;V3tbbe?+)<87OE3k!F zK4)$O73o2^m))%9OSyUCsAXdl*8tX5O7V~>c5!6*j!ojV%Y~Bf%L$Z-F-Len==8rg z?XH$*-|zuBd+0P28;j)^e@K6Fu-K?Z%a70$^RO0NT0RuHXku?M zqHiWNXxqqd?;I+x6uRiLk{d}LdvCr%EsQO&j&;CI zwcnb$X1=0kq@dS6sUolys_Lj3x9#bqQe}u4r(NhO(t|Ro;^2Rs1$Hj|JUZ3R3Fpav zig@_zqh&9QI>x5;=YP%o?f&mc7Y+f>EB9two8(Avk-i;7$wAmrOX3!46pXhC=4}RE zv1AyvrmVeGINArE@;oDT<^$!argol`o#`%qWNUjn!($F6H{^D|P7}sYSKNA`{qnX> zG%wFCEr5?$2X=nlz_%b`Tf^38!pSc9~yGTB;2QoaaV*9ph zwUB`*ph=>D%ytA&wioIFXDKIHbS(E@<0b^Emoz+Ce|QoxA!IU7Q8au2%B2{8*b~T* zT*se>S>E3`R;aD>>-X13>n<~&+c?OUr#{V$!^t;wG-td*wm_x=FEqTKX6U}O&gyRv zn{y@T-j*{j!*I;E1h{|$2Kp=)%$>hKn5wihgXcfJ66rPTh>#rLu1kzg1JDEWx4FNu z-m3$Cis{(5>_ssLt<|GpUS#rO@uIl7c{I#LhV6=Qjj8k1n{66;?WNQRt$Uz-g()4k zGL4`y4|l@1t#&?Fkc|7;Bl6GkI-$|(C2NMNm)JSRIX9P0Cc{{Jb8)iv9hVWop#vhTa!6o%iuQ|VSyTnCTFMZG zENr{{x>u+DS#R2`NRa%Q!h_miJ4%fVqE=Rs^6UwC=NFs<37N5MY`d*I*?4R5tOsg^Uw5Tf9PAUrA^~oFk z!_R4NSQ3`{5}A>8pGbG-NiTL;ym-Yv!M6My>I3oYT@fZshi|_wZhoE|F>S}rJS@sr zWQ_?Ac}zud79w^(`Z5N1vcp~b`pGp~dHR`Spl{1~990^(V{`*h4RDowwNWQ9wQ0f0 zop{1BWO8W1BIYWz4QJC;nSrwFj&4pzKCL2}9s^*bnKhbf7JqezLx&IzX;iB+x!LrqvS2jeWS#>9+`L`zAD{m_iE zM?cJqtSPOA(x8`61z$$MWF16De~`Vl0WN0k|PXS{y! zD8?W1*22>{H8PlwpueTCDWRzsq}1PRhm%|Sk;%XW4s|Mq@Ijow^8AF3`W0qjQUJ+= z+BG1<=hd^2)1~7C21O=ViwGlM7>ePzAt;P1HQ27{L=u}-V@CGbzB;4H5%Vxs3BMlq zi2dxH15F#?alU#7@`nuT76U#zNSEagbdSZDnehee5Z6cGCa%Q$l_g?b6jW{o?o_j} z*$D4>ot*&kbZMy2`)`rK%< zxV@7P^gIT>5mr-7z}c489b_5y3ZN0s&QOrAZIoqthJEdh70Q#A&{y_+6BR6o#t7jJn0_tJ$3G`3;v>DVFG+4?> zOpZAYmMMN#7esek7C|lJb#E_8zV5RH>*{1E~)S~hG)I*!=NW4u*1#>f-7vV24jZdi3PMj4M{431ah6S zsDLb)?lDNm4bXW0lhll~Xc3c@_F{3x$Sz!Qg5=6#ve#Xkk>dS2gG8z1J)xnz@pj8; zJ8IWX{Akl>?WC!x>{>}dWy?Nrn=3^SG|qzkoYwf@{h2B0B!|tg^+u~Zs$;B$lwq4P z%J0uk`vO;Z)?-Ca`pL~sokdKv(Xrlv*Zj32c2)3WeMSx>Wb2t{@KNvpCIVOMgMR?^ z_C)!9PHEL3KA`xoQZl1@fz*!@1nDOslc$;sloi;ggFyxFf05joVpv2%Ay-^l(};^S z3{X=XJ>$+S4@4EDnT!Hl6C*SNZUIn;j1MI5+WBg-8C36o`)_MN(%X^`5%E2+r)H8B z2|y7Kzn=rAUq%_PbjzCQsZh~)D2rY`FSIC?b5EIIRaILiJdNcI1=Hr4-l*yDnyC0= z{CbJ&YhQioMA0u~f0jxwlpYlgxnYcX^lc_UaY0G9MJxQy0;fS^k!5vxwU6AB+|PgXq1?u{1!?V&Jk6jNn!Z5$b3_az zkisccbZVjL;S)uuQ+9X4@uN*xs+^mU3Gize4t7|Hu?-qKw(ob4E~8HpYO2fqR4LE$ z`#KTwbe|_Jn8fG5{D~@9=WD$>>bE1l2&Y$MGm#k1Y?T!l*eW#?s6Sb{Sqm-(?~~t0 z{f-F4!xm7G1l-p--Kv5JTn*~)piO!6Yz@tj9&Ja|Ib zSqG%%%HG1r+Cr@>VUgEjtR$NK5T+7`<}DDxvkON0CHdW%g?b>FV#@XJ=Y!LwI@v-T zp=6xcBt%vO5~Q5#R-wR`RvjMmGcIuy7NpXQ^jdXbMTAWJ{GEJg!lfmTK4nQJN4!Es z2aL{x8Pl$n3dhBE4I;UxcoVWQNuje{Yiu({XA`x6h3T;z&kpY&?34CQV}u{M#^bwC z5qD6%_q34W;>;mWy7be~PDve}!C$@Z*p>I!N^vk~^^M~DYfd=cG?oc#nN8^TSKFy%S!dG6|+3C3H{9VQfB`fomC35uT13C}ST9!XH<>Apc7`8a_Q<~8UDj&}X$J%`bam*^cyjx_Edq!`MwC+) zfe68@dg81FmZk~F8Yb#k%P}xlKI2D#ocFx0ic3!X_D3?ifC)8>`p2f1H@eZJzfTr8 z?AXSLN?vU?5+e%6GXdK|mAdE%r zeU9x5La@yJCdN`AI3d9Dnn|t8b0%Vk5)8$WWcH&}Upm^4b0IclLnSY_F7nnjTHlHe zIAB?W#LB3POi-`+R|i3^(q$nSEd-ipH-CTxswH8hz%&_qc_ILsyfroeH_Tz&5f`l|0h>D<0jDPh? z-rKqVbay0BkHuK+UrN=^LYb?N{N_q+M!60N<}t~xH}K<#0wo>zaCzH&1^FF*X4K!Pygo)xNxLg{7+_FyqjnCPK+^;e%9 zm?du z0Nkv+%z(cv{%XolZn1t-Qdm{_=)(d(*@nfQ4hvDPQ7%#5?8JitOADR{MIyxG{k=O@ zx^exa|6sr`e$HNq#wr871~5vfB2rJJJ4g}bj&#h>c3Vz7=->Q+)iPh#harQ(zijvV z^Zp@P3vo-5YB&K1#e{OMeH69jk)zE<;2H$*XzW(-u`MdU66XG?vvKJoh8hvd3rv() zpPc&jCit)!!YzT&6Bfl{sP5lNZ#KXHO}8;B{Pwe*p0_IeR={2+UgS|s!6gSYh|7jl>IaJVQ0#zyfP(y&xSY>e^_>=`sc2N)lN@#IGUGA$4V29#m&JT zhnDV8T`bS=&ge$&^L#?0gO3r1FN8>MKGd|6c;dQJ$i|vRD0Pg!uRTxwMVfj2KbyTUGdun~K&roJqB{r6c;PY<888 z?k5|B2|r44gnBOB0kS$R>W3M8FWwhO{UcyjlQ=ybi28*-4#x-iTt;?jMEo|y*Q&if6p8l9`atdLfCufu9Q#X ziG{=PE$s1kNk6R!iHt7=jF%Lt8j@eKGqN{)?^>Baja5J;&-@d(Pg zdT{0&MkwR&wGoh_L6vT~I@)alSO}eszK>UiURJS3#Km~f zS6byd`N*9dguI8T3Npd!ZNeWI&XpGo^L4h20wrADVWPjspx+ROeuDlgJMb0pjHBv8AlKABb~unn7>21C#!gM7nH%JqO?ye*pj4p)K%kD+L3QAT&_Y`CADPg^`Mx8Kb%H^QtZb@>0f z-^HkXS?@AbJPEDDfNQA~2iixQ2^(ZMnqo-RtY+9J8>J9gX=wJBL} zV~IX=%4CF{iF)_F5NQaI@>ixm7Yx6im?%6H93u5M$&Y5ifs(u?)`9T%8vy}9d?GW) zJ&V|@{O~3+=#-Q+4@FrXI?PDqhrf3?pQ}6l`gLr%zsS{}EHf0jiTj@7I(73%@JA$f{&$Ei4UC9cLok38bY4xz&7=3CfctOB zriXtLm;iYpS#HDR9#km7b(>;wvRi6t4%8qZDmk@9m$pvoM#QU^av-p%Yd(d?>^+r& z^IMPp;^aH*`WCF_PBofWRSFV(8_r}+cN4g|SH&tVWP;xNy zA4QiagOE~;;ajv9?Wt%FESpbYkdoXwQej}Btn_e^3>Ya_wAv=~9KQp&2mXoYxhQwR z*zjlO#d-edBri7NPpWybYt*E$W@;5N zzTGT#rwb8cd{`Ff#AH9R^_)b9!Y~*QgY)QzRdw)(=3g?-;l z8GH~xJQmL(i={CCnI#qhO%Xk>*B#!y9GqVG!`*md+N)(^Vqhl@(|H{A1V%~tc&G2_ z=4z=E@XuMl-&|>cdVM7-j&Atz55v0o2OHmgoE@v}H?H*}s5XbY+Rfh zYgd@g*me5#(#sq5!0Cq;H>$}I+1eJ1{|Z?WUQNxrI`51xPjIYQUE)fmbf-^WvZV%gR!|pTO|UGU|SIJjPTPBcSCpElj{FS$@-k``&_zdmZ8l z-OzfwMP$1zUDo|eyaem_O6WUFL~&sJhaxC19hWexFzYqim=x?@Cph*|#`#HXg~_Wn z5^p|X-aSE58*{`O`{r)ADHBrbKW8=#CP^@5J+M}a)#9kgL({Xfxf}I)0K;vWl!v`922DO4*YpcWOKRy z)B~D?RbbzbZNX9K3pOy_=B;+kdUom8eCQJ8NM(c4lnZ)6Up3`>*?UJ(W44*>XKy%h z!atJ@t2~ah5Pl_@`JF<%FXprC&>IRkHJ-A#fdIWS`lX~@vulk}DK-O`{mvj_Cr(*~weMjM)K z`swHItWZ6FXbNbAs<8Xep<=A54u&->H?Zl9e%QW|b|h!!(n_kH?;3S`fSq=}{?_XC z&GmhHU=pRI}OG;wHOK=ctkqu>j;>3CX%G(k_(sdUn9)1L{n|ycK|MIc2%jMSKxhxnjP8q95u(5(rm|=eWQrz^` zWG!_QWuW!?QU1b|T71|okkSFpz_GkciFXvN7iwPFbkb)r-cVe@-y^KNIg9w{N1Zzc zoB;&9z2FBbIIx(R*FV^I@9~uM5jHFQiQw?xpX|2^)pUa?W z7)*NvFOPoaz6n1cx%W4b3>mE{PAf>P4+hSnOCZLD6$6Js0eQt~vT8M^fl?DzU*xUk ze|cRfUaO&e0M4Pxq?0}Bdu1}h(pFIJs`8;WE!Y=GR9g~x#(;jGgo+LTsV?Y_8NbpE zS4UC*eMDMl$ADRuY#zpk6O#U_6pHmt=zL)}8b46_y9@l3`S=u7lxqsgmgVG}q(0uZ z+3TyascwQeVAzK4H+ype72`eg1M?wuvcC4NVRiniC~oM5FcY7uys`g`D9Jlzr5kTs zm`TVyf+%bbxP*+IsJPpjH87ZSCEl(pg03&WKT06TWxX$ZHO5DgKfCJDQ(Y7hYWvdt z1^1wGo`Rn8$?LcfVm!ep8R@SukXY=I5?}NJ9oqQ(EG8 zXP)L*aP+}mYRwDBka{t;;-IDMnzLT@Ia)lk(XheM(RX4%GfhvB!xs8o(6}JXYbmr+c1+5gs6o|NfEt6-xnN+Bg>wgkW6ph0 zVolTTgJK|B%VpM63HWRKPG$3U)X$?aydrP`9x4H=oC)y%TdURV6{f^@8nqqgQTx;Q z4k&nV2ShM#1a&PYig;i=pAMczyTO`gaiVnQ4ZfepVo&CCY+?n`?NwQycQF#^HHXjV zU2pw}gKPyWpId#qEQoNAn)Hj|537DurBWmh3vF2hBtKkf1q)`~xl-+k*r+b)4O$|B zoIk4;OiP9>JVQdNh+H6jD6z=A3wM|@d|^DVpCRd z&kIpKEp1w5es3RsnuIQl2nu*W3*~+|_{2+W?hC^=@oKc}!>}hjucU}#DAfyh`9A*O-qiU_`K}XnD>W!uh}I52{P3)FUHl&9 zveMPzHSDW@1@CY-JeY2Y^?moleT9R z(2Y0V_;;91os4PEMw)~3!pL}W$lQ0#Z9)Mf%+<9fU>qF}pi-u9Pr0JN^roKImrH1d%RM1sPZ}@i(>pf*V>tIKHT_aGo(nj|qx6X4@_-2*0b)*pCHp_%+RJZd*qldE^FV zkfz6>YA_)+4y%|`FVEihFRMZI_8DQ>JLSW?jb=K^<4SZv=`T0FWifa|MKKE5;go5YP3Ntkb)&O1Ru} zVLloJu=F=mW$C7|w_qpjeVo3pH5LYO9qIrcj=Sm~I;FIFcthFkv_lR#q;FcS>LOXU z4z>`k&^WJd{07=lAb$@a$#gdBuOMX0 z5Y%kP->CP;fVZ6EFEam)BbcV=#2UCRf(w%-O>!MXIt;#Of8lx&eww;m7+WDgpa2)z zr3^S}3DZg2_J1>Nc%JoRjDEVtuGvX28z(U*kLeauXIzDCO12>#eDJ}`aBXmmbx$|$ zMIRtsbf%Z`CV`5QNosISYb~e`^AZ4rr3Z_xcNv4iAXwDTn9FnypP7V&M2Qj&loTHL zD0rW|nfJBtl4mL3?n#uW`>ADFjRk!{d5SU*1;nxN2qyzF91Y;`daaCA)aX`$n?y}O z0iL37whH%qi#%GLRM~}rui=A^hsSfD{WN7&H7;DY@4v7WMHzqUzvKnOGPb|eN7?@x z|8$!Ye_c$mYSl^hmqG&uHDe6jvKWchnY=bn4s4Dmx_4+K2`2{$-F3pM0sYKTCN3bG2pf*QIO_`m0_X=6~>woPLl2xf@v>yDvojTRCS zSW;IFT@sv!V1wh%7^k1#jdt(6^Ugy78GeL-JEyb?7!zP}4wazBd+Gaj0Dw0$MxTou zmjcHd8@hE?_iXG*IW?@(tiyAy+em@=;!4KhW-b_@Rf8ad>)@Jdt)bhApIUfCHi@dH z!gaK+ZX&v@xCYM0`aZ9b-m?7(`TSY}7%6B&3kI)+;DSLc9gAz!;y2wc?lUMeV>pce zZNJI5v+#wi(3o#jFd`pCM;jo^=@vVRG_BZ5H|15w~}US2BL zUV}C5hCN+I>tfNcwvqdTp-mPIBa<4H2k2D&tj&`z00HA|U_1qfjtKcacnW5ka!;K) zRdZ^Eop%3;MkXnYDsUPHKw&R3AH*gVAX6Oo-T)2voUk0w+~4}`?-Ap`dsj;c!2kt) zzl*>NU{&K8gqD6aq%a?wf|~TUD*_e_ri%>g8poj}gVqgE*A3L7KyJE8ffF_I1tkOh zUrB$zC$Qnz2(}oO2F&j_{Qni&*v2FYm3+;*QJC#TK|25!``6rG;6qCa-|bD-Q-S(= z%D+->j=7YnB#pI@vElayuo784f&wJaqRCI@tKjZ+3O5zs4_Z3t#^QWsAY511LhA?5 ztFEcv)q1!_X8kBKNQ({6g|Yx8q#R;CUcU(dBd^$}YlOdOjrFwuYJka@TZ=k50K!)M zyFxr@b=G{>UVH7P0I0Wc-Y&Fdy8;@5CcS0Q&~wUrqwBRQi4r9mTp}LLx@r{T++R?Z z^d#yJrFU)jQAQ~~^{G$o0ncy*e8n%uj~{=(9@UhfD=oO9PDcrJ8vFmwW{5)ZqMK@i zeYGC(3;J3!sxZ(3RUX3lRDk{OVJ|+D;}5b2AKVU*4IOykfq7|}>3F)vwW4ahz_{hd z*2Z-r=F(eQHT;g!HK{+>M%v5cGk}JH2Cb-CG<1_6NuqTpOqpgcUc7k47ryX?pCQ=) zO=@YV@*814}CnN@j>OC?X%T_VfZoHh(lSYL&`pkfl**h zqKk=h3irB5mnmRk+X6XSKe&#uHqP7m>w+PO5LQTk@N9byfhh~kiv?|H^RcM6nxK}p z-x9dcHKPOp9KV)Uf{(USRAMOv@NzY=D`r)?))HbImRgeu4!V$d5zhm(?BYG+b#Oj{ zR@-g2-7DOKpP~BKDN<*n&L&EfXs9Wp6g8-49m!Zd=bUp+ecH5XiFsKAC6J+e>8PWQ zdXRnn7WUeGuz0*->C&YI{KHItBMwsdnBGBoAE3Z?#DcmT3sHH3I?9-qX~x}S!zw=Z zd5&wTD$k-7WCIt*76G>9gC@Y&Jj*_QcEzHiQMy(XStm@Y`$t7ZQTE^R67oX>wrHrj zPYeOcTUrL&q9GdWkMI`EdKAw|%-0AZQ|Nh#VZz^l8Pm0DA=P&Jz-U74&F4!1)KNx% zy~jlekU@WKK?eViGp%xy%LScRzgAkVE`4xijhK>o!BfW4~FM#?xM}dhR zNoxa-31$d5I4_>(4H29jOB<+AD5n@J;sWMy1^_|M=6<+q7(s~47NOOF#qqkvf(!x& zkxJA0T7@{jSigvap#@2dwJ&*muf6taaZV0{(Fk`3+P#bR_s|j}T>C1N+jfwtKRLe% z)ftC=PXeN8$LiVf0{JVgCB3U>LJ;k#i1AawW1Q5P**=3gy@RQ;$bV0q;`lCPjeO9`Hk(GM5&7My(&RQe-fT1PeK3lb)fWVtu$y zWKd|U?4Z9VS!DXV!lWb7pio@@=XjtkZ-7~EzK&P zLqVqFnI;kqK6wol_TpMw)KVKK!I!Q;mjbOCdR-_YW`hE}!n~&Zf&ylbu!QwNd@9rn z2q=7dj-ZA06_o8q5F*kLS;BP!@_T?EZg#fsMp&Rx&v+(Y#{W>0{AZxO(Wu`>TkQa; z2>A9FnHdBZoQGp~PWEfD-D*D>)I+4@RjfxZ8|=-342(%s`w7l{JwQvVig??Wpr1uo z5UnL_w*)L~QxL;X*Fg(}@E6R=<5~ItCoot1gkXYT0pGQ%$Q*xIh6r5Prt1~}U{xDo z3Gl`?rML!`pvrIY499x^9L>kEtnpmN`QEZ#ZFQL}DpVNbg1Oak)A0Jb7G6)+T2Lqe z2k#v}W4&Dq16}G9`a8}Yx9hIE_R>yki!HX8M3o0AlGh{mlms#)N;LZDy6di6K#ZS{ z5`1=Fg(j@ix+XB&I#Q;kTLu-73d5nEmte8NDQiBH{qIKiH^yaZ#T0bDi^!NsfCT|0 zNXM^6hG>-cR@A$b@(z?8ABRs`0zXvaxzZBScyD>c&7yt?+!ptId9R$9Dd)TMP zQSVcmZn|j?=X=jAqut4rCckwJ*uWfq$@sU4EE4^dQ>+g){Yu%WlimWQ6+=NxvGII9 zIp{z`xiABA!Eo_p5cM(c1#~nUUVAqgKP?KVYVQ?@ z6)x4B+m-^R_m1%a+{ASAiS`t_b*~Uyu-K08u-Mol&$Dh1)gX}8b6k$oHf&q)Va_q*FuzdyMI>pa76Ug#Y{QeJ)$EeHz zCV7l81b6`k01w*^R|d5J24jqP5w4%>XgvW2{}-%t1GjDiYXZ;BG3jlwX1bHqBMXOX z>l&dw&>|vSL)v}!1p(Gz85dEQtsAiv!a~90o1^hq$TKl3srAlL2<2TaZE-)o?>Bm5rg&Qhu2%==%597+9oZrX&WiO3j)Si^{X(a|XQKHdB z!Ep1=6*T@V0H}b&e2&ckXsEYMwue9cfpx_(#~d@HAPVpE79Z~WKjxi$GW+L+Zb1oX z=sJpfNB6?E^#bxj?3Jsnx9`6D1_*F5!M86ZW85Y1_J<)~zZhgD1*uyIwHXJ z^0IF!*dyQ+M2%O-=!i8#kOGyU0#TY3ZoJ?0;j;gf(sG!S?+dS~*$uQZhzt)3oeJIp z0s;wY&b<%fnum}Y0fhu7tQW_R;H0FZX@fGqe=%UEk*mdJ+u>>aROc6F1c?o-N8;EJ4qQ-&=|$=3nr9DgRMrh4NBx3lEfiz& zOTqiCNv^KOocLv@KsMdx{V0`76Zn`S(BLt~9CI2Ji-v)M1umS7;>w;x!;|j$6_B9@;;0t3W5PZCD`c7#pnA*~P;!|V<`i)c5by*lz0PfBE+~Th zSx3#hT5C1;#s_foQ8*PW@a65f{vYX+bP-Sh58;%JsOpMiKMJY}%WhuQsYXAxZ$W~- zaRr*C^+hdW5}5hKD9W1K)BhOS$xM?e=wbho;|qYqaR=ZaVBl|lmz?W<`|YQdf#XvM zk5rGVK$pj0?T}$M*g(jyaoAK*ezwQunCQEO5T2v8&jdH@Kl<~#^ZdaNexLMZ6#9@!N$xLrf?h>R2`8>>I1P z5!gwz)>M?jY^HJvdW5nSmYc_NA1>sYD`&_jH2AD>UmCw5ET{u`P+1|bz-(VF4;p3YGKkbhExN}loE9Q!eI2rI62 z0vc*-VbM_agYL!`Z=!zE%$YOuco50mzl?`@B0`wLoghQOOCaO3ZMNKL3iI=zWH~du zDPE%CpD$RTuq}cezWx5L;H_re-xMg_RMfgFC>lRN^M30`I!DRx;Z_jG>?14*LVK<| zhM6e*-`}N34Oz9cu>GJiuu)J1nbf*QHwOiFgCUBrI~V)(e1-Tn_<;c5WUex+HRk5A z7;825fS`z<0Z?QJ)x9#dd+xbs&6hp@`+L0-h_!CJj!(^71Y-;#KR^^fh*;aO%xDl; z$#$-$jSo|tbDeRY3Ue*c($WVLEkQhg0t_;M0yNb$qqbLlHse_A53WT7?rfHp9yK%& z0pdIzAVVK|!Le2?P3*G_WZ87AT+5%9=6zCt-MNef{bx`iBLg_|cU@3@R@4bggBb+i$jC?8r zP%5wWS5a;(g-<#Uz~Cc1XLYPN4gTH4^0F4ZOelUr;VJ*deJ}8k0hBec+N@)Zs+G<` zq_j2-`2Ca?ah5uHFK49{?9X|o!gWF(sJ|8s5r^wnu2ToCsB(%KLEdic7UjL$Zo6%= zKm*sL7}Q{p{Uz%|aZaOyi;-v$3BReTCBwro;X7jL-DJbb5au#`rZY5xZbE~ePBP5M zR|6a*U}2b3H65X)D)d_-Z?al)&FKXz4Www+0L;U04S(y1)&R#MZq|N zIYyiM@=cjC#f%UkVB4NxfSa3E10EMVvk%(|&>>9SA|pWoW&Hk<-6M3rP63v>8QO0F zi`X0@){4 z*ad1HVsrf}=>K@?ooOmbtp;q%5>cB4LhMse1h)(=I&#M4+HcPDzAen=iLA*Su7UFq z2&uVtT4xA;=q_PVa+qX*I*!Q{{`9_ z$J%bd`fSEL&Z6&U%{;;N-JH*fm{0EFSYv~RA~r*-4tb3ME3||#YsiMB$#1Jts`Nz* z4D@y|AhRER^wHfJ`!+PQF=c9n`L0L0=GejM@3o?k~Kn_TkthNZ(v?D+z(KBf%vTtzU|3Xi*>y1lJM*yn-ykv&9WUAV5LZ|7&W_Js$A} zyyyA`YxIBJCjcXCSAal&GVfI_aKcJJAVLr!;xi~vD+CJ+#MmOcf-VpW_x9uQ@CP(- zqG={qA=LJw-I?q=7?k{Z+RUieju8+6N$o>o4pl3Pf;Kbe^n3hgZ)1J7V65AffJ6aW zpTXG0=Hi%JSQ#`-v6w-eo0paYiwJ`Gw>1A!1VX3%Pt*6G^Zh3j$uUo5tW#*K$#`nI z9BGE=yd|v&!jgb--j#5etWqdpRvAm4BTnHZO>s`9?R_4^|ad> z#F}|8d^0q6(C=amZn@=_cQTGWnA;8j3fp20v+?ZNvyUqyUjLvhT1Kb=+=U$7JH46~ z?d-G9Ud|fqRtBS*0wX@3b-NAi$V~SA2&L%eq*RR+O%M|Kq;GJ5S5M zi6@?TqG|Ddn?d~;_m3%iedt3UstfpcSc_WaAKKdOrAwFY$e!~sd%Knu+fa(rPd`1q zYezPj*D3i%_HSxg*AG`?OXDfJ^I$(qG8*=vGEcm?OHv@2x_o7~%%y=ynK{;T> zTzH8C;0v_c{Fd#bm{_mY4F%*UN}m@mz4TJYDNp3#tUu>d*VN|nga6*iBn!c(<5D$F z-cKvygAO|AC+h`hptFGpeb!HAPQ#Z9|9tIhU;8F6^=Swu1rKN*0o!2i*9!;`nFchY z_5~s87h2>*!;`$G3W^qm#xUboV2?DCzPvmZ86V1Ygl(-j*Zxto>{oIR&M~#2FJ?Cs zEd)%fNF9NMHt;3cj-Z6?=ws?8^S}cSL^?;c>uvW0Nnu%V0SXI(u%xj~K?vK6SOyk_ zbH|razn7Q3g7m*B=)VFnmJM2vLN&sw{TR^Fd)fetx_lIjOE98IyLIMas>E3ofsxDj z?J%_UO~zIC9Que@5dsUn)UnMMsCNUd7AJDri^NO#8^&`Ozr9Gk27>mpJfE*H_tyg^ zD1g5X%cCi5#GYG=6trR0fhBkf_!VEmFcYk)_(h^(aEW1!;K@!RDtKkdjU zoWmSu*#}f`tsQ^iHBo!TJaYjWu4hJl=g?wJbC$j)sMObw7+`eg6)RTErp=F2e-l2n zYH5Q=XzPp?{|$pdpL*)4W3)s8WLQv@;&yVRx?0-ppYJ_iG&rOP8=t*@t`d z0Kp#Sm9I~RB~hY8T|r$d;Ff_O1%SWA`}#8oCxYI;7G&t}*v+s5`L!{Wu3;5H>`y7u z_>X<;V;#}vCh7`m`Dg0XsR1}Fr)&*>^C9-&a}4N=%pecggugLHQ(nzL7M7vZQ+CN8 zdgvi}fEEJ(pTeWu!EaZ>7yh-z0u;}wuMgRkaRk5ci&A-&Q~LcpnXbExp(W4h`5k>0 z$3Za_W7O~|uRXXx!vH9>l_^HUFs3C-mYe~oZ~y{Iap#?P`tXL9Qh{+$0fumcP;fzW ztMF6!P$@{7(Sp9$OP`6>FGYYufdm9XHQ(MtS}HUVaus;>_i6(Gk-7+hH{2PT+z)j& zk}GNF+iV7NV!1`O&{m1hKBt(uQ zXkx@TP@66QVPB8%+pU5O9DA)GLutLBFl?|K10*``SP5N+Bxp3Tus@E;yF7o_b--dCLN2G1qEx^K&xQp8J}67)d-SS zqujwcHv%N=%V(s)d>K$+YroQOUuM;4(Z|9hEEF7y>rh%xc>Ntm+v39Yjewi1ag)y) z>*xG#fhj&jyrztiu@l;ha{(lF)l$VaoNu_Xc+DZ_Kfmm&5o2=m*OJDsXaKjGKY#vJ z01VqwJQgt}ybm1LH|YQSwD%YREPvK^pMVm`kSI~2A*Lci1_2oF$-DYW_TW!=fY1J# ziMPuAFdt% zDRrPsHX1E2R2{^q9W{L7#EA)g90pVdwrhfbPrT-uYnJg4`j8d`jLQ(_d>GbCR)+|( z2gslx)Ivj=BZw+6C_w64uCS6U8-@`@W)RKY73>u9%;+HCP(}-mK#MEc6mm9)8iIGm zhEb?p_ID{<7dT$EI0%H-qWQjV4w2@_V%=(Ng|_8{LZ|l;sk?Mh&`jPSjB4ep0+mUY8wf3D|3sj$R_?#8G zV>n&b%D5Go76Tl2t?yy2{~hLZ4>rQh9h*Q2KtzL0yzcrr2d}L~0lcc+k8yiFEY8v2 z4n6eHjVmr53jU5M^ArNjewY4sW}dH5HYj6Y1fUSt!gf5?fa=UstCJU5lf!7^MvD8+ zyNL;L67xQsSQUaTu5W`jY5|(_{R!SNr}FiiJ$(oeC_oUc9ggFk{EF`(*2wqZD%-@Z zr8RBZw6TDo`-t=OBubPhQKCeNI!b*5IU=)sp8eSX&nlEuxHQa)r!X(iDQ_3#ck9U~ z!Phhid|yMc;PLOF$l!|>pcJq9&7tYDJ*(D(Gs?Wm%*d}84!F5w8)w-=L#|kTMAxiIyIwL7;`-9 zB>-dyrItwlmuTP=!g>T)w5VN2KsS27f?!+FhfW7kp32M9EGE4Qqzc~%n`*8_lKTer zDOynY`A4RKYF3D9rU-*X(yp6LT+@g%5OE3gGt+X$I<{AxgNV5Ir1za;ua$`N_LMI( zzSF4oM8%wJM|{^VEbq}=O9|`Sw&T(=LjVter471by1xX_S_n2aX-kWcdTCK|8SyQS2op!N z6W1`_g9JVVC>XObEu3TBrEzW5AZW-y=}Q6W^z2RC}I z;nM*!9C5@EV@jr_SRdw=i4rABv@WC~l#kX>xjqagu?Gl5yLY7bZK9^i3MgC^KXbwf zCw%E!-}=_s@M3e3CF&>yw8Ct{3(3bt8q9E~P*I{gc#U+|DiCt`yPetVpMp<$v78f#rFX>HeyWu1{tKV#(?C>o@yT(Y>n?4ESp%bu_)-2)t>hM0}nhf z3dJ3>7Qcfz=h2=q{q730tVLx1A z)Vga`(BQi-f9=pGk#S%S$LD|~{~z26wkT5`p2EB1UcNs_S;==h$hh}vwyWSQ5MX

    {tSR116(rhg5b`?0k;}Azvn53!{^LLez<@= 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%0D?|TM2Vdnh8!qx5) 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 secureRoutes = [ return const Dashboard(); }, ), + GoRoute( + name: RouteNames.CHAT_HCW, + path: 'chat-hcw', + builder: (BuildContext context, GoRouterState state) { + return const ChatHCWScreen(); + }, + routes: chatRoutes, + ), GoRoute( name: RouteNames.APPOINTMENTS, path: 'appointments', @@ -352,7 +362,7 @@ final List secureRoutes = [ }, ), GoRoute( - name: RouteNames.CHAT_HCW, + name: RouteNames.CHAT_BOT, path: 'chat-bot', builder: (BuildContext context, GoRouterState state) { return const ChatScreen(); @@ -649,6 +659,15 @@ final List dawaDropRoutes = [ ]), ]; +final List chatRoutes = [ + GoRoute( + name: RouteNames.CHAT_DETAIL, + path: 'chat-detail', + builder: (BuildContext context, GoRouterState state) { + return ChatDetailScreen(); + }, + ), +]; final List programMenu = [ GoRoute( name: RouteNames.PROGRAME_REGISTRATION_SCREEN, diff --git a/lib/src/app/navigation/drawer/customeDrawer.dart b/lib/src/app/navigation/drawer/customeDrawer.dart index ff494237..5c38cafb 100644 --- a/lib/src/app/navigation/drawer/customeDrawer.dart +++ b/lib/src/app/navigation/drawer/customeDrawer.dart @@ -71,6 +71,15 @@ class _CustomDrawerState extends ConsumerState { Navigator.pop(context); }, ), + ListTile( + leading: const Icon(Icons.chat_outlined), + title: const Text("Chat with HCW"), + onTap: () { + context.goNamed(RouteNames.CHAT_HCW); + // Close drawer + Navigator.pop(context); + }, + ), // ListTile( // leading: const Icon(Icons.notifications), diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index f45c7a38..368e495a 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -209,11 +209,6 @@ List getGenericMenuItems(BuildContext context) { // title: MenuItemNames.TREATMENT_SUPPORT, // onPressed: () => context.goNamed(RouteNames.TREATMENT_SUPPORT), // ), - // MenuItem( - // icon: Icons.event_note, - // title: MenuItemNames.MENSTRUAL_CIRCLE, - // onPressed: () => "", - // ), MenuItem( shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, icon: SvgPicture.asset( @@ -286,26 +281,26 @@ List getGenericMenuItems(BuildContext context) { // title: MenuItemNames.CHAT_HCW, // onPressed: () => context.goNamed(RouteNames.CHAT_HCW), // ), - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_planner2.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset( - "assets/images/period_planner2.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize, - ), - title: MenuItemNames.PERIOD_PLANNER, - onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), - color: Constants.periodPlanner, - ), + // MenuItem( + // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, + // icon: SvgPicture.asset( + // "assets/images/period_planner2.svg", + // semanticsLabel: "Doctors", + // fit: BoxFit.contain, + // width: 80, + // height: 80, + // ), + // shortcutIcon: SvgPicture.asset( + // "assets/images/period_planner2.svg", + // semanticsLabel: "Doctors", + // fit: BoxFit.contain, + // width: Constants.shortcutIconSize, + // height: Constants.shortcutIconSize, + // ), + // title: MenuItemNames.PERIOD_PLANNER, + // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), + // color: Constants.periodPlanner, + // ), ]; } diff --git a/lib/src/features/nishauri_chat/chat/models/chat_hcw.dart b/lib/src/features/nishauri_chat/chat/models/chat_hcw.dart new file mode 100644 index 00000000..61448309 --- /dev/null +++ b/lib/src/features/nishauri_chat/chat/models/chat_hcw.dart @@ -0,0 +1,16 @@ +import 'package:flutter/cupertino.dart'; + +class ChatUsers{ + String name; + String messageText; + String imageURL; + String time; + + ChatUsers( + { + required this.name, + required this.messageText, + required this.imageURL, + required this.time + }); +} \ No newline at end of file diff --git a/lib/src/features/nishauri_chat/chat/models/chat_message.dart b/lib/src/features/nishauri_chat/chat/models/chat_message.dart new file mode 100644 index 00000000..2b6402ba --- /dev/null +++ b/lib/src/features/nishauri_chat/chat/models/chat_message.dart @@ -0,0 +1,7 @@ +import 'package:flutter/cupertino.dart'; + +class ChatMessage{ + String messageContent; + String messageType; + ChatMessage({required this.messageContent, required this.messageType}); +} \ No newline at end of file diff --git a/lib/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart b/lib/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart new file mode 100644 index 00000000..00a46e78 --- /dev/null +++ b/lib/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/nishauri_chat/chat/models/chat_message.dart'; + +class ChatDetailScreen extends StatefulWidget{ + ChatDetailScreen({Key?key}) : super (key: key); + @override + _ChatDetailScreenState createState() => _ChatDetailScreenState(); +} +class _ChatDetailScreenState extends State { + List messages = [ + ChatMessage(messageContent: "Hello, Will", messageType: "receiver"), + ChatMessage(messageContent: "How have you been?", messageType: "receiver"), + ChatMessage(messageContent: "Hey Kriss, I am doing fine dude. wbu?", messageType: "sender"), + ChatMessage(messageContent: "ehhhh, doing OK.", messageType: "receiver"), + ChatMessage(messageContent: "Is there any thing wrong?", messageType: "sender"), + ]; + @override + Widget build(BuildContext context){ + final theme = Theme.of(context); + return Scaffold( + appBar: AppBar( + elevation: 0, + automaticallyImplyLeading: false, + backgroundColor: Colors.white, + flexibleSpace: SafeArea( + child: Container( + padding: EdgeInsets.only(right: 16), + child: Row( + children: [ + IconButton(onPressed: (){ + Navigator.pop(context); + }, + icon: Icon(Icons.arrow_back, color: Colors.black,)), + SizedBox(width: 2,), + CircleAvatar( + backgroundImage: AssetImage("assets/images/chat/userImage1.png"), + maxRadius: 20, + ), + SizedBox( + width: 12, + ), + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Charles Mabel (Kiseuni Dispensary)", style: theme.textTheme.bodyMedium,), + SizedBox(height: 6,), + Text("Online", style: TextStyle(color: Colors.green.shade600, fontSize: 13),), + ], + )), + Icon(Icons.settings, color: Colors.black54,), + ], + ), + ), + ), + ), + body: Stack( + children: [ + ListView.builder( + itemCount: messages.length, + shrinkWrap: true, + padding: EdgeInsets.only(top: 10,bottom: 10), + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index){ + return Container( + padding: EdgeInsets.only(left: 14,right: 14,top: 10,bottom: 10), + child: Align( + alignment: (messages[index].messageType == "receiver"?Alignment.topLeft:Alignment.topRight), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: (messages[index].messageType == "receiver" ? Colors.grey.shade200:Colors.blue[200]), + ), + padding: EdgeInsets.all(16), + child: Text(messages[index].messageContent, style: theme.textTheme.bodySmall,), + ), + ) + ); + }, + ), + Align( + alignment: Alignment.bottomLeft, + child: Container( + padding: EdgeInsets.only(left: 10,bottom: 10,top: 10), + height: 60, + width: double.infinity, + color: Colors.white, + child: Row( + children: [ + GestureDetector( + onTap: (){ + + }, + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + color: Colors.lightBlue, + borderRadius: BorderRadius.circular(30), + ), + child: Icon(Icons.add, color: Colors.white, size: 20,), + ), + ), + SizedBox(width: 15,), + Expanded(child: TextField( + decoration: InputDecoration( + hintText: "Message", + hintStyle: TextStyle(color: Colors.black54), + border: InputBorder.none + ), + ), + ), + SizedBox(width: 15,), + FloatingActionButton(onPressed: (){}, + child: Icon(Icons.send, color: Colors.white, size:18,), + backgroundColor: Colors.blue, + elevation: 0, + ), + ], + ), + ), + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart b/lib/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart new file mode 100644 index 00000000..602b02f9 --- /dev/null +++ b/lib/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/nishauri_chat/chat/models/chat_hcw.dart'; +import 'package:nishauri/src/features/nishauri_chat/chat/presentation/widget/conversationList.dart'; +import 'package:nishauri/src/shared/input/Search.dart'; + +class ChatHCWScreen extends StatefulWidget { + + const ChatHCWScreen({Key? key}) : super(key: key); + + @override + _ChatHCWScreenState createState() => _ChatHCWScreenState(); +} + +class _ChatHCWScreenState extends State { + List chatUsers = [ + ChatUsers(name: "Jane Russel", messageText: "Awesome Setup", imageURL: "assets/images/chat/userImage1.png", time: "Now"), + ChatUsers(name: "Glady's Murphy", messageText: "That's Great", imageURL: "assets/images/chat/userImage2.png", time: "Yesterday"), + ChatUsers(name: "Jorge Henry", messageText: "Hey where are you?", imageURL: "assets/images/chat/userImage3.png", time: "31 Mar"), + ChatUsers(name: "Philip Fox", messageText: "Busy! Call me in 20 mins", imageURL: "assets/images/chat/userImage4.png", time: "28 Mar"), + ChatUsers(name: "Debra Hawkins", messageText: "Thankyou, It's awesome", imageURL: "assets/images/chat/userImage5.png", time: "23 Mar"), + ChatUsers(name: "Jacob Pena", messageText: "will update you in evening", imageURL: "assets/images/chat/userImage6.png", time: "17 Mar"), + ChatUsers(name: "Andrey Jones", messageText: "Can you please share the file?", imageURL: "assets/images/chat/userImage7.png", time: "24 Feb"), + ChatUsers(name: "John Wick", messageText: "How are you?", imageURL: "assets/images/chat/userImage8.png", time: "18 Feb"), + ]; + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + body: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SafeArea(child: Padding( + padding: EdgeInsets.only(left: 16,right: 16,top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Chat List", style:theme.textTheme.titleLarge,), + Container( + padding: EdgeInsets.only(left: 8,right: 8,top: 2,bottom: 2), + height: 30, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: Colors.pink[50], + ), + child: Row( + children: [ + Icon(Icons.add, color: Colors.pink, size: 20,), + SizedBox(width: 2,), + Text("Add New", style: theme.textTheme.titleMedium,), + ], + ), + ) + ], + ), + )), + Padding( + padding: EdgeInsets.only(top: 16,left: 16,right: 16), + child: Search(), + ), + ListView.builder( + itemCount: chatUsers.length, + shrinkWrap: true, + padding: EdgeInsets.only(top: 16), + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index){ + return ConversationList( + name: chatUsers[index].name, + messageText: chatUsers[index].messageText, + imageURL: chatUsers[index].imageURL, + time: chatUsers[index].time, + isMessageRead: (index == 0 || index == 3) ? true:false, + ); + } + ) + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/nishauri_chat/chat/presentation/widget/conversationList.dart b/lib/src/features/nishauri_chat/chat/presentation/widget/conversationList.dart new file mode 100644 index 00000000..6453f071 --- /dev/null +++ b/lib/src/features/nishauri_chat/chat/presentation/widget/conversationList.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +class ConversationList extends StatefulWidget { + String name; + String messageText; + String imageURL; + String time; + + bool isMessageRead; + + ConversationList({required this.name,required this.messageText,required this.imageURL,required this.time,required this.isMessageRead}); + @override + _ConversationListState createState() => _ConversationListState(); +} + +class _ConversationListState extends State { + @override + Widget build(BuildContext context){ + final theme = Theme.of(context); + return GestureDetector( + onTap: (){ + context.goNamed(RouteNames.CHAT_DETAIL); + }, + child: Container( + padding: EdgeInsets.only(left: 16,right: 16,top: 10,bottom: 10), + child: Row( + children: [ + CircleAvatar( + backgroundImage: AssetImage(widget.imageURL), + maxRadius: 30, + ), + SizedBox(width: 16,), + Expanded(child: Container( + color: Colors.transparent, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(widget.name, style: theme.textTheme.bodyMedium,), + SizedBox(height: 6,), + Text(widget.messageText, style: theme.textTheme.bodySmall) + ], + ), + )), + Text(widget.time, style: TextStyle(fontSize: 12,fontWeight: widget.isMessageRead?FontWeight.bold:FontWeight.normal),), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/self_screening/presentation/self_screening_menu.dart b/lib/src/features/self_screening/presentation/self_screening_menu.dart index 7bc81861..1638703c 100644 --- a/lib/src/features/self_screening/presentation/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/self_screening_menu.dart @@ -31,6 +31,15 @@ _menuItems(BuildContext context) => [ onPressed: () => context.goNamed(MenuItemNames.BLOOD_SUGAR), color: Constants.bloodSugarColor.withOpacity(0.5), ), + MenuItem( + // icon: FaIcon(FontAwesomeIcons.capsules, size: Constants.iconSize, color: Colors.teal[200],), + shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, + icon: const Icon(Icons.calendar_month_outlined), + shortcutIcon: Icon(Icons.calendar_month_outlined), + title: MenuItemNames.PERIOD_PLANNER, + onPressed: () => context.goNamed(MenuItemNames.PERIOD_PLANNER), + color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), + ), ]; class SelfScreening extends StatelessWidget { diff --git a/lib/src/shared/input/Search.dart b/lib/src/shared/input/Search.dart index 2b9247f1..c5450302 100644 --- a/lib/src/shared/input/Search.dart +++ b/lib/src/shared/input/Search.dart @@ -1,15 +1,24 @@ import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; class Search extends StatelessWidget { const Search({super.key}); @override Widget build(BuildContext context) { - return const TextField( + return TextField( decoration: InputDecoration( hintText: "Search ...", - prefixIcon: Icon(Icons.search), - border: InputBorder.none, + hintStyle: TextStyle(color: Colors.grey.shade600), + prefixIcon: Icon(Icons.search,color: Colors.grey.shade600, size: 20,), + filled: true, + contentPadding: EdgeInsets.all(8), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + borderSide: BorderSide( + color: Colors.grey.shade100 + ) + ), ), ); } diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 76058151..a58a3d58 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -45,7 +45,7 @@ class RouteNames { static const LAB_RESULTS = "lab-results"; static const MY_CLINIC_CARD = "clinic-card"; - static const CHAT_HCW = "chat-bot"; + static const CHAT_BOT = "chat-bot"; static const SETTINGS = "settings"; static const Facility_Directory = "facility-directory"; @@ -67,6 +67,8 @@ class RouteNames { static const PERIOD_PLANNER_CALENDAR = "Period Planner Calendar"; static const PERIOD_PLANNER_LOG_PERIODS = "period-planner-log-periods"; static const PERIOD_PLANNER_EDIT_PERIODS = "period-planner-edit-periods"; + static const CHAT_HCW = "chat-hcw"; + static const CHAT_DETAIL = "chat-detail"; } @@ -86,7 +88,7 @@ class MenuItemNames { static const FACILITY_VISITS = "Visits"; static const LAB_RESULTS = "Lab Results"; static const MY_CLINIC_CARD = "My Clinic Card"; - static const CHAT_HCW = "Ask Nuru"; + static const CHAT_BOT = "Ask Nuru"; static const FACILITY_DIRECTORY = "Facility Directory"; static const PROGRAM_MENU = "Program Menu"; static const DAWA_DROP = "Dawa Drop"; @@ -100,6 +102,8 @@ class MenuItemNames { static const BLOOD_SUGAR = "Blood Sugar"; static const PERIOD_PLANNER = "Period Planner"; + static const CHAT_HCW = "Chat with HCW"; + static const CHAT_DETAIL = "Chat Detail"; } diff --git a/pubspec.yaml b/pubspec.yaml index 842f7bdb..dc6c9705 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -114,6 +114,7 @@ flutter: assets: - assets/images/ - assets/data/ + - assets/images/chat/ # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg From c135a4ff2ef92891d8380c965d5e76e1fc8bfc29 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 22 Aug 2024 09:32:30 +0300 Subject: [PATCH 033/140] :ambulance: Fix VL lable --- .../lab/presentation/widget/ViralLoadResult.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/features/lab/presentation/widget/ViralLoadResult.dart b/lib/src/features/lab/presentation/widget/ViralLoadResult.dart index 436c945b..4f8efde9 100644 --- a/lib/src/features/lab/presentation/widget/ViralLoadResult.dart +++ b/lib/src/features/lab/presentation/widget/ViralLoadResult.dart @@ -23,7 +23,7 @@ class ViralLoadResults extends StatelessWidget { child: ListView.builder( itemCount: data.length, itemBuilder: (BuildContext context, int index) { - final color = data[index].status == "Viral unsuppressed" + final color = data[index].status == "Virally Unsuppressed" ? Colors.red : Colors.green; return Column( @@ -54,9 +54,9 @@ class ViralLoadResults extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - data[index].status == "Viral unsuppressed" - ? 'Viral unsuppressed (${data[index].plot})' - : 'Viral Suppressed (${data[index].plot})', + data[index].status == "Virally Unsuppressed" + ? 'Virally Unsuppressed (${data[index].plot})' + : 'Virally Suppressed (${data[index].plot})', style: theme.textTheme.headline6, ), const Divider(), @@ -64,7 +64,7 @@ class ViralLoadResults extends StatelessWidget { ], ), content: Text( - data[index].status == "Viral unsuppressed" + data[index].status == "Virally Unsuppressed" ? 'This could mean the beginning of treatment failure. Kindly visit your doctor/healthcare provider as soon as possible!' : 'This means you are adhering to your treatment well. Continue taking your medication as advised by your doctor/healthcare provider.', ), From 8a99b6adf5d1548f7bf4a5b03ca14623c062e7fa Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 22 Aug 2024 17:54:22 +0300 Subject: [PATCH 034/140] Add chat user list --- lib/src/app/navigation/app_router.dart | 8 + .../presentation/widgets/Greeting2.dart | 2 +- .../presentation/pages/ChatDetailScreen.dart | 16 +- .../chat/presentation/pages/ChatUserList.dart | 101 +++++++++++++ .../presentation/pages/ConversationList.dart | 143 +++++++++++------- lib/src/shared/input/Search.dart | 5 +- lib/src/utils/routes.dart | 1 + 7 files changed, 215 insertions(+), 61 deletions(-) create mode 100644 lib/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index d8a5d179..346d022d 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -57,6 +57,7 @@ import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart'; import 'package:nishauri/src/features/lab/presentation/pages/LabResultsScreen.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart'; +import 'package:nishauri/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsScreen.dart'; @@ -667,6 +668,13 @@ final List chatRoutes = [ return ChatDetailScreen(); }, ), + GoRoute( + name: RouteNames.CHAT_USER, + path: 'chat-user', + builder: (BuildContext context, GoRouterState state) { + return ChatUserListScreen(); + }, + ), ]; final List programMenu = [ GoRoute( diff --git a/lib/src/features/common/presentation/widgets/Greeting2.dart b/lib/src/features/common/presentation/widgets/Greeting2.dart index 50541c78..7bfdd959 100644 --- a/lib/src/features/common/presentation/widgets/Greeting2.dart +++ b/lib/src/features/common/presentation/widgets/Greeting2.dart @@ -56,7 +56,7 @@ class Greetings2 extends StatelessWidget { Radius.circular(radius), ), ), - child: const Center(child: Search()), + child: Center(child: Search(searchText: "Search...",)), ), ), ], diff --git a/lib/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart b/lib/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart index 00a46e78..0255086b 100644 --- a/lib/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart +++ b/lib/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/models/chat_message.dart'; +import 'package:nishauri/src/utils/helpers.dart'; class ChatDetailScreen extends StatefulWidget{ ChatDetailScreen({Key?key}) : super (key: key); @@ -17,6 +19,7 @@ class _ChatDetailScreenState extends State { @override Widget build(BuildContext context){ final theme = Theme.of(context); + final size = getOrientationAwareScreenSize(context); return Scaffold( appBar: AppBar( elevation: 0, @@ -43,7 +46,7 @@ class _ChatDetailScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ - Text("Charles Mabel (Kiseuni Dispensary)", style: theme.textTheme.bodyMedium,), + Text("Charles Mabel (Kiseuni Dispensary)", style: theme.textTheme.titleSmall,), SizedBox(height: 6,), Text("Online", style: TextStyle(color: Colors.green.shade600, fontSize: 13),), ], @@ -56,6 +59,17 @@ class _ChatDetailScreenState extends State { ), body: Stack( children: [ + Positioned( + top: 0, + right: 0, + child: SvgPicture.asset( + "assets/images/rect-bg.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: size.width * 0.55, + width: size.width * 0.55, + ) + ), ListView.builder( itemCount: messages.length, shrinkWrap: true, diff --git a/lib/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart b/lib/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart new file mode 100644 index 00000000..b850c0a6 --- /dev/null +++ b/lib/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/nishauri_chat/chat/models/chat_hcw.dart'; +import 'package:nishauri/src/features/nishauri_chat/chat/presentation/widget/conversationList.dart'; +import 'package:nishauri/src/shared/input/Search.dart'; +import 'package:nishauri/src/utils/helpers.dart'; + +class ChatUserListScreen extends StatefulWidget { + + const ChatUserListScreen({Key? key}) : super(key: key); + + @override + _ChatUserListScreenState createState() => _ChatUserListScreenState(); +} + +class _ChatUserListScreenState extends State { + List chatUsers = [ + ChatUsers(name: "Jane Kamau (Kenyatta Hospital)", messageText: "ART Program", imageURL: "assets/images/chat/userImage1.png", time: "online"), + ChatUsers(name: "Glady's Murphy (Kenyatta Hospital)", messageText: "Malaria Program", imageURL: "assets/images/chat/userImage2.png", time: "offline"), + ChatUsers(name: "Jorge Henry (Kenyatta Hospital)", messageText: "TB Program", imageURL: "assets/images/chat/userImage3.png", time: "offline"), + ChatUsers(name: "Philip Okeyo (Kenyatta Hospital)", messageText: "MCH Program", imageURL: "assets/images/chat/userImage4.png", time: "online"), + ChatUsers(name: "Debra Joho (Kenyatta Hospital)", messageText: "Some Program", imageURL: "assets/images/chat/userImage5.png", time: "offline"), + ]; + @override + Widget build(BuildContext context) { + final size = getOrientationAwareScreenSize(context); + final theme = Theme.of(context); + final searchText = "Search name or program"; + return Scaffold( + body: Stack( + children: [ + Positioned( + top: 0, + right: 0, + child: SvgPicture.asset( + "assets/images/rect-bg.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: size.width * 0.55, + width: size.width * 0.55, + ) + ), + SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SafeArea(child: Padding( + padding: EdgeInsets.only(left: 16,right: 16,top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + IconButton(onPressed: (){ + Navigator.pop(context); + }, + icon: Icon(Icons.arrow_back, color: Colors.black,)), + Text("Select contact", style:theme.textTheme.titleLarge,), + // Container( + // padding: EdgeInsets.only(left: 8,right: 8,top: 2,bottom: 2), + // height: 30, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(30), + // color: Colors.pink[50], + // ), + // child: Row( + // children: [ + // Icon(Icons.search, color: Colors.grey.shade600, size: 20,), + // SizedBox(width: 2,), + // ], + // ), + // ) + ], + ), + )), + Padding( + padding: EdgeInsets.only(top: 16,left: 16,right: 16), + child: Search(searchText: searchText,), + ), + ListView.builder( + itemCount: chatUsers.length, + shrinkWrap: true, + padding: EdgeInsets.only(top: 16), + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index){ + return ConversationList( + name: chatUsers[index].name, + messageText: chatUsers[index].messageText, + imageURL: chatUsers[index].imageURL, + time: chatUsers[index].time, + isMessageRead: (index == 0 || index == 3) ? true:false, + ); + } + ) + ], + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart b/lib/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart index 602b02f9..b5c29da6 100644 --- a/lib/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart +++ b/lib/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart @@ -1,7 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/models/chat_hcw.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/presentation/widget/conversationList.dart'; import 'package:nishauri/src/shared/input/Search.dart'; +import 'package:nishauri/src/utils/helpers.dart'; +import 'package:nishauri/src/utils/routes.dart'; class ChatHCWScreen extends StatefulWidget { @@ -13,69 +17,94 @@ class ChatHCWScreen extends StatefulWidget { class _ChatHCWScreenState extends State { List chatUsers = [ - ChatUsers(name: "Jane Russel", messageText: "Awesome Setup", imageURL: "assets/images/chat/userImage1.png", time: "Now"), - ChatUsers(name: "Glady's Murphy", messageText: "That's Great", imageURL: "assets/images/chat/userImage2.png", time: "Yesterday"), - ChatUsers(name: "Jorge Henry", messageText: "Hey where are you?", imageURL: "assets/images/chat/userImage3.png", time: "31 Mar"), - ChatUsers(name: "Philip Fox", messageText: "Busy! Call me in 20 mins", imageURL: "assets/images/chat/userImage4.png", time: "28 Mar"), - ChatUsers(name: "Debra Hawkins", messageText: "Thankyou, It's awesome", imageURL: "assets/images/chat/userImage5.png", time: "23 Mar"), - ChatUsers(name: "Jacob Pena", messageText: "will update you in evening", imageURL: "assets/images/chat/userImage6.png", time: "17 Mar"), - ChatUsers(name: "Andrey Jones", messageText: "Can you please share the file?", imageURL: "assets/images/chat/userImage7.png", time: "24 Feb"), - ChatUsers(name: "John Wick", messageText: "How are you?", imageURL: "assets/images/chat/userImage8.png", time: "18 Feb"), + ChatUsers(name: "Jane Kamau (Kenyatta Hospital)", messageText: "Did you get it?", imageURL: "assets/images/chat/userImage1.png", time: "Now"), + ChatUsers(name: "Glady's Murphy (Kenyatta Hospital)", messageText: "That's Great", imageURL: "assets/images/chat/userImage2.png", time: "Yesterday"), + ChatUsers(name: "Jorge Henry (Kenyatta Hospital)", messageText: "Come over next week?", imageURL: "assets/images/chat/userImage3.png", time: "31 Mar"), + ChatUsers(name: "Philip Okeyo (Kenyatta Hospital)", messageText: "We are updating the appointments", imageURL: "assets/images/chat/userImage4.png", time: "28 Mar"), + ChatUsers(name: "Debra Joho (Kenyatta Hospital)", messageText: "Thankyou, It's awesome", imageURL: "assets/images/chat/userImage5.png", time: "23 Mar"), + ChatUsers(name: "Jacob Otieno (Kenyatta Hospital)", messageText: "will update you in evening", imageURL: "assets/images/chat/userImage6.png", time: "17 Mar"), + ChatUsers(name: "Andrey Kinyanjui (Kenyatta Hospital)", messageText: "Can you please share the file?", imageURL: "assets/images/chat/userImage7.png", time: "24 Feb"), + ChatUsers(name: "John Otiende (Kenyatta Hospital)", messageText: "How are you?", imageURL: "assets/images/chat/userImage8.png", time: "18 Feb"), ]; @override Widget build(BuildContext context) { + final size = getOrientationAwareScreenSize(context); final theme = Theme.of(context); return Scaffold( - body: SingleChildScrollView( - physics: BouncingScrollPhysics(), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SafeArea(child: Padding( - padding: EdgeInsets.only(left: 16,right: 16,top: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("Chat List", style:theme.textTheme.titleLarge,), - Container( - padding: EdgeInsets.only(left: 8,right: 8,top: 2,bottom: 2), - height: 30, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30), - color: Colors.pink[50], - ), - child: Row( - children: [ - Icon(Icons.add, color: Colors.pink, size: 20,), - SizedBox(width: 2,), - Text("Add New", style: theme.textTheme.titleMedium,), - ], - ), - ) - ], - ), - )), - Padding( - padding: EdgeInsets.only(top: 16,left: 16,right: 16), - child: Search(), + body: Stack( + children: [ + Positioned( + top: 0, + right: 0, + child: SvgPicture.asset( + "assets/images/rect-bg.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: size.width * 0.55, + width: size.width * 0.55, + ) + ), + SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SafeArea(child: Padding( + padding: EdgeInsets.only(left: 16,right: 16,top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton(onPressed: (){ + Navigator.pop(context); + }, + icon: Icon(Icons.arrow_back, color: Colors.black,)), + Text("Chat List", style:theme.textTheme.titleLarge,), + GestureDetector( + onTap: (){ + context.goNamed(RouteNames.CHAT_USER); + }, + child: Container( + padding: EdgeInsets.only(left: 8,right: 8,top: 2,bottom: 2), + height: 30, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: Colors.pink[50], + ), + child: Row( + children: [ + Icon(Icons.add, color: Colors.pink, size: 20,), + SizedBox(width: 2,), + Text("Add New", style: theme.textTheme.titleMedium,), + ], + ), + ) + ) + ], + ), + )), + Padding( + padding: EdgeInsets.only(top: 16,left: 16,right: 16), + child: Search(searchText: "Search name",), + ), + ListView.builder( + itemCount: chatUsers.length, + shrinkWrap: true, + padding: EdgeInsets.only(top: 16), + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index){ + return ConversationList( + name: chatUsers[index].name, + messageText: chatUsers[index].messageText, + imageURL: chatUsers[index].imageURL, + time: chatUsers[index].time, + isMessageRead: (index == 0 || index == 3) ? true:false, + ); + } + ) + ], ), - ListView.builder( - itemCount: chatUsers.length, - shrinkWrap: true, - padding: EdgeInsets.only(top: 16), - physics: NeverScrollableScrollPhysics(), - itemBuilder: (context, index){ - return ConversationList( - name: chatUsers[index].name, - messageText: chatUsers[index].messageText, - imageURL: chatUsers[index].imageURL, - time: chatUsers[index].time, - isMessageRead: (index == 0 || index == 3) ? true:false, - ); - } - ) - ], - ), + ), + ], ), ); } diff --git a/lib/src/shared/input/Search.dart b/lib/src/shared/input/Search.dart index c5450302..1848aa09 100644 --- a/lib/src/shared/input/Search.dart +++ b/lib/src/shared/input/Search.dart @@ -2,13 +2,14 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; class Search extends StatelessWidget { - const Search({super.key}); + String searchText; + Search({required this.searchText, super.key}); @override Widget build(BuildContext context) { return TextField( decoration: InputDecoration( - hintText: "Search ...", + hintText: searchText, hintStyle: TextStyle(color: Colors.grey.shade600), prefixIcon: Icon(Icons.search,color: Colors.grey.shade600, size: 20,), filled: true, diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index a58a3d58..a61b9779 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -69,6 +69,7 @@ class RouteNames { static const PERIOD_PLANNER_EDIT_PERIODS = "period-planner-edit-periods"; static const CHAT_HCW = "chat-hcw"; static const CHAT_DETAIL = "chat-detail"; + static const CHAT_USER = "chat-user"; } From 2674fb1e91b13814da9628f8dab2b8bf3f5ebf0d Mon Sep 17 00:00:00 2001 From: NewtonMutugi Date: Thu, 22 Aug 2024 20:38:07 +0300 Subject: [PATCH 035/140] Refactor BMICalculatorScreen to calculate user's age dynamically --- .../pages/BMICalculatorScreen.dart | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart index fdd42444..274f1acb 100644 --- a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart +++ b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart @@ -36,9 +36,12 @@ class BMICalculatorScreen extends HookConsumerWidget { final heightUnits = useState(HeightUnitsPickerOptions.In); final weight = useState(65); - final age = useState(27); final isForSelf = useState(true); final userAsync = ref.watch(userProvider); + var age = userAsync.whenData((user) { + return DateTime.now().year - int.parse(user.dateOfBirth!.split('-')[0]); + }); + var userAge = useState(age); return Scaffold( body: Column( @@ -94,6 +97,16 @@ class BMICalculatorScreen extends HookConsumerWidget { } } }); + userAsync.whenData((user) async { + if (user.dateOfBirth != null) { + debugPrint( + 'user dateOfBirth: ${user.dateOfBirth}'); + var age = DateTime.now().year - + int.parse(user.dateOfBirth! + .split('-')[0]); + userAge.value = AsyncValue.data(age); + } + }); }, selectedColor: Colors .white, //color for selected button @@ -212,15 +225,25 @@ class BMICalculatorScreen extends HookConsumerWidget { units: "Kgs", activeColor: activeColor, ), - Quantizer( - min: 5, - max: 100, - value: age.value, - onValueChange: (value) => age.value = value, - label: "Age", - units: "Years", - activeColor: activeColor, - ), + isForSelf.value == false + ? Quantizer( + min: 5, + max: 100, + value: userAge.value.value!, + onValueChange: (value) => + userAge.value = AsyncValue.data(value), + label: "Age", + units: "Years", + activeColor: activeColor, + ) + : // Show similar quantizer but one that values can't be modified + Quantizer( + value: userAge.value.value!, + onValueChange: (value) {}, + label: "Age", + units: "Years", + activeColor: activeColor, + ), ], ), const SizedBox(height: Constants.SPACING), From c03c41ff98b5053a5fb0d2aa460bad99911646fc Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 22 Aug 2024 21:44:19 +0300 Subject: [PATCH 036/140] Adjust Algorithm by adding a cap on the average cycle and period length --- .../pages/periodPlannerScreen.dart | 23 +-- .../presentation/widgets/customCalendar.dart | 181 +++++++++++++++--- .../period_planner/utils/event_utils.dart | 20 +- 3 files changed, 179 insertions(+), 45 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index fac59d9f..38aeb80a 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -256,19 +256,20 @@ class _PeriodPlannerScreenState extends State { onPressed: () { // setState(() { // // Log the period start here - // isInPeriod = true; - // isDangerZone = false; - // _currentDate = DateTime.now(); + isInPeriod = true; + isDangerZone = false; + _currentDate = DateTime.now(); + int averagePeriods = calculateAveragePeriodLength(cycles); - // final Cycle predictedCycle = predictCycle( - // _periodStart = DateTime.now(), - // _periodEnd = DateTime.now().add(const Duration(days: 6)), - // ); - // cycles.add(predictedCycle); + final Cycle predictedCycle = predictCycle( + _periodStart = DateTime.now(), + _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), + ); + cycles.add(predictedCycle); - // _ovulationDate = predictedCycle.ovulation; - // _nextPeriodStart = predictedCycle.predictedPeriodStart; - // _updateEvents(); + _ovulationDate = predictedCycle.ovulation; + _nextPeriodStart = predictedCycle.predictedPeriodStart; + _updateEvents(); // // Debug print to check the state update // debugPrint("After User has logged Period"); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index f2ecc243..13904525 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -7,22 +7,42 @@ import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; //Function to calculate Average Cycle days +// Function to calculate Average Cycle days int calculateAverageCycleLength(List cycles) { - if (cycles.length < 2) return 28; // Default to 28 if there aren't enough cycles + if (cycles.length < 2) { + debugPrint("Not enough cycles to calculate an average, defaulting to 28 days."); + return 28; // Default to 28 if there aren't enough cycles + } int totalLength = 0; for (int i = 1; i < cycles.length; i++) { int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; - debugPrint("Cycle Length $i: $cycleLength"); + debugPrint("Cycle Length before adjustment for cycle $i: $cycleLength"); + + // Cap to a minimum cycle length of 21 days + if (cycleLength < 21) { + debugPrint("Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); + cycleLength = 26; + } + + debugPrint("Cycle Length after check for cycle $i: $cycleLength"); totalLength += cycleLength; } + int averageCycle = (totalLength / (cycles.length - 1)).round(); - debugPrint("Total Length: $totalLength"); - debugPrint("Cycles.Length: ${cycles.length - 1}"); - debugPrint("Average Cycle Length: $averageCycle"); + debugPrint("Calculated Average Cycle Length before final check: $averageCycle"); + + if (averageCycle < 21) { + debugPrint("Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); + return 26; + } + + debugPrint("Final Average Cycle Length: $averageCycle"); return averageCycle; } + + //Function for calculating Average Period days int calculateAveragePeriodLength(List cycles) { if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles @@ -33,6 +53,9 @@ int calculateAveragePeriodLength(List cycles) { totalPeriodLength += cycle.periodLength; } int averagePeriodLength = (totalPeriodLength / cycles.length).round(); + if (averagePeriodLength < 3) { + return 4; + } debugPrint("Total Period Length: $totalPeriodLength"); debugPrint("Number of Cycles: ${cycles.length}"); debugPrint("Average Period Length: $averagePeriodLength"); @@ -92,6 +115,37 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { ); } + //Removing predicted period days from previous cycles + // widget.events.forEach((cycleId, dateMap) { + // if (cycleId != latestCycleId) { + // dateMap.forEach((date, events) { + // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); + // if (newEventList.isNotEmpty) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(newEventList); + // } else { + // filteredEvents[date] = List.from(newEventList); + // } + // } + // }); + + // /* + // Checks if the period date from the latest cycle collides with the + // Ovulation days or Fertile Days of Previous Cycles or if they are before + // */ + // dateMap.forEach((date, events) { + // final hasCollision = events.any((event) { + // return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + // latestCycleEvents.keys.any((latestDate) { + // // Check if the latest period days collide with fertile/ovulation days + // return isSameDay(latestDate, (date)) || + // latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + // }); + // }); + // debugPrint("Has Collision: $hasCollision"); + // }); + // } + // }); class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; @@ -173,17 +227,79 @@ class _CustomCalendarState extends State{ // return filteredEvents; // } +//Second Improvement +// Map> _filterEventsForLatestCycle() { +// final Map> filteredEvents = {}; + +// // Finding the latest cycleId +// final latestCycleId = widget.events.keys.last; + +// if (widget.events.containsKey(latestCycleId)) { +// final latestCycleEvents = widget.events[latestCycleId]!; + +// // Add events from the latest cycle +// latestCycleEvents.forEach((date, events) { +// if (filteredEvents.containsKey(date)) { +// filteredEvents[date]!.addAll(events); +// } else { +// filteredEvents[date] = List.from(events); +// } +// }); + +// // Removing predicted period days and handling collisions with fertile/ovulation days from previous cycles +// widget.events.forEach((cycleId, dateMap) { +// if (cycleId != latestCycleId) { +// bool shouldOmitFertileOvulationDays = false; + +// // Check if any of the latest period days collide with fertile/ovulation days from previous cycles +// dateMap.forEach((date, events) { +// final hasCollision = events.any((event) { +// return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && +// latestCycleEvents.keys.any((latestDate) { +// // Check if the latest period days collide with fertile/ovulation days +// return latestDate.isAtSameMomentAs(date) || +// latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); +// }); +// }); + +// // isSameDay(latestDate, (date)) + +// if (hasCollision) { +// shouldOmitFertileOvulationDays = true; +// } +// }); + +// // Add non-colliding events from previous cycles +// dateMap.forEach((date, events) { +// if (!shouldOmitFertileOvulationDays || events.any((event) => event.title != 'Fertile Day' && event.title != 'Ovulation Day')) { +// final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); +// if (newEventList.isNotEmpty) { +// if (filteredEvents.containsKey(date)) { +// filteredEvents[date]!.addAll(newEventList); +// } else { +// filteredEvents[date] = List.from(newEventList); +// } +// } +// } +// }); +// } +// }); +// } + +// return filteredEvents; +// } + Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; - // Find the latest cycleId + // Step 1: Identify the latest cycle final latestCycleId = widget.events.keys.last; if (widget.events.containsKey(latestCycleId)) { - // Get events from the latest cycle final latestCycleEvents = widget.events[latestCycleId]!; + print("Latest Events: $latestCycleEvents"); - // Add all events from the latest cycle to the filtered events + // Step 2: Add all events from the latest cycle to filteredEvents latestCycleEvents.forEach((date, events) { if (filteredEvents.containsKey(date)) { filteredEvents[date]!.addAll(events); @@ -192,33 +308,49 @@ Map> _filterEventsForLatestCycle() { } }); - // Now process previous cycles + // Step 3: Filter previous cycles + + widget.events.forEach((cycleId, dateMap) { if (cycleId != latestCycleId) { + bool shouldOmitFertileOvulationDays = false; + + // Check if any of the latest period days collide with fertile/ovulation days from previous cycles dateMap.forEach((date, events) { - // Check if this date is already occupied by a 'Period Day' from the latest cycle - final isCollision = filteredEvents.containsKey(date) && - filteredEvents[date]!.any((event) => event.title == 'Period Day'); + final hasCollision = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + latestCycleEvents.keys.any((latestDate) { + // Check if the latest period days collide with fertile/ovulation days + return latestDate.isAtSameMomentAs(date) || + latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + print("Collided Events: $hasCollision"); + + if (hasCollision) { + shouldOmitFertileOvulationDays = true; + } + }); - // We only add events that are not 'Predicted Period Day' and that do not collide with new period days - final filteredEventList = events.where((event) { - // Remove all 'Predicted Period Day' events + // Filter out the events based on collision detection and omit predicted period days regardless + dateMap.forEach((date, events) { + final newEventList = events.where((event) { + // Always omit predicted period days if (event.title == 'Predicted Period Day') { return false; } - // If there's a collision, don't include 'Fertile Day' or 'Ovulation Day' - if (isCollision && (event.title == 'Fertile Day' || event.title == 'Ovulation Day')) { - return false; - } - return true; // Keep all other events + // Remove fertile and ovulation days if there was a collision + return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); }).toList(); - // Add these filtered events to the final list if they aren't empty - if (filteredEventList.isNotEmpty) { + + + if (newEventList.isNotEmpty) { + print("new Event List: $newEventList"); if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(filteredEventList); + filteredEvents[date]!.addAll(newEventList); } else { - filteredEvents[date] = List.from(filteredEventList); + filteredEvents[date] = List.from(newEventList); } } }); @@ -229,7 +361,6 @@ Map> _filterEventsForLatestCycle() { return filteredEvents; } - @override Widget build(BuildContext context) { return TableCalendar( diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 82b647cc..5279e601 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -61,17 +61,19 @@ class EventUtils { } } - events.forEach((id, events) { - //print("Cycle Id: $id"); - //print("["); - events.forEach((date, event) { - //print("Date: $date, Event: $event\n"); - }); - //print("]"); - }); + // events.forEach((id, events) { + // print("Cycle Id: $id"); + // print("["); + // events.forEach((date, event) { + // print("Date: $date, Event: $event\n"); + // }); + // print("]"); + // }); - //print("--------------"); + // print("--------------"); return events; } } + + From 0f3dc36c29f4fc8496c00cd5b03f9c7fa4d596eb Mon Sep 17 00:00:00 2001 From: NewtonMutugi Date: Fri, 23 Aug 2024 10:47:52 +0300 Subject: [PATCH 037/140] Add age fetching functionality to BMICalculatorScreen --- .../pages/BMICalculatorScreen.dart | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart index 274f1acb..4d4727a7 100644 --- a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart +++ b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart @@ -7,6 +7,9 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; +import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; +import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/bmi/data/services/bmi_log_service.dart'; @@ -26,6 +29,11 @@ import 'package:nishauri/src/utils/routes.dart'; class BMICalculatorScreen extends HookConsumerWidget { const BMICalculatorScreen({super.key}); + Future _fetchAge() async { + final authRepository = AuthRepository(AuthApiService()); + return await authRepository.getAge() as Future; + } + @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); @@ -38,11 +46,21 @@ class BMICalculatorScreen extends HookConsumerWidget { final weight = useState(65); final isForSelf = useState(true); final userAsync = ref.watch(userProvider); + // var age = userAsync.whenData((user) { + // return DateTime.now().year - int.parse(user.dateOfBirth!.split('-')[0]); + // }); var age = userAsync.whenData((user) { return DateTime.now().year - int.parse(user.dateOfBirth!.split('-')[0]); }); var userAge = useState(age); + // Implmentation using Fetch age and AuthRepository + // var userAge = useState(18); + // useEffect(() { + // _fetchAge().then((value) => userAge.value = value); + // return null; + // }, []); + return Scaffold( body: Column( children: [ @@ -104,9 +122,13 @@ class BMICalculatorScreen extends HookConsumerWidget { var age = DateTime.now().year - int.parse(user.dateOfBirth! .split('-')[0]); - userAge.value = AsyncValue.data(age); + userAge.value = + age as AsyncValue; } }); + // ==== Fetch user not working as expected + // _fetchAge().then( + // (value) => userAge.value = value); }, selectedColor: Colors .white, //color for selected button @@ -231,7 +253,7 @@ class BMICalculatorScreen extends HookConsumerWidget { max: 100, value: userAge.value.value!, onValueChange: (value) => - userAge.value = AsyncValue.data(value), + userAge.value = value as AsyncValue, label: "Age", units: "Years", activeColor: activeColor, From 80d0f21aa53cea0ae4eec5f34e6f9af7d2eb8a8e Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 23 Aug 2024 11:21:29 +0300 Subject: [PATCH 038/140] Add hcw user list --- .../chat/presentation/pages/ChatUserList.dart | 7 +-- .../chat/presentation/widget/UserList.dart | 52 +++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 lib/src/features/nishauri_chat/chat/presentation/widget/UserList.dart diff --git a/lib/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart b/lib/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart index b850c0a6..30430637 100644 --- a/lib/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart +++ b/lib/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/models/chat_hcw.dart'; +import 'package:nishauri/src/features/nishauri_chat/chat/presentation/widget/UserList.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/presentation/widget/conversationList.dart'; import 'package:nishauri/src/shared/input/Search.dart'; import 'package:nishauri/src/utils/helpers.dart'; @@ -53,7 +54,7 @@ class _ChatUserListScreenState extends State { IconButton(onPressed: (){ Navigator.pop(context); }, - icon: Icon(Icons.arrow_back, color: Colors.black,)), + icon: Icon(Icons.arrow_back,)), Text("Select contact", style:theme.textTheme.titleLarge,), // Container( // padding: EdgeInsets.only(left: 8,right: 8,top: 2,bottom: 2), @@ -82,12 +83,12 @@ class _ChatUserListScreenState extends State { padding: EdgeInsets.only(top: 16), physics: NeverScrollableScrollPhysics(), itemBuilder: (context, index){ - return ConversationList( + return UserHCWList( name: chatUsers[index].name, messageText: chatUsers[index].messageText, imageURL: chatUsers[index].imageURL, time: chatUsers[index].time, - isMessageRead: (index == 0 || index == 3) ? true:false, + isActive: (index == 0 || index == 3) ? true:false, ); } ) diff --git a/lib/src/features/nishauri_chat/chat/presentation/widget/UserList.dart b/lib/src/features/nishauri_chat/chat/presentation/widget/UserList.dart new file mode 100644 index 00000000..737ca549 --- /dev/null +++ b/lib/src/features/nishauri_chat/chat/presentation/widget/UserList.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +class UserHCWList extends StatefulWidget { + String name; + String messageText; + String imageURL; + String time; + + bool isActive; + + UserHCWList({required this.name,required this.messageText,required this.imageURL,required this.time,required this.isActive}); + @override + _UserHCWListState createState() => _UserHCWListState(); +} + +class _UserHCWListState extends State { + @override + Widget build(BuildContext context){ + final theme = Theme.of(context); + return GestureDetector( + onTap: (){ + context.goNamed(RouteNames.CHAT_DETAIL); + }, + child: Container( + padding: EdgeInsets.only(left: 16,right: 16,top: 10,bottom: 10), + child: Row( + children: [ + CircleAvatar( + backgroundImage: AssetImage(widget.imageURL), + maxRadius: 30, + ), + SizedBox(width: 16,), + Expanded(child: Container( + color: Colors.transparent, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(widget.name, style: theme.textTheme.bodyLarge,), + SizedBox(height: 6,), + Text(widget.messageText, style: theme.textTheme.titleSmall?.merge(TextStyle(color: theme.primaryColorLight))) + ], + ), + )), + Text(widget.time, style: TextStyle(fontSize: 12,fontWeight: widget.isActive?FontWeight.bold:FontWeight.normal, color: widget.isActive? Colors.green:Colors.grey.shade600),), + ], + ), + ), + ); + } +} \ No newline at end of file From d3d1f2c99bad5f66385900562cce57287a8687f7 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 11:43:49 +0300 Subject: [PATCH 039/140] Handled cases where user period days collides with fertile and ovulation days of previous cycles by removing them from the calendar so as to reduce the mess. --- .../presentation/pages/logPeriods.dart | 7 +- .../pages/periodPlannerScreen.dart | 24 ++-- .../presentation/widgets/customCalendar.dart | 128 ++++-------------- 3 files changed, 40 insertions(+), 119 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index f4d487c6..4af95f6b 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -41,6 +41,7 @@ class _LogPeriodScreenState extends State { Map>> events = EventUtils.generateEvents(cycles); late Map> _flatEvents; + @override void initState() { super.initState(); @@ -65,7 +66,8 @@ class _LogPeriodScreenState extends State { //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events return flattenedEvents; -} + } + // Method to validate date range bool _isDateRangeValid(DateTime start, DateTime end) { @@ -106,8 +108,9 @@ class _LogPeriodScreenState extends State { end ??= start; final DateTime now = DateTime.now(); + int averagePeriods = calculateAveragePeriodLength(cycles); if (isSameDay(start, now) || isSameDay(end, now)) { - end = start.add(const Duration(days: 6)); + end = start.add( Duration(days: averagePeriods)); } for (Cycle cycle in cycles) { diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 38aeb80a..4c0bf4d9 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -256,20 +256,20 @@ class _PeriodPlannerScreenState extends State { onPressed: () { // setState(() { // // Log the period start here - isInPeriod = true; - isDangerZone = false; - _currentDate = DateTime.now(); - int averagePeriods = calculateAveragePeriodLength(cycles); + // isInPeriod = true; + // isDangerZone = false; + // _currentDate = DateTime.now(); + // int averagePeriods = calculateAveragePeriodLength(cycles); - final Cycle predictedCycle = predictCycle( - _periodStart = DateTime.now(), - _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), - ); - cycles.add(predictedCycle); + // final Cycle predictedCycle = predictCycle( + // _periodStart = DateTime.now(), + // _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), + // ); + // cycles.add(predictedCycle); - _ovulationDate = predictedCycle.ovulation; - _nextPeriodStart = predictedCycle.predictedPeriodStart; - _updateEvents(); + // _ovulationDate = predictedCycle.ovulation; + // _nextPeriodStart = predictedCycle.predictedPeriodStart; + // _updateEvents(); // // Debug print to check the state update // debugPrint("After User has logged Period"); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 13904525..6218f2f9 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -190,105 +190,6 @@ class _CustomCalendarState extends State{ return flattenedEvents; } - // Map> _filterEventsForLatestCycle() { - // final Map> filteredEvents = {}; - - // //Finding the latest cycleId - // final latestCycleId = widget.events.keys.last; - - // if (widget.events.containsKey(latestCycleId)) { - // final latestCycleEvents = widget.events[latestCycleId]!; - - // //Add events from the latest cycle - // latestCycleEvents.forEach((date, events) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(events); - // } else { - // filteredEvents[date] = List.from(events); - // } - // }); - - // //Removing predicted period days from previous cycles - // widget.events.forEach((cycleId, dateMap) { - // if (cycleId != latestCycleId) { - // dateMap.forEach((date, events) { - // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - // if (newEventList.isNotEmpty) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(newEventList); - // } else { - // filteredEvents[date] = List.from(newEventList); - // } - // } - // }); - // } - // }); - // } - // return filteredEvents; - // } - -//Second Improvement -// Map> _filterEventsForLatestCycle() { -// final Map> filteredEvents = {}; - -// // Finding the latest cycleId -// final latestCycleId = widget.events.keys.last; - -// if (widget.events.containsKey(latestCycleId)) { -// final latestCycleEvents = widget.events[latestCycleId]!; - -// // Add events from the latest cycle -// latestCycleEvents.forEach((date, events) { -// if (filteredEvents.containsKey(date)) { -// filteredEvents[date]!.addAll(events); -// } else { -// filteredEvents[date] = List.from(events); -// } -// }); - -// // Removing predicted period days and handling collisions with fertile/ovulation days from previous cycles -// widget.events.forEach((cycleId, dateMap) { -// if (cycleId != latestCycleId) { -// bool shouldOmitFertileOvulationDays = false; - -// // Check if any of the latest period days collide with fertile/ovulation days from previous cycles -// dateMap.forEach((date, events) { -// final hasCollision = events.any((event) { -// return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && -// latestCycleEvents.keys.any((latestDate) { -// // Check if the latest period days collide with fertile/ovulation days -// return latestDate.isAtSameMomentAs(date) || -// latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); -// }); -// }); - -// // isSameDay(latestDate, (date)) - -// if (hasCollision) { -// shouldOmitFertileOvulationDays = true; -// } -// }); - -// // Add non-colliding events from previous cycles -// dateMap.forEach((date, events) { -// if (!shouldOmitFertileOvulationDays || events.any((event) => event.title != 'Fertile Day' && event.title != 'Ovulation Day')) { -// final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); -// if (newEventList.isNotEmpty) { -// if (filteredEvents.containsKey(date)) { -// filteredEvents[date]!.addAll(newEventList); -// } else { -// filteredEvents[date] = List.from(newEventList); -// } -// } -// } -// }); -// } -// }); -// } - -// return filteredEvents; -// } - Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; @@ -309,8 +210,6 @@ Map> _filterEventsForLatestCycle() { }); // Step 3: Filter previous cycles - - widget.events.forEach((cycleId, dateMap) { if (cycleId != latestCycleId) { bool shouldOmitFertileOvulationDays = false; @@ -318,10 +217,10 @@ Map> _filterEventsForLatestCycle() { // Check if any of the latest period days collide with fertile/ovulation days from previous cycles dateMap.forEach((date, events) { final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && latestCycleEvents.keys.any((latestDate) { // Check if the latest period days collide with fertile/ovulation days - return latestDate.isAtSameMomentAs(date) || + return isSameDay(latestDate, date) || latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); }); }); @@ -332,6 +231,26 @@ Map> _filterEventsForLatestCycle() { } }); + // Additional step: Check if previous cycles' dates also collide with those of later cycles + widget.events.forEach((laterCycleId, laterDateMap) { + //condition ensures that we only consider cycles that are neither the current one nor the latest one + if (laterCycleId != cycleId && laterCycleId != latestCycleId) { + dateMap.forEach((date, events) { + final hasCollisionWithlaterCycle = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + laterDateMap.keys.any((laterDate) { + return isSameDay(laterDate, date) || + laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + + if (hasCollisionWithlaterCycle) { + shouldOmitFertileOvulationDays = true; + } + }); + } + }); + // Filter out the events based on collision detection and omit predicted period days regardless dateMap.forEach((date, events) { final newEventList = events.where((event) { @@ -343,8 +262,6 @@ Map> _filterEventsForLatestCycle() { return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); }).toList(); - - if (newEventList.isNotEmpty) { print("new Event List: $newEventList"); if (filteredEvents.containsKey(date)) { @@ -361,6 +278,7 @@ Map> _filterEventsForLatestCycle() { return filteredEvents; } + @override Widget build(BuildContext context) { return TableCalendar( From 409b9c68f5fd61ca1da692d7de0e522ec6b4c6b7 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 12:19:57 +0300 Subject: [PATCH 040/140] Testing --- .../presentation/widgets/customCalendar.dart | 35 ++----------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 6218f2f9..99bfb422 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -113,39 +113,7 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { cycleLength: cycleLength, periodLength: periodLength, ); -} - - //Removing predicted period days from previous cycles - // widget.events.forEach((cycleId, dateMap) { - // if (cycleId != latestCycleId) { - // dateMap.forEach((date, events) { - // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - // if (newEventList.isNotEmpty) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(newEventList); - // } else { - // filteredEvents[date] = List.from(newEventList); - // } - // } - // }); - - // /* - // Checks if the period date from the latest cycle collides with the - // Ovulation days or Fertile Days of Previous Cycles or if they are before - // */ - // dateMap.forEach((date, events) { - // final hasCollision = events.any((event) { - // return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - // latestCycleEvents.keys.any((latestDate) { - // // Check if the latest period days collide with fertile/ovulation days - // return isSameDay(latestDate, (date)) || - // latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - // }); - // }); - // debugPrint("Has Collision: $hasCollision"); - // }); - // } - // }); +} class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; @@ -190,6 +158,7 @@ class _CustomCalendarState extends State{ return flattenedEvents; } +//This is for filtering events on the calendar Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; From a3c2afbded8ed056c3cf370926e7ee56f00ab7cc Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 16:06:16 +0300 Subject: [PATCH 041/140] Adjusting a few Terminologies used in the Application --- .../presentation/pages/logPeriods.dart | 107 ++++++++++++++++- .../presentation/pages/periodPlanner.dart | 10 +- .../pages/periodPlannerScreen.dart | 112 +++++------------- .../period_planner/utils/event_utils.dart | 8 +- 4 files changed, 144 insertions(+), 93 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 4af95f6b..a8b5d59d 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -40,12 +40,23 @@ class _LogPeriodScreenState extends State { DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); late Map> _flatEvents; + late Map> _filteredEvents; @override - void initState() { + void initState() { super.initState(); + // _flatEvents = _flattenEvents(events); + // _filteredEvents = _filterEventsForLatestCycle(); + + if (events.isNotEmpty) { _flatEvents = _flattenEvents(events); + _filteredEvents = _filterEventsForLatestCycle(); + } else { + _flatEvents = {}; + _filteredEvents = {}; + } + } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -68,6 +79,94 @@ class _LogPeriodScreenState extends State { return flattenedEvents; } + Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; + + // Step 1: Identify the latest cycle + final latestCycleId = events.keys.last; + + if (events.containsKey(latestCycleId)) { + final latestCycleEvents = events[latestCycleId]!; + print("Latest Events: $latestCycleEvents"); + + // Step 2: Add all events from the latest cycle to filteredEvents + latestCycleEvents.forEach((date, events) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(events); + } else { + filteredEvents[date] = List.from(events); + } + }); + + // Step 3: Filter previous cycles + events.forEach((cycleId, dateMap) { + if (cycleId != latestCycleId) { + bool shouldOmitFertileOvulationDays = false; + + // Check if any of the latest period days collide with fertile/ovulation days from previous cycles + dateMap.forEach((date, events) { + final hasCollision = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + latestCycleEvents.keys.any((latestDate) { + // Check if the latest period days collide with fertile/ovulation days + return isSameDay(latestDate, date) || + latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + print("Collided Events: $hasCollision"); + + if (hasCollision) { + shouldOmitFertileOvulationDays = true; + } + }); + + // Additional step: Check if previous cycles' dates also collide with those of later cycles + events.forEach((laterCycleId, laterDateMap) { + //condition ensures that we only consider cycles that are neither the current one nor the latest one + if (laterCycleId != cycleId && laterCycleId != latestCycleId) { + dateMap.forEach((date, events) { + final hasCollisionWithlaterCycle = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + laterDateMap.keys.any((laterDate) { + return isSameDay(laterDate, date) || + laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + + if (hasCollisionWithlaterCycle) { + shouldOmitFertileOvulationDays = true; + } + }); + } + }); + + // Filter out the events based on collision detection and omit predicted period days regardless + dateMap.forEach((date, events) { + final newEventList = events.where((event) { + // Always omit predicted period days + if (event.title == 'Predicted Period Day') { + return false; + } + // Remove fertile and ovulation days if there was a collision + return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); + }).toList(); + + if (newEventList.isNotEmpty) { + print("new Event List: $newEventList"); + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(newEventList); + } else { + filteredEvents[date] = List.from(newEventList); + } + } + }); + } + }); + } + + return filteredEvents; +} + // Method to validate date range bool _isDateRangeValid(DateTime start, DateTime end) { @@ -113,9 +212,9 @@ class _LogPeriodScreenState extends State { end = start.add( Duration(days: averagePeriods)); } + //Handling cases where a user might log an already logged date in their previous cycle, hence warning them using a snackbar for (Cycle cycle in cycles) { if (_datesOverlap(cycle.periodStart, cycle.periodEnd, start, end)) { - // Show an alert or a Snackbar ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('The selected period overlaps with an existing cycle. Please choose different dates.'), @@ -176,7 +275,7 @@ class _LogPeriodScreenState extends State { _focusedDay = focusedDay; }, eventLoader: (day) { - return _flatEvents[day] ?? []; + return _filteredEvents[day] ?? []; }, calendarBuilders: CalendarBuilders( markerBuilder: (context, date, events) { @@ -221,7 +320,7 @@ class _LogPeriodScreenState extends State { ), onPressed: () { if (_startDate != null) { - final endDate = _endDate ?? _startDate!; + final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date _updateOrAddCycle(_startDate!, endDate); printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index c93ad167..73b4e4e6 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -109,11 +109,11 @@ class PeriodPlanner extends StatelessWidget { description: 'View and manage your menstrual cycles with a detailed calendar.', icon: Icons.calendar_today, ), - FeatureTile( - title: 'Partner Tracking', - description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', - icon: Icons.people, - ), + // FeatureTile( + // title: 'Partner Tracking', + // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', + // icon: Icons.people, + // ), ], ), ), diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 4c0bf4d9..de780255 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -113,12 +113,12 @@ class _PeriodPlannerScreenState extends State { progressValue = 0.2; title = 'Period'; message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; - buttonText = 'Log End Period'; + buttonText = 'Period End'; chances = 'Low Chances of Getting Pregnant'; } else if (isCloseToOvulation) { progressValue = 0.3; title = 'Ovulation in'; - message = '$daysToOvulation days'; + message = '$daysToOvulation day${daysToOvulation > 1 ? 's': ''}'; buttonText = ''; chances = 'High Chances of Getting Pregnant'; } else if (veryCloseToOvulation) { @@ -136,26 +136,26 @@ class _PeriodPlannerScreenState extends State { } else if (afterOvulation) { progressValue = 0.7; title = 'Next Period in'; - message = '$daysToNextPeriod days'; - buttonText = 'Log Period'; + message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's': ''}'; + buttonText = 'Period Start'; chances = 'High Chances of Getting Pregnant'; } else if (veryCloseToPeriod) { progressValue = 0.7; title = 'Next Period is'; message = 'Tomorrow'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'Low Chances of Getting Pregnant'; } else if (duringPredictedPeriodRange) { progressValue = 1.0; title = 'Periods May happen'; message = 'Today'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'Low Chances of Getting Pregnant'; } else if(isDangerZone) { progressValue = 1.0; title = 'Periods Overdue by'; message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'High Chances of Getting Pregnant'; } @@ -176,7 +176,7 @@ class _PeriodPlannerScreenState extends State { body: Column( children: [ const CustomAppBar( - title: "Track Periods 🌸", + title: "My Flow Tracker 🌺", color: Constants.periodPlanner, ), //const SizedBox(height: Constants.SPACING), @@ -237,58 +237,8 @@ class _PeriodPlannerScreenState extends State { ElevatedButton( onPressed: () { //Logging Start of new period - if (buttonText == 'Log Period') { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Confirm Log Period'), - content: const Text('Are you sure you want to log your period?'), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.of(context).pop(); // Close the dialog - }, - ), - TextButton( - child: const Text('Confirm'), - onPressed: () { - // setState(() { - // // Log the period start here - // isInPeriod = true; - // isDangerZone = false; - // _currentDate = DateTime.now(); - // int averagePeriods = calculateAveragePeriodLength(cycles); - - // final Cycle predictedCycle = predictCycle( - // _periodStart = DateTime.now(), - // _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), - // ); - // cycles.add(predictedCycle); - - // _ovulationDate = predictedCycle.ovulation; - // _nextPeriodStart = predictedCycle.predictedPeriodStart; - // _updateEvents(); - - // // Debug print to check the state update - // debugPrint("After User has logged Period"); - // debugPrint('Period Start after update: $_periodStart'); - // debugPrint('Period End after update: $_periodEnd'); - // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - // debugPrint('Current Date after update: $_currentDate'); - // debugPrint('Is In Period after update: $isInPeriod'); - // debugPrint("--------"); - // }); - printCycles(cycles); - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - }, - ), - ], - ); - }, - ); - + if (buttonText == 'Period Start') { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); } //Logging end of new period else{ @@ -414,27 +364,27 @@ class _PeriodPlannerScreenState extends State { ), ), ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - }, - child: Text( - 'Edit period dates', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), + // Align( + // alignment: Alignment.bottomCenter, + // child: Padding( + // padding: const EdgeInsets.all(16.0), + // child: ElevatedButton( + // style: ElevatedButton.styleFrom( + // backgroundColor: Constants.periodPlanner, + // ), + // onPressed: () { + // // To add functionality later + // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + // }, + // child: Text( + // 'Edit period dates', + // style: theme.textTheme.titleSmall?.copyWith( + // color: Colors.white, + // ), + // ), + // ), + // ), + // ), ], ), ); diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 5279e601..8a3962bd 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:table_calendar/table_calendar.dart'; class EventUtils { @@ -16,9 +17,10 @@ class EventUtils { } Map> updatedEvents = events[cycleId]!; + // Add period days for (DateTime date = cycle.periodStart; - date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); + date.isBefore(cycle.periodEnd) || isSameDay(date, cycle.periodEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, @@ -30,7 +32,7 @@ class EventUtils { // Add fertile window days for (DateTime date = cycle.fertileStart; - date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); + date.isBefore(cycle.fertileEnd) || isSameDay(date, cycle.fertileEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, @@ -50,7 +52,7 @@ class EventUtils { // Add predicted period start for (DateTime date = cycle.predictedPeriodStart; - date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); + date.isBefore(cycle.predictedPeriodEnd) || isSameDay(date, cycle.predictedPeriodEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, From a5382b23b6c18d69590c976bef1adb0ff9a8e0af Mon Sep 17 00:00:00 2001 From: NewtonMutugi Date: Mon, 26 Aug 2024 13:10:42 +0300 Subject: [PATCH 042/140] Updated user age module --- .../features/bmi/presentation/pages/BMICalculatorScreen.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart index 4d4727a7..2769287b 100644 --- a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart +++ b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart @@ -122,8 +122,7 @@ class BMICalculatorScreen extends HookConsumerWidget { var age = DateTime.now().year - int.parse(user.dateOfBirth! .split('-')[0]); - userAge.value = - age as AsyncValue; + userAge.value = AsyncValue.data(age); } }); // ==== Fetch user not working as expected @@ -253,7 +252,7 @@ class BMICalculatorScreen extends HookConsumerWidget { max: 100, value: userAge.value.value!, onValueChange: (value) => - userAge.value = value as AsyncValue, + userAge.value = AsyncValue.data(value), label: "Age", units: "Years", activeColor: activeColor, From db20661308eb2c5c4550d2ae692cf46a8d17325b Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 27 Aug 2024 18:12:28 +0300 Subject: [PATCH 043/140] Changed the routing for the application, made some few changes on the main screen like on the weekly calendar and adding a card --- lib/src/app/navigation/app_router.dart | 55 +--- lib/src/app/navigation/menu/menuItems.dart | 11 +- .../presentation/pages/editPeriodsScreen.dart | 236 +++++++------- .../presentation/pages/logPeriods.dart | 17 +- .../presentation/pages/periodCalendar.dart | 172 +++++------ .../presentation/pages/periodPlanner.dart | 288 +++++++++--------- .../presentation/pages/periodPlannerMenu.dart | 282 ++++++++--------- .../pages/periodPlannerScreen.dart | 142 ++++++--- .../presentation/widgets/customCalendar.dart | 117 +++---- .../presentation/widgets/eventsMaker.dart | 20 +- .../presentation/widgets/logItems.dart | 154 +++++----- .../presentation/widgets/logger.dart | 22 +- .../presentation/widgets/loggerWidget.dart | 182 +++++------ .../period_planner/utils/event_utils.dart | 8 + 14 files changed, 841 insertions(+), 865 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 7d782daa..57736a34 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -383,59 +383,20 @@ final List secureRoutes = [ ]), //Routes for the Period Planner GoRoute( - name: RouteNames.PERIOD_PLANNER, - path: 'period-planner', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlanner(); + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return LogPeriodScreen(); }, - routes: periodPlannerRoutes, - ), -]; - -final List periodPlannerRoutes = [ - GoRoute( - name: RouteNames.PERIOD_PLANNER_MENU, - path: 'period-planner-menu', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerMenu(); - }, - routes: [ - GoRoute( + GoRoute( name: RouteNames.PERIOD_PLANNER_SCREEN, - path: 'period-planner-screen', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerScreen(); - }, - ), - - GoRoute( - name: RouteNames.PERIOD_PLANNER_CALENDAR, - path: 'period-planner-calendar', + path: 'period-planner-screen', builder: (BuildContext context, GoRouterState state) { - return const PeriodCalendar(); + return const PeriodPlannerScreen(); }, - routes: [ - GoRoute( - name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - path: 'period-planner-edit-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return EditPeriodsScreen(); - }, - ), - ] ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, - path: 'period-planner-log-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return LogPeriodScreen(); - }, - ), - ]), - - -]; +]; final List openRoutes = [ GoRoute( diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index f45c7a38..6f38615f 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; @@ -303,7 +304,15 @@ List getGenericMenuItems(BuildContext context) { height: Constants.shortcutIconSize, ), title: MenuItemNames.PERIOD_PLANNER, - onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), + onPressed: () { + //If the List Cycles is Empty, the user is navigated to the log Periods screen + if(cycles.isEmpty) { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + } + else { + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + } + }, color: Constants.periodPlanner, ), ]; diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 0731c3a4..e87293c2 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,133 +1,133 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:table_calendar/table_calendar.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:table_calendar/table_calendar.dart'; -class EditPeriodsScreen extends StatefulWidget { +// class EditPeriodsScreen extends StatefulWidget { - const EditPeriodsScreen({super.key}); +// const EditPeriodsScreen({super.key}); - @override - State createState() => _EditPeriodsScreenState(); -} +// @override +// State createState() => _EditPeriodsScreenState(); +// } -class _EditPeriodsScreenState extends State { - // DateTime? _periodStart; - // DateTime? _periodEnd; - // Cycle? _cycle; - Map _periodRanges = {}; +// class _EditPeriodsScreenState extends State { +// // DateTime? _periodStart; +// // DateTime? _periodEnd; +// // Cycle? _cycle; +// Map _periodRanges = {}; - @override - void initState() { - super.initState(); +// @override +// void initState() { +// super.initState(); - // Gather all period ranges from all cycles - for (Cycle cycle in cycles) { - _periodRanges[cycle.periodStart] = cycle.periodEnd; - } +// // Gather all period ranges from all cycles +// for (Cycle cycle in cycles) { +// _periodRanges[cycle.periodStart] = cycle.periodEnd; +// } - // Here, selecting the last cycle added to the list - // if (cycles.isNotEmpty) { - // _cycle = cycles.last; - // _periodStart = _cycle?.periodStart; - // _periodEnd = _cycle?.periodEnd; - // } +// // Here, selecting the last cycle added to the list +// // if (cycles.isNotEmpty) { +// // _cycle = cycles.last; +// // _periodStart = _cycle?.periodStart; +// // _periodEnd = _cycle?.periodEnd; +// // } - } +// } - void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { - setState(() { - if (start != null && end != null) { - // Assuming you're editing the last cycle for simplicity - Cycle lastCycle = cycles.last; - lastCycle.periodStart = start; - lastCycle.periodEnd = end; +// void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { +// setState(() { +// if (start != null && end != null) { +// // Assuming you're editing the last cycle for simplicity +// Cycle lastCycle = cycles.last; +// lastCycle.periodStart = start; +// lastCycle.periodEnd = end; - // Update the period ranges map - _periodRanges[start] = end; - } - }); - } +// // Update the period ranges map +// _periodRanges[start] = end; +// } +// }); +// } - void _applyChanges() { - // Save the updated cycle list and recalculate important dates - for (Cycle cycle in cycles) { - Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); - cycle.fertileStart = updatedCycle.fertileStart; - cycle.fertileEnd = updatedCycle.fertileEnd; - cycle.ovulation = updatedCycle.ovulation; - cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; - cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; - } +// void _applyChanges() { +// // Save the updated cycle list and recalculate important dates +// for (Cycle cycle in cycles) { +// Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); +// cycle.fertileStart = updatedCycle.fertileStart; +// cycle.fertileEnd = updatedCycle.fertileEnd; +// cycle.ovulation = updatedCycle.ovulation; +// cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; +// cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; +// } - Navigator.of(context).pop(); // Go back to the previous screen - } +// Navigator.of(context).pop(); // Go back to the previous screen +// } - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Edit Periods 📅", - color: Constants.periodPlanner.withOpacity(1.0), - ), - TableCalendar( - focusedDay: DateTime.now(), - firstDay: DateTime(2020), - lastDay: DateTime.now(), - rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, - rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, - onRangeSelected: _onRangeSelected, - calendarFormat: CalendarFormat.month, - headerStyle: const HeaderStyle( - formatButtonVisible: false, - ), - calendarStyle: const CalendarStyle( - todayDecoration: BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - rangeStartDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeEndDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeHighlightColor: Constants.periodPlanner, - ), - ), - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - _applyChanges(); - }, - child: Text( - 'Apply Changes', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ), - ], - ), - ); - } -} \ No newline at end of file +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Edit Periods 📅", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// TableCalendar( +// focusedDay: DateTime.now(), +// firstDay: DateTime(2020), +// lastDay: DateTime.now(), +// rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, +// rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, +// onRangeSelected: _onRangeSelected, +// calendarFormat: CalendarFormat.month, +// headerStyle: const HeaderStyle( +// formatButtonVisible: false, +// ), +// calendarStyle: const CalendarStyle( +// todayDecoration: BoxDecoration( +// color: Colors.blue, +// shape: BoxShape.circle, +// ), +// rangeStartDecoration: BoxDecoration( +// color: Colors.pink, +// shape: BoxShape.circle, +// ), +// rangeEndDecoration: BoxDecoration( +// color: Colors.pink, +// shape: BoxShape.circle, +// ), +// rangeHighlightColor: Constants.periodPlanner, +// ), +// ), +// Expanded( +// child: Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// _applyChanges(); +// }, +// child: Text( +// 'Apply Changes', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index a8b5d59d..0834a2b6 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -24,10 +24,13 @@ void printCycles(List cycles) { debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); debugPrint('Cycle Length: ${cycle.cycleLength}'); debugPrint('Period Length: ${cycle.periodLength}'); - debugPrint('---'); // Separator between cycles for clarity + debugPrint('---'); } } + +//This is the screen the user interacts when they are logging their Period Days + class LogPeriodScreen extends StatefulWidget { @override @@ -42,7 +45,6 @@ class _LogPeriodScreenState extends State { late Map> _flatEvents; late Map> _filteredEvents; - @override void initState() { super.initState(); @@ -60,6 +62,7 @@ class _LogPeriodScreenState extends State { } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values + //These are events generated from the events utils class Map> _flattenEvents(Map>> nestedEvents) { final Map> flattenedEvents = {}; @@ -168,10 +171,11 @@ class _LogPeriodScreenState extends State { } - // Method to validate date range + // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day - return difference <= 7; // Ensure the range does not exceed 7 days + return + difference <= 7; // Ensure the range does not exceed 7 days } void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { @@ -230,6 +234,7 @@ class _LogPeriodScreenState extends State { //_updateEventsForCycle(newCycle); } + // void _updateEventsForCycle(Cycle cycle) { // // Remove old events for this cycle from the events map // events.remove(cycle.cycleId); @@ -267,10 +272,12 @@ class _LogPeriodScreenState extends State { focusedDay: _focusedDay, firstDay: DateTime(2020), lastDay: DateTime.now(), - rangeStartDay: _startDate, + rangeStartDay: _startDate , rangeEndDay: _endDate, onRangeSelected: _onRangeSelected, + rangeSelectionMode: RangeSelectionMode.toggledOn, + onPageChanged: (focusedDay) { _focusedDay = focusedDay; }, diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 3bacf4f9..d4de7a21 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -1,91 +1,91 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -import 'package:nishauri/src/features/period_planner/data/models/events.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; +// import 'package:flutter/material.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +// import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; -class PeriodCalendar extends StatelessWidget { - const PeriodCalendar({super.key}); +// class PeriodCalendar extends StatelessWidget { +// const PeriodCalendar({super.key}); - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - Map>> events = {}; - events = EventUtils.generateEvents(cycles); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Calendar 🗓️", - color: Constants.periodPlanner.withOpacity(1.0), - ), - Expanded( - child: Column( - children: [ - CustomCalendar( - events: events - ), - const SizedBox(height: 20), - const Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Key:", - style: TextStyle( - color: Constants.periodPlanner, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - const Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CalendarKey(color: Colors.red, label: 'Today'), - CalendarKey(color: Colors.pink, label: 'Period Days'), - CalendarKey(color: Colors.green, label: 'Fertile Days'), - CalendarKey(color: Colors.blue, label: 'Ovulation Day'), - CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), - ], - ), - ], - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - }, - child: Text( - 'Edit period dates', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ], - ), - ); - } +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// Map>> events = {}; +// events = EventUtils.generateEvents(cycles); +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Calendar 🗓️", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// Expanded( +// child: Column( +// children: [ +// CustomCalendar( +// events: events +// ), +// const SizedBox(height: 20), +// const Row( +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Padding( +// padding: EdgeInsets.all(8.0), +// child: Text( +// "Key:", +// style: TextStyle( +// color: Constants.periodPlanner, +// fontSize: 20, +// fontWeight: FontWeight.bold, +// ), +// ), +// ), +// ], +// ), +// const Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// CalendarKey(color: Colors.red, label: 'Today'), +// CalendarKey(color: Colors.pink, label: 'Period Days'), +// CalendarKey(color: Colors.green, label: 'Fertile Days'), +// CalendarKey(color: Colors.blue, label: 'Ovulation Day'), +// CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), +// ], +// ), +// ], +// ), +// ), +// Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// // To add functionality later +// context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); +// }, +// child: Text( +// 'Edit period dates', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// ); +// } -} +// } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index 73b4e4e6..1176bbe8 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -1,149 +1,149 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_svg/flutter_svg.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; -class PeriodPlanner extends StatelessWidget { - const PeriodPlanner({super.key}); +// class PeriodPlanner extends StatelessWidget { +// const PeriodPlanner({super.key}); - @override - Widget build(BuildContext context) { - return Scaffold( - body: Column( - children: [ - const CustomAppBar( - title: "Period Planner App 🌸", - color: Constants.periodPlanner, - ), - Expanded( - child: SingleChildScrollView( - child: Column( - children: [ - Container( - padding: const EdgeInsets.all(20.0), - decoration: BoxDecoration( - color: Constants.periodPlanner.withOpacity(1.0), - image: const DecorationImage( - image: AssetImage("assets/images/contours.png"), - opacity: 0.1, - fit: BoxFit.cover, - ), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - DecoratedBox( - decoration: const BoxDecoration(), - child: SvgPicture.asset( - "assets/images/period_planner2.svg", - fit: BoxFit.contain, - height: 100, - width: 100, - ), - ), - const SizedBox(height: 20.0), - const Text( - 'Track Your Cycle with Ease', - style: TextStyle( - color: Colors.white, - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 10.0), - const Text( - 'Stay healthy And Well Informed', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 20.0), - ElevatedButton( - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_MENU); - }, - style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric( - vertical: 15.0, - horizontal: 40.0, - ), - ), - child: const Text( - 'Get Started', - style: TextStyle( - fontSize: 18.0, - ), - ), - ), - ], - ), - ), - const SizedBox(height: 20.0), - Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Features', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 10.0), - FeatureTile( - title: 'Track Your Period', - description: 'Keep an accurate record of your menstrual cycles to better understand your health.', - icon: Icons.track_changes, - ), - FeatureTile( - title: 'Period Calendar', - description: 'View and manage your menstrual cycles with a detailed calendar.', - icon: Icons.calendar_today, - ), - // FeatureTile( - // title: 'Partner Tracking', - // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', - // icon: Icons.people, - // ), - ], - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// body: Column( +// children: [ +// const CustomAppBar( +// title: "Period Planner App 🌸", +// color: Constants.periodPlanner, +// ), +// Expanded( +// child: SingleChildScrollView( +// child: Column( +// children: [ +// Container( +// padding: const EdgeInsets.all(20.0), +// decoration: BoxDecoration( +// color: Constants.periodPlanner.withOpacity(1.0), +// image: const DecorationImage( +// image: AssetImage("assets/images/contours.png"), +// opacity: 0.1, +// fit: BoxFit.cover, +// ), +// ), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.stretch, +// children: [ +// DecoratedBox( +// decoration: const BoxDecoration(), +// child: SvgPicture.asset( +// "assets/images/period_planner2.svg", +// fit: BoxFit.contain, +// height: 100, +// width: 100, +// ), +// ), +// const SizedBox(height: 20.0), +// const Text( +// 'Track Your Cycle with Ease', +// style: TextStyle( +// color: Colors.white, +// fontSize: 20.0, +// fontWeight: FontWeight.bold, +// ), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 10.0), +// const Text( +// 'Stay healthy And Well Informed', +// style: TextStyle( +// color: Colors.white, +// fontSize: 16.0, +// ), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 20.0), +// ElevatedButton( +// onPressed: () { +// context.goNamed(RouteNames.PERIOD_PLANNER_MENU); +// }, +// style: ElevatedButton.styleFrom( +// padding: const EdgeInsets.symmetric( +// vertical: 15.0, +// horizontal: 40.0, +// ), +// ), +// child: const Text( +// 'Get Started', +// style: TextStyle( +// fontSize: 18.0, +// ), +// ), +// ), +// ], +// ), +// ), +// const SizedBox(height: 20.0), +// Padding( +// padding: const EdgeInsets.all(20.0), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// const Text( +// 'Features', +// style: TextStyle( +// fontSize: 20.0, +// fontWeight: FontWeight.bold, +// ), +// ), +// const SizedBox(height: 10.0), +// FeatureTile( +// title: 'Track Your Period', +// description: 'Keep an accurate record of your menstrual cycles to better understand your health.', +// icon: Icons.track_changes, +// ), +// FeatureTile( +// title: 'Period Calendar', +// description: 'View and manage your menstrual cycles with a detailed calendar.', +// icon: Icons.calendar_today, +// ), +// // FeatureTile( +// // title: 'Partner Tracking', +// // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', +// // icon: Icons.people, +// // ), +// ], +// ), +// ), +// ], +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } -class FeatureTile extends StatelessWidget { - final String title; - final String description; - final IconData icon; +// class FeatureTile extends StatelessWidget { +// final String title; +// final String description; +// final IconData icon; - FeatureTile({ - required this.title, - required this.description, - required this.icon, - }); +// FeatureTile({ +// required this.title, +// required this.description, +// required this.icon, +// }); - @override - Widget build(BuildContext context) { - return ListTile( - leading: Icon(icon), - title: Text(title), - subtitle: Text(description), - ); - } -} +// @override +// Widget build(BuildContext context) { +// return ListTile( +// leading: Icon(icon), +// title: Text(title), +// subtitle: Text(description), +// ); +// } +// } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart index 27a8c80f..cfbab66f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -1,145 +1,145 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; -import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -class PeriodPlannerMenu extends StatelessWidget { - const PeriodPlannerMenu({super.key}); +// import 'package:flutter/material.dart'; +// import 'package:flutter_svg/svg.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; +// import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// class PeriodPlannerMenu extends StatelessWidget { +// const PeriodPlannerMenu({super.key}); - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final _items = _menuItems(context); +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// final _items = _menuItems(context); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Period Planner 🌸", - color: Constants.periodPlanner.withOpacity(1.0), - ), - Expanded( - child: MenuItemsBuilder( - crossAxisCount: 2, - itemBuilder: (item) => Card( - margin: const EdgeInsets.all(Constants.SPACING), - clipBehavior: Clip.antiAlias, - child: InkWell( - splashColor: Constants.periodPlannerShortcutBgColor, - onTap: item.onPressed, - child: Container( - padding: const EdgeInsets.all(Constants.SPACING), - decoration: BoxDecoration( - color: item.color ?? theme.colorScheme.primary, - image: const DecorationImage( - image: AssetImage("assets/images/contours.png"), - opacity: 0.2, - fit: BoxFit.cover, - ), - ), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - item.icon, - const SizedBox(height: Constants.SPACING), - Text( - item.title ?? '', - style: theme.textTheme.titleMedium?.copyWith( - color: Colors.white, - fontWeight: FontWeight.normal, - overflow: TextOverflow.ellipsis, - ), - textAlign: TextAlign.center, - ), - ], - ), - ), - ), - ), - ), - items: _items, - ), - ), - ], - ), - ); - } -} +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Period Planner 🌸", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// Expanded( +// child: MenuItemsBuilder( +// crossAxisCount: 2, +// itemBuilder: (item) => Card( +// margin: const EdgeInsets.all(Constants.SPACING), +// clipBehavior: Clip.antiAlias, +// child: InkWell( +// splashColor: Constants.periodPlannerShortcutBgColor, +// onTap: item.onPressed, +// child: Container( +// padding: const EdgeInsets.all(Constants.SPACING), +// decoration: BoxDecoration( +// color: item.color ?? theme.colorScheme.primary, +// image: const DecorationImage( +// image: AssetImage("assets/images/contours.png"), +// opacity: 0.2, +// fit: BoxFit.cover, +// ), +// ), +// child: Center( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// item.icon, +// const SizedBox(height: Constants.SPACING), +// Text( +// item.title ?? '', +// style: theme.textTheme.titleMedium?.copyWith( +// color: Colors.white, +// fontWeight: FontWeight.normal, +// overflow: TextOverflow.ellipsis, +// ), +// textAlign: TextAlign.center, +// ), +// ], +// ), +// ), +// ), +// ), +// ), +// items: _items, +// ), +// ), +// ], +// ), +// ); +// } +// } -_menuItems(BuildContext context) => [ - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_planner4.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Track Periods", - onPressed: () { - if(cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - } - else { - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } - } , - color: Constants.periodPlanner.withOpacity(1.0), - ), - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_calender1.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Calendar", - onPressed: () { - if(cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - } - else { - context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); - } - }, - color: Constants.periodPlanner.withOpacity(1.0), - ), - // MenuItem( - // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/partners2.svg", - // semanticsLabel: "Periods", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", - // semanticsLabel: "Periods", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize), - // title: "Partners", - // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), - // color: Constants.periodPlanner.withOpacity(1.0), - // ), - ]; \ No newline at end of file +// _menuItems(BuildContext context) => [ +// MenuItem( +// shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/period_planner4.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Track Periods", +// onPressed: () { +// if(cycles.isEmpty) { +// context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); +// } +// else { +// context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); +// } +// } , +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// MenuItem( +// shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/period_calender1.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Calendar", +// onPressed: () { +// if(cycles.isEmpty) { +// context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); +// } +// else { +// context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); +// } +// }, +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// // MenuItem( +// // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// // icon: SvgPicture.asset( +// // "assets/images/partners2.svg", +// // semanticsLabel: "Periods", +// // fit: BoxFit.contain, +// // width: 80, +// // height: 80, +// // ), +// // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", +// // semanticsLabel: "Periods", +// // fit: BoxFit.contain, +// // width: Constants.shortcutIconSize, +// // height: Constants.shortcutIconSize), +// // title: "Partners", +// // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), +// // color: Constants.periodPlanner.withOpacity(1.0), +// // ), +// ]; \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index de780255..b51bea2c 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -78,8 +78,6 @@ class _PeriodPlannerScreenState extends State { @override Widget build(BuildContext context) { - //late bool endOfPeriod; // handling when user has logged end of period - //handling the days before, after or during the various phases in the Menstrual Cycle int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; @@ -90,17 +88,15 @@ class _PeriodPlannerScreenState extends State { bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && !isInPeriod && daysToOvulation>=1 ; bool veryCloseToOvulation = _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); - //two days after ovulation -- I'm thinking about it though bool afterOvulation = _currentDate.isAfter(_ovulationDate) && (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod>0); bool duringPredictedPeriodRange = _currentDate.isAfter(_nextPeriodStart) && _currentDate.isBefore(_nextPeriodEnd) || isSameDay(_currentDate, _nextPeriodStart) || isSameDay(_currentDate, _nextPeriodEnd); bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); - - - + bool inPeriods = isInPeriod; + // Determine progress value and messages based on the current date double progressValue = 0.0; String message = ''; @@ -114,49 +110,49 @@ class _PeriodPlannerScreenState extends State { title = 'Period'; message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; buttonText = 'Period End'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if (isCloseToOvulation) { progressValue = 0.3; title = 'Ovulation in'; message = '$daysToOvulation day${daysToOvulation > 1 ? 's': ''}'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (veryCloseToOvulation) { progressValue = 0.4; title = 'Ovulation is'; message = 'Tomorrow'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (isOvulation) { progressValue = 0.5; title = 'Ovulation is'; message = 'Today'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (afterOvulation) { progressValue = 0.7; title = 'Next Period in'; message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's': ''}'; buttonText = 'Period Start'; - chances = 'High Chances of Getting Pregnant'; + chances = 'Low'; } else if (veryCloseToPeriod) { progressValue = 0.7; title = 'Next Period is'; message = 'Tomorrow'; buttonText = 'Period Start'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if (duringPredictedPeriodRange) { progressValue = 1.0; title = 'Periods May happen'; message = 'Today'; buttonText = 'Period Start'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if(isDangerZone) { progressValue = 1.0; title = 'Periods Overdue by'; message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; buttonText = 'Period Start'; - chances = 'High Chances of Getting Pregnant'; + chances = 'High'; } final theme = Theme.of(context); @@ -169,9 +165,6 @@ class _PeriodPlannerScreenState extends State { // debugPrint('-----Widget Rebuild-----'); // debugPrint('Is In Period: $isInPeriod'); // debugPrint('Is close to Ovulation: $isCloseToOvulation'); - - - return Scaffold( body: Column( children: [ @@ -187,6 +180,32 @@ class _PeriodPlannerScreenState extends State { padding: const EdgeInsets.all(16.0), child: Column( children: [ + Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const Text( + "Your Chances of Getting Pregnant are:", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + ), + Text( + chances, + style: const TextStyle( + fontSize: 34, + color: Constants.periodPlanner, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ) + ), + const SizedBox(height: Constants.SPACING), SizedBox( height: 150, child: CustomCalendar( @@ -194,15 +213,16 @@ class _PeriodPlannerScreenState extends State { initialFormat: CalendarFormat.week, events: events, headerButton: true, + inPeriods: inPeriods, ), ), - const SizedBox(height: 40), + const SizedBox(height: Constants.SPACING), Stack( alignment: Alignment.center, children: [ SizedBox( - width: Constants.SPACING * 30, // Adjust the width as needed - height: Constants.SPACING * 30, // Adjust the height as needed + width: 300, // Adjust the width as needed + height: 300, // Adjust the height as needed child: CircularProgressIndicator( value: progressValue, strokeWidth: 10, @@ -210,6 +230,7 @@ class _PeriodPlannerScreenState extends State { valueColor: AlwaysStoppedAnimation( isDangerZone ? Colors.red : Constants.periodPlanner, ), + ), ), Column( @@ -227,12 +248,7 @@ class _PeriodPlannerScreenState extends State { message, style: TextStyle(fontSize: 38, color: isDangerZone ? Colors.red: Constants.periodPlanner, fontWeight: FontWeight.bold), ), - const SizedBox(height: Constants.SPACING), - Text( - chances, - style: const TextStyle(fontSize: 16), - ), - const SizedBox(height: Constants.SPACING), + const SizedBox(height: Constants.SPACING + 10), if (buttonText.isNotEmpty) ElevatedButton( onPressed: () { @@ -314,6 +330,32 @@ class _PeriodPlannerScreenState extends State { ), ], ), + // const SizedBox(height: Constants.SPACING), + // Card( + // child: Padding( + // padding: const EdgeInsets.all(16.0), + // child: Column( + // children: [ + // const Text( + // "Your Chances of Getting Pregnant are:", + // style: TextStyle( + // fontSize: 14, + // fontWeight: FontWeight.bold, + // ), + // // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + // ), + // Text( + // chances, + // style: const TextStyle( + // fontSize: 34, + // color: Constants.periodPlanner, + // fontWeight: FontWeight.bold, + // ), + // ), + // ], + // ), + // ) + // ), //const SizedBox(height: 20,), // const Text( @@ -364,27 +406,27 @@ class _PeriodPlannerScreenState extends State { ), ), ), - // Align( - // alignment: Alignment.bottomCenter, - // child: Padding( - // padding: const EdgeInsets.all(16.0), - // child: ElevatedButton( - // style: ElevatedButton.styleFrom( - // backgroundColor: Constants.periodPlanner, - // ), - // onPressed: () { - // // To add functionality later - // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - // }, - // child: Text( - // 'Edit period dates', - // style: theme.textTheme.titleSmall?.copyWith( - // color: Colors.white, - // ), - // ), - // ), - // ), - // ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // To add functionality later + // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + }, + child: Text( + 'Periods History', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), ], ), ); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 99bfb422..460935c8 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -118,12 +118,14 @@ class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; final bool headerButton; + final bool? inPeriods; const CustomCalendar({ Key? key, this.initialFormat = CalendarFormat.month, required this.events, this.headerButton = false, + this.inPeriods, }) : super(key: key); @override @@ -131,6 +133,7 @@ class CustomCalendar extends StatefulWidget { } class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; + late DateTime _focusedDay; late Map> _flatEvents; late Map> _filteredEvents; @@ -140,6 +143,10 @@ class _CustomCalendarState extends State{ _calendarFormat = widget.initialFormat; _flatEvents = _flattenEvents(widget.events); _filteredEvents = _filterEventsForLatestCycle(); + // Determine the focused day based on the calendar format + _focusedDay = _calendarFormat == CalendarFormat.week + ? _getNextPredictedPeriodDate() ?? DateTime.now() + : DateTime.now(); } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -159,102 +166,50 @@ class _CustomCalendarState extends State{ } //This is for filtering events on the calendar -Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; + Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; - // Step 1: Identify the latest cycle - final latestCycleId = widget.events.keys.last; + // Identify the latest cycle + final latestCycleId = widget.events.keys.last; - if (widget.events.containsKey(latestCycleId)) { - final latestCycleEvents = widget.events[latestCycleId]!; - print("Latest Events: $latestCycleEvents"); + // If the latest cycle exists, add its events to the filteredEvents map + if (widget.events.containsKey(latestCycleId)) { + final latestCycleEvents = widget.events[latestCycleId]!; - // Step 2: Add all events from the latest cycle to filteredEvents - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { + // Directly add all events from the latest cycle + latestCycleEvents.forEach((date, events) { filteredEvents[date] = List.from(events); - } - }); + }); + } - // Step 3: Filter previous cycles - widget.events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - bool shouldOmitFertileOvulationDays = false; - - // Check if any of the latest period days collide with fertile/ovulation days from previous cycles - dateMap.forEach((date, events) { - final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - latestCycleEvents.keys.any((latestDate) { - // Check if the latest period days collide with fertile/ovulation days - return isSameDay(latestDate, date) || - latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - print("Collided Events: $hasCollision"); - - if (hasCollision) { - shouldOmitFertileOvulationDays = true; - } - }); - - // Additional step: Check if previous cycles' dates also collide with those of later cycles - widget.events.forEach((laterCycleId, laterDateMap) { - //condition ensures that we only consider cycles that are neither the current one nor the latest one - if (laterCycleId != cycleId && laterCycleId != latestCycleId) { - dateMap.forEach((date, events) { - final hasCollisionWithlaterCycle = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - laterDateMap.keys.any((laterDate) { - return isSameDay(laterDate, date) || - laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - - if (hasCollisionWithlaterCycle) { - shouldOmitFertileOvulationDays = true; - } - }); - } - }); - - // Filter out the events based on collision detection and omit predicted period days regardless - dateMap.forEach((date, events) { - final newEventList = events.where((event) { - // Always omit predicted period days - if (event.title == 'Predicted Period Day') { - return false; - } - // Remove fertile and ovulation days if there was a collision - return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); - }).toList(); - - if (newEventList.isNotEmpty) { - print("new Event List: $newEventList"); - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } - } - }); + return filteredEvents; + } + + + DateTime? _getNextPredictedPeriodDate() { + for (var entry in _filteredEvents.entries) { + if (widget.inPeriods == true) { + // Return the first date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + return entry.key; } - }); + } else { + // Return the first date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + return entry.key; + } + } } - - return filteredEvents; + return null; } - @override Widget build(BuildContext context) { return TableCalendar( key: ValueKey(widget.events), firstDay: DateTime(2010), lastDay: DateTime(2100), - focusedDay: DateTime.now(), + focusedDay: _focusedDay, // onDaySelected: (selectedDay, focusedDay) { // setState(() { // _focusedDay = focusedDay; diff --git a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart index 628b8fc8..88aec81e 100644 --- a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart +++ b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart @@ -1,6 +1,13 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +/* +This is responsible for the highlighting of the various events as you will see in the calendar +based on their Event Title and Color +For Example if the event is a Period Day, since the corresponding color is pink, +the day in the calendar will be highlighted in Pink. The same applies for the other events that is +Fertile days, Ovulation days and Predicted Period Days. +*/ class EventsMaker extends StatelessWidget { const EventsMaker({ super.key, @@ -11,13 +18,6 @@ class EventsMaker extends StatelessWidget { final DateTime date; final List events; - //Calculating Opacity - // double _calculateOpacity(DateTime eventStart, DateTime eventEnd, DateTime currentDate) { - // int totalDays = eventEnd.difference(eventStart).inDays + 1; - // int currentDayIndex = currentDate.difference(eventStart).inDays; - // return (1 - (currentDayIndex / totalDays)).clamp(0.2, 1.0); - // } - @override Widget build(BuildContext context) { //debugPrint("----From EventMaker Class----"); @@ -28,13 +28,7 @@ class EventsMaker extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, children: events.map((event) { - // Example: Assuming you have the start and end dates for the event - // DateTime eventStart = date; // Update this to the actual event start date - // DateTime eventEnd = date.add(Duration(days: events.length - 1)); // Update this to the actual event end date - - // double opacity = _calculateOpacity(eventStart, eventEnd, date); Color color = event.color; - return Container( margin: const EdgeInsets.symmetric(horizontal: 0.5), width: 7.0, diff --git a/lib/src/features/period_planner/presentation/widgets/logItems.dart b/lib/src/features/period_planner/presentation/widgets/logItems.dart index 5af15dbd..3b6353bb 100644 --- a/lib/src/features/period_planner/presentation/widgets/logItems.dart +++ b/lib/src/features/period_planner/presentation/widgets/logItems.dart @@ -1,80 +1,80 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; -class LogItems { - static List getSymptoms() { - Color symptomsColor = Colors.pink; - return [ - Logger( - icon: Icons.favorite, - label: 'Cramps', - color: symptomsColor, - ), - Logger( - icon: Icons.sentiment_satisfied, - label: 'Mood swings', - color: symptomsColor, - ), - Logger( - icon: Icons.battery_alert, - label: 'Fatigue', - color: symptomsColor, - ), - // Add more symptom loggers as needed - ]; - } +// class LogItems { +// static List getSymptoms() { +// Color symptomsColor = Colors.pink; +// return [ +// Logger( +// icon: Icons.favorite, +// label: 'Cramps', +// color: symptomsColor, +// ), +// Logger( +// icon: Icons.sentiment_satisfied, +// label: 'Mood swings', +// color: symptomsColor, +// ), +// Logger( +// icon: Icons.battery_alert, +// label: 'Fatigue', +// color: symptomsColor, +// ), +// // Add more symptom loggers as needed +// ]; +// } - static List getDischarge() { - Color dischargeColor = Colors.blue; - return [ - Logger( - icon: Icons.water_drop, - label: 'No discharge', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Egg whites', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Sticky', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Brown', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Yellow or Green', - color: dischargeColor, - ), - // Add more discharge loggers as needed - ]; - } +// static List getDischarge() { +// Color dischargeColor = Colors.blue; +// return [ +// Logger( +// icon: Icons.water_drop, +// label: 'No discharge', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Egg whites', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Sticky', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Brown', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Yellow or Green', +// color: dischargeColor, +// ), +// // Add more discharge loggers as needed +// ]; +// } - static List getMoods() { - Color moodsColor = Colors.orange; - return [ - Logger( - icon: Icons.sentiment_very_satisfied, - label: 'Happy', - color: moodsColor, - ), - Logger( - icon: Icons.sentiment_dissatisfied, - label: 'Sad', - color: moodsColor, - ), - Logger( - icon: Icons.sentiment_neutral, - label: 'Anxious', - color: moodsColor, - ), - // Add more mood loggers as needed - ]; - } -} +// static List getMoods() { +// Color moodsColor = Colors.orange; +// return [ +// Logger( +// icon: Icons.sentiment_very_satisfied, +// label: 'Happy', +// color: moodsColor, +// ), +// Logger( +// icon: Icons.sentiment_dissatisfied, +// label: 'Sad', +// color: moodsColor, +// ), +// Logger( +// icon: Icons.sentiment_neutral, +// label: 'Anxious', +// color: moodsColor, +// ), +// // Add more mood loggers as needed +// ]; +// } +// } diff --git a/lib/src/features/period_planner/presentation/widgets/logger.dart b/lib/src/features/period_planner/presentation/widgets/logger.dart index 4c3765a2..4291da82 100644 --- a/lib/src/features/period_planner/presentation/widgets/logger.dart +++ b/lib/src/features/period_planner/presentation/widgets/logger.dart @@ -1,13 +1,13 @@ -import 'package:flutter/material.dart'; +// import 'package:flutter/material.dart'; -class Logger { - final IconData icon; - final String label; - final Color color; +// class Logger { +// final IconData icon; +// final String label; +// final Color color; - Logger({ - required this.icon, - required this.label, - required this.color, - }); -} \ No newline at end of file +// Logger({ +// required this.icon, +// required this.label, +// required this.color, +// }); +// } \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart index 37e4048c..e608b8c8 100644 --- a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart +++ b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart @@ -1,98 +1,98 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; -import 'package:nishauri/src/utils/constants.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; +// import 'package:nishauri/src/utils/constants.dart'; -class LoggerWidget extends StatefulWidget { - final String heading; - final List items; +// class LoggerWidget extends StatefulWidget { +// final String heading; +// final List items; - LoggerWidget({required this.heading, required this.items}); +// LoggerWidget({required this.heading, required this.items}); - @override - _LoggerWidgetState createState() => _LoggerWidgetState(); -} +// @override +// _LoggerWidgetState createState() => _LoggerWidgetState(); +// } -class _LoggerWidgetState extends State { - // Create a list to keep track of the selected items - late List _selectedItems; +// class _LoggerWidgetState extends State { +// // Create a list to keep track of the selected items +// late List _selectedItems; - @override - void initState() { - super.initState(); - // Initialize the list with false (none of the items are selected initially) - _selectedItems = List.filled(widget.items.length, false); - } +// @override +// void initState() { +// super.initState(); +// // Initialize the list with false (none of the items are selected initially) +// _selectedItems = List.filled(widget.items.length, false); +// } - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - widget.heading, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 16), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: widget.items - .asMap() - .entries - .map((entry) => _buildItemCard(entry.key, entry.value)) - .toList(), - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - }, - child: Text( - 'Click to Apply', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ], - ); - } +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return Column( +// crossAxisAlignment: CrossAxisAlignment.stretch, +// children: [ +// Text( +// widget.heading, +// textAlign: TextAlign.center, +// style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), +// ), +// const SizedBox(height: 16), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: Row( +// children: widget.items +// .asMap() +// .entries +// .map((entry) => _buildItemCard(entry.key, entry.value)) +// .toList(), +// ), +// ), +// Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// // To add functionality later +// }, +// child: Text( +// 'Click to Apply', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ], +// ); +// } - Widget _buildItemCard(int index, Logger item) { - return GestureDetector( - onTap: () { - setState(() { - _selectedItems[index] = !_selectedItems[index]; - }); - }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - Stack( - alignment: Alignment.center, - children: [ - Icon(item.icon, size: 40, color: item.color), - if (_selectedItems[index]) - Icon(Icons.check_circle, size: 40, color: Colors.green.withOpacity(0.9)), - ], - ), - const SizedBox(height: 8), - Text(item.label), - ], - ), - ), - ); - } -} +// Widget _buildItemCard(int index, Logger item) { +// return GestureDetector( +// onTap: () { +// setState(() { +// _selectedItems[index] = !_selectedItems[index]; +// }); +// }, +// child: Padding( +// padding: const EdgeInsets.symmetric(horizontal: 8.0), +// child: Column( +// children: [ +// Stack( +// alignment: Alignment.center, +// children: [ +// Icon(item.icon, size: 40, color: item.color), +// if (_selectedItems[index]) +// Icon(Icons.check_circle, size: 40, color: Colors.green.withOpacity(0.9)), +// ], +// ), +// const SizedBox(height: 8), +// Text(item.label), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 8a3962bd..4fe5e40a 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -3,10 +3,18 @@ import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:table_calendar/table_calendar.dart'; +/* +This class is responsible for generating events based the logged period days +and the days the algorithm predicts(Fertile, Ovulation and Predicted Next Period days) +The Events in this case are Period, Fertile, Ovulation and Predicted Period Day of a cycle. +The Days that are within Period Days are give a title of Period Day and a color of Colors.pink. +The rest happens for the other days. +*/ class EventUtils { static Map>> generateEvents(List cycles) { Map>> events= {}; + //debugPrint("-----Generating New Events From Event Utils-----"); From 045ef9b937623c4daaf57fb84886924faf382b19 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 28 Aug 2024 15:45:24 +0300 Subject: [PATCH 044/140] Handling cases whereby new users and regular users interact with the screen for logging periods. That is new users can log period start and end and regular log period start and the end is set based on the calculated average period Length. --- .../presentation/pages/logPeriods.dart | 224 ++++++------------ .../presentation/widgets/customCalendar.dart | 42 ++-- 2 files changed, 91 insertions(+), 175 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 0834a2b6..5d7dc983 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -42,136 +42,62 @@ class _LogPeriodScreenState extends State { DateTime? _startDate; DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); - late Map> _flatEvents; - late Map> _filteredEvents; - - @override - void initState() { + //late Map> _filteredEvents; + final bool _isNewUser = cycles.isEmpty; + int averagePeriods = calculateAveragePeriodLength(cycles); + + + @override + void initState() { super.initState(); - // _flatEvents = _flattenEvents(events); - // _filteredEvents = _filterEventsForLatestCycle(); - - if (events.isNotEmpty) { - _flatEvents = _flattenEvents(events); - _filteredEvents = _filterEventsForLatestCycle(); - } else { - _flatEvents = {}; - _filteredEvents = {}; + if (!_isNewUser) { + //_filteredEvents = _filterEventsForLatestCycle(); + _initializePredictedPeriodRange(); + _setFocusedDayForRegularUser(); + } + // else { + // _filteredEvents = {}; + // } } - } - - //To flatten the events so that it can be in the form of DateTime as the key and the events as the values - //These are events generated from the events utils class - Map> _flattenEvents(Map>> nestedEvents) { - final Map> flattenedEvents = {}; - - nestedEvents.forEach((cycleId, dateMap) { - //print("Processing cycle: $cycleId"); // Debug: Print current cycleId - dateMap.forEach((date, events) { - //print("Date: $date, Events: $events"); // Debug: Print date and events being processed - if (flattenedEvents.containsKey(date)) { - flattenedEvents[date]!.addAll(events); - } else { - flattenedEvents[date] = List.from(events); - } - }); - }); + // Map> _filterEventsForLatestCycle() { + // final Map> filteredEvents = {}; + + // final latestCycleId = events.keys.last; + // if (events.containsKey(latestCycleId)) { + // final latestCycleEvents = events[latestCycleId]!; + // latestCycleEvents.forEach((date, events) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(events); + // } else { + // filteredEvents[date] = List.from(events); + // } + // }); + // } + + // return filteredEvents; + // } - //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events - return flattenedEvents; + void _initializePredictedPeriodRange() { + final latestCycle = cycles.last; + _startDate = latestCycle.predictedPeriodStart; + _endDate = latestCycle.predictedPeriodEnd; } - Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; - - // Step 1: Identify the latest cycle - final latestCycleId = events.keys.last; - - if (events.containsKey(latestCycleId)) { - final latestCycleEvents = events[latestCycleId]!; - print("Latest Events: $latestCycleEvents"); - - // Step 2: Add all events from the latest cycle to filteredEvents - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { - filteredEvents[date] = List.from(events); - } - }); - - // Step 3: Filter previous cycles - events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - bool shouldOmitFertileOvulationDays = false; - - // Check if any of the latest period days collide with fertile/ovulation days from previous cycles - dateMap.forEach((date, events) { - final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - latestCycleEvents.keys.any((latestDate) { - // Check if the latest period days collide with fertile/ovulation days - return isSameDay(latestDate, date) || - latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - print("Collided Events: $hasCollision"); - - if (hasCollision) { - shouldOmitFertileOvulationDays = true; - } - }); - - // Additional step: Check if previous cycles' dates also collide with those of later cycles - events.forEach((laterCycleId, laterDateMap) { - //condition ensures that we only consider cycles that are neither the current one nor the latest one - if (laterCycleId != cycleId && laterCycleId != latestCycleId) { - dateMap.forEach((date, events) { - final hasCollisionWithlaterCycle = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - laterDateMap.keys.any((laterDate) { - return isSameDay(laterDate, date) || - laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - - if (hasCollisionWithlaterCycle) { - shouldOmitFertileOvulationDays = true; - } - }); - } - }); - - // Filter out the events based on collision detection and omit predicted period days regardless - dateMap.forEach((date, events) { - final newEventList = events.where((event) { - // Always omit predicted period days - if (event.title == 'Predicted Period Day') { - return false; - } - // Remove fertile and ovulation days if there was a collision - return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); - }).toList(); + void _setFocusedDayForRegularUser() { + final latestCycle = cycles.last; + _focusedDay = latestCycle.predictedPeriodStart; + } - if (newEventList.isNotEmpty) { - print("new Event List: $newEventList"); - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } - } - }); - } + void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { + setState(() { + _startDate = selectedDay; + _endDate = _startDate?.add(Duration(days: averagePeriods - 1)); // Only start date is used for regular users + _focusedDay = focusedDay; + debugPrint("Average Period Length from Log Periods is $averagePeriods"); }); } - - return filteredEvents; -} - - - // Method to validate date range ensuring selection does not exceed 7 days + // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day return @@ -203,17 +129,14 @@ class _LogPeriodScreenState extends State { }); } } - - //Function to handle adding and updating log entries in list Database void _updateOrAddCycle(DateTime start, [DateTime? end]) { // If end date is not provided, set it to the start date end ??= start; final DateTime now = DateTime.now(); - int averagePeriods = calculateAveragePeriodLength(cycles); if (isSameDay(start, now) || isSameDay(end, now)) { - end = start.add( Duration(days: averagePeriods)); + end = start.add( Duration(days: averagePeriods - 1)); } //Handling cases where a user might log an already logged date in their previous cycle, hence warning them using a snackbar @@ -255,8 +178,6 @@ class _LogPeriodScreenState extends State { (start2.isBefore(end1) || isSameDay(start2, end1)); } - - @override Widget build(BuildContext context) { //events = EventUtils.generateEvents(cycles); @@ -265,34 +186,37 @@ class _LogPeriodScreenState extends State { body: Column( children: [ CustomAppBar( - title: "Log Periods 📅", + title: "Enter Periods 📅", + subTitle: _isNewUser + ? "Please enter your previous period start and end date." + : "Please enter when your Periods have started", color: Constants.periodPlanner.withOpacity(1.0), ), TableCalendar( focusedDay: _focusedDay, - firstDay: DateTime(2020), - lastDay: DateTime.now(), - rangeStartDay: _startDate , - rangeEndDay: _endDate, - onRangeSelected: _onRangeSelected, - - rangeSelectionMode: RangeSelectionMode.toggledOn, + firstDay: DateTime(2021), + lastDay: DateTime(2100), + rangeStartDay: _startDate, + rangeEndDay: _isNewUser ? _endDate : _endDate, + onRangeSelected: _isNewUser ? _onRangeSelected : null, + onDaySelected: _isNewUser ? null : _onDaySelected, + rangeSelectionMode: _isNewUser ? RangeSelectionMode.toggledOn : RangeSelectionMode.toggledOn, - onPageChanged: (focusedDay) { - _focusedDay = focusedDay; - }, - eventLoader: (day) { - return _filteredEvents[day] ?? []; - }, - calendarBuilders: CalendarBuilders( - markerBuilder: (context, date, events) { - if (events.isEmpty) { - return null; - } - final eventList = events.cast(); - return EventsMaker(date: date, events: eventList); - }, - ), + // onPageChanged: (focusedDay) { + // _focusedDay = focusedDay; + // }, + // eventLoader: (day) { + // return _filteredEvents[day] ?? []; + // }, + // calendarBuilders: CalendarBuilders( + // markerBuilder: (context, date, events) { + // if (events.isEmpty) { + // return null; + // } + // final eventList = events.cast(); + // return EventsMaker(date: date, events: eventList); + // }, + // ), calendarStyle: const CalendarStyle( todayDecoration: BoxDecoration( color: Colors.blue, diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 460935c8..45bf6068 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -61,17 +61,9 @@ int calculateAveragePeriodLength(List cycles) { debugPrint("Average Period Length: $averagePeriodLength"); return averagePeriodLength; } - - - - // DateTime normalizeToMidnight(DateTime dateTime) { // return DateTime(dateTime.year, dateTime.month, dateTime.day); // } - - - - //Algorithm for calculating Next Period Days, Ovulation and Fertile Days Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { var uuid = const Uuid(); @@ -83,7 +75,7 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { // Calculate average period length from the period Start to the Period End int averagePeriodLength = calculateAveragePeriodLength(cycles); - DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength)); + DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength - 1)); DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) @@ -134,14 +126,14 @@ class CustomCalendar extends StatefulWidget { class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; late DateTime _focusedDay; - late Map> _flatEvents; + //late Map> _flatEvents; late Map> _filteredEvents; @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; - _flatEvents = _flattenEvents(widget.events); + //_flatEvents = _flattenEvents(widget.events); _filteredEvents = _filterEventsForLatestCycle(); // Determine the focused day based on the calendar format _focusedDay = _calendarFormat == CalendarFormat.week @@ -150,20 +142,20 @@ class _CustomCalendarState extends State{ } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values - Map> _flattenEvents(Map>> nestedEvents) { - final Map> flattenedEvents = {}; - - nestedEvents.forEach((cycleId, dateMap) { - dateMap.forEach((date, events) { - if (flattenedEvents.containsKey(date)) { - flattenedEvents[date]!.addAll(events); - } else { - flattenedEvents[date] = List.from(events); - } - }); - }); - return flattenedEvents; - } + // Map> _flattenEvents(Map>> nestedEvents) { + // final Map> flattenedEvents = {}; + + // nestedEvents.forEach((cycleId, dateMap) { + // dateMap.forEach((date, events) { + // if (flattenedEvents.containsKey(date)) { + // flattenedEvents[date]!.addAll(events); + // } else { + // flattenedEvents[date] = List.from(events); + // } + // }); + // }); + // return flattenedEvents; + // } //This is for filtering events on the calendar Map> _filterEventsForLatestCycle() { From 9a44e834347cc3a5668afbd4abc69cb2f19d7f08 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 29 Aug 2024 18:01:22 +0300 Subject: [PATCH 045/140] Added Period History in the Menstrual Calendar Feature --- lib/src/app/navigation/app_router.dart | 35 ++- .../pages/periodPlannerScreen.dart | 9 +- .../presentation/pages/periods_history.dart | 208 ++++++++++++++++++ lib/src/utils/routes.dart | 1 + 4 files changed, 236 insertions(+), 17 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/pages/periods_history.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 57736a34..10a1d96a 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -63,6 +63,7 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/periodCa import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlanner.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; import 'package:nishauri/src/features/self_screening/presentation/self_screening_menu.dart'; import 'package:nishauri/src/features/treatment_support/presentation/pages/TreatmentSupport.dart'; @@ -381,21 +382,31 @@ final List secureRoutes = [ }, ) ]), - //Routes for the Period Planner - GoRoute( - name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, - path: 'period-planner-log-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return LogPeriodScreen(); - }, - ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_SCREEN, - path: 'period-planner-screen', + //Routes for the Period Planner + GoRoute( + name: RouteNames.PERIOD_PLANNER_SCREEN, + path: 'period-planner-screen', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlannerScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, + path: 'period-planner-period-history', builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerScreen(); + return PeriodsHistory(); }, ), + ], + ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return LogPeriodScreen(); + }, + ), + ]; final List openRoutes = [ diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index b51bea2c..dfe337fe 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -195,9 +195,9 @@ class _PeriodPlannerScreenState extends State { ), Text( chances, - style: const TextStyle( + style: TextStyle( fontSize: 34, - color: Constants.periodPlanner, + color: chances == 'High' ? Colors.red : Colors.blue, fontWeight: FontWeight.bold, ), ), @@ -414,9 +414,8 @@ class _PeriodPlannerScreenState extends State { style: ElevatedButton.styleFrom( backgroundColor: Constants.periodPlanner, ), - onPressed: () { - // To add functionality later - // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); }, child: Text( 'Periods History', diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart new file mode 100644 index 00000000..9b77e31b --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -0,0 +1,208 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + + +class PeriodsHistory extends StatefulWidget { + const PeriodsHistory({super.key}); + + @override + State createState() => _PeriodsHistoryState(); +} + +class _PeriodsHistoryState extends State { + final averagePeriod = calculateAveragePeriodLength(cycles); + final averageCycles = calculateAverageCycleLength(cycles); + // final List> periodHistory = [ + // {'start': 'July 1', 'end': 'July 7'}, + // {'start': 'August 1', 'end': 'August 7'}, + // {'start': 'September 2', 'end': 'September 8'}, + // {'start': 'October 3', 'end': 'October 9'}, + // {'start': 'November 4', 'end': 'November 10'}, + // {'start': 'December 5', 'end': 'December 11'}, + // {'start': 'January 6', 'end': 'January 12'}, + // {'start': 'February 7', 'end': 'February 13'}, + // {'start': 'March 8', 'end': 'March 14'}, + // {'start': 'April 9', 'end': 'April 15'}, + // {'start': 'May 10', 'end': 'May 16'}, + // {'start': 'June 11', 'end': 'June 17'}, + // {'start': 'July 12', 'end': 'July 18'}, + // {'start': 'August 13', 'end': 'August 19'}, + // {'start': 'September 14', 'end': 'September 20'}, + // {'start': 'October 15', 'end': 'October 21'}, + // {'start': 'November 16', 'end': 'November 22'}, + // {'start': 'December 17', 'end': 'December 23'}, + // {'start': 'January 18', 'end': 'January 24'}, + // {'start': 'February 19', 'end': 'February 25'}, + // ]; + + // Function to format the date as "MMM d" + String formatDate(DateTime date) { + return DateFormat('MMM d').format(date); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: ListView( + children: [ + const CustomAppBar( + title: "My Period History 🌼", + color: Constants.periodPlanner, + ), + const SizedBox(height: 10), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + //The first Card showing both Average period and cycle lengths + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + "My Cycles", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + //Card showing Average Period days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + "Average Period", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 8.0), + Text( + "$averagePeriod days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.pink, + ), + ), + ], + ), + ), + ), + ), + Expanded( + //Card Showing Average Cycle days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + 'Average Cycle', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 8.0), + Text( + "$averageCycles days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.blue, + ), + ), + ], + ), + ), + ), + ), + ], + ), + const SizedBox(height: 10) + ], + ), + ), + ), + const SizedBox(height: 20), + //Card Showing period history + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), + child: Column( + children: [ + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink + ), + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: cycles.length, + itemBuilder: (context, index) { + final cycle = cycles[index]; + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + return ListTile( + title: const Text("2024"), + subtitle: Text( + "$start - $end", + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + trailing: IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_forward_ios), + ), + ); + } + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 76058151..27fec9e9 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -67,6 +67,7 @@ class RouteNames { static const PERIOD_PLANNER_CALENDAR = "Period Planner Calendar"; static const PERIOD_PLANNER_LOG_PERIODS = "period-planner-log-periods"; static const PERIOD_PLANNER_EDIT_PERIODS = "period-planner-edit-periods"; + static const PERIOD_PLANNER_PERIOD_HISTORY = "period-planner-period-history"; } From 8407c0f57c8415a61437b369e0768df46c7fd907 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 29 Aug 2024 19:05:24 +0300 Subject: [PATCH 046/140] Grouping the cycles by their years and making sure the latest cycle is displayed first --- .../presentation/pages/periods_history.dart | 322 ++++++++++-------- 1 file changed, 171 insertions(+), 151 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 9b77e31b..608e5f9f 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -5,7 +5,6 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/custom import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; - class PeriodsHistory extends StatefulWidget { const PeriodsHistory({super.key}); @@ -16,36 +15,31 @@ class PeriodsHistory extends StatefulWidget { class _PeriodsHistoryState extends State { final averagePeriod = calculateAveragePeriodLength(cycles); final averageCycles = calculateAverageCycleLength(cycles); - // final List> periodHistory = [ - // {'start': 'July 1', 'end': 'July 7'}, - // {'start': 'August 1', 'end': 'August 7'}, - // {'start': 'September 2', 'end': 'September 8'}, - // {'start': 'October 3', 'end': 'October 9'}, - // {'start': 'November 4', 'end': 'November 10'}, - // {'start': 'December 5', 'end': 'December 11'}, - // {'start': 'January 6', 'end': 'January 12'}, - // {'start': 'February 7', 'end': 'February 13'}, - // {'start': 'March 8', 'end': 'March 14'}, - // {'start': 'April 9', 'end': 'April 15'}, - // {'start': 'May 10', 'end': 'May 16'}, - // {'start': 'June 11', 'end': 'June 17'}, - // {'start': 'July 12', 'end': 'July 18'}, - // {'start': 'August 13', 'end': 'August 19'}, - // {'start': 'September 14', 'end': 'September 20'}, - // {'start': 'October 15', 'end': 'October 21'}, - // {'start': 'November 16', 'end': 'November 22'}, - // {'start': 'December 17', 'end': 'December 23'}, - // {'start': 'January 18', 'end': 'January 24'}, - // {'start': 'February 19', 'end': 'February 25'}, - // ]; // Function to format the date as "MMM d" String formatDate(DateTime date) { return DateFormat('MMM d').format(date); } + // Function to group cycles by year + Map> groupCyclesByYear(List cycles) { + final Map> groupedCycles = {}; + for (var cycle in cycles) { + final year = cycle.periodStart.year; + if (!groupedCycles.containsKey(year)) { + groupedCycles[year] = []; + } + groupedCycles[year]!.add(cycle); + } + return groupedCycles; + } + @override Widget build(BuildContext context) { + // Group cycles by year and reverse the list to show the latest first + final groupedCycles = groupCyclesByYear(cycles); + final sortedYears = groupedCycles.keys.toList()..sort((a, b) => b.compareTo(a)); + return Scaffold( body: ListView( children: [ @@ -54,150 +48,176 @@ class _PeriodsHistoryState extends State { color: Constants.periodPlanner, ), const SizedBox(height: 10), - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - //The first Card showing both Average period and cycle lengths - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - "My Cycles", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.bold, - ), + SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + // The first Card showing both Average period and cycle lengths + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + "My Cycles", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - //Card showing Average Period days - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - const Text( - "Average Period", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.w500, - ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + // Card showing Average Period days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + "Average Period", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, ), - const SizedBox(height: 8.0), - Text( - "$averagePeriod days", - style: const TextStyle( - fontSize: 30.0, - fontWeight: FontWeight.bold, - color: Colors.pink, - ), + ), + const SizedBox(height: 8.0), + Text( + "$averagePeriod days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - ], - ), + ), + ], ), ), ), - Expanded( - //Card Showing Average Cycle days - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - const Text( - 'Average Cycle', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.w500, - ), + ), + Expanded( + // Card Showing Average Cycle days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + 'Average Cycle', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w500, ), - const SizedBox(height: 8.0), - Text( - "$averageCycles days", - style: const TextStyle( - fontSize: 30.0, - fontWeight: FontWeight.bold, - color: Colors.blue, - ), + ), + const SizedBox(height: 8.0), + Text( + "$averageCycles days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.blue, ), - ], - ), + ), + ], ), ), ), - ], - ), - const SizedBox(height: 10) - ], - ), + ), + ], + ), + const SizedBox(height: 10), + ], ), ), - const SizedBox(height: 20), - //Card Showing period history - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), - child: Column( - children: [ - const Text( - "History", - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: Colors.pink - ), + ), + const SizedBox(height: 20), + // Card Showing period history + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), + child: Column( + children: [ + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: cycles.length, - itemBuilder: (context, index) { - final cycle = cycles[index]; - final start = formatDate(cycle.periodStart); - final end = formatDate(cycle.periodEnd); - return ListTile( - title: const Text("2024"), - subtitle: Text( - "$start - $end", - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - trailing: IconButton( - onPressed: () {}, - icon: const Icon(Icons.arrow_forward_ios), + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: sortedYears.length, + itemBuilder: (context, index) { + final year = sortedYears[index]; + final cyclesInYear = groupedCycles[year]!; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + "$year", + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), ), - ); - } - ), - ], - ), + ...cyclesInYear.reversed.map((cycle) { + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + final cycleDays = cycle.cycleLength; + return ListTile( + title: Text( + "$start - $end", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text( + "Length of cycle: $cycleDays days", + style: const TextStyle( + fontSize: 16.0, + ), + ), + trailing: IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_forward_ios), + ), + ); + }).toList(), + ], + ); + }, + ), + ], ), ), - ], - ), + ), + ], ), ), ), @@ -205,4 +225,4 @@ class _PeriodsHistoryState extends State { ), ); } -} \ No newline at end of file +} From 7f17019a8733e58c34dd91ade2ab66449893cc6a Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 30 Aug 2024 16:09:09 +0300 Subject: [PATCH 047/140] Started working on allowing editing of period days from history although it is not quite complete. --- lib/src/app/navigation/app_router.dart | 13 +- .../presentation/pages/editPeriodsScreen.dart | 201 +++++++----------- .../pages/periodPlannerScreen.dart | 23 +- .../presentation/pages/periods_history.dart | 15 +- 4 files changed, 113 insertions(+), 139 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 10a1d96a..afb69b43 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -394,8 +394,19 @@ final List secureRoutes = [ name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, path: 'period-planner-period-history', builder: (BuildContext context, GoRouterState state) { - return PeriodsHistory(); + return const PeriodsHistory(); }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + path: 'period-planner-edit-periods', + builder: (BuildContext context, GoRouterState state) { + final startDate = state.extra != null ? (state.extra as Map)['startDate'] as DateTime : null; + final endDate = state.extra != null ? (state.extra as Map)['endDate'] as DateTime : null; + return EditPeriods(initialStartDate: startDate, initialEndDate: endDate); + }, + ), + ], ), ], ), diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index e87293c2..1aa3a59a 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,133 +1,78 @@ -// import 'package:flutter/material.dart'; -// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -// import 'package:nishauri/src/utils/constants.dart'; -// import 'package:table_calendar/table_calendar.dart'; +import 'package:flutter/material.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:table_calendar/table_calendar.dart'; -// class EditPeriodsScreen extends StatefulWidget { +class EditPeriods extends StatefulWidget { + final DateTime? initialStartDate; + final DateTime? initialEndDate; + const EditPeriods({super.key, this.initialStartDate, this.initialEndDate}); -// const EditPeriodsScreen({super.key}); + @override + State createState() => _EditPeriodsState(); +} -// @override -// State createState() => _EditPeriodsScreenState(); -// } +class _EditPeriodsState extends State { + late DateTime _focusedDay; + DateTime? _rangeStart; + DateTime? _rangeEnd; -// class _EditPeriodsScreenState extends State { -// // DateTime? _periodStart; -// // DateTime? _periodEnd; -// // Cycle? _cycle; -// Map _periodRanges = {}; - + @override + void initState() { + super.initState(); + + _focusedDay = widget.initialStartDate ?? DateTime.now(); + _rangeStart = widget.initialStartDate; + _rangeEnd = widget.initialEndDate; + } -// @override -// void initState() { -// super.initState(); - -// // Gather all period ranges from all cycles -// for (Cycle cycle in cycles) { -// _periodRanges[cycle.periodStart] = cycle.periodEnd; -// } - -// // Here, selecting the last cycle added to the list -// // if (cycles.isNotEmpty) { -// // _cycle = cycles.last; -// // _periodStart = _cycle?.periodStart; -// // _periodEnd = _cycle?.periodEnd; -// // } - -// } - -// void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { -// setState(() { -// if (start != null && end != null) { -// // Assuming you're editing the last cycle for simplicity -// Cycle lastCycle = cycles.last; -// lastCycle.periodStart = start; -// lastCycle.periodEnd = end; - -// // Update the period ranges map -// _periodRanges[start] = end; -// } -// }); -// } - -// void _applyChanges() { -// // Save the updated cycle list and recalculate important dates -// for (Cycle cycle in cycles) { -// Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); -// cycle.fertileStart = updatedCycle.fertileStart; -// cycle.fertileEnd = updatedCycle.fertileEnd; -// cycle.ovulation = updatedCycle.ovulation; -// cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; -// cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; -// } - -// Navigator.of(context).pop(); // Go back to the previous screen -// } - -// @override -// Widget build(BuildContext context) { -// final theme = Theme.of(context); - -// return Scaffold( -// body: Column( -// children: [ -// CustomAppBar( -// title: "Edit Periods 📅", -// color: Constants.periodPlanner.withOpacity(1.0), -// ), -// TableCalendar( -// focusedDay: DateTime.now(), -// firstDay: DateTime(2020), -// lastDay: DateTime.now(), -// rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, -// rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, -// onRangeSelected: _onRangeSelected, -// calendarFormat: CalendarFormat.month, -// headerStyle: const HeaderStyle( -// formatButtonVisible: false, -// ), -// calendarStyle: const CalendarStyle( -// todayDecoration: BoxDecoration( -// color: Colors.blue, -// shape: BoxShape.circle, -// ), -// rangeStartDecoration: BoxDecoration( -// color: Colors.pink, -// shape: BoxShape.circle, -// ), -// rangeEndDecoration: BoxDecoration( -// color: Colors.pink, -// shape: BoxShape.circle, -// ), -// rangeHighlightColor: Constants.periodPlanner, -// ), -// ), -// Expanded( -// child: Align( -// alignment: Alignment.bottomCenter, -// child: Padding( -// padding: const EdgeInsets.all(16.0), -// child: ElevatedButton( -// style: ElevatedButton.styleFrom( -// backgroundColor: Constants.periodPlanner, -// ), -// onPressed: () { -// _applyChanges(); -// }, -// child: Text( -// 'Apply Changes', -// style: theme.textTheme.titleSmall?.copyWith( -// color: Colors.white, -// ), -// ), -// ), -// ), -// ), -// ), -// ], -// ), -// ); -// } -// } \ No newline at end of file + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + title: "Edit Period 🌸", + color: Constants.periodPlanner, + ), + TableCalendar( + focusedDay: _focusedDay, + firstDay: DateTime(2021), + lastDay: DateTime(2100), + rangeStartDay: _rangeStart, + rangeEndDay: _rangeEnd, + onRangeSelected: (start, end, focusedDay) { + setState(() { + _rangeStart = start; + _rangeEnd = end; + _focusedDay = focusedDay; + }); + }, + calendarStyle: const CalendarStyle( + todayDecoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + rangeStartDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeEndDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeHighlightColor: Constants.periodPlanner, + selectedDecoration: BoxDecoration( + color: Constants.periodPlanner, + shape: BoxShape.circle, + ), + ), + headerStyle: const HeaderStyle( + formatButtonVisible: false, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index dfe337fe..6d0b0410 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -50,12 +50,14 @@ class _PeriodPlannerScreenState extends State { _periodEnd = latestCycle.periodEnd; _ovulationDate = latestCycle.ovulation; _nextPeriodStart = latestCycle.predictedPeriodStart; - _nextPeriodEnd = latestCycle.predictedPeriodEnd; + _nextPeriodEnd = latestCycle.predictedPeriodEnd; + + //_autoAddPeriodDay(); } events = EventUtils.generateEvents(cycles); //_updateEvents(); } - + //Method for updating events void _updateEvents() { setState(() { events = EventUtils.generateEvents(cycles); @@ -71,10 +73,17 @@ class _PeriodPlannerScreenState extends State { }); } - - - - + //Method for auto adding the latest predicted period day as the period start + void _autoAddPeriodDay() { + if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { + setState(() { + _periodStart = _nextPeriodStart; + _periodEnd = _nextPeriodEnd; + final Cycle newCycle = predictCycle(_periodStart, _periodEnd); + cycles.add(newCycle); + }); + } + } @override Widget build(BuildContext context) { @@ -286,7 +295,7 @@ class _PeriodPlannerScreenState extends State { if (cycle.periodStart == _periodStart) { cycle.periodEnd = _periodEnd; } - } + } _updateEvents(); printCycles(cycles); diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 608e5f9f..6c62be94 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class PeriodsHistory extends StatefulWidget { const PeriodsHistory({super.key}); @@ -170,8 +172,7 @@ class _PeriodsHistoryState extends State { itemCount: sortedYears.length, itemBuilder: (context, index) { final year = sortedYears[index]; - final cyclesInYear = groupedCycles[year]!; - + final cyclesInYear = groupedCycles[year]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -204,7 +205,15 @@ class _PeriodsHistoryState extends State { ), ), trailing: IconButton( - onPressed: () {}, + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + extra: { + 'startDate': cycle.periodStart, + 'endDate' : cycle.periodEnd, + } + ); + }, icon: const Icon(Icons.arrow_forward_ios), ), ); From a881f2b56865d009a200bac74b3c8e2740c0679a Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 2 Sep 2024 13:14:24 +0300 Subject: [PATCH 048/140] Ensuring every entry in the period history has its own card and making the calendar in the weekly format static --- .../pages/periodPlannerScreen.dart | 22 +-- .../presentation/pages/periods_history.dart | 133 +++++++++--------- .../presentation/widgets/customCalendar.dart | 130 +++++++++++------ 3 files changed, 162 insertions(+), 123 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 6d0b0410..eb77c887 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -74,16 +74,16 @@ class _PeriodPlannerScreenState extends State { } //Method for auto adding the latest predicted period day as the period start - void _autoAddPeriodDay() { - if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { - setState(() { - _periodStart = _nextPeriodStart; - _periodEnd = _nextPeriodEnd; - final Cycle newCycle = predictCycle(_periodStart, _periodEnd); - cycles.add(newCycle); - }); - } - } + // void _autoAddPeriodDay() { + // if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { + // setState(() { + // _periodStart = _nextPeriodStart; + // _periodEnd = _nextPeriodEnd; + // final Cycle newCycle = predictCycle(_periodStart, _periodEnd); + // cycles.add(newCycle); + // }); + // } + // } @override Widget build(BuildContext context) { @@ -223,7 +223,7 @@ class _PeriodPlannerScreenState extends State { events: events, headerButton: true, inPeriods: inPeriods, - ), + ), ), const SizedBox(height: Constants.SPACING), Stack( diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 6c62be94..58f3fd8a 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -149,82 +149,77 @@ class _PeriodsHistoryState extends State { ), const SizedBox(height: 20), // Card Showing period history - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - child: Padding( - padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), - child: Column( + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: sortedYears.length, + itemBuilder: (context, index) { + final year = sortedYears[index]; + final cyclesInYear = groupedCycles[year]!; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( - "History", - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: Colors.pink, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + "$year", + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), ), - ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: sortedYears.length, - itemBuilder: (context, index) { - final year = sortedYears[index]; - final cyclesInYear = groupedCycles[year]!; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Text( - "$year", - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), + const SizedBox(height: 10), + ...cyclesInYear.reversed.map((cycle) { + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + final cycleDays = cycle.cycleLength; + return Card( + elevation: 4.0, + margin: const EdgeInsets.symmetric(vertical: 8.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: ListTile( + title: Text( + "$start - $end", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, ), - ...cyclesInYear.reversed.map((cycle) { - final start = formatDate(cycle.periodStart); - final end = formatDate(cycle.periodEnd); - final cycleDays = cycle.cycleLength; - return ListTile( - title: Text( - "$start - $end", - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - subtitle: Text( - "Length of cycle: $cycleDays days", - style: const TextStyle( - fontSize: 16.0, - ), - ), - trailing: IconButton( - onPressed: () { - context.goNamed( - RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - extra: { - 'startDate': cycle.periodStart, - 'endDate' : cycle.periodEnd, - } - ); - }, - icon: const Icon(Icons.arrow_forward_ios), - ), + ), + subtitle: Text( + "Length of cycle: $cycleDays days", + style: const TextStyle( + fontSize: 16.0, + ), + ), + trailing: IconButton( + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + extra: { + 'startDate': cycle.periodStart, + 'endDate': cycle.periodEnd, + }, ); - }).toList(), - ], - ); - }, - ), + }, + icon: const Icon(Icons.arrow_forward_ios), + ), + ), + ); + }).toList(), ], - ), - ), + ); + }, ), ], ), diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 45bf6068..ff587c60 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -10,18 +10,21 @@ import 'package:uuid/uuid.dart'; // Function to calculate Average Cycle days int calculateAverageCycleLength(List cycles) { if (cycles.length < 2) { - debugPrint("Not enough cycles to calculate an average, defaulting to 28 days."); + debugPrint( + "Not enough cycles to calculate an average, defaulting to 28 days."); return 28; // Default to 28 if there aren't enough cycles } int totalLength = 0; for (int i = 1; i < cycles.length; i++) { - int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; + int cycleLength = + cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; debugPrint("Cycle Length before adjustment for cycle $i: $cycleLength"); // Cap to a minimum cycle length of 21 days if (cycleLength < 21) { - debugPrint("Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); + debugPrint( + "Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); cycleLength = 26; } @@ -30,10 +33,12 @@ int calculateAverageCycleLength(List cycles) { } int averageCycle = (totalLength / (cycles.length - 1)).round(); - debugPrint("Calculated Average Cycle Length before final check: $averageCycle"); + debugPrint( + "Calculated Average Cycle Length before final check: $averageCycle"); if (averageCycle < 21) { - debugPrint("Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); + debugPrint( + "Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); return 26; } @@ -41,8 +46,6 @@ int calculateAverageCycleLength(List cycles) { return averageCycle; } - - //Function for calculating Average Period days int calculateAveragePeriodLength(List cycles) { if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles @@ -54,13 +57,14 @@ int calculateAveragePeriodLength(List cycles) { } int averagePeriodLength = (totalPeriodLength / cycles.length).round(); if (averagePeriodLength < 3) { - return 4; + return 4; } debugPrint("Total Period Length: $totalPeriodLength"); debugPrint("Number of Cycles: ${cycles.length}"); debugPrint("Average Period Length: $averagePeriodLength"); return averagePeriodLength; } + // DateTime normalizeToMidnight(DateTime dateTime) { // return DateTime(dateTime.year, dateTime.month, dateTime.day); // } @@ -75,8 +79,10 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { // Calculate average period length from the period Start to the Period End int averagePeriodLength = calculateAveragePeriodLength(cycles); - DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength - 1)); - DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); + DateTime predictedPeriodStart = + periodStart.add(Duration(days: averageCycleLength - 1)); + DateTime predictedPeriodEnd = + predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) DateTime ovulation = predictedPeriodStart.subtract(const Duration(days: 14)); @@ -91,45 +97,49 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { : averageCycleLength; // Calculate cycle length only if there are previous cycles //Calculating period Length of each cycle - int periodLength = periodEnd.difference(periodStart).inDays + 1; + int periodLength = periodEnd.difference(periodStart).inDays + 1; return Cycle( - cycleId: cycleId, - periodStart: periodStart, - periodEnd: periodEnd, - fertileStart: fertileStart, - fertileEnd: fertileEnd, - ovulation: ovulation, - predictedPeriodStart: predictedPeriodStart, + cycleId: cycleId, + periodStart: periodStart, + periodEnd: periodEnd, + fertileStart: fertileStart, + fertileEnd: fertileEnd, + ovulation: ovulation, + predictedPeriodStart: predictedPeriodStart, predictedPeriodEnd: predictedPeriodEnd, cycleLength: cycleLength, periodLength: periodLength, ); -} +} + class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; final bool headerButton; final bool? inPeriods; - const CustomCalendar({ + const CustomCalendar({ Key? key, - this.initialFormat = CalendarFormat.month, - required this.events, + this.initialFormat = CalendarFormat.month, + required this.events, this.headerButton = false, this.inPeriods, - }) : super(key: key); + }) : super(key: key); @override _CustomCalendarState createState() => _CustomCalendarState(); } -class _CustomCalendarState extends State{ + +class _CustomCalendarState extends State { late CalendarFormat _calendarFormat; late DateTime _focusedDay; + late DateTime _firstDay; + late DateTime _lastDay; //late Map> _flatEvents; late Map> _filteredEvents; - @override + @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; @@ -139,6 +149,8 @@ class _CustomCalendarState extends State{ _focusedDay = _calendarFormat == CalendarFormat.week ? _getNextPredictedPeriodDate() ?? DateTime.now() : DateTime.now(); + _firstDay = _getFirstEventDate(); + _lastDay = _getLastEventDate(); } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -175,32 +187,65 @@ class _CustomCalendarState extends State{ } return filteredEvents; - } - + } + //Function for getting the focused day DateTime? _getNextPredictedPeriodDate() { - for (var entry in _filteredEvents.entries) { - if (widget.inPeriods == true) { - // Return the first date with a 'Period Day' event - if (entry.value.any((event) => event.title == 'Period Day')) { - return entry.key; + for (var entry in _filteredEvents.entries) { + if (widget.inPeriods == true) { + // Return the first date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + return entry.key; + } + } else { + // Return the first date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + return entry.key; + } } - } else { - // Return the first date with a 'Predicted Period Day' event - if (entry.value.any((event) => event.title == 'Predicted Period Day')) { - return entry.key; + } + return null; + } + + /*Getting the first date to be displayed on the calendar + if the function _getNextPredictedPeriodDate, the start date of the calendar is 2010 + */ + DateTime _getFirstEventDate() { + DateTime? firstEventDate = _getNextPredictedPeriodDate(); + return _calendarFormat == CalendarFormat.week ? firstEventDate ?? DateTime(2010): DateTime(2010); // Fallback to DateTime(2010) if null + } + + /*Getting the last date to be displayed on the calendar + if the function _getNextPredictedPeriodDate, the last date of the calendar is 2100 + */ + DateTime _getLastEventDate() { + DateTime? lastEventDate; + + for (var entry in _filteredEvents.entries.toList().reversed) { + if (widget.inPeriods == true) { + // Return the last date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + lastEventDate = entry.key; + break; + } + } else { + // Return the last date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + lastEventDate = entry.key; + break; + } } } + + return _calendarFormat == CalendarFormat.week ? lastEventDate ?? DateTime(2100): DateTime(2100); // Fallback to DateTime(2100) if null } - return null; -} @override Widget build(BuildContext context) { return TableCalendar( key: ValueKey(widget.events), - firstDay: DateTime(2010), - lastDay: DateTime(2100), + firstDay: _firstDay, + lastDay: _lastDay, focusedDay: _focusedDay, // onDaySelected: (selectedDay, focusedDay) { // setState(() { @@ -213,7 +258,7 @@ class _CustomCalendarState extends State{ }, headerVisible: true, headerStyle: HeaderStyle( - formatButtonVisible: widget.headerButton, + formatButtonVisible: widget.headerButton, ), onFormatChanged: (format) { // Show the modal when the format button is pressed @@ -250,7 +295,7 @@ class _CustomCalendarState extends State{ return null; } final eventList = events.cast(); - + // debugPrint("-----From CustomCalendar------"); // debugPrint('Successfully cast events for date: $date, events: $eventList'); @@ -260,4 +305,3 @@ class _CustomCalendarState extends State{ ); } } - From 5fc7f9ffd99d7cd65bf50bb341852301cc94b7a5 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 2 Sep 2024 15:51:05 +0300 Subject: [PATCH 049/140] Allowing users to edit their periods however there are some issues to solve since screens are not updating --- .../presentation/pages/editPeriodsScreen.dart | 106 ++++++++++++++++-- .../presentation/pages/logPeriods.dart | 33 +++--- 2 files changed, 113 insertions(+), 26 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 1aa3a59a..f888d068 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,12 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; class EditPeriods extends StatefulWidget { final DateTime? initialStartDate; final DateTime? initialEndDate; - const EditPeriods({super.key, this.initialStartDate, this.initialEndDate}); + const EditPeriods( + {super.key, this.initialStartDate, this.initialEndDate}); @override State createState() => _EditPeriodsState(); @@ -17,17 +22,50 @@ class _EditPeriodsState extends State { DateTime? _rangeStart; DateTime? _rangeEnd; - @override + @override void initState() { super.initState(); - + _focusedDay = widget.initialStartDate ?? DateTime.now(); _rangeStart = widget.initialStartDate; _rangeEnd = widget.initialEndDate; } + void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { + setState(() { + _rangeStart = start; + _rangeEnd = end; + _focusedDay = focusedDay ?? _focusedDay; + }); + } + + //Function for updating the entries in the list database + void _updateCycle() { + if (_rangeStart != null && _rangeEnd != null) { + //Finding the current cycle to update + Cycle currentCycle = cycles.firstWhere( + (cycle) => + cycle.periodStart == widget.initialStartDate && + cycle.periodEnd == widget.initialEndDate, + ); + + // Predict the new cycle based on the updated period start and end dates + Cycle updatedCycle = predictCycle(_rangeStart!, _rangeEnd!); + + //Replace the old cycle with the updated one + int index = cycles.indexOf(currentCycle); + cycles[index] = updatedCycle; + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Periods updated successfully!')), + ); + Navigator.pop(context); + } + } + @override Widget build(BuildContext context) { + final theme = Theme.of(context); return Scaffold( body: Column( children: [ @@ -41,13 +79,8 @@ class _EditPeriodsState extends State { lastDay: DateTime(2100), rangeStartDay: _rangeStart, rangeEndDay: _rangeEnd, - onRangeSelected: (start, end, focusedDay) { - setState(() { - _rangeStart = start; - _rangeEnd = end; - _focusedDay = focusedDay; - }); - }, + rangeSelectionMode: RangeSelectionMode.toggledOn, + onRangeSelected: _onRangeSelected, calendarStyle: const CalendarStyle( todayDecoration: BoxDecoration( color: Colors.blue, @@ -71,8 +104,59 @@ class _EditPeriodsState extends State { formatButtonVisible: false, ), ), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // if (_startDate != null) { + // final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date + // _updateOrAddCycle(_startDate!, endDate); + // printCycles(cycles); + // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + // } else { + // ScaffoldMessenger.of(context).showSnackBar( + // const SnackBar(content: Text('Please select your Period start and end dates.')), + // ); + // } + if (_rangeStart == null || _rangeEnd == null) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Invalid Selection'), + content: const Text('Please select both start and end of your periods!!'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('OK'), + ), + ], + ), + ); + } else { + _updateCycle(); + context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); + } + }, + child: Text( + 'Apply', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), + ), ], ), ); } -} \ No newline at end of file +} diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 5d7dc983..8eccbc25 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -43,6 +43,7 @@ class _LogPeriodScreenState extends State { DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); //late Map> _filteredEvents; + //final latestCycle = cycles.last; final bool _isNewUser = cycles.isEmpty; int averagePeriods = calculateAveragePeriodLength(cycles); @@ -51,13 +52,9 @@ class _LogPeriodScreenState extends State { void initState() { super.initState(); if (!_isNewUser) { - //_filteredEvents = _filterEventsForLatestCycle(); _initializePredictedPeriodRange(); _setFocusedDayForRegularUser(); } - // else { - // _filteredEvents = {}; - // } } // Map> _filterEventsForLatestCycle() { @@ -100,8 +97,7 @@ class _LogPeriodScreenState extends State { // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day - return - difference <= 7; // Ensure the range does not exceed 7 days + return difference <= 7; // Ensure the range does not exceed 7 days } void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { @@ -129,8 +125,8 @@ class _LogPeriodScreenState extends State { }); } } - //Function to handle adding and updating log entries in list Database - void _updateOrAddCycle(DateTime start, [DateTime? end]) { + //Function to handle adding log entries in list Database + void addCycle(DateTime start, [DateTime? end]) { // If end date is not provided, set it to the start date end ??= start; @@ -184,23 +180,30 @@ class _LogPeriodScreenState extends State { final theme = Theme.of(context); return Scaffold( body: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ CustomAppBar( title: "Enter Periods 📅", - subTitle: _isNewUser - ? "Please enter your previous period start and end date." - : "Please enter when your Periods have started", color: Constants.periodPlanner.withOpacity(1.0), ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + _isNewUser + ? "Please enter your previous period start and end date." + : "Please enter when your Periods have started", + style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + ), + ), TableCalendar( focusedDay: _focusedDay, firstDay: DateTime(2021), lastDay: DateTime(2100), rangeStartDay: _startDate, - rangeEndDay: _isNewUser ? _endDate : _endDate, + rangeEndDay: _endDate, onRangeSelected: _isNewUser ? _onRangeSelected : null, onDaySelected: _isNewUser ? null : _onDaySelected, - rangeSelectionMode: _isNewUser ? RangeSelectionMode.toggledOn : RangeSelectionMode.toggledOn, + rangeSelectionMode: RangeSelectionMode.toggledOn, // onPageChanged: (focusedDay) { // _focusedDay = focusedDay; @@ -251,8 +254,8 @@ class _LogPeriodScreenState extends State { ), onPressed: () { if (_startDate != null) { - final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date - _updateOrAddCycle(_startDate!, endDate); + final endDate = _endDate ?? _startDate!.add(const Duration(days: 1)); // The else statement handles where a period only happens for a single day hence the end date will be same day as start date + addCycle(_startDate!, endDate); printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); } else { From 3491056d2e5cdf0457045d0c86fe3300c05825e4 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 3 Sep 2024 12:01:45 +0300 Subject: [PATCH 050/140] Fix BMI fetch age, update program, reschedule appointment --- .../data/respositories/auth_repository.dart | 5 + .../controllers/auth_controller.dart | 1 + .../pages/BMICalculatorScreen.dart | 324 ++++++++---------- .../presentation/widgets/Appointments.dart | 9 +- .../presentation/widgets/Greetings.dart | 304 ++++++---------- .../pages/ConfirmDeliveryScreen.dart | 2 +- .../pages/program_appointments.dart | 33 +- .../widget/orders/FulfilledOrders.dart | 6 +- .../widget/orders/active_orders.dart | 6 +- .../appointments/ARTAppointmentDetail.dart | 15 +- .../user/data/services/UserService.dart | 14 +- 11 files changed, 302 insertions(+), 417 deletions(-) diff --git a/lib/src/features/auth/data/respositories/auth_repository.dart b/lib/src/features/auth/data/respositories/auth_repository.dart index 5fb70489..3bb27fc5 100644 --- a/lib/src/features/auth/data/respositories/auth_repository.dart +++ b/lib/src/features/auth/data/respositories/auth_repository.dart @@ -90,9 +90,14 @@ class AuthRepository { } Future saveAge(String age) async { + print("saving age: $age"); await LocalStorage.save("age", age); } + Future deleteAge() async { + await LocalStorage.delete("age"); + } + Future getAge() async { return await LocalStorage.get("age"); } diff --git a/lib/src/features/auth/presentation/controllers/auth_controller.dart b/lib/src/features/auth/presentation/controllers/auth_controller.dart index 19f1ac1d..14c3d9fc 100644 --- a/lib/src/features/auth/presentation/controllers/auth_controller.dart +++ b/lib/src/features/auth/presentation/controllers/auth_controller.dart @@ -173,6 +173,7 @@ class AuthController extends StateNotifier> { _repository.deleteToken(); _repository.deleteUserId(); _repository.deletePhoneNumber(); + _repository.deleteAge(); state.when( data: (value) => state = AsyncValue.data( value.copyWith( diff --git a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart index 2769287b..85533761 100644 --- a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart +++ b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart @@ -1,18 +1,13 @@ import 'dart:developer'; -import 'dart:ffi'; - import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:flutter_svg/svg.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; -import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; -import 'package:nishauri/src/features/bmi/data/services/bmi_log_service.dart'; import 'package:nishauri/src/features/bmi/presentation/widgets/GenderPicker.dart'; import 'package:nishauri/src/features/bmi/presentation/widgets/HeightPicker.dart'; import 'package:nishauri/src/features/bmi/presentation/widgets/HeightUnitsPicker.dart'; @@ -29,37 +24,49 @@ import 'package:nishauri/src/utils/routes.dart'; class BMICalculatorScreen extends HookConsumerWidget { const BMICalculatorScreen({super.key}); - Future _fetchAge() async { - final authRepository = AuthRepository(AuthApiService()); - return await authRepository.getAge() as Future; + Future _fetchAge(WidgetRef ref) async { + try { + final authRepository = AuthRepository(AuthApiService()); + String ageString = await authRepository.getAge(); + int age = int.parse(ageString); + return age; + } catch (e) { + print("An error occurred while fetching the age: $e"); + final userAsync = ref.watch(userProvider); + final age = userAsync.when( + data: (user) { + final birthYear = int.parse(user.dateOfBirth!.split('-')[0]); + return DateTime.now().year - birthYear; + }, + loading: () => null, + error: (error, stack) { + print("Error fetching user data: $error"); + return null; + }, + ); + return age; + } } @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); const activeColor = Constants.activeSelectionColor; - var gender = useState(GenderPickerChoices.male); + final gender = useState(GenderPickerChoices.male); final isPregnant = useState(false); final height = useState(180); - final heightUnits = - useState(HeightUnitsPickerOptions.In); + final heightUnits = useState(HeightUnitsPickerOptions.In); final weight = useState(65); final isForSelf = useState(true); - final userAsync = ref.watch(userProvider); - // var age = userAsync.whenData((user) { - // return DateTime.now().year - int.parse(user.dateOfBirth!.split('-')[0]); - // }); - var age = userAsync.whenData((user) { - return DateTime.now().year - int.parse(user.dateOfBirth!.split('-')[0]); - }); - var userAge = useState(age); + final userAge = useState(18); - // Implmentation using Fetch age and AuthRepository - // var userAge = useState(18); - // useEffect(() { - // _fetchAge().then((value) => userAge.value = value); - // return null; - // }, []); + useEffect(() { + _fetchAge(ref).then((fetchedAge) { + print("Age fetched: $fetchedAge"); + userAge.value = fetchedAge!; + }); + return null; + }, [ref]); return Scaffold( body: Column( @@ -67,7 +74,6 @@ class BMICalculatorScreen extends HookConsumerWidget { const CustomAppBar( title: "BMI Calculator ⚖️", subTitle: "Empower Your Health Journey \nWith BMI Insights", - // icon: Icons.calculate_outlined, color: Constants.bmiCalculatorColor, ), Expanded( @@ -79,73 +85,40 @@ class BMICalculatorScreen extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Card( - child: Container( + child: Padding( padding: const EdgeInsets.all(Constants.SPACING), child: Column( children: [ Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "BMI for: ", style: theme.textTheme.titleMedium, ), - const SizedBox(height: Constants.SPACING), ToggleButtons( - isSelected: [ - isForSelf.value, - !isForSelf.value - ], + isSelected: [isForSelf.value, !isForSelf.value], onPressed: (index) { isForSelf.value = index == 0; - // fetch user gender - userAsync.whenData((user) async { - if (user.gender != null) { - debugPrint( - 'user gender: ${user.gender}'); - if (user.gender == 'Male') { - gender = - useState( - GenderPickerChoices.male); - } else { - gender = - useState( - GenderPickerChoices.female); - } - } - }); - userAsync.whenData((user) async { - if (user.dateOfBirth != null) { - debugPrint( - 'user dateOfBirth: ${user.dateOfBirth}'); - var age = DateTime.now().year - - int.parse(user.dateOfBirth! - .split('-')[0]); - userAge.value = AsyncValue.data(age); - } - }); - // ==== Fetch user not working as expected - // _fetchAge().then( - // (value) => userAge.value = value); + if (isForSelf.value) { + _fetchAge(ref).then((fetchedAge) { + userAge.value = fetchedAge!; + }); + } }, - selectedColor: Colors - .white, //color for selected button + selectedColor: Colors.white, fillColor: activeColor, children: const [ Padding( - padding: EdgeInsets.symmetric( - horizontal: 16.0), + padding: EdgeInsets.symmetric(horizontal: 16.0), child: Text("Myself"), ), Padding( - padding: EdgeInsets.symmetric( - horizontal: 16.0), + padding: EdgeInsets.symmetric(horizontal: 16.0), child: Text("Other"), ), ], ), - const SizedBox(height: Constants.SPACING), ], ), ], @@ -158,69 +131,69 @@ class BMICalculatorScreen extends HookConsumerWidget { style: theme.textTheme.titleMedium, ), const SizedBox(height: Constants.SPACING), - // Check is forself is true - isForSelf.value == false - ? GenderPicker( - gender: gender.value, - onGenderChange: (gender_) { - if (gender_ == GenderPickerChoices.female) { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text("Warning!"), - content: SingleChildScrollView( - child: Wrap( - children: [ - const Text( - "BMI Calculation for pregnant lady is highly discouraged and not supported to avoid drastic decisions.Please confirm your pregnancy status", - ), - RadioGroup( - // value: pregnant.value ? "no":"yes", - onValueChanged: (val) { - context.pop(val == "no"); - }, - items: [ - RadioGroupItem( - value: "yes", - title: "Not Pregnant", - icon: - Icons.woman_rounded), - RadioGroupItem( - value: "no", - title: "Pregnant", - icon: - Icons.pregnant_woman), - ], - ) - ], - ), - )), - ).then((isPregnant_) { - if (isPregnant_ != null) { - if (isPregnant_ == false) { - gender.value = gender_; - isPregnant.value = false; - } else { - gender.value = gender_; - isPregnant.value = true; - ScaffoldMessenger.of(context) - .showSnackBar(const SnackBar( - content: Text( - "BMI calculation for pregnant lady ain't supported"))); - } - } - }); - } else { + if (!isForSelf.value) + GenderPicker( + gender: gender.value, + onGenderChange: (gender_) { + if (gender_ == GenderPickerChoices.female) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text("Warning!"), + content: SingleChildScrollView( + child: Wrap( + children: [ + const Text( + "BMI Calculation for pregnant ladies is highly discouraged and not supported to avoid drastic decisions. Please confirm your pregnancy status.", + ), + RadioGroup( + onValueChanged: (val) { + Navigator.of(context).pop(val == "no"); + }, + items: [ + RadioGroupItem( + value: "yes", + title: "Not Pregnant", + icon: Icons.woman_rounded, + ), + RadioGroupItem( + value: "no", + title: "Pregnant", + icon: Icons.pregnant_woman, + ), + ], + ), + ], + ), + ), + ), + ).then((isPregnant_) { + if (isPregnant_ != null) { + isPregnant.value = !isPregnant_; gender.value = gender_; + if (isPregnant_) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + "BMI calculation for pregnant ladies isn't supported", + ), + ), + ); + } } - }, - activeColor: activeColor, - ) - : GenderPicker( - gender: gender.value, - onGenderChange: (gender) {}, - isEnabled: isForSelf.value, - ), + }); + } else { + gender.value = gender_; + } + }, + activeColor: activeColor, + ) + else + GenderPicker( + gender: gender.value, + onGenderChange: (gender) {}, + isEnabled: isForSelf.value, + ), const SizedBox(height: Constants.SPACING), HeightPicker( activeColor: activeColor, @@ -246,64 +219,45 @@ class BMICalculatorScreen extends HookConsumerWidget { units: "Kgs", activeColor: activeColor, ), - isForSelf.value == false - ? Quantizer( - min: 5, - max: 100, - value: userAge.value.value!, - onValueChange: (value) => - userAge.value = AsyncValue.data(value), - label: "Age", - units: "Years", - activeColor: activeColor, - ) - : // Show similar quantizer but one that values can't be modified - Quantizer( - value: userAge.value.value!, - onValueChange: (value) {}, - label: "Age", - units: "Years", - activeColor: activeColor, - ), + Quantizer( + min: 5, + max: 100, + value: userAge.value, + onValueChange: isForSelf.value ? (_) {} : (value) => userAge.value = value, + label: "Age", + units: "Years", + activeColor: activeColor, + ), ], ), const SizedBox(height: Constants.SPACING), Button( - title: "Calculate", - surfixIcon: SvgPicture.asset( - "assets/images/refresh-circle.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - ), - disabled: isPregnant.value, - backgroundColor: activeColor, - textColor: theme.canvasColor, - onPress: () { - final bmi = - calculateBMI(height.value, weight.value); - print('height.value: ${height.value}'); - print('bmi: $bmi'); - - if (isForSelf.value) { - ref - .read(bmiLogProvider.notifier) - .logBMI(height.value.toString(), - weight.value.toString(), bmi.toString()) - .then((_) { - context.goNamed( - RouteNames.BMI_CALCULATOR_RESULTS, - extra: bmi); - }); - ref.refresh(bmiListProvider); - } else { - context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS, - extra: bmi); - } - }), + title: "Calculate", + surfixIcon: SvgPicture.asset( + "assets/images/refresh-circle.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + ), + disabled: isPregnant.value, + backgroundColor: activeColor, + textColor: theme.canvasColor, + onPress: () { + final bmi = calculateBMI(height.value, weight.value); + if (isForSelf.value) { + ref.read(bmiLogProvider.notifier) + .logBMI(height.value.toString(), weight.value.toString(), bmi.toString()) + .then((_) { + context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS, extra: bmi); + }); + ref.refresh(bmiListProvider); + } else { + context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS, extra: bmi); + } + }, + ), const SizedBox(height: Constants.SPACING), Button( title: "BMI History", - // disabled: isPregnant.value, backgroundColor: activeColor, textColor: theme.canvasColor, onPress: () { @@ -322,7 +276,3 @@ class BMICalculatorScreen extends HookConsumerWidget { ); } } - -//Awaiting Endpoints - - diff --git a/lib/src/features/common/presentation/widgets/Appointments.dart b/lib/src/features/common/presentation/widgets/Appointments.dart index ed445c93..51e9eda3 100644 --- a/lib/src/features/common/presentation/widgets/Appointments.dart +++ b/lib/src/features/common/presentation/widgets/Appointments.dart @@ -30,6 +30,12 @@ class Appointments extends HookConsumerWidget { ?.where((order) => order.status != 'Fullfilled') .toList() ?? []; + final fullFilledOrders = ref + .watch(drugOrderProvider) + .valueOrNull + ?.where((order) => order.status == 'Fullfilled') + .toList() ?? + []; final theme = Theme.of(context); return appointmentsAsync.when( @@ -112,6 +118,7 @@ class Appointments extends HookConsumerWidget { child: AppointmentCard( rescheduleButtonText: pendingOrders.isNotEmpty ? "Has active order" + :fullFilledOrders.isNotEmpty ? "Appointment order has already been fulfilled" : (artAppointment.reschedule_status .toString() == "0" @@ -134,7 +141,7 @@ class Appointments extends HookConsumerWidget { null || artAppointment.reschedule_status .toString() == - "2" + "2" && !fullFilledOrders.isNotEmpty ? () => context.goNamed( RouteNames.APPOINTMENTS_RESCHEDULE, extra: diff --git a/lib/src/features/common/presentation/widgets/Greetings.dart b/lib/src/features/common/presentation/widgets/Greetings.dart index 6d0bfe46..c7d60888 100644 --- a/lib/src/features/common/presentation/widgets/Greetings.dart +++ b/lib/src/features/common/presentation/widgets/Greetings.dart @@ -5,21 +5,32 @@ import 'package:intl/intl.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +import 'package:nishauri/src/features/clinic_card/data/providers/programProvider.dart'; import 'package:nishauri/src/features/common/data/providers/shortcut_provider.dart'; import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -class Greetings extends StatelessWidget { +class Greetings extends ConsumerWidget { final String? image; final String name; const Greetings({super.key, this.image, required this.name}); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); + final programState = ref.watch(programProvider); + + // Check if the program list is empty or if all programs are inactive + final showUpdateProgram = + programState.when( + data: (programs) => programs.isEmpty || + programs.every((program) => program == 0), + error: (error, stack) => false, + loading: () => false, + ); return Container( width: double.maxFinite, @@ -27,220 +38,111 @@ class Greetings extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - "Hey, 👋", - style: theme.textTheme.headlineMedium?.copyWith( - color: theme.colorScheme.primary, fontWeight: FontWeight.w700), - ), - name == 'Null Null' || name == null - ? GestureDetector( - onTap: () { - context.goNamed(RouteNames.PROFILE_EDIT_FORM); - }, - child: Text( - 'Click here to update your profile', - style: theme.textTheme.titleMedium?.copyWith( - color: Colors.red, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ) - : Text( - name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: theme.textTheme.headlineLarge?.copyWith( - color: theme.colorScheme.primary, - fontWeight: FontWeight.w700, - ), - ), - - // Text( - // name == 'null null' || name == null ? - // GestureDetector( - // onTap: () { - // context.goNamed(RouteNames.PROFILE_EDIT_FORM); - // }, - // child: const Text( - // 'Click here to update your profile', - // style: TextStyle( - // color: Colors.red, - // // decoration: TextDecoration.underline, - // ), - // ), - // ) - // : name, - // maxLines: 1, - // overflow: TextOverflow.ellipsis, - // style: theme.textTheme.headlineLarge - // ?.copyWith(color: theme.colorScheme.primary, fontWeight: FontWeight.w700), - // ), - const SizedBox(height: Constants.SPACING), - Text( - DateFormat("EEEE, MMMM dd").format( - DateTime.now(), - ), - style: theme.textTheme.titleMedium - // ?.copyWith(color: theme.colorScheme.onSurface.withOpacity(0.3)), - ), - const SizedBox(height: Constants.SPACING * 2), - /* Stack( - clipBehavior: Clip.none, - alignment: Alignment.center, - children: [ - Positioned( - bottom: -(headerHeight * 0.25), - height: headerHeight * 1.25, - width: screenSize.width * 0.89, - child: Column( + Padding( + padding: const EdgeInsets.symmetric(horizontal: Constants.SPACING), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( - "Hello 👋,", - ), Text( + "Hey, 👋", + style: theme.textTheme.headlineMedium?.copyWith( + color: theme.colorScheme.primary, + fontWeight: FontWeight.w700, + ), + ), + name == 'Null Null' || name == null + ? GestureDetector( + onTap: () { + context.goNamed(RouteNames.PROFILE_EDIT_FORM); + }, + child: Text( + 'Click here to update your profile', + style: theme.textTheme.titleMedium?.copyWith( + color: Colors.red, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ) + : Text( name, - style: const TextStyle(fontSize: 20), maxLines: 1, overflow: TextOverflow.ellipsis, + style: theme.textTheme.headlineLarge?.copyWith( + color: theme.colorScheme.primary, + fontWeight: FontWeight.w700, + ), ), - Expanded( - child: AppCard( - color: theme.colorScheme.onPrimary, - variant: CardVariant.ELEVETED, - child: Container( - padding: const EdgeInsets.all(Constants.SPACING), - width: double.infinity, - height: double.infinity, - child: Center( - child: Consumer( - builder: (context, ref, child) { - final shortcuts = ref.watch(shortcutProvider); - return MenuItemsBuilder( - itemBuilder: (item) => MenuOption( - title: item.title ?? "", - icon: item.icon, - bgColor: item.title == "Edit Shortcut" - ? theme.colorScheme.secondary - : null, - onPress: item.onPressed, - ), - items: getMenuItemByNames(context, shortcuts) - ..add( - MenuItem( - icon: Icons.edit_note_sharp, - title: "Edit Shortcut", - onPressed: () => _showDialog(context), - ), + const SizedBox(height: Constants.SPACING), + Text( + DateFormat("EEEE, MMMM dd").format(DateTime.now()), + style: theme.textTheme.titleMedium, + ), + ], + ), + if (showUpdateProgram) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + "Update program", + style: theme.textTheme.headlineMedium?.copyWith( + color: theme.colorScheme.primary, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(width: 8.0), + IconButton( + icon: const Icon( + Icons.info_outline, + size: 40, + color: Constants.bpBgColor, + ), + onPressed: () { + // Handle the tap event here + showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + title: Text( + 'You are not registered to any program. Kindly register to a program to have your data personalized.', + style: theme.textTheme.bodyMedium, ), - ); - - return Wrap( - alignment: WrapAlignment.spaceBetween, - crossAxisAlignment: WrapCrossAlignment.center, - spacing: Constants.SPACING, - runSpacing: Constants.SPACING, - children: [ - ...getMenuItemByNames(context, shortcuts) - .map((e) => MenuOption( - title: e.title ?? "", - icon: e.icon, - onPress: e.onPressed, - )), - MenuOption( - icon: Icons.add, - title: "Add Shortcut", - onPress: () { - _showDialog(context); - }, + content: Text( + 'Touch on OK to select and register a program', + style: theme.textTheme.bodySmall, ), - ], + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); + }, + ), + TextButton( + child: const Text('Cancel'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ), ); }, ), - ), + ], ), - ), - ), - ], - ), - ), - ], - ),*/ + ] + ) + ], + ), + ), ], ), ); } } - -_showDialog(BuildContext context) { - final theme = Theme.of(context); - return showDialog( - context: context, - builder: (BuildContext context) => AlertDialog( - icon: const Icon(Icons.construction), - title: Text( - "Select Shortcut MenuOptions", - style: theme.textTheme.titleMedium, - ), - content: SizedBox( - width: double.maxFinite, - height: MediaQuery.of(context).size.height * 0.5, - child: Consumer( - builder: (context, ref, child) { - final userProgram = ref.watch(userProgramProvider); - final shortcuts = ref.watch(shortcutProvider); - final shortcutsNotifier = ref.watch(shortcutProvider.notifier); - return userProgram.when( - data: (data) => MenuItemsBuilder( - itemBuilder: (item) => MenuOption( - title: item.title ?? "", - icon: item.icon, - onPress: () { - if (shortcuts.any((element) => element == item.title)) { - // Delete shortcut - shortcutsNotifier.deleteShortcut( - item.title ?? "", - ); - } else { - // Add shortcut - if (shortcuts.length >= shortcutsNotifier.maxShortcuts) { - context.pop(); - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: - Text("Max number of shortcuts reached"))); - } else { - shortcutsNotifier.addShortcut( - item.title ?? "", - ); - } - } - }, - bgColor: shortcuts.any((element) => element == item.title) - ? theme.colorScheme.secondary - : null, - ), - items: [ - // get generic menu items - ...getGenericMenuItems(context), - // get program menu items - ...data.map((e) { - final programCode = e.id; - return getProgramMenuItemByProgramCode( - context, programCode ?? ''); - }).toList(), - ], - ), - error: (error, _) => Center(child: Text(error.toString())), - loading: () => const Center( - child: CircularProgressIndicator(), - ), - ); - }, - ), - ), - ), - ); -} diff --git a/lib/src/features/confirm_delivery/presentation/pages/ConfirmDeliveryScreen.dart b/lib/src/features/confirm_delivery/presentation/pages/ConfirmDeliveryScreen.dart index 583cba68..ee1a991e 100644 --- a/lib/src/features/confirm_delivery/presentation/pages/ConfirmDeliveryScreen.dart +++ b/lib/src/features/confirm_delivery/presentation/pages/ConfirmDeliveryScreen.dart @@ -136,7 +136,7 @@ class ConfirmDeliveryScreen extends HookConsumerWidget { builder: (context, ref, child) { return Button( title: "Confirm Delivery", - backgroundColor: const Color.fromRGBO(64, 87, 162, 1), + backgroundColor: Constants.dawaDropShortcutBgColor, textColor: Colors.white, onPress: handleSubmit, loading: _loading, diff --git a/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart b/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart index 045a007d..dac572fe 100644 --- a/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart +++ b/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart @@ -57,10 +57,17 @@ class ProgramAppointmentsScreen extends ConsumerWidget { final bool hasActiveRequest = appointment.id != null && orderAsync.when( data: (orders) => orders.any((order) => - order.appointment?.id == appointment.id), + order.appointment?.id == appointment.id && order.status != "Fullfilled"), loading: () => false, error: (_, __) => false, ); + // Check if appointment is fulfilled + final bool isFulfilled = orderAsync.when( + data: (orders) => orders.any((order) => + order.appointment?.id == appointment.id && order.status == "Fullfilled"), + loading: () => false, + error: (_, __) => false, + ); final bool eligibleAppointment = appointment.id != null && orderAsync.when( @@ -143,21 +150,21 @@ class ProgramAppointmentsScreen extends ConsumerWidget { height: Constants.SPACING), // Display text based on whether there is an active request Text( - hasActiveRequest + isFulfilled + ? "Appointment order has already been fulfilled" + : hasActiveRequest ? "Appointment has an active request" - : appointment - .appointment_status == - 1 - ? "Request Home delivery" - : "", + : appointment.appointment_status == 1 + ? "Request Home delivery" + : "", style: TextStyle( - color: hasActiveRequest + color: isFulfilled + ? Colors.grey // Adjust color for fulfilled status + : hasActiveRequest ? Constants.appointmentsColor - : appointment - .appointment_status == - 1 - ? Constants.clinicCardColor - : Colors.transparent, + : appointment.appointment_status == 1 + ? Constants.clinicCardColor + : Colors.transparent, ), ), ], diff --git a/lib/src/features/dawa_drop/presentation/widget/orders/FulfilledOrders.dart b/lib/src/features/dawa_drop/presentation/widget/orders/FulfilledOrders.dart index 6d372f25..14140394 100644 --- a/lib/src/features/dawa_drop/presentation/widget/orders/FulfilledOrders.dart +++ b/lib/src/features/dawa_drop/presentation/widget/orders/FulfilledOrders.dart @@ -87,7 +87,7 @@ class FulfilledOrders extends StatelessWidget { color: Constants.dawaDropColor.withOpacity(0.5), ), const SizedBox(width: Constants.SPACING), - Text("Deliver Person: ${order.deliveryPerson?.fullName ?? ''}"), + Text("Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"), ], ), if (order.deliveryPerson?.phoneNumber != null && order.deliveryPerson?.phoneNumber != '') @@ -99,7 +99,7 @@ class FulfilledOrders extends StatelessWidget { color: Constants.dawaDropColor.withOpacity(0.5), ), const SizedBox(width: Constants.SPACING), - Text("Deliver Person Phone: ${order.deliveryPerson?.phoneNumber ?? ''}"), + Text("Delivery Person Phone: ${order.deliveryPerson?.phoneNumber ?? ''}"), ], ), if (order.status != null && order.status != '') @@ -111,7 +111,7 @@ class FulfilledOrders extends StatelessWidget { color: Constants.dawaDropColor.withOpacity(0.5), ), const SizedBox(width: Constants.SPACING), - Text("Deliver Status: ${order.status ?? ''}"), + Text("Delivery Status: ${order.status ?? ''}"), ], ), ], diff --git a/lib/src/features/dawa_drop/presentation/widget/orders/active_orders.dart b/lib/src/features/dawa_drop/presentation/widget/orders/active_orders.dart index 33fac323..33a60b4c 100644 --- a/lib/src/features/dawa_drop/presentation/widget/orders/active_orders.dart +++ b/lib/src/features/dawa_drop/presentation/widget/orders/active_orders.dart @@ -90,7 +90,7 @@ class ActiveOrders extends StatelessWidget { color: Constants.dawaDropColor.withOpacity(0.5), ), const SizedBox(width: Constants.SPACING), - Text("Deliver Person: ${order.deliveryPerson?.fullName ?? ''}"), + Text("Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"), ], ), if (order.deliveryPerson?.phoneNumber != null && order.deliveryPerson?.phoneNumber != '') @@ -102,7 +102,7 @@ class ActiveOrders extends StatelessWidget { color: Constants.dawaDropColor.withOpacity(0.5), ), const SizedBox(width: Constants.SPACING), - Text("Deliver Person Phone: ${order.deliveryPerson?.phoneNumber ?? ''}"), + Text("Delivery Person Phone: ${order.deliveryPerson?.phoneNumber ?? ''}"), ], ), if (order.status != null && order.status != '') @@ -114,7 +114,7 @@ class ActiveOrders extends StatelessWidget { color: Constants.dawaDropColor.withOpacity(0.5), ), const SizedBox(width: Constants.SPACING), - Text("Deliver Status: ${order.status ?? ''}"), + Text("Delivery Status: ${order.status ?? ''}"), ], ), ], diff --git a/lib/src/features/hiv/presentation/pages/appointments/ARTAppointmentDetail.dart b/lib/src/features/hiv/presentation/pages/appointments/ARTAppointmentDetail.dart index e2cff03e..62b3ba1b 100644 --- a/lib/src/features/hiv/presentation/pages/appointments/ARTAppointmentDetail.dart +++ b/lib/src/features/hiv/presentation/pages/appointments/ARTAppointmentDetail.dart @@ -19,7 +19,13 @@ class ARTAppointmentDetailScreen extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final orderAsync = ref.watch(drugOrderProvider); final bool hasActiveRequest = artAppointment.id != null && orderAsync.when( - data: (orders) => orders.any((order) => order.appointment?.id == artAppointment.id), + data: (orders) => orders.any((order) => order.appointment?.id == artAppointment.id && order.status != "Fullfilled"), + loading: () => false, + error: (_, __) => false, + ); + + final bool isFulfilled = artAppointment.id != null && orderAsync.when( + data: (orders) => orders.any((order) => order.appointment?.id == artAppointment.id && order.status == "Fullfilled"), loading: () => false, error: (_, __) => false, ); @@ -88,13 +94,16 @@ class ARTAppointmentDetailScreen extends ConsumerWidget { Padding( padding: const EdgeInsets.all(Constants.SPACING), child: Button( - onPress: hasActiveRequest + onPress: hasActiveRequest? null : isFulfilled ? null : () { context.goNamed(RouteNames.HIV_ART_DELIVERY_REQUEST_FORM, extra: {"payload": artAppointment, "type": "self"}); }, - title: hasActiveRequest + title: isFulfilled + ? "Appointment order has already been fulfilled" + : + hasActiveRequest ? "Active request available for the appointment" : "Request Home delivery", ), diff --git a/lib/src/features/user/data/services/UserService.dart b/lib/src/features/user/data/services/UserService.dart index a79921a0..a65e9176 100644 --- a/lib/src/features/user/data/services/UserService.dart +++ b/lib/src/features/user/data/services/UserService.dart @@ -151,7 +151,6 @@ class UserService extends HTTPService { Future saveGenderAge() async { - try{ final resp = await call(patientData_, null); if (resp.statusCode == 200) { final responseString = await resp.stream.bytesToString(); @@ -163,12 +162,17 @@ class UserService extends HTTPService { await _repository.saveAge(calculateAge(dob).toString()); } else{ - throw respData["message"]; + final profileDOB = await call(getUser_,null); + final profileString = await profileDOB.stream.bytesToString(); + final data = json.decode(profileString); + final dob = data["profile"]["dob"]; + final gender = data["profile"]["gender"]; + await _repository.saveAge(calculateAge(dob).toString()); + await _repository.saveGender(gender); } + } else { + throw "something is wrong"; } - } catch (e) { - throw e; - } } Future accountVerify(Map data) async { http.StreamedResponse response = await call(accountVerify_, data); From ea8707d627c6e7fc25c59225a32594f5c51763f5 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 4 Sep 2024 09:43:01 +0300 Subject: [PATCH 051/140] redesign update program dialogue --- .../presentation/widgets/Greetings.dart | 66 +++++++++++-------- pubspec.lock | 16 +++++ pubspec.yaml | 3 +- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/lib/src/features/common/presentation/widgets/Greetings.dart b/lib/src/features/common/presentation/widgets/Greetings.dart index c7d60888..64c66dff 100644 --- a/lib/src/features/common/presentation/widgets/Greetings.dart +++ b/lib/src/features/common/presentation/widgets/Greetings.dart @@ -2,6 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; +import 'package:material_dialogs/dialogs.dart'; +import 'package:material_dialogs/widgets/buttons/icon_button.dart'; +import 'package:material_dialogs/widgets/buttons/icon_outline_button.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; @@ -21,13 +24,13 @@ class Greetings extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); - final programState = ref.watch(programProvider); + final programState = ref.watch(userProgramProvider); // Check if the program list is empty or if all programs are inactive final showUpdateProgram = programState.when( data: (programs) => programs.isEmpty || - programs.every((program) => program == 0), + programs.every((program) => program.isActive == false), error: (error, stack) => false, loading: () => false, ); @@ -104,33 +107,38 @@ class Greetings extends ConsumerWidget { color: Constants.bpBgColor, ), onPressed: () { - // Handle the tap event here - showDialog( - context: context, - builder: (BuildContext context) => AlertDialog( - title: Text( - 'You are not registered to any program. Kindly register to a program to have your data personalized.', - style: theme.textTheme.bodyMedium, - ), - content: Text( - 'Touch on OK to select and register a program', - style: theme.textTheme.bodySmall, - ), - actions: [ - TextButton( - child: const Text('OK'), - onPressed: () { - context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); - }, - ), - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ), + // // Handle the tap event here + // showDialog( + // context: context, + // builder: (BuildContext context) => + Dialogs.bottomMaterialDialog( + msg: 'Tap to Choose and Enrol in a Program', + context: context, + color: Constants.dawaDropShortcutBgColor, + title: 'Take Control of Your Health – Join A Program and Start Your Journey Today!', + actions: [ + IconsOutlineButton( + onPressed: () { + context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); + Navigator.of(context).pop(); + }, + text: 'Opt-In', + iconData: Icons.add, + textStyle: TextStyle(color: Colors.white), + color: Constants.programsColor, + iconColor: Colors.white, + ), + IconsButton( + onPressed: () { + Navigator.of(context).pop(); + }, + text: 'Not now', + iconData: Icons.cancel_outlined, + color: Constants.bpShortCutBgColor, + textStyle: TextStyle(color: Colors.white), + iconColor: Colors.white, + ), + ] ); }, ), diff --git a/pubspec.lock b/pubspec.lock index 2ea9362c..39f99bbd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1285,6 +1285,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + lottie: + dependency: transitive + description: + name: lottie + sha256: "6a24ade5d3d918c306bb1c21a6b9a04aab0489d51a2582522eea820b4093b62b" + url: "https://pub.dev" + source: hosted + version: "3.1.2" markdown: dependency: transitive description: @@ -1309,6 +1317,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.8.0" + material_dialogs: + dependency: "direct main" + description: + name: material_dialogs + sha256: f072d8c11b3392a2aa6a2f279239e5063654113e1e851b62ef009b500d512f17 + url: "https://pub.dev" + source: hosted + version: "1.1.5" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 842f7bdb..0733eaf5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 2.0.0+1 +version: 2.0.1+1 environment: sdk: '>=3.1.3 <4.0.0' @@ -80,6 +80,7 @@ dependencies: flutter_secure_storage: ^9.2.2 flutter_blue_plus: ^1.32.4 + material_dialogs: ^1.1.5 dev_dependencies: flutter_test: From a9a998af40daf8c8617c7d470af51972755496d6 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 4 Sep 2024 11:12:57 +0300 Subject: [PATCH 052/140] :construction: insight info on self screening --- .../presentation/self_screening_menu.dart | 146 ++++++++++-------- 1 file changed, 84 insertions(+), 62 deletions(-) diff --git a/lib/src/features/self_screening/presentation/self_screening_menu.dart b/lib/src/features/self_screening/presentation/self_screening_menu.dart index 1638703c..442da579 100644 --- a/lib/src/features/self_screening/presentation/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/self_screening_menu.dart @@ -1,83 +1,105 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +import 'package:nishauri/src/features/common/presentation/pages/HomeScreen.dart'; +import 'package:nishauri/src/features/common/presentation/pages/SettingsScreen.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -_menuItems(BuildContext context) => [ - MenuItem( - icon: const Icon(Icons.calculate), - shortcutIcon: const Icon(Icons.calculate), - color: Constants.bmiCalculatorShortcutBgColor, - shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, - title: "BMI Calculator", - onPressed: () => context.goNamed(RouteNames.BMI_CALCULATOR)), - MenuItem( - icon: const Icon(Icons.trending_up), - shortcutIcon: const Icon(Icons.trending_up), - color: Constants.bpShortCutBgColor, - shortcutBackgroundColor: Constants.bpShortCutBgColor, - title: "B P Monitor", - onPressed: () => context.goNamed(RouteNames.BLOOD_PRESSURE)), - MenuItem( - // icon: FaIcon(FontAwesomeIcons.capsules, size: Constants.iconSize, color: Colors.teal[200],), - shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - icon: const Icon(Icons.sanitizer), - shortcutIcon: Icon(Icons.sanitizer), - title: MenuItemNames.BLOOD_SUGAR, - onPressed: () => context.goNamed(MenuItemNames.BLOOD_SUGAR), - color: Constants.bloodSugarColor.withOpacity(0.5), - ), - MenuItem( - // icon: FaIcon(FontAwesomeIcons.capsules, size: Constants.iconSize, color: Colors.teal[200],), - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: const Icon(Icons.calendar_month_outlined), - shortcutIcon: Icon(Icons.calendar_month_outlined), - title: MenuItemNames.PERIOD_PLANNER, - onPressed: () => context.goNamed(MenuItemNames.PERIOD_PLANNER), - color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), - ), - ]; +List _menuItems(BuildContext context) => [ + MenuItem( + icon: const Icon(Icons.calculate), + shortcutIcon: const Icon(Icons.calculate), + color: Constants.bmiCalculatorShortcutBgColor, + shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, + title: "BMI Calculator", + onPressed: () => context.goNamed(RouteNames.BMI_CALCULATOR), + ), + MenuItem( + icon: const Icon(Icons.trending_up), + shortcutIcon: const Icon(Icons.trending_up), + color: Constants.bpShortCutBgColor, + shortcutBackgroundColor: Constants.bpShortCutBgColor, + title: "B P Monitor", + onPressed: () => context.goNamed(RouteNames.BLOOD_PRESSURE), + ), + MenuItem( + shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, + icon: const Icon(Icons.sanitizer), + shortcutIcon: const Icon(Icons.sanitizer), + title: MenuItemNames.BLOOD_SUGAR, + onPressed: () => context.goNamed(MenuItemNames.BLOOD_SUGAR), + color: Constants.bloodSugarColor.withOpacity(0.5), + ), + MenuItem( + shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, + icon: const Icon(Icons.calendar_month_outlined), + shortcutIcon: const Icon(Icons.calendar_month_outlined), + title: MenuItemNames.PERIOD_PLANNER, + onPressed: () => context.goNamed(MenuItemNames.PERIOD_PLANNER), + color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), + ), +]; -class SelfScreening extends StatelessWidget { +class SelfScreening extends StatefulWidget { const SelfScreening({super.key}); + @override + _SelfScreeningState createState() => _SelfScreeningState(); +} + +class _SelfScreeningState extends State { + @override Widget build(BuildContext context) { final theme = Theme.of(context); final _items = _menuItems(context); + return Scaffold( - // appBar: AppBar( - // backgroundColor: theme.primaryColor, - // leading: IconButton( - // icon: const Icon(Icons.chevron_left), - // onPressed: () => context.pop(), - // ), - // title: const Text("HIV Program"), - // ), - body: Column( - children: [ - CustomAppBar( - title: "Self Screening🌡️📈", - // icon: Icons.add_chart_rounded, - color: Constants.bmiCalculatorColor, - ), - Expanded( - child: MenuItemsBuilder( - crossAxisCount: 3, - itemBuilder: (item) => MenuOption( - title: item.title ?? "", - icon: item.shortcutIcon, - bgColor: Constants.bmiCalculatorShortcutBgColor, - onPress: item.onPressed, + body: Column( + children: [ + CustomAppBar( + title: "Self Screening🌡️📈", + color: Constants.bmiCalculatorColor, + ), + Expanded( + child: MenuItemsBuilder( + crossAxisCount: 3, + itemBuilder: (item) => MenuOption( + title: item.title ?? "", + icon: item.shortcutIcon, + bgColor: item.color ?? Constants.bmiCalculatorShortcutBgColor, + onPress: item.onPressed, + ), + items: _items, ), - items: _items, ), - ) - ], - )); + ], + ), + floatingActionButton: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + FloatingActionButton( + tooltip: "Insight", + hoverColor: Constants.bmiCalculatorShortcutBgColor, + onPressed: () { }, + backgroundColor: Constants.bmiCalculatorShortcutBgColor, + child: const Icon(Icons.insights), + ), + SizedBox(height: 10,), + FloatingActionButton( + tooltip: "Settings", + hoverColor: Constants.bmiCalculatorShortcutBgColor, + onPressed: () { }, + backgroundColor: Constants.bmiCalculatorShortcutBgColor, + child: const Icon(Icons.settings_applications_sharp), + ), + ], + ) + ); } } From 53a1708a0d5338c1415e6fc6ec4fd712025a2874 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 4 Sep 2024 11:51:50 +0300 Subject: [PATCH 053/140] Fix overflow --- .../presentation/widgets/Greetings.dart | 163 +++++++++--------- 1 file changed, 83 insertions(+), 80 deletions(-) diff --git a/lib/src/features/common/presentation/widgets/Greetings.dart b/lib/src/features/common/presentation/widgets/Greetings.dart index 64c66dff..4d1c5845 100644 --- a/lib/src/features/common/presentation/widgets/Greetings.dart +++ b/lib/src/features/common/presentation/widgets/Greetings.dart @@ -36,116 +36,119 @@ class Greetings extends ConsumerWidget { ); return Container( - width: double.maxFinite, + width: double.infinity, // Use double.infinity instead of double.maxFinite padding: const EdgeInsets.all(Constants.SPACING), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: Constants.SPACING), + padding: const EdgeInsets.symmetric(horizontal: Constants.SMALL_SPACING), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Hey, 👋", - style: theme.textTheme.headlineMedium?.copyWith( - color: theme.colorScheme.primary, - fontWeight: FontWeight.w700, - ), - ), - name == 'Null Null' || name == null - ? GestureDetector( - onTap: () { - context.goNamed(RouteNames.PROFILE_EDIT_FORM); - }, - child: Text( - 'Click here to update your profile', - style: theme.textTheme.titleMedium?.copyWith( - color: Colors.red, + Expanded( + flex: 2, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Hey, 👋", + style: theme.textTheme.headlineSmall?.copyWith( + color: theme.colorScheme.primary, + fontWeight: FontWeight.w600, ), - maxLines: 1, - overflow: TextOverflow.ellipsis, ), - ) - : Text( - name, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: theme.textTheme.headlineLarge?.copyWith( - color: theme.colorScheme.primary, - fontWeight: FontWeight.w700, + if (name == 'Null Null' || name == null) + GestureDetector( + onTap: () { + context.goNamed(RouteNames.PROFILE_EDIT_FORM); + }, + child: Text( + 'Click here to update your profile', + style: theme.textTheme.titleMedium?.copyWith( + color: Colors.red, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ) + else + Text( + name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodyLarge?.copyWith( + color: theme.colorScheme.primary, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: Constants.SPACING), + Text( + DateFormat("EEEE, MMMM dd").format(DateTime.now()), + style: theme.textTheme.titleMedium, ), - ), - const SizedBox(height: Constants.SPACING), - Text( - DateFormat("EEEE, MMMM dd").format(DateTime.now()), - style: theme.textTheme.titleMedium, - ), - ], + ], + ), ), if (showUpdateProgram) - Column( + Expanded( + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ - Text( - "Update program", - style: theme.textTheme.headlineMedium?.copyWith( - color: theme.colorScheme.primary, - fontWeight: FontWeight.w500, + Expanded( + child: Text( + "Update program", + style: theme.textTheme.bodyLarge?.copyWith( + color: theme.colorScheme.primary, + fontWeight: FontWeight.w400, + ), ), ), - const SizedBox(width: 8.0), IconButton( icon: const Icon( Icons.info_outline, - size: 40, + size: 20, color: Constants.bpBgColor, ), onPressed: () { - // // Handle the tap event here - // showDialog( - // context: context, - // builder: (BuildContext context) => - Dialogs.bottomMaterialDialog( - msg: 'Tap to Choose and Enrol in a Program', - context: context, - color: Constants.dawaDropShortcutBgColor, - title: 'Take Control of Your Health – Join A Program and Start Your Journey Today!', - actions: [ - IconsOutlineButton( - onPressed: () { - context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); - Navigator.of(context).pop(); - }, - text: 'Opt-In', - iconData: Icons.add, - textStyle: TextStyle(color: Colors.white), - color: Constants.programsColor, - iconColor: Colors.white, - ), - IconsButton( - onPressed: () { - Navigator.of(context).pop(); - }, - text: 'Not now', - iconData: Icons.cancel_outlined, - color: Constants.bpShortCutBgColor, - textStyle: TextStyle(color: Colors.white), - iconColor: Colors.white, - ), - ] + Dialogs.bottomMaterialDialog( + msg: 'Tap to Choose and Enrol in a Program', + context: context, + color: Constants.dawaDropShortcutBgColor, + title: 'Take Control of Your Health – Join A Program and Start Your Journey Today!', + actions: [ + IconsOutlineButton( + onPressed: () { + context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); + Navigator.of(context).pop(); + }, + text: 'Opt-In', + iconData: Icons.add, + textStyle: TextStyle(color: Colors.white), + color: Constants.programsColor, + iconColor: Colors.white, + ), + IconsButton( + onPressed: () { + Navigator.of(context).pop(); + }, + text: 'Not now', + iconData: Icons.cancel_outlined, + color: Constants.bpShortCutBgColor, + textStyle: TextStyle(color: Colors.white), + iconColor: Colors.white, + ), + ], ); }, ), ], ), - ] - ) + ], + ), + ), ], ), ), From 64ca705c659709528a16765aab0aafe7294121b0 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 21 Aug 2024 23:32:00 +0300 Subject: [PATCH 054/140] Worked on making Algorithm more flexible. Currently working on overlapping days between ovulation days. --- .../period_planner/data/models/cycle.dart | 20 +- .../presentation/pages/logPeriods.dart | 8 +- .../pages/periodPlannerScreen.dart | 17 +- .../presentation/widgets/customCalendar.dart | 190 ++++++++++++++---- .../period_planner/utils/event_utils.dart | 12 +- 5 files changed, 185 insertions(+), 62 deletions(-) diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart index ca7d416b..ff4a273c 100644 --- a/lib/src/features/period_planner/data/models/cycle.dart +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -18,14 +18,16 @@ class Cycle{ - String cycleId; - DateTime periodStart; - DateTime periodEnd; - DateTime fertileStart; - DateTime fertileEnd; - DateTime ovulation; - DateTime predictedPeriodStart; - DateTime predictedPeriodEnd; + String cycleId; + DateTime periodStart; + DateTime periodEnd; + DateTime fertileStart; + DateTime fertileEnd; + DateTime ovulation; + DateTime predictedPeriodStart; + DateTime predictedPeriodEnd; + int cycleLength; + int periodLength; Cycle({ required this.cycleId, @@ -36,6 +38,8 @@ class Cycle{ required this.ovulation, required this.predictedPeriodStart, required this.predictedPeriodEnd, + required this.cycleLength, + required this.periodLength, }); } diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 70510baf..f4d487c6 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -22,6 +22,8 @@ void printCycles(List cycles) { debugPrint('Ovulation: ${cycle.ovulation}'); debugPrint('Predicted Period Start: ${cycle.predictedPeriodStart}'); debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); + debugPrint('Cycle Length: ${cycle.cycleLength}'); + debugPrint('Period Length: ${cycle.periodLength}'); debugPrint('---'); // Separator between cycles for clarity } } @@ -50,9 +52,9 @@ class _LogPeriodScreenState extends State { final Map> flattenedEvents = {}; nestedEvents.forEach((cycleId, dateMap) { - print("Processing cycle: $cycleId"); // Debug: Print current cycleId + //print("Processing cycle: $cycleId"); // Debug: Print current cycleId dateMap.forEach((date, events) { - print("Date: $date, Events: $events"); // Debug: Print date and events being processed + //print("Date: $date, Events: $events"); // Debug: Print date and events being processed if (flattenedEvents.containsKey(date)) { flattenedEvents[date]!.addAll(events); } else { @@ -61,7 +63,7 @@ class _LogPeriodScreenState extends State { }); }); - print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events + //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events return flattenedEvents; } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index a144da92..fac59d9f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -322,16 +322,17 @@ class _PeriodPlannerScreenState extends State { } _updateEvents(); + printCycles(cycles); // Debug print to check the state update - debugPrint("After User has logged end of Period"); - debugPrint('Period Start after update: $_periodStart'); - debugPrint('Period End after update: $_periodEnd'); - debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - debugPrint('Current Date after update: $_currentDate'); - debugPrint('Is In Period after update: $isInPeriod'); - debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); - debugPrint("--------"); + // debugPrint("After User has logged end of Period"); + // debugPrint('Period Start after update: $_periodStart'); + // debugPrint('Period End after update: $_periodEnd'); + // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); + // debugPrint('Current Date after update: $_currentDate'); + // debugPrint('Is In Period after update: $isInPeriod'); + // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); + // debugPrint("--------"); }); //printCycles(cycles); Navigator.of(context).pop(); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 80a690f3..f2ecc243 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -6,13 +6,62 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/modalC import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; -//Algorithm -Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLength = 28, int averagePeriodLength = 6}) { +//Function to calculate Average Cycle days +int calculateAverageCycleLength(List cycles) { + if (cycles.length < 2) return 28; // Default to 28 if there aren't enough cycles + + int totalLength = 0; + for (int i = 1; i < cycles.length; i++) { + int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; + debugPrint("Cycle Length $i: $cycleLength"); + totalLength += cycleLength; + } + int averageCycle = (totalLength / (cycles.length - 1)).round(); + debugPrint("Total Length: $totalLength"); + debugPrint("Cycles.Length: ${cycles.length - 1}"); + debugPrint("Average Cycle Length: $averageCycle"); + return averageCycle; +} + +//Function for calculating Average Period days +int calculateAveragePeriodLength(List cycles) { + if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles + + int totalPeriodLength = 0; + for (Cycle cycle in cycles) { + debugPrint("Period Length : ${cycle.periodLength}"); + totalPeriodLength += cycle.periodLength; + } + int averagePeriodLength = (totalPeriodLength / cycles.length).round(); + debugPrint("Total Period Length: $totalPeriodLength"); + debugPrint("Number of Cycles: ${cycles.length}"); + debugPrint("Average Period Length: $averagePeriodLength"); + return averagePeriodLength; +} + + + + +// DateTime normalizeToMidnight(DateTime dateTime) { +// return DateTime(dateTime.year, dateTime.month, dateTime.day); +// } + + + + +//Algorithm for calculating Next Period Days, Ovulation and Fertile Days +Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { var uuid = const Uuid(); String cycleId = uuid.v4(); //Generating a unique id + // Calculate average cycle length from previous cycles + int averageCycleLength = calculateAverageCycleLength(cycles); + + // Calculate average period length from the period Start to the Period End + int averagePeriodLength = calculateAveragePeriodLength(cycles); + DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength)); - DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength)); + DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) DateTime ovulation = predictedPeriodStart.subtract(const Duration(days: 14)); @@ -21,6 +70,14 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe DateTime fertileStart = ovulation.subtract(const Duration(days: 5)); DateTime fertileEnd = ovulation.subtract(const Duration(days: 1)); + //Calculating cycle Length between the previous cycle start and the latest cycle start + int cycleLength = (cycles.isNotEmpty) + ? periodStart.difference(cycles.last.periodStart).inDays + : averageCycleLength; // Calculate cycle length only if there are previous cycles + + //Calculating period Length of each cycle + int periodLength = periodEnd.difference(periodStart).inDays + 1; + return Cycle( cycleId: cycleId, periodStart: periodStart, @@ -30,6 +87,8 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe ovulation: ovulation, predictedPeriodStart: predictedPeriodStart, predictedPeriodEnd: predictedPeriodEnd, + cycleLength: cycleLength, + periodLength: periodLength, ); } @@ -38,7 +97,7 @@ class CustomCalendar extends StatefulWidget { final Map>> events; final bool headerButton; - CustomCalendar({ + const CustomCalendar({ Key? key, this.initialFormat = CalendarFormat.month, required this.events, @@ -77,43 +136,100 @@ class _CustomCalendarState extends State{ return flattenedEvents; } - Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; - - //Finding the latest cycleId - final latestCycleId = widget.events.keys.last; - - if (widget.events.containsKey(latestCycleId)) { - final latestCycleEvents = widget.events[latestCycleId]!; - - //Add events from the latest cycle - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { - filteredEvents[date] = List.from(events); - } - }); - - //Removing predicted period days from previous cycles - widget.events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - dateMap.forEach((date, events) { - final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - if (newEventList.isNotEmpty) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } + // Map> _filterEventsForLatestCycle() { + // final Map> filteredEvents = {}; + + // //Finding the latest cycleId + // final latestCycleId = widget.events.keys.last; + + // if (widget.events.containsKey(latestCycleId)) { + // final latestCycleEvents = widget.events[latestCycleId]!; + + // //Add events from the latest cycle + // latestCycleEvents.forEach((date, events) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(events); + // } else { + // filteredEvents[date] = List.from(events); + // } + // }); + + // //Removing predicted period days from previous cycles + // widget.events.forEach((cycleId, dateMap) { + // if (cycleId != latestCycleId) { + // dateMap.forEach((date, events) { + // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); + // if (newEventList.isNotEmpty) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(newEventList); + // } else { + // filteredEvents[date] = List.from(newEventList); + // } + // } + // }); + // } + // }); + // } + // return filteredEvents; + // } + +Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; + + // Find the latest cycleId + final latestCycleId = widget.events.keys.last; + + if (widget.events.containsKey(latestCycleId)) { + // Get events from the latest cycle + final latestCycleEvents = widget.events[latestCycleId]!; + + // Add all events from the latest cycle to the filtered events + latestCycleEvents.forEach((date, events) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(events); + } else { + filteredEvents[date] = List.from(events); + } + }); + + // Now process previous cycles + widget.events.forEach((cycleId, dateMap) { + if (cycleId != latestCycleId) { + dateMap.forEach((date, events) { + // Check if this date is already occupied by a 'Period Day' from the latest cycle + final isCollision = filteredEvents.containsKey(date) && + filteredEvents[date]!.any((event) => event.title == 'Period Day'); + + // We only add events that are not 'Predicted Period Day' and that do not collide with new period days + final filteredEventList = events.where((event) { + // Remove all 'Predicted Period Day' events + if (event.title == 'Predicted Period Day') { + return false; + } + // If there's a collision, don't include 'Fertile Day' or 'Ovulation Day' + if (isCollision && (event.title == 'Fertile Day' || event.title == 'Ovulation Day')) { + return false; } - }); - } + return true; // Keep all other events + }).toList(); + + // Add these filtered events to the final list if they aren't empty + if (filteredEventList.isNotEmpty) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(filteredEventList); + } else { + filteredEvents[date] = List.from(filteredEventList); + } + } }); - } - return filteredEvents; + } + }); } + return filteredEvents; +} + + @override Widget build(BuildContext context) { return TableCalendar( diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 7352ddb7..82b647cc 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -7,7 +7,7 @@ class EventUtils { static Map>> generateEvents(List cycles) { Map>> events= {}; - debugPrint("-----Generating New Events From Event Utils-----"); + //debugPrint("-----Generating New Events From Event Utils-----"); for (Cycle cycle in cycles) { String cycleId = cycle.cycleId; @@ -62,15 +62,15 @@ class EventUtils { } events.forEach((id, events) { - print("Cycle Id: $id"); - print("["); + //print("Cycle Id: $id"); + //print("["); events.forEach((date, event) { - print("Date: $date, Event: $event\n"); + //print("Date: $date, Event: $event\n"); }); - print("]"); + //print("]"); }); - print("--------------"); + //print("--------------"); return events; } } From 51bc26b05a46293f979a50e5b8e2774d02d1c7c5 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 22 Aug 2024 21:44:19 +0300 Subject: [PATCH 055/140] Adjust Algorithm by adding a cap on the average cycle and period length --- .../pages/periodPlannerScreen.dart | 23 +-- .../presentation/widgets/customCalendar.dart | 181 +++++++++++++++--- .../period_planner/utils/event_utils.dart | 20 +- 3 files changed, 179 insertions(+), 45 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index fac59d9f..38aeb80a 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -256,19 +256,20 @@ class _PeriodPlannerScreenState extends State { onPressed: () { // setState(() { // // Log the period start here - // isInPeriod = true; - // isDangerZone = false; - // _currentDate = DateTime.now(); + isInPeriod = true; + isDangerZone = false; + _currentDate = DateTime.now(); + int averagePeriods = calculateAveragePeriodLength(cycles); - // final Cycle predictedCycle = predictCycle( - // _periodStart = DateTime.now(), - // _periodEnd = DateTime.now().add(const Duration(days: 6)), - // ); - // cycles.add(predictedCycle); + final Cycle predictedCycle = predictCycle( + _periodStart = DateTime.now(), + _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), + ); + cycles.add(predictedCycle); - // _ovulationDate = predictedCycle.ovulation; - // _nextPeriodStart = predictedCycle.predictedPeriodStart; - // _updateEvents(); + _ovulationDate = predictedCycle.ovulation; + _nextPeriodStart = predictedCycle.predictedPeriodStart; + _updateEvents(); // // Debug print to check the state update // debugPrint("After User has logged Period"); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index f2ecc243..13904525 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -7,22 +7,42 @@ import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; //Function to calculate Average Cycle days +// Function to calculate Average Cycle days int calculateAverageCycleLength(List cycles) { - if (cycles.length < 2) return 28; // Default to 28 if there aren't enough cycles + if (cycles.length < 2) { + debugPrint("Not enough cycles to calculate an average, defaulting to 28 days."); + return 28; // Default to 28 if there aren't enough cycles + } int totalLength = 0; for (int i = 1; i < cycles.length; i++) { int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; - debugPrint("Cycle Length $i: $cycleLength"); + debugPrint("Cycle Length before adjustment for cycle $i: $cycleLength"); + + // Cap to a minimum cycle length of 21 days + if (cycleLength < 21) { + debugPrint("Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); + cycleLength = 26; + } + + debugPrint("Cycle Length after check for cycle $i: $cycleLength"); totalLength += cycleLength; } + int averageCycle = (totalLength / (cycles.length - 1)).round(); - debugPrint("Total Length: $totalLength"); - debugPrint("Cycles.Length: ${cycles.length - 1}"); - debugPrint("Average Cycle Length: $averageCycle"); + debugPrint("Calculated Average Cycle Length before final check: $averageCycle"); + + if (averageCycle < 21) { + debugPrint("Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); + return 26; + } + + debugPrint("Final Average Cycle Length: $averageCycle"); return averageCycle; } + + //Function for calculating Average Period days int calculateAveragePeriodLength(List cycles) { if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles @@ -33,6 +53,9 @@ int calculateAveragePeriodLength(List cycles) { totalPeriodLength += cycle.periodLength; } int averagePeriodLength = (totalPeriodLength / cycles.length).round(); + if (averagePeriodLength < 3) { + return 4; + } debugPrint("Total Period Length: $totalPeriodLength"); debugPrint("Number of Cycles: ${cycles.length}"); debugPrint("Average Period Length: $averagePeriodLength"); @@ -92,6 +115,37 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { ); } + //Removing predicted period days from previous cycles + // widget.events.forEach((cycleId, dateMap) { + // if (cycleId != latestCycleId) { + // dateMap.forEach((date, events) { + // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); + // if (newEventList.isNotEmpty) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(newEventList); + // } else { + // filteredEvents[date] = List.from(newEventList); + // } + // } + // }); + + // /* + // Checks if the period date from the latest cycle collides with the + // Ovulation days or Fertile Days of Previous Cycles or if they are before + // */ + // dateMap.forEach((date, events) { + // final hasCollision = events.any((event) { + // return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + // latestCycleEvents.keys.any((latestDate) { + // // Check if the latest period days collide with fertile/ovulation days + // return isSameDay(latestDate, (date)) || + // latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + // }); + // }); + // debugPrint("Has Collision: $hasCollision"); + // }); + // } + // }); class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; @@ -173,17 +227,79 @@ class _CustomCalendarState extends State{ // return filteredEvents; // } +//Second Improvement +// Map> _filterEventsForLatestCycle() { +// final Map> filteredEvents = {}; + +// // Finding the latest cycleId +// final latestCycleId = widget.events.keys.last; + +// if (widget.events.containsKey(latestCycleId)) { +// final latestCycleEvents = widget.events[latestCycleId]!; + +// // Add events from the latest cycle +// latestCycleEvents.forEach((date, events) { +// if (filteredEvents.containsKey(date)) { +// filteredEvents[date]!.addAll(events); +// } else { +// filteredEvents[date] = List.from(events); +// } +// }); + +// // Removing predicted period days and handling collisions with fertile/ovulation days from previous cycles +// widget.events.forEach((cycleId, dateMap) { +// if (cycleId != latestCycleId) { +// bool shouldOmitFertileOvulationDays = false; + +// // Check if any of the latest period days collide with fertile/ovulation days from previous cycles +// dateMap.forEach((date, events) { +// final hasCollision = events.any((event) { +// return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && +// latestCycleEvents.keys.any((latestDate) { +// // Check if the latest period days collide with fertile/ovulation days +// return latestDate.isAtSameMomentAs(date) || +// latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); +// }); +// }); + +// // isSameDay(latestDate, (date)) + +// if (hasCollision) { +// shouldOmitFertileOvulationDays = true; +// } +// }); + +// // Add non-colliding events from previous cycles +// dateMap.forEach((date, events) { +// if (!shouldOmitFertileOvulationDays || events.any((event) => event.title != 'Fertile Day' && event.title != 'Ovulation Day')) { +// final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); +// if (newEventList.isNotEmpty) { +// if (filteredEvents.containsKey(date)) { +// filteredEvents[date]!.addAll(newEventList); +// } else { +// filteredEvents[date] = List.from(newEventList); +// } +// } +// } +// }); +// } +// }); +// } + +// return filteredEvents; +// } + Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; - // Find the latest cycleId + // Step 1: Identify the latest cycle final latestCycleId = widget.events.keys.last; if (widget.events.containsKey(latestCycleId)) { - // Get events from the latest cycle final latestCycleEvents = widget.events[latestCycleId]!; + print("Latest Events: $latestCycleEvents"); - // Add all events from the latest cycle to the filtered events + // Step 2: Add all events from the latest cycle to filteredEvents latestCycleEvents.forEach((date, events) { if (filteredEvents.containsKey(date)) { filteredEvents[date]!.addAll(events); @@ -192,33 +308,49 @@ Map> _filterEventsForLatestCycle() { } }); - // Now process previous cycles + // Step 3: Filter previous cycles + + widget.events.forEach((cycleId, dateMap) { if (cycleId != latestCycleId) { + bool shouldOmitFertileOvulationDays = false; + + // Check if any of the latest period days collide with fertile/ovulation days from previous cycles dateMap.forEach((date, events) { - // Check if this date is already occupied by a 'Period Day' from the latest cycle - final isCollision = filteredEvents.containsKey(date) && - filteredEvents[date]!.any((event) => event.title == 'Period Day'); + final hasCollision = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + latestCycleEvents.keys.any((latestDate) { + // Check if the latest period days collide with fertile/ovulation days + return latestDate.isAtSameMomentAs(date) || + latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + print("Collided Events: $hasCollision"); + + if (hasCollision) { + shouldOmitFertileOvulationDays = true; + } + }); - // We only add events that are not 'Predicted Period Day' and that do not collide with new period days - final filteredEventList = events.where((event) { - // Remove all 'Predicted Period Day' events + // Filter out the events based on collision detection and omit predicted period days regardless + dateMap.forEach((date, events) { + final newEventList = events.where((event) { + // Always omit predicted period days if (event.title == 'Predicted Period Day') { return false; } - // If there's a collision, don't include 'Fertile Day' or 'Ovulation Day' - if (isCollision && (event.title == 'Fertile Day' || event.title == 'Ovulation Day')) { - return false; - } - return true; // Keep all other events + // Remove fertile and ovulation days if there was a collision + return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); }).toList(); - // Add these filtered events to the final list if they aren't empty - if (filteredEventList.isNotEmpty) { + + + if (newEventList.isNotEmpty) { + print("new Event List: $newEventList"); if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(filteredEventList); + filteredEvents[date]!.addAll(newEventList); } else { - filteredEvents[date] = List.from(filteredEventList); + filteredEvents[date] = List.from(newEventList); } } }); @@ -229,7 +361,6 @@ Map> _filterEventsForLatestCycle() { return filteredEvents; } - @override Widget build(BuildContext context) { return TableCalendar( diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 82b647cc..5279e601 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -61,17 +61,19 @@ class EventUtils { } } - events.forEach((id, events) { - //print("Cycle Id: $id"); - //print("["); - events.forEach((date, event) { - //print("Date: $date, Event: $event\n"); - }); - //print("]"); - }); + // events.forEach((id, events) { + // print("Cycle Id: $id"); + // print("["); + // events.forEach((date, event) { + // print("Date: $date, Event: $event\n"); + // }); + // print("]"); + // }); - //print("--------------"); + // print("--------------"); return events; } } + + From 02b1fbe34a7420ca1400ce8d381bf75439de9615 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 11:43:49 +0300 Subject: [PATCH 056/140] Handled cases where user period days collides with fertile and ovulation days of previous cycles by removing them from the calendar so as to reduce the mess. --- .../presentation/pages/logPeriods.dart | 7 +- .../pages/periodPlannerScreen.dart | 24 ++-- .../presentation/widgets/customCalendar.dart | 128 ++++-------------- 3 files changed, 40 insertions(+), 119 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index f4d487c6..4af95f6b 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -41,6 +41,7 @@ class _LogPeriodScreenState extends State { Map>> events = EventUtils.generateEvents(cycles); late Map> _flatEvents; + @override void initState() { super.initState(); @@ -65,7 +66,8 @@ class _LogPeriodScreenState extends State { //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events return flattenedEvents; -} + } + // Method to validate date range bool _isDateRangeValid(DateTime start, DateTime end) { @@ -106,8 +108,9 @@ class _LogPeriodScreenState extends State { end ??= start; final DateTime now = DateTime.now(); + int averagePeriods = calculateAveragePeriodLength(cycles); if (isSameDay(start, now) || isSameDay(end, now)) { - end = start.add(const Duration(days: 6)); + end = start.add( Duration(days: averagePeriods)); } for (Cycle cycle in cycles) { diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 38aeb80a..4c0bf4d9 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -256,20 +256,20 @@ class _PeriodPlannerScreenState extends State { onPressed: () { // setState(() { // // Log the period start here - isInPeriod = true; - isDangerZone = false; - _currentDate = DateTime.now(); - int averagePeriods = calculateAveragePeriodLength(cycles); + // isInPeriod = true; + // isDangerZone = false; + // _currentDate = DateTime.now(); + // int averagePeriods = calculateAveragePeriodLength(cycles); - final Cycle predictedCycle = predictCycle( - _periodStart = DateTime.now(), - _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), - ); - cycles.add(predictedCycle); + // final Cycle predictedCycle = predictCycle( + // _periodStart = DateTime.now(), + // _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), + // ); + // cycles.add(predictedCycle); - _ovulationDate = predictedCycle.ovulation; - _nextPeriodStart = predictedCycle.predictedPeriodStart; - _updateEvents(); + // _ovulationDate = predictedCycle.ovulation; + // _nextPeriodStart = predictedCycle.predictedPeriodStart; + // _updateEvents(); // // Debug print to check the state update // debugPrint("After User has logged Period"); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 13904525..6218f2f9 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -190,105 +190,6 @@ class _CustomCalendarState extends State{ return flattenedEvents; } - // Map> _filterEventsForLatestCycle() { - // final Map> filteredEvents = {}; - - // //Finding the latest cycleId - // final latestCycleId = widget.events.keys.last; - - // if (widget.events.containsKey(latestCycleId)) { - // final latestCycleEvents = widget.events[latestCycleId]!; - - // //Add events from the latest cycle - // latestCycleEvents.forEach((date, events) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(events); - // } else { - // filteredEvents[date] = List.from(events); - // } - // }); - - // //Removing predicted period days from previous cycles - // widget.events.forEach((cycleId, dateMap) { - // if (cycleId != latestCycleId) { - // dateMap.forEach((date, events) { - // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - // if (newEventList.isNotEmpty) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(newEventList); - // } else { - // filteredEvents[date] = List.from(newEventList); - // } - // } - // }); - // } - // }); - // } - // return filteredEvents; - // } - -//Second Improvement -// Map> _filterEventsForLatestCycle() { -// final Map> filteredEvents = {}; - -// // Finding the latest cycleId -// final latestCycleId = widget.events.keys.last; - -// if (widget.events.containsKey(latestCycleId)) { -// final latestCycleEvents = widget.events[latestCycleId]!; - -// // Add events from the latest cycle -// latestCycleEvents.forEach((date, events) { -// if (filteredEvents.containsKey(date)) { -// filteredEvents[date]!.addAll(events); -// } else { -// filteredEvents[date] = List.from(events); -// } -// }); - -// // Removing predicted period days and handling collisions with fertile/ovulation days from previous cycles -// widget.events.forEach((cycleId, dateMap) { -// if (cycleId != latestCycleId) { -// bool shouldOmitFertileOvulationDays = false; - -// // Check if any of the latest period days collide with fertile/ovulation days from previous cycles -// dateMap.forEach((date, events) { -// final hasCollision = events.any((event) { -// return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && -// latestCycleEvents.keys.any((latestDate) { -// // Check if the latest period days collide with fertile/ovulation days -// return latestDate.isAtSameMomentAs(date) || -// latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); -// }); -// }); - -// // isSameDay(latestDate, (date)) - -// if (hasCollision) { -// shouldOmitFertileOvulationDays = true; -// } -// }); - -// // Add non-colliding events from previous cycles -// dateMap.forEach((date, events) { -// if (!shouldOmitFertileOvulationDays || events.any((event) => event.title != 'Fertile Day' && event.title != 'Ovulation Day')) { -// final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); -// if (newEventList.isNotEmpty) { -// if (filteredEvents.containsKey(date)) { -// filteredEvents[date]!.addAll(newEventList); -// } else { -// filteredEvents[date] = List.from(newEventList); -// } -// } -// } -// }); -// } -// }); -// } - -// return filteredEvents; -// } - Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; @@ -309,8 +210,6 @@ Map> _filterEventsForLatestCycle() { }); // Step 3: Filter previous cycles - - widget.events.forEach((cycleId, dateMap) { if (cycleId != latestCycleId) { bool shouldOmitFertileOvulationDays = false; @@ -318,10 +217,10 @@ Map> _filterEventsForLatestCycle() { // Check if any of the latest period days collide with fertile/ovulation days from previous cycles dateMap.forEach((date, events) { final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && latestCycleEvents.keys.any((latestDate) { // Check if the latest period days collide with fertile/ovulation days - return latestDate.isAtSameMomentAs(date) || + return isSameDay(latestDate, date) || latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); }); }); @@ -332,6 +231,26 @@ Map> _filterEventsForLatestCycle() { } }); + // Additional step: Check if previous cycles' dates also collide with those of later cycles + widget.events.forEach((laterCycleId, laterDateMap) { + //condition ensures that we only consider cycles that are neither the current one nor the latest one + if (laterCycleId != cycleId && laterCycleId != latestCycleId) { + dateMap.forEach((date, events) { + final hasCollisionWithlaterCycle = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + laterDateMap.keys.any((laterDate) { + return isSameDay(laterDate, date) || + laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + + if (hasCollisionWithlaterCycle) { + shouldOmitFertileOvulationDays = true; + } + }); + } + }); + // Filter out the events based on collision detection and omit predicted period days regardless dateMap.forEach((date, events) { final newEventList = events.where((event) { @@ -343,8 +262,6 @@ Map> _filterEventsForLatestCycle() { return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); }).toList(); - - if (newEventList.isNotEmpty) { print("new Event List: $newEventList"); if (filteredEvents.containsKey(date)) { @@ -361,6 +278,7 @@ Map> _filterEventsForLatestCycle() { return filteredEvents; } + @override Widget build(BuildContext context) { return TableCalendar( From 5c4250b55dd03291a79595fa4f35d60e6535559e Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 12:19:57 +0300 Subject: [PATCH 057/140] Testing --- .../presentation/widgets/customCalendar.dart | 35 ++----------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 6218f2f9..99bfb422 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -113,39 +113,7 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { cycleLength: cycleLength, periodLength: periodLength, ); -} - - //Removing predicted period days from previous cycles - // widget.events.forEach((cycleId, dateMap) { - // if (cycleId != latestCycleId) { - // dateMap.forEach((date, events) { - // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - // if (newEventList.isNotEmpty) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(newEventList); - // } else { - // filteredEvents[date] = List.from(newEventList); - // } - // } - // }); - - // /* - // Checks if the period date from the latest cycle collides with the - // Ovulation days or Fertile Days of Previous Cycles or if they are before - // */ - // dateMap.forEach((date, events) { - // final hasCollision = events.any((event) { - // return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - // latestCycleEvents.keys.any((latestDate) { - // // Check if the latest period days collide with fertile/ovulation days - // return isSameDay(latestDate, (date)) || - // latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - // }); - // }); - // debugPrint("Has Collision: $hasCollision"); - // }); - // } - // }); +} class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; @@ -190,6 +158,7 @@ class _CustomCalendarState extends State{ return flattenedEvents; } +//This is for filtering events on the calendar Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; From 47809b98be73d920b6b6acd4baeaee742d948c8e Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 16:06:16 +0300 Subject: [PATCH 058/140] Adjusting a few Terminologies used in the Application --- .../presentation/pages/logPeriods.dart | 107 ++++++++++++++++- .../presentation/pages/periodPlanner.dart | 10 +- .../pages/periodPlannerScreen.dart | 112 +++++------------- .../period_planner/utils/event_utils.dart | 8 +- 4 files changed, 144 insertions(+), 93 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 4af95f6b..a8b5d59d 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -40,12 +40,23 @@ class _LogPeriodScreenState extends State { DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); late Map> _flatEvents; + late Map> _filteredEvents; @override - void initState() { + void initState() { super.initState(); + // _flatEvents = _flattenEvents(events); + // _filteredEvents = _filterEventsForLatestCycle(); + + if (events.isNotEmpty) { _flatEvents = _flattenEvents(events); + _filteredEvents = _filterEventsForLatestCycle(); + } else { + _flatEvents = {}; + _filteredEvents = {}; + } + } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -68,6 +79,94 @@ class _LogPeriodScreenState extends State { return flattenedEvents; } + Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; + + // Step 1: Identify the latest cycle + final latestCycleId = events.keys.last; + + if (events.containsKey(latestCycleId)) { + final latestCycleEvents = events[latestCycleId]!; + print("Latest Events: $latestCycleEvents"); + + // Step 2: Add all events from the latest cycle to filteredEvents + latestCycleEvents.forEach((date, events) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(events); + } else { + filteredEvents[date] = List.from(events); + } + }); + + // Step 3: Filter previous cycles + events.forEach((cycleId, dateMap) { + if (cycleId != latestCycleId) { + bool shouldOmitFertileOvulationDays = false; + + // Check if any of the latest period days collide with fertile/ovulation days from previous cycles + dateMap.forEach((date, events) { + final hasCollision = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + latestCycleEvents.keys.any((latestDate) { + // Check if the latest period days collide with fertile/ovulation days + return isSameDay(latestDate, date) || + latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + print("Collided Events: $hasCollision"); + + if (hasCollision) { + shouldOmitFertileOvulationDays = true; + } + }); + + // Additional step: Check if previous cycles' dates also collide with those of later cycles + events.forEach((laterCycleId, laterDateMap) { + //condition ensures that we only consider cycles that are neither the current one nor the latest one + if (laterCycleId != cycleId && laterCycleId != latestCycleId) { + dateMap.forEach((date, events) { + final hasCollisionWithlaterCycle = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + laterDateMap.keys.any((laterDate) { + return isSameDay(laterDate, date) || + laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + + if (hasCollisionWithlaterCycle) { + shouldOmitFertileOvulationDays = true; + } + }); + } + }); + + // Filter out the events based on collision detection and omit predicted period days regardless + dateMap.forEach((date, events) { + final newEventList = events.where((event) { + // Always omit predicted period days + if (event.title == 'Predicted Period Day') { + return false; + } + // Remove fertile and ovulation days if there was a collision + return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); + }).toList(); + + if (newEventList.isNotEmpty) { + print("new Event List: $newEventList"); + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(newEventList); + } else { + filteredEvents[date] = List.from(newEventList); + } + } + }); + } + }); + } + + return filteredEvents; +} + // Method to validate date range bool _isDateRangeValid(DateTime start, DateTime end) { @@ -113,9 +212,9 @@ class _LogPeriodScreenState extends State { end = start.add( Duration(days: averagePeriods)); } + //Handling cases where a user might log an already logged date in their previous cycle, hence warning them using a snackbar for (Cycle cycle in cycles) { if (_datesOverlap(cycle.periodStart, cycle.periodEnd, start, end)) { - // Show an alert or a Snackbar ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('The selected period overlaps with an existing cycle. Please choose different dates.'), @@ -176,7 +275,7 @@ class _LogPeriodScreenState extends State { _focusedDay = focusedDay; }, eventLoader: (day) { - return _flatEvents[day] ?? []; + return _filteredEvents[day] ?? []; }, calendarBuilders: CalendarBuilders( markerBuilder: (context, date, events) { @@ -221,7 +320,7 @@ class _LogPeriodScreenState extends State { ), onPressed: () { if (_startDate != null) { - final endDate = _endDate ?? _startDate!; + final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date _updateOrAddCycle(_startDate!, endDate); printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index c93ad167..73b4e4e6 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -109,11 +109,11 @@ class PeriodPlanner extends StatelessWidget { description: 'View and manage your menstrual cycles with a detailed calendar.', icon: Icons.calendar_today, ), - FeatureTile( - title: 'Partner Tracking', - description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', - icon: Icons.people, - ), + // FeatureTile( + // title: 'Partner Tracking', + // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', + // icon: Icons.people, + // ), ], ), ), diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 4c0bf4d9..de780255 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -113,12 +113,12 @@ class _PeriodPlannerScreenState extends State { progressValue = 0.2; title = 'Period'; message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; - buttonText = 'Log End Period'; + buttonText = 'Period End'; chances = 'Low Chances of Getting Pregnant'; } else if (isCloseToOvulation) { progressValue = 0.3; title = 'Ovulation in'; - message = '$daysToOvulation days'; + message = '$daysToOvulation day${daysToOvulation > 1 ? 's': ''}'; buttonText = ''; chances = 'High Chances of Getting Pregnant'; } else if (veryCloseToOvulation) { @@ -136,26 +136,26 @@ class _PeriodPlannerScreenState extends State { } else if (afterOvulation) { progressValue = 0.7; title = 'Next Period in'; - message = '$daysToNextPeriod days'; - buttonText = 'Log Period'; + message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's': ''}'; + buttonText = 'Period Start'; chances = 'High Chances of Getting Pregnant'; } else if (veryCloseToPeriod) { progressValue = 0.7; title = 'Next Period is'; message = 'Tomorrow'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'Low Chances of Getting Pregnant'; } else if (duringPredictedPeriodRange) { progressValue = 1.0; title = 'Periods May happen'; message = 'Today'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'Low Chances of Getting Pregnant'; } else if(isDangerZone) { progressValue = 1.0; title = 'Periods Overdue by'; message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'High Chances of Getting Pregnant'; } @@ -176,7 +176,7 @@ class _PeriodPlannerScreenState extends State { body: Column( children: [ const CustomAppBar( - title: "Track Periods 🌸", + title: "My Flow Tracker 🌺", color: Constants.periodPlanner, ), //const SizedBox(height: Constants.SPACING), @@ -237,58 +237,8 @@ class _PeriodPlannerScreenState extends State { ElevatedButton( onPressed: () { //Logging Start of new period - if (buttonText == 'Log Period') { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Confirm Log Period'), - content: const Text('Are you sure you want to log your period?'), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.of(context).pop(); // Close the dialog - }, - ), - TextButton( - child: const Text('Confirm'), - onPressed: () { - // setState(() { - // // Log the period start here - // isInPeriod = true; - // isDangerZone = false; - // _currentDate = DateTime.now(); - // int averagePeriods = calculateAveragePeriodLength(cycles); - - // final Cycle predictedCycle = predictCycle( - // _periodStart = DateTime.now(), - // _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), - // ); - // cycles.add(predictedCycle); - - // _ovulationDate = predictedCycle.ovulation; - // _nextPeriodStart = predictedCycle.predictedPeriodStart; - // _updateEvents(); - - // // Debug print to check the state update - // debugPrint("After User has logged Period"); - // debugPrint('Period Start after update: $_periodStart'); - // debugPrint('Period End after update: $_periodEnd'); - // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - // debugPrint('Current Date after update: $_currentDate'); - // debugPrint('Is In Period after update: $isInPeriod'); - // debugPrint("--------"); - // }); - printCycles(cycles); - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - }, - ), - ], - ); - }, - ); - + if (buttonText == 'Period Start') { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); } //Logging end of new period else{ @@ -414,27 +364,27 @@ class _PeriodPlannerScreenState extends State { ), ), ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - }, - child: Text( - 'Edit period dates', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), + // Align( + // alignment: Alignment.bottomCenter, + // child: Padding( + // padding: const EdgeInsets.all(16.0), + // child: ElevatedButton( + // style: ElevatedButton.styleFrom( + // backgroundColor: Constants.periodPlanner, + // ), + // onPressed: () { + // // To add functionality later + // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + // }, + // child: Text( + // 'Edit period dates', + // style: theme.textTheme.titleSmall?.copyWith( + // color: Colors.white, + // ), + // ), + // ), + // ), + // ), ], ), ); diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 5279e601..8a3962bd 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:table_calendar/table_calendar.dart'; class EventUtils { @@ -16,9 +17,10 @@ class EventUtils { } Map> updatedEvents = events[cycleId]!; + // Add period days for (DateTime date = cycle.periodStart; - date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); + date.isBefore(cycle.periodEnd) || isSameDay(date, cycle.periodEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, @@ -30,7 +32,7 @@ class EventUtils { // Add fertile window days for (DateTime date = cycle.fertileStart; - date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); + date.isBefore(cycle.fertileEnd) || isSameDay(date, cycle.fertileEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, @@ -50,7 +52,7 @@ class EventUtils { // Add predicted period start for (DateTime date = cycle.predictedPeriodStart; - date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); + date.isBefore(cycle.predictedPeriodEnd) || isSameDay(date, cycle.predictedPeriodEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, From baf77b6262ff64e0e995112976c23402a38c1c78 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 27 Aug 2024 18:12:28 +0300 Subject: [PATCH 059/140] Changed the routing for the application, made some few changes on the main screen like on the weekly calendar and adding a card --- lib/src/app/navigation/app_router.dart | 55 +--- lib/src/app/navigation/menu/menuItems.dart | 1 + .../presentation/pages/editPeriodsScreen.dart | 236 +++++++------- .../presentation/pages/logPeriods.dart | 17 +- .../presentation/pages/periodCalendar.dart | 172 +++++------ .../presentation/pages/periodPlanner.dart | 288 +++++++++--------- .../presentation/pages/periodPlannerMenu.dart | 282 ++++++++--------- .../pages/periodPlannerScreen.dart | 142 ++++++--- .../presentation/widgets/customCalendar.dart | 117 +++---- .../presentation/widgets/eventsMaker.dart | 20 +- .../presentation/widgets/logItems.dart | 154 +++++----- .../presentation/widgets/logger.dart | 22 +- .../presentation/widgets/loggerWidget.dart | 182 +++++------ .../period_planner/utils/event_utils.dart | 8 + 14 files changed, 832 insertions(+), 864 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 346d022d..d86887d8 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -394,59 +394,20 @@ final List secureRoutes = [ ]), //Routes for the Period Planner GoRoute( - name: RouteNames.PERIOD_PLANNER, - path: 'period-planner', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlanner(); + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return LogPeriodScreen(); }, - routes: periodPlannerRoutes, - ), -]; - -final List periodPlannerRoutes = [ - GoRoute( - name: RouteNames.PERIOD_PLANNER_MENU, - path: 'period-planner-menu', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerMenu(); - }, - routes: [ - GoRoute( + GoRoute( name: RouteNames.PERIOD_PLANNER_SCREEN, - path: 'period-planner-screen', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerScreen(); - }, - ), - - GoRoute( - name: RouteNames.PERIOD_PLANNER_CALENDAR, - path: 'period-planner-calendar', + path: 'period-planner-screen', builder: (BuildContext context, GoRouterState state) { - return const PeriodCalendar(); + return const PeriodPlannerScreen(); }, - routes: [ - GoRoute( - name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - path: 'period-planner-edit-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return EditPeriodsScreen(); - }, - ), - ] ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, - path: 'period-planner-log-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return LogPeriodScreen(); - }, - ), - ]), - - -]; +]; final List openRoutes = [ GoRoute( diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 368e495a..f1af7f9d 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 0731c3a4..e87293c2 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,133 +1,133 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:table_calendar/table_calendar.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:table_calendar/table_calendar.dart'; -class EditPeriodsScreen extends StatefulWidget { +// class EditPeriodsScreen extends StatefulWidget { - const EditPeriodsScreen({super.key}); +// const EditPeriodsScreen({super.key}); - @override - State createState() => _EditPeriodsScreenState(); -} +// @override +// State createState() => _EditPeriodsScreenState(); +// } -class _EditPeriodsScreenState extends State { - // DateTime? _periodStart; - // DateTime? _periodEnd; - // Cycle? _cycle; - Map _periodRanges = {}; +// class _EditPeriodsScreenState extends State { +// // DateTime? _periodStart; +// // DateTime? _periodEnd; +// // Cycle? _cycle; +// Map _periodRanges = {}; - @override - void initState() { - super.initState(); +// @override +// void initState() { +// super.initState(); - // Gather all period ranges from all cycles - for (Cycle cycle in cycles) { - _periodRanges[cycle.periodStart] = cycle.periodEnd; - } +// // Gather all period ranges from all cycles +// for (Cycle cycle in cycles) { +// _periodRanges[cycle.periodStart] = cycle.periodEnd; +// } - // Here, selecting the last cycle added to the list - // if (cycles.isNotEmpty) { - // _cycle = cycles.last; - // _periodStart = _cycle?.periodStart; - // _periodEnd = _cycle?.periodEnd; - // } +// // Here, selecting the last cycle added to the list +// // if (cycles.isNotEmpty) { +// // _cycle = cycles.last; +// // _periodStart = _cycle?.periodStart; +// // _periodEnd = _cycle?.periodEnd; +// // } - } +// } - void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { - setState(() { - if (start != null && end != null) { - // Assuming you're editing the last cycle for simplicity - Cycle lastCycle = cycles.last; - lastCycle.periodStart = start; - lastCycle.periodEnd = end; +// void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { +// setState(() { +// if (start != null && end != null) { +// // Assuming you're editing the last cycle for simplicity +// Cycle lastCycle = cycles.last; +// lastCycle.periodStart = start; +// lastCycle.periodEnd = end; - // Update the period ranges map - _periodRanges[start] = end; - } - }); - } +// // Update the period ranges map +// _periodRanges[start] = end; +// } +// }); +// } - void _applyChanges() { - // Save the updated cycle list and recalculate important dates - for (Cycle cycle in cycles) { - Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); - cycle.fertileStart = updatedCycle.fertileStart; - cycle.fertileEnd = updatedCycle.fertileEnd; - cycle.ovulation = updatedCycle.ovulation; - cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; - cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; - } +// void _applyChanges() { +// // Save the updated cycle list and recalculate important dates +// for (Cycle cycle in cycles) { +// Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); +// cycle.fertileStart = updatedCycle.fertileStart; +// cycle.fertileEnd = updatedCycle.fertileEnd; +// cycle.ovulation = updatedCycle.ovulation; +// cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; +// cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; +// } - Navigator.of(context).pop(); // Go back to the previous screen - } +// Navigator.of(context).pop(); // Go back to the previous screen +// } - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Edit Periods 📅", - color: Constants.periodPlanner.withOpacity(1.0), - ), - TableCalendar( - focusedDay: DateTime.now(), - firstDay: DateTime(2020), - lastDay: DateTime.now(), - rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, - rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, - onRangeSelected: _onRangeSelected, - calendarFormat: CalendarFormat.month, - headerStyle: const HeaderStyle( - formatButtonVisible: false, - ), - calendarStyle: const CalendarStyle( - todayDecoration: BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - rangeStartDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeEndDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeHighlightColor: Constants.periodPlanner, - ), - ), - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - _applyChanges(); - }, - child: Text( - 'Apply Changes', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ), - ], - ), - ); - } -} \ No newline at end of file +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Edit Periods 📅", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// TableCalendar( +// focusedDay: DateTime.now(), +// firstDay: DateTime(2020), +// lastDay: DateTime.now(), +// rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, +// rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, +// onRangeSelected: _onRangeSelected, +// calendarFormat: CalendarFormat.month, +// headerStyle: const HeaderStyle( +// formatButtonVisible: false, +// ), +// calendarStyle: const CalendarStyle( +// todayDecoration: BoxDecoration( +// color: Colors.blue, +// shape: BoxShape.circle, +// ), +// rangeStartDecoration: BoxDecoration( +// color: Colors.pink, +// shape: BoxShape.circle, +// ), +// rangeEndDecoration: BoxDecoration( +// color: Colors.pink, +// shape: BoxShape.circle, +// ), +// rangeHighlightColor: Constants.periodPlanner, +// ), +// ), +// Expanded( +// child: Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// _applyChanges(); +// }, +// child: Text( +// 'Apply Changes', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index a8b5d59d..0834a2b6 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -24,10 +24,13 @@ void printCycles(List cycles) { debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); debugPrint('Cycle Length: ${cycle.cycleLength}'); debugPrint('Period Length: ${cycle.periodLength}'); - debugPrint('---'); // Separator between cycles for clarity + debugPrint('---'); } } + +//This is the screen the user interacts when they are logging their Period Days + class LogPeriodScreen extends StatefulWidget { @override @@ -42,7 +45,6 @@ class _LogPeriodScreenState extends State { late Map> _flatEvents; late Map> _filteredEvents; - @override void initState() { super.initState(); @@ -60,6 +62,7 @@ class _LogPeriodScreenState extends State { } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values + //These are events generated from the events utils class Map> _flattenEvents(Map>> nestedEvents) { final Map> flattenedEvents = {}; @@ -168,10 +171,11 @@ class _LogPeriodScreenState extends State { } - // Method to validate date range + // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day - return difference <= 7; // Ensure the range does not exceed 7 days + return + difference <= 7; // Ensure the range does not exceed 7 days } void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { @@ -230,6 +234,7 @@ class _LogPeriodScreenState extends State { //_updateEventsForCycle(newCycle); } + // void _updateEventsForCycle(Cycle cycle) { // // Remove old events for this cycle from the events map // events.remove(cycle.cycleId); @@ -267,10 +272,12 @@ class _LogPeriodScreenState extends State { focusedDay: _focusedDay, firstDay: DateTime(2020), lastDay: DateTime.now(), - rangeStartDay: _startDate, + rangeStartDay: _startDate , rangeEndDay: _endDate, onRangeSelected: _onRangeSelected, + rangeSelectionMode: RangeSelectionMode.toggledOn, + onPageChanged: (focusedDay) { _focusedDay = focusedDay; }, diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 3bacf4f9..d4de7a21 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -1,91 +1,91 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -import 'package:nishauri/src/features/period_planner/data/models/events.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; +// import 'package:flutter/material.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +// import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; -class PeriodCalendar extends StatelessWidget { - const PeriodCalendar({super.key}); +// class PeriodCalendar extends StatelessWidget { +// const PeriodCalendar({super.key}); - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - Map>> events = {}; - events = EventUtils.generateEvents(cycles); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Calendar 🗓️", - color: Constants.periodPlanner.withOpacity(1.0), - ), - Expanded( - child: Column( - children: [ - CustomCalendar( - events: events - ), - const SizedBox(height: 20), - const Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Key:", - style: TextStyle( - color: Constants.periodPlanner, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - const Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CalendarKey(color: Colors.red, label: 'Today'), - CalendarKey(color: Colors.pink, label: 'Period Days'), - CalendarKey(color: Colors.green, label: 'Fertile Days'), - CalendarKey(color: Colors.blue, label: 'Ovulation Day'), - CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), - ], - ), - ], - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - }, - child: Text( - 'Edit period dates', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ], - ), - ); - } +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// Map>> events = {}; +// events = EventUtils.generateEvents(cycles); +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Calendar 🗓️", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// Expanded( +// child: Column( +// children: [ +// CustomCalendar( +// events: events +// ), +// const SizedBox(height: 20), +// const Row( +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Padding( +// padding: EdgeInsets.all(8.0), +// child: Text( +// "Key:", +// style: TextStyle( +// color: Constants.periodPlanner, +// fontSize: 20, +// fontWeight: FontWeight.bold, +// ), +// ), +// ), +// ], +// ), +// const Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// CalendarKey(color: Colors.red, label: 'Today'), +// CalendarKey(color: Colors.pink, label: 'Period Days'), +// CalendarKey(color: Colors.green, label: 'Fertile Days'), +// CalendarKey(color: Colors.blue, label: 'Ovulation Day'), +// CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), +// ], +// ), +// ], +// ), +// ), +// Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// // To add functionality later +// context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); +// }, +// child: Text( +// 'Edit period dates', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// ); +// } -} +// } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index 73b4e4e6..1176bbe8 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -1,149 +1,149 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_svg/flutter_svg.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; -class PeriodPlanner extends StatelessWidget { - const PeriodPlanner({super.key}); +// class PeriodPlanner extends StatelessWidget { +// const PeriodPlanner({super.key}); - @override - Widget build(BuildContext context) { - return Scaffold( - body: Column( - children: [ - const CustomAppBar( - title: "Period Planner App 🌸", - color: Constants.periodPlanner, - ), - Expanded( - child: SingleChildScrollView( - child: Column( - children: [ - Container( - padding: const EdgeInsets.all(20.0), - decoration: BoxDecoration( - color: Constants.periodPlanner.withOpacity(1.0), - image: const DecorationImage( - image: AssetImage("assets/images/contours.png"), - opacity: 0.1, - fit: BoxFit.cover, - ), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - DecoratedBox( - decoration: const BoxDecoration(), - child: SvgPicture.asset( - "assets/images/period_planner2.svg", - fit: BoxFit.contain, - height: 100, - width: 100, - ), - ), - const SizedBox(height: 20.0), - const Text( - 'Track Your Cycle with Ease', - style: TextStyle( - color: Colors.white, - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 10.0), - const Text( - 'Stay healthy And Well Informed', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 20.0), - ElevatedButton( - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_MENU); - }, - style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric( - vertical: 15.0, - horizontal: 40.0, - ), - ), - child: const Text( - 'Get Started', - style: TextStyle( - fontSize: 18.0, - ), - ), - ), - ], - ), - ), - const SizedBox(height: 20.0), - Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Features', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 10.0), - FeatureTile( - title: 'Track Your Period', - description: 'Keep an accurate record of your menstrual cycles to better understand your health.', - icon: Icons.track_changes, - ), - FeatureTile( - title: 'Period Calendar', - description: 'View and manage your menstrual cycles with a detailed calendar.', - icon: Icons.calendar_today, - ), - // FeatureTile( - // title: 'Partner Tracking', - // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', - // icon: Icons.people, - // ), - ], - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// body: Column( +// children: [ +// const CustomAppBar( +// title: "Period Planner App 🌸", +// color: Constants.periodPlanner, +// ), +// Expanded( +// child: SingleChildScrollView( +// child: Column( +// children: [ +// Container( +// padding: const EdgeInsets.all(20.0), +// decoration: BoxDecoration( +// color: Constants.periodPlanner.withOpacity(1.0), +// image: const DecorationImage( +// image: AssetImage("assets/images/contours.png"), +// opacity: 0.1, +// fit: BoxFit.cover, +// ), +// ), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.stretch, +// children: [ +// DecoratedBox( +// decoration: const BoxDecoration(), +// child: SvgPicture.asset( +// "assets/images/period_planner2.svg", +// fit: BoxFit.contain, +// height: 100, +// width: 100, +// ), +// ), +// const SizedBox(height: 20.0), +// const Text( +// 'Track Your Cycle with Ease', +// style: TextStyle( +// color: Colors.white, +// fontSize: 20.0, +// fontWeight: FontWeight.bold, +// ), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 10.0), +// const Text( +// 'Stay healthy And Well Informed', +// style: TextStyle( +// color: Colors.white, +// fontSize: 16.0, +// ), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 20.0), +// ElevatedButton( +// onPressed: () { +// context.goNamed(RouteNames.PERIOD_PLANNER_MENU); +// }, +// style: ElevatedButton.styleFrom( +// padding: const EdgeInsets.symmetric( +// vertical: 15.0, +// horizontal: 40.0, +// ), +// ), +// child: const Text( +// 'Get Started', +// style: TextStyle( +// fontSize: 18.0, +// ), +// ), +// ), +// ], +// ), +// ), +// const SizedBox(height: 20.0), +// Padding( +// padding: const EdgeInsets.all(20.0), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// const Text( +// 'Features', +// style: TextStyle( +// fontSize: 20.0, +// fontWeight: FontWeight.bold, +// ), +// ), +// const SizedBox(height: 10.0), +// FeatureTile( +// title: 'Track Your Period', +// description: 'Keep an accurate record of your menstrual cycles to better understand your health.', +// icon: Icons.track_changes, +// ), +// FeatureTile( +// title: 'Period Calendar', +// description: 'View and manage your menstrual cycles with a detailed calendar.', +// icon: Icons.calendar_today, +// ), +// // FeatureTile( +// // title: 'Partner Tracking', +// // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', +// // icon: Icons.people, +// // ), +// ], +// ), +// ), +// ], +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } -class FeatureTile extends StatelessWidget { - final String title; - final String description; - final IconData icon; +// class FeatureTile extends StatelessWidget { +// final String title; +// final String description; +// final IconData icon; - FeatureTile({ - required this.title, - required this.description, - required this.icon, - }); +// FeatureTile({ +// required this.title, +// required this.description, +// required this.icon, +// }); - @override - Widget build(BuildContext context) { - return ListTile( - leading: Icon(icon), - title: Text(title), - subtitle: Text(description), - ); - } -} +// @override +// Widget build(BuildContext context) { +// return ListTile( +// leading: Icon(icon), +// title: Text(title), +// subtitle: Text(description), +// ); +// } +// } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart index 27a8c80f..cfbab66f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -1,145 +1,145 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; -import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -class PeriodPlannerMenu extends StatelessWidget { - const PeriodPlannerMenu({super.key}); +// import 'package:flutter/material.dart'; +// import 'package:flutter_svg/svg.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; +// import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// class PeriodPlannerMenu extends StatelessWidget { +// const PeriodPlannerMenu({super.key}); - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final _items = _menuItems(context); +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// final _items = _menuItems(context); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Period Planner 🌸", - color: Constants.periodPlanner.withOpacity(1.0), - ), - Expanded( - child: MenuItemsBuilder( - crossAxisCount: 2, - itemBuilder: (item) => Card( - margin: const EdgeInsets.all(Constants.SPACING), - clipBehavior: Clip.antiAlias, - child: InkWell( - splashColor: Constants.periodPlannerShortcutBgColor, - onTap: item.onPressed, - child: Container( - padding: const EdgeInsets.all(Constants.SPACING), - decoration: BoxDecoration( - color: item.color ?? theme.colorScheme.primary, - image: const DecorationImage( - image: AssetImage("assets/images/contours.png"), - opacity: 0.2, - fit: BoxFit.cover, - ), - ), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - item.icon, - const SizedBox(height: Constants.SPACING), - Text( - item.title ?? '', - style: theme.textTheme.titleMedium?.copyWith( - color: Colors.white, - fontWeight: FontWeight.normal, - overflow: TextOverflow.ellipsis, - ), - textAlign: TextAlign.center, - ), - ], - ), - ), - ), - ), - ), - items: _items, - ), - ), - ], - ), - ); - } -} +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Period Planner 🌸", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// Expanded( +// child: MenuItemsBuilder( +// crossAxisCount: 2, +// itemBuilder: (item) => Card( +// margin: const EdgeInsets.all(Constants.SPACING), +// clipBehavior: Clip.antiAlias, +// child: InkWell( +// splashColor: Constants.periodPlannerShortcutBgColor, +// onTap: item.onPressed, +// child: Container( +// padding: const EdgeInsets.all(Constants.SPACING), +// decoration: BoxDecoration( +// color: item.color ?? theme.colorScheme.primary, +// image: const DecorationImage( +// image: AssetImage("assets/images/contours.png"), +// opacity: 0.2, +// fit: BoxFit.cover, +// ), +// ), +// child: Center( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// item.icon, +// const SizedBox(height: Constants.SPACING), +// Text( +// item.title ?? '', +// style: theme.textTheme.titleMedium?.copyWith( +// color: Colors.white, +// fontWeight: FontWeight.normal, +// overflow: TextOverflow.ellipsis, +// ), +// textAlign: TextAlign.center, +// ), +// ], +// ), +// ), +// ), +// ), +// ), +// items: _items, +// ), +// ), +// ], +// ), +// ); +// } +// } -_menuItems(BuildContext context) => [ - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_planner4.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Track Periods", - onPressed: () { - if(cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - } - else { - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } - } , - color: Constants.periodPlanner.withOpacity(1.0), - ), - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_calender1.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Calendar", - onPressed: () { - if(cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - } - else { - context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); - } - }, - color: Constants.periodPlanner.withOpacity(1.0), - ), - // MenuItem( - // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/partners2.svg", - // semanticsLabel: "Periods", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", - // semanticsLabel: "Periods", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize), - // title: "Partners", - // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), - // color: Constants.periodPlanner.withOpacity(1.0), - // ), - ]; \ No newline at end of file +// _menuItems(BuildContext context) => [ +// MenuItem( +// shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/period_planner4.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Track Periods", +// onPressed: () { +// if(cycles.isEmpty) { +// context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); +// } +// else { +// context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); +// } +// } , +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// MenuItem( +// shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/period_calender1.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Calendar", +// onPressed: () { +// if(cycles.isEmpty) { +// context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); +// } +// else { +// context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); +// } +// }, +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// // MenuItem( +// // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// // icon: SvgPicture.asset( +// // "assets/images/partners2.svg", +// // semanticsLabel: "Periods", +// // fit: BoxFit.contain, +// // width: 80, +// // height: 80, +// // ), +// // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", +// // semanticsLabel: "Periods", +// // fit: BoxFit.contain, +// // width: Constants.shortcutIconSize, +// // height: Constants.shortcutIconSize), +// // title: "Partners", +// // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), +// // color: Constants.periodPlanner.withOpacity(1.0), +// // ), +// ]; \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index de780255..b51bea2c 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -78,8 +78,6 @@ class _PeriodPlannerScreenState extends State { @override Widget build(BuildContext context) { - //late bool endOfPeriod; // handling when user has logged end of period - //handling the days before, after or during the various phases in the Menstrual Cycle int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; @@ -90,17 +88,15 @@ class _PeriodPlannerScreenState extends State { bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && !isInPeriod && daysToOvulation>=1 ; bool veryCloseToOvulation = _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); - //two days after ovulation -- I'm thinking about it though bool afterOvulation = _currentDate.isAfter(_ovulationDate) && (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod>0); bool duringPredictedPeriodRange = _currentDate.isAfter(_nextPeriodStart) && _currentDate.isBefore(_nextPeriodEnd) || isSameDay(_currentDate, _nextPeriodStart) || isSameDay(_currentDate, _nextPeriodEnd); bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); - - - + bool inPeriods = isInPeriod; + // Determine progress value and messages based on the current date double progressValue = 0.0; String message = ''; @@ -114,49 +110,49 @@ class _PeriodPlannerScreenState extends State { title = 'Period'; message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; buttonText = 'Period End'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if (isCloseToOvulation) { progressValue = 0.3; title = 'Ovulation in'; message = '$daysToOvulation day${daysToOvulation > 1 ? 's': ''}'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (veryCloseToOvulation) { progressValue = 0.4; title = 'Ovulation is'; message = 'Tomorrow'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (isOvulation) { progressValue = 0.5; title = 'Ovulation is'; message = 'Today'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (afterOvulation) { progressValue = 0.7; title = 'Next Period in'; message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's': ''}'; buttonText = 'Period Start'; - chances = 'High Chances of Getting Pregnant'; + chances = 'Low'; } else if (veryCloseToPeriod) { progressValue = 0.7; title = 'Next Period is'; message = 'Tomorrow'; buttonText = 'Period Start'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if (duringPredictedPeriodRange) { progressValue = 1.0; title = 'Periods May happen'; message = 'Today'; buttonText = 'Period Start'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if(isDangerZone) { progressValue = 1.0; title = 'Periods Overdue by'; message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; buttonText = 'Period Start'; - chances = 'High Chances of Getting Pregnant'; + chances = 'High'; } final theme = Theme.of(context); @@ -169,9 +165,6 @@ class _PeriodPlannerScreenState extends State { // debugPrint('-----Widget Rebuild-----'); // debugPrint('Is In Period: $isInPeriod'); // debugPrint('Is close to Ovulation: $isCloseToOvulation'); - - - return Scaffold( body: Column( children: [ @@ -187,6 +180,32 @@ class _PeriodPlannerScreenState extends State { padding: const EdgeInsets.all(16.0), child: Column( children: [ + Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const Text( + "Your Chances of Getting Pregnant are:", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + ), + Text( + chances, + style: const TextStyle( + fontSize: 34, + color: Constants.periodPlanner, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ) + ), + const SizedBox(height: Constants.SPACING), SizedBox( height: 150, child: CustomCalendar( @@ -194,15 +213,16 @@ class _PeriodPlannerScreenState extends State { initialFormat: CalendarFormat.week, events: events, headerButton: true, + inPeriods: inPeriods, ), ), - const SizedBox(height: 40), + const SizedBox(height: Constants.SPACING), Stack( alignment: Alignment.center, children: [ SizedBox( - width: Constants.SPACING * 30, // Adjust the width as needed - height: Constants.SPACING * 30, // Adjust the height as needed + width: 300, // Adjust the width as needed + height: 300, // Adjust the height as needed child: CircularProgressIndicator( value: progressValue, strokeWidth: 10, @@ -210,6 +230,7 @@ class _PeriodPlannerScreenState extends State { valueColor: AlwaysStoppedAnimation( isDangerZone ? Colors.red : Constants.periodPlanner, ), + ), ), Column( @@ -227,12 +248,7 @@ class _PeriodPlannerScreenState extends State { message, style: TextStyle(fontSize: 38, color: isDangerZone ? Colors.red: Constants.periodPlanner, fontWeight: FontWeight.bold), ), - const SizedBox(height: Constants.SPACING), - Text( - chances, - style: const TextStyle(fontSize: 16), - ), - const SizedBox(height: Constants.SPACING), + const SizedBox(height: Constants.SPACING + 10), if (buttonText.isNotEmpty) ElevatedButton( onPressed: () { @@ -314,6 +330,32 @@ class _PeriodPlannerScreenState extends State { ), ], ), + // const SizedBox(height: Constants.SPACING), + // Card( + // child: Padding( + // padding: const EdgeInsets.all(16.0), + // child: Column( + // children: [ + // const Text( + // "Your Chances of Getting Pregnant are:", + // style: TextStyle( + // fontSize: 14, + // fontWeight: FontWeight.bold, + // ), + // // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + // ), + // Text( + // chances, + // style: const TextStyle( + // fontSize: 34, + // color: Constants.periodPlanner, + // fontWeight: FontWeight.bold, + // ), + // ), + // ], + // ), + // ) + // ), //const SizedBox(height: 20,), // const Text( @@ -364,27 +406,27 @@ class _PeriodPlannerScreenState extends State { ), ), ), - // Align( - // alignment: Alignment.bottomCenter, - // child: Padding( - // padding: const EdgeInsets.all(16.0), - // child: ElevatedButton( - // style: ElevatedButton.styleFrom( - // backgroundColor: Constants.periodPlanner, - // ), - // onPressed: () { - // // To add functionality later - // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - // }, - // child: Text( - // 'Edit period dates', - // style: theme.textTheme.titleSmall?.copyWith( - // color: Colors.white, - // ), - // ), - // ), - // ), - // ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // To add functionality later + // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + }, + child: Text( + 'Periods History', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), ], ), ); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 99bfb422..460935c8 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -118,12 +118,14 @@ class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; final bool headerButton; + final bool? inPeriods; const CustomCalendar({ Key? key, this.initialFormat = CalendarFormat.month, required this.events, this.headerButton = false, + this.inPeriods, }) : super(key: key); @override @@ -131,6 +133,7 @@ class CustomCalendar extends StatefulWidget { } class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; + late DateTime _focusedDay; late Map> _flatEvents; late Map> _filteredEvents; @@ -140,6 +143,10 @@ class _CustomCalendarState extends State{ _calendarFormat = widget.initialFormat; _flatEvents = _flattenEvents(widget.events); _filteredEvents = _filterEventsForLatestCycle(); + // Determine the focused day based on the calendar format + _focusedDay = _calendarFormat == CalendarFormat.week + ? _getNextPredictedPeriodDate() ?? DateTime.now() + : DateTime.now(); } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -159,102 +166,50 @@ class _CustomCalendarState extends State{ } //This is for filtering events on the calendar -Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; + Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; - // Step 1: Identify the latest cycle - final latestCycleId = widget.events.keys.last; + // Identify the latest cycle + final latestCycleId = widget.events.keys.last; - if (widget.events.containsKey(latestCycleId)) { - final latestCycleEvents = widget.events[latestCycleId]!; - print("Latest Events: $latestCycleEvents"); + // If the latest cycle exists, add its events to the filteredEvents map + if (widget.events.containsKey(latestCycleId)) { + final latestCycleEvents = widget.events[latestCycleId]!; - // Step 2: Add all events from the latest cycle to filteredEvents - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { + // Directly add all events from the latest cycle + latestCycleEvents.forEach((date, events) { filteredEvents[date] = List.from(events); - } - }); + }); + } - // Step 3: Filter previous cycles - widget.events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - bool shouldOmitFertileOvulationDays = false; - - // Check if any of the latest period days collide with fertile/ovulation days from previous cycles - dateMap.forEach((date, events) { - final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - latestCycleEvents.keys.any((latestDate) { - // Check if the latest period days collide with fertile/ovulation days - return isSameDay(latestDate, date) || - latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - print("Collided Events: $hasCollision"); - - if (hasCollision) { - shouldOmitFertileOvulationDays = true; - } - }); - - // Additional step: Check if previous cycles' dates also collide with those of later cycles - widget.events.forEach((laterCycleId, laterDateMap) { - //condition ensures that we only consider cycles that are neither the current one nor the latest one - if (laterCycleId != cycleId && laterCycleId != latestCycleId) { - dateMap.forEach((date, events) { - final hasCollisionWithlaterCycle = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - laterDateMap.keys.any((laterDate) { - return isSameDay(laterDate, date) || - laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - - if (hasCollisionWithlaterCycle) { - shouldOmitFertileOvulationDays = true; - } - }); - } - }); - - // Filter out the events based on collision detection and omit predicted period days regardless - dateMap.forEach((date, events) { - final newEventList = events.where((event) { - // Always omit predicted period days - if (event.title == 'Predicted Period Day') { - return false; - } - // Remove fertile and ovulation days if there was a collision - return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); - }).toList(); - - if (newEventList.isNotEmpty) { - print("new Event List: $newEventList"); - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } - } - }); + return filteredEvents; + } + + + DateTime? _getNextPredictedPeriodDate() { + for (var entry in _filteredEvents.entries) { + if (widget.inPeriods == true) { + // Return the first date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + return entry.key; } - }); + } else { + // Return the first date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + return entry.key; + } + } } - - return filteredEvents; + return null; } - @override Widget build(BuildContext context) { return TableCalendar( key: ValueKey(widget.events), firstDay: DateTime(2010), lastDay: DateTime(2100), - focusedDay: DateTime.now(), + focusedDay: _focusedDay, // onDaySelected: (selectedDay, focusedDay) { // setState(() { // _focusedDay = focusedDay; diff --git a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart index 628b8fc8..88aec81e 100644 --- a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart +++ b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart @@ -1,6 +1,13 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +/* +This is responsible for the highlighting of the various events as you will see in the calendar +based on their Event Title and Color +For Example if the event is a Period Day, since the corresponding color is pink, +the day in the calendar will be highlighted in Pink. The same applies for the other events that is +Fertile days, Ovulation days and Predicted Period Days. +*/ class EventsMaker extends StatelessWidget { const EventsMaker({ super.key, @@ -11,13 +18,6 @@ class EventsMaker extends StatelessWidget { final DateTime date; final List events; - //Calculating Opacity - // double _calculateOpacity(DateTime eventStart, DateTime eventEnd, DateTime currentDate) { - // int totalDays = eventEnd.difference(eventStart).inDays + 1; - // int currentDayIndex = currentDate.difference(eventStart).inDays; - // return (1 - (currentDayIndex / totalDays)).clamp(0.2, 1.0); - // } - @override Widget build(BuildContext context) { //debugPrint("----From EventMaker Class----"); @@ -28,13 +28,7 @@ class EventsMaker extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, children: events.map((event) { - // Example: Assuming you have the start and end dates for the event - // DateTime eventStart = date; // Update this to the actual event start date - // DateTime eventEnd = date.add(Duration(days: events.length - 1)); // Update this to the actual event end date - - // double opacity = _calculateOpacity(eventStart, eventEnd, date); Color color = event.color; - return Container( margin: const EdgeInsets.symmetric(horizontal: 0.5), width: 7.0, diff --git a/lib/src/features/period_planner/presentation/widgets/logItems.dart b/lib/src/features/period_planner/presentation/widgets/logItems.dart index 5af15dbd..3b6353bb 100644 --- a/lib/src/features/period_planner/presentation/widgets/logItems.dart +++ b/lib/src/features/period_planner/presentation/widgets/logItems.dart @@ -1,80 +1,80 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; -class LogItems { - static List getSymptoms() { - Color symptomsColor = Colors.pink; - return [ - Logger( - icon: Icons.favorite, - label: 'Cramps', - color: symptomsColor, - ), - Logger( - icon: Icons.sentiment_satisfied, - label: 'Mood swings', - color: symptomsColor, - ), - Logger( - icon: Icons.battery_alert, - label: 'Fatigue', - color: symptomsColor, - ), - // Add more symptom loggers as needed - ]; - } +// class LogItems { +// static List getSymptoms() { +// Color symptomsColor = Colors.pink; +// return [ +// Logger( +// icon: Icons.favorite, +// label: 'Cramps', +// color: symptomsColor, +// ), +// Logger( +// icon: Icons.sentiment_satisfied, +// label: 'Mood swings', +// color: symptomsColor, +// ), +// Logger( +// icon: Icons.battery_alert, +// label: 'Fatigue', +// color: symptomsColor, +// ), +// // Add more symptom loggers as needed +// ]; +// } - static List getDischarge() { - Color dischargeColor = Colors.blue; - return [ - Logger( - icon: Icons.water_drop, - label: 'No discharge', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Egg whites', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Sticky', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Brown', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Yellow or Green', - color: dischargeColor, - ), - // Add more discharge loggers as needed - ]; - } +// static List getDischarge() { +// Color dischargeColor = Colors.blue; +// return [ +// Logger( +// icon: Icons.water_drop, +// label: 'No discharge', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Egg whites', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Sticky', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Brown', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Yellow or Green', +// color: dischargeColor, +// ), +// // Add more discharge loggers as needed +// ]; +// } - static List getMoods() { - Color moodsColor = Colors.orange; - return [ - Logger( - icon: Icons.sentiment_very_satisfied, - label: 'Happy', - color: moodsColor, - ), - Logger( - icon: Icons.sentiment_dissatisfied, - label: 'Sad', - color: moodsColor, - ), - Logger( - icon: Icons.sentiment_neutral, - label: 'Anxious', - color: moodsColor, - ), - // Add more mood loggers as needed - ]; - } -} +// static List getMoods() { +// Color moodsColor = Colors.orange; +// return [ +// Logger( +// icon: Icons.sentiment_very_satisfied, +// label: 'Happy', +// color: moodsColor, +// ), +// Logger( +// icon: Icons.sentiment_dissatisfied, +// label: 'Sad', +// color: moodsColor, +// ), +// Logger( +// icon: Icons.sentiment_neutral, +// label: 'Anxious', +// color: moodsColor, +// ), +// // Add more mood loggers as needed +// ]; +// } +// } diff --git a/lib/src/features/period_planner/presentation/widgets/logger.dart b/lib/src/features/period_planner/presentation/widgets/logger.dart index 4c3765a2..4291da82 100644 --- a/lib/src/features/period_planner/presentation/widgets/logger.dart +++ b/lib/src/features/period_planner/presentation/widgets/logger.dart @@ -1,13 +1,13 @@ -import 'package:flutter/material.dart'; +// import 'package:flutter/material.dart'; -class Logger { - final IconData icon; - final String label; - final Color color; +// class Logger { +// final IconData icon; +// final String label; +// final Color color; - Logger({ - required this.icon, - required this.label, - required this.color, - }); -} \ No newline at end of file +// Logger({ +// required this.icon, +// required this.label, +// required this.color, +// }); +// } \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart index 37e4048c..e608b8c8 100644 --- a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart +++ b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart @@ -1,98 +1,98 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; -import 'package:nishauri/src/utils/constants.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; +// import 'package:nishauri/src/utils/constants.dart'; -class LoggerWidget extends StatefulWidget { - final String heading; - final List items; +// class LoggerWidget extends StatefulWidget { +// final String heading; +// final List items; - LoggerWidget({required this.heading, required this.items}); +// LoggerWidget({required this.heading, required this.items}); - @override - _LoggerWidgetState createState() => _LoggerWidgetState(); -} +// @override +// _LoggerWidgetState createState() => _LoggerWidgetState(); +// } -class _LoggerWidgetState extends State { - // Create a list to keep track of the selected items - late List _selectedItems; +// class _LoggerWidgetState extends State { +// // Create a list to keep track of the selected items +// late List _selectedItems; - @override - void initState() { - super.initState(); - // Initialize the list with false (none of the items are selected initially) - _selectedItems = List.filled(widget.items.length, false); - } +// @override +// void initState() { +// super.initState(); +// // Initialize the list with false (none of the items are selected initially) +// _selectedItems = List.filled(widget.items.length, false); +// } - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - widget.heading, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 16), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: widget.items - .asMap() - .entries - .map((entry) => _buildItemCard(entry.key, entry.value)) - .toList(), - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - }, - child: Text( - 'Click to Apply', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ], - ); - } +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return Column( +// crossAxisAlignment: CrossAxisAlignment.stretch, +// children: [ +// Text( +// widget.heading, +// textAlign: TextAlign.center, +// style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), +// ), +// const SizedBox(height: 16), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: Row( +// children: widget.items +// .asMap() +// .entries +// .map((entry) => _buildItemCard(entry.key, entry.value)) +// .toList(), +// ), +// ), +// Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// // To add functionality later +// }, +// child: Text( +// 'Click to Apply', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ], +// ); +// } - Widget _buildItemCard(int index, Logger item) { - return GestureDetector( - onTap: () { - setState(() { - _selectedItems[index] = !_selectedItems[index]; - }); - }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - Stack( - alignment: Alignment.center, - children: [ - Icon(item.icon, size: 40, color: item.color), - if (_selectedItems[index]) - Icon(Icons.check_circle, size: 40, color: Colors.green.withOpacity(0.9)), - ], - ), - const SizedBox(height: 8), - Text(item.label), - ], - ), - ), - ); - } -} +// Widget _buildItemCard(int index, Logger item) { +// return GestureDetector( +// onTap: () { +// setState(() { +// _selectedItems[index] = !_selectedItems[index]; +// }); +// }, +// child: Padding( +// padding: const EdgeInsets.symmetric(horizontal: 8.0), +// child: Column( +// children: [ +// Stack( +// alignment: Alignment.center, +// children: [ +// Icon(item.icon, size: 40, color: item.color), +// if (_selectedItems[index]) +// Icon(Icons.check_circle, size: 40, color: Colors.green.withOpacity(0.9)), +// ], +// ), +// const SizedBox(height: 8), +// Text(item.label), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 8a3962bd..4fe5e40a 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -3,10 +3,18 @@ import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:table_calendar/table_calendar.dart'; +/* +This class is responsible for generating events based the logged period days +and the days the algorithm predicts(Fertile, Ovulation and Predicted Next Period days) +The Events in this case are Period, Fertile, Ovulation and Predicted Period Day of a cycle. +The Days that are within Period Days are give a title of Period Day and a color of Colors.pink. +The rest happens for the other days. +*/ class EventUtils { static Map>> generateEvents(List cycles) { Map>> events= {}; + //debugPrint("-----Generating New Events From Event Utils-----"); From 2f2f338a09107d456ba5fc88dead987120e78fa2 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 28 Aug 2024 15:45:24 +0300 Subject: [PATCH 060/140] Handling cases whereby new users and regular users interact with the screen for logging periods. That is new users can log period start and end and regular log period start and the end is set based on the calculated average period Length. --- .../presentation/pages/logPeriods.dart | 224 ++++++------------ .../presentation/widgets/customCalendar.dart | 42 ++-- 2 files changed, 91 insertions(+), 175 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 0834a2b6..5d7dc983 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -42,136 +42,62 @@ class _LogPeriodScreenState extends State { DateTime? _startDate; DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); - late Map> _flatEvents; - late Map> _filteredEvents; - - @override - void initState() { + //late Map> _filteredEvents; + final bool _isNewUser = cycles.isEmpty; + int averagePeriods = calculateAveragePeriodLength(cycles); + + + @override + void initState() { super.initState(); - // _flatEvents = _flattenEvents(events); - // _filteredEvents = _filterEventsForLatestCycle(); - - if (events.isNotEmpty) { - _flatEvents = _flattenEvents(events); - _filteredEvents = _filterEventsForLatestCycle(); - } else { - _flatEvents = {}; - _filteredEvents = {}; + if (!_isNewUser) { + //_filteredEvents = _filterEventsForLatestCycle(); + _initializePredictedPeriodRange(); + _setFocusedDayForRegularUser(); + } + // else { + // _filteredEvents = {}; + // } } - } - - //To flatten the events so that it can be in the form of DateTime as the key and the events as the values - //These are events generated from the events utils class - Map> _flattenEvents(Map>> nestedEvents) { - final Map> flattenedEvents = {}; - - nestedEvents.forEach((cycleId, dateMap) { - //print("Processing cycle: $cycleId"); // Debug: Print current cycleId - dateMap.forEach((date, events) { - //print("Date: $date, Events: $events"); // Debug: Print date and events being processed - if (flattenedEvents.containsKey(date)) { - flattenedEvents[date]!.addAll(events); - } else { - flattenedEvents[date] = List.from(events); - } - }); - }); + // Map> _filterEventsForLatestCycle() { + // final Map> filteredEvents = {}; + + // final latestCycleId = events.keys.last; + // if (events.containsKey(latestCycleId)) { + // final latestCycleEvents = events[latestCycleId]!; + // latestCycleEvents.forEach((date, events) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(events); + // } else { + // filteredEvents[date] = List.from(events); + // } + // }); + // } + + // return filteredEvents; + // } - //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events - return flattenedEvents; + void _initializePredictedPeriodRange() { + final latestCycle = cycles.last; + _startDate = latestCycle.predictedPeriodStart; + _endDate = latestCycle.predictedPeriodEnd; } - Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; - - // Step 1: Identify the latest cycle - final latestCycleId = events.keys.last; - - if (events.containsKey(latestCycleId)) { - final latestCycleEvents = events[latestCycleId]!; - print("Latest Events: $latestCycleEvents"); - - // Step 2: Add all events from the latest cycle to filteredEvents - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { - filteredEvents[date] = List.from(events); - } - }); - - // Step 3: Filter previous cycles - events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - bool shouldOmitFertileOvulationDays = false; - - // Check if any of the latest period days collide with fertile/ovulation days from previous cycles - dateMap.forEach((date, events) { - final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - latestCycleEvents.keys.any((latestDate) { - // Check if the latest period days collide with fertile/ovulation days - return isSameDay(latestDate, date) || - latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - print("Collided Events: $hasCollision"); - - if (hasCollision) { - shouldOmitFertileOvulationDays = true; - } - }); - - // Additional step: Check if previous cycles' dates also collide with those of later cycles - events.forEach((laterCycleId, laterDateMap) { - //condition ensures that we only consider cycles that are neither the current one nor the latest one - if (laterCycleId != cycleId && laterCycleId != latestCycleId) { - dateMap.forEach((date, events) { - final hasCollisionWithlaterCycle = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - laterDateMap.keys.any((laterDate) { - return isSameDay(laterDate, date) || - laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - - if (hasCollisionWithlaterCycle) { - shouldOmitFertileOvulationDays = true; - } - }); - } - }); - - // Filter out the events based on collision detection and omit predicted period days regardless - dateMap.forEach((date, events) { - final newEventList = events.where((event) { - // Always omit predicted period days - if (event.title == 'Predicted Period Day') { - return false; - } - // Remove fertile and ovulation days if there was a collision - return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); - }).toList(); + void _setFocusedDayForRegularUser() { + final latestCycle = cycles.last; + _focusedDay = latestCycle.predictedPeriodStart; + } - if (newEventList.isNotEmpty) { - print("new Event List: $newEventList"); - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } - } - }); - } + void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { + setState(() { + _startDate = selectedDay; + _endDate = _startDate?.add(Duration(days: averagePeriods - 1)); // Only start date is used for regular users + _focusedDay = focusedDay; + debugPrint("Average Period Length from Log Periods is $averagePeriods"); }); } - - return filteredEvents; -} - - - // Method to validate date range ensuring selection does not exceed 7 days + // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day return @@ -203,17 +129,14 @@ class _LogPeriodScreenState extends State { }); } } - - //Function to handle adding and updating log entries in list Database void _updateOrAddCycle(DateTime start, [DateTime? end]) { // If end date is not provided, set it to the start date end ??= start; final DateTime now = DateTime.now(); - int averagePeriods = calculateAveragePeriodLength(cycles); if (isSameDay(start, now) || isSameDay(end, now)) { - end = start.add( Duration(days: averagePeriods)); + end = start.add( Duration(days: averagePeriods - 1)); } //Handling cases where a user might log an already logged date in their previous cycle, hence warning them using a snackbar @@ -255,8 +178,6 @@ class _LogPeriodScreenState extends State { (start2.isBefore(end1) || isSameDay(start2, end1)); } - - @override Widget build(BuildContext context) { //events = EventUtils.generateEvents(cycles); @@ -265,34 +186,37 @@ class _LogPeriodScreenState extends State { body: Column( children: [ CustomAppBar( - title: "Log Periods 📅", + title: "Enter Periods 📅", + subTitle: _isNewUser + ? "Please enter your previous period start and end date." + : "Please enter when your Periods have started", color: Constants.periodPlanner.withOpacity(1.0), ), TableCalendar( focusedDay: _focusedDay, - firstDay: DateTime(2020), - lastDay: DateTime.now(), - rangeStartDay: _startDate , - rangeEndDay: _endDate, - onRangeSelected: _onRangeSelected, - - rangeSelectionMode: RangeSelectionMode.toggledOn, + firstDay: DateTime(2021), + lastDay: DateTime(2100), + rangeStartDay: _startDate, + rangeEndDay: _isNewUser ? _endDate : _endDate, + onRangeSelected: _isNewUser ? _onRangeSelected : null, + onDaySelected: _isNewUser ? null : _onDaySelected, + rangeSelectionMode: _isNewUser ? RangeSelectionMode.toggledOn : RangeSelectionMode.toggledOn, - onPageChanged: (focusedDay) { - _focusedDay = focusedDay; - }, - eventLoader: (day) { - return _filteredEvents[day] ?? []; - }, - calendarBuilders: CalendarBuilders( - markerBuilder: (context, date, events) { - if (events.isEmpty) { - return null; - } - final eventList = events.cast(); - return EventsMaker(date: date, events: eventList); - }, - ), + // onPageChanged: (focusedDay) { + // _focusedDay = focusedDay; + // }, + // eventLoader: (day) { + // return _filteredEvents[day] ?? []; + // }, + // calendarBuilders: CalendarBuilders( + // markerBuilder: (context, date, events) { + // if (events.isEmpty) { + // return null; + // } + // final eventList = events.cast(); + // return EventsMaker(date: date, events: eventList); + // }, + // ), calendarStyle: const CalendarStyle( todayDecoration: BoxDecoration( color: Colors.blue, diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 460935c8..45bf6068 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -61,17 +61,9 @@ int calculateAveragePeriodLength(List cycles) { debugPrint("Average Period Length: $averagePeriodLength"); return averagePeriodLength; } - - - - // DateTime normalizeToMidnight(DateTime dateTime) { // return DateTime(dateTime.year, dateTime.month, dateTime.day); // } - - - - //Algorithm for calculating Next Period Days, Ovulation and Fertile Days Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { var uuid = const Uuid(); @@ -83,7 +75,7 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { // Calculate average period length from the period Start to the Period End int averagePeriodLength = calculateAveragePeriodLength(cycles); - DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength)); + DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength - 1)); DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) @@ -134,14 +126,14 @@ class CustomCalendar extends StatefulWidget { class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; late DateTime _focusedDay; - late Map> _flatEvents; + //late Map> _flatEvents; late Map> _filteredEvents; @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; - _flatEvents = _flattenEvents(widget.events); + //_flatEvents = _flattenEvents(widget.events); _filteredEvents = _filterEventsForLatestCycle(); // Determine the focused day based on the calendar format _focusedDay = _calendarFormat == CalendarFormat.week @@ -150,20 +142,20 @@ class _CustomCalendarState extends State{ } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values - Map> _flattenEvents(Map>> nestedEvents) { - final Map> flattenedEvents = {}; - - nestedEvents.forEach((cycleId, dateMap) { - dateMap.forEach((date, events) { - if (flattenedEvents.containsKey(date)) { - flattenedEvents[date]!.addAll(events); - } else { - flattenedEvents[date] = List.from(events); - } - }); - }); - return flattenedEvents; - } + // Map> _flattenEvents(Map>> nestedEvents) { + // final Map> flattenedEvents = {}; + + // nestedEvents.forEach((cycleId, dateMap) { + // dateMap.forEach((date, events) { + // if (flattenedEvents.containsKey(date)) { + // flattenedEvents[date]!.addAll(events); + // } else { + // flattenedEvents[date] = List.from(events); + // } + // }); + // }); + // return flattenedEvents; + // } //This is for filtering events on the calendar Map> _filterEventsForLatestCycle() { From fe519f1abaecd6855bcc10b7161298cf9e753267 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 29 Aug 2024 18:01:22 +0300 Subject: [PATCH 061/140] Added Period History in the Menstrual Calendar Feature --- lib/src/app/navigation/app_router.dart | 35 ++- .../pages/periodPlannerScreen.dart | 9 +- .../presentation/pages/periods_history.dart | 208 ++++++++++++++++++ lib/src/utils/routes.dart | 2 + 4 files changed, 237 insertions(+), 17 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/pages/periods_history.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index d86887d8..88e5627f 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -66,6 +66,7 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/periodCa import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlanner.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; import 'package:nishauri/src/features/self_screening/presentation/self_screening_menu.dart'; import 'package:nishauri/src/features/treatment_support/presentation/pages/TreatmentSupport.dart'; @@ -392,21 +393,31 @@ final List secureRoutes = [ }, ) ]), - //Routes for the Period Planner - GoRoute( - name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, - path: 'period-planner-log-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return LogPeriodScreen(); - }, - ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_SCREEN, - path: 'period-planner-screen', + //Routes for the Period Planner + GoRoute( + name: RouteNames.PERIOD_PLANNER_SCREEN, + path: 'period-planner-screen', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlannerScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, + path: 'period-planner-period-history', builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerScreen(); + return PeriodsHistory(); }, ), + ], + ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return LogPeriodScreen(); + }, + ), + ]; final List openRoutes = [ diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index b51bea2c..dfe337fe 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -195,9 +195,9 @@ class _PeriodPlannerScreenState extends State { ), Text( chances, - style: const TextStyle( + style: TextStyle( fontSize: 34, - color: Constants.periodPlanner, + color: chances == 'High' ? Colors.red : Colors.blue, fontWeight: FontWeight.bold, ), ), @@ -414,9 +414,8 @@ class _PeriodPlannerScreenState extends State { style: ElevatedButton.styleFrom( backgroundColor: Constants.periodPlanner, ), - onPressed: () { - // To add functionality later - // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); }, child: Text( 'Periods History', diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart new file mode 100644 index 00000000..9b77e31b --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -0,0 +1,208 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + + +class PeriodsHistory extends StatefulWidget { + const PeriodsHistory({super.key}); + + @override + State createState() => _PeriodsHistoryState(); +} + +class _PeriodsHistoryState extends State { + final averagePeriod = calculateAveragePeriodLength(cycles); + final averageCycles = calculateAverageCycleLength(cycles); + // final List> periodHistory = [ + // {'start': 'July 1', 'end': 'July 7'}, + // {'start': 'August 1', 'end': 'August 7'}, + // {'start': 'September 2', 'end': 'September 8'}, + // {'start': 'October 3', 'end': 'October 9'}, + // {'start': 'November 4', 'end': 'November 10'}, + // {'start': 'December 5', 'end': 'December 11'}, + // {'start': 'January 6', 'end': 'January 12'}, + // {'start': 'February 7', 'end': 'February 13'}, + // {'start': 'March 8', 'end': 'March 14'}, + // {'start': 'April 9', 'end': 'April 15'}, + // {'start': 'May 10', 'end': 'May 16'}, + // {'start': 'June 11', 'end': 'June 17'}, + // {'start': 'July 12', 'end': 'July 18'}, + // {'start': 'August 13', 'end': 'August 19'}, + // {'start': 'September 14', 'end': 'September 20'}, + // {'start': 'October 15', 'end': 'October 21'}, + // {'start': 'November 16', 'end': 'November 22'}, + // {'start': 'December 17', 'end': 'December 23'}, + // {'start': 'January 18', 'end': 'January 24'}, + // {'start': 'February 19', 'end': 'February 25'}, + // ]; + + // Function to format the date as "MMM d" + String formatDate(DateTime date) { + return DateFormat('MMM d').format(date); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: ListView( + children: [ + const CustomAppBar( + title: "My Period History 🌼", + color: Constants.periodPlanner, + ), + const SizedBox(height: 10), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + //The first Card showing both Average period and cycle lengths + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + "My Cycles", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + //Card showing Average Period days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + "Average Period", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 8.0), + Text( + "$averagePeriod days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.pink, + ), + ), + ], + ), + ), + ), + ), + Expanded( + //Card Showing Average Cycle days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + 'Average Cycle', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 8.0), + Text( + "$averageCycles days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.blue, + ), + ), + ], + ), + ), + ), + ), + ], + ), + const SizedBox(height: 10) + ], + ), + ), + ), + const SizedBox(height: 20), + //Card Showing period history + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), + child: Column( + children: [ + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink + ), + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: cycles.length, + itemBuilder: (context, index) { + final cycle = cycles[index]; + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + return ListTile( + title: const Text("2024"), + subtitle: Text( + "$start - $end", + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + trailing: IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_forward_ios), + ), + ); + } + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index a61b9779..df8a1567 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -67,10 +67,12 @@ class RouteNames { static const PERIOD_PLANNER_CALENDAR = "Period Planner Calendar"; static const PERIOD_PLANNER_LOG_PERIODS = "period-planner-log-periods"; static const PERIOD_PLANNER_EDIT_PERIODS = "period-planner-edit-periods"; + static const PERIOD_PLANNER_PERIOD_HISTORY = "period-planner-period-history"; static const CHAT_HCW = "chat-hcw"; static const CHAT_DETAIL = "chat-detail"; static const CHAT_USER = "chat-user"; + } class MenuItemNames { From 626d619c622b094f9e9816d5397ead0f89c19de9 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 29 Aug 2024 19:05:24 +0300 Subject: [PATCH 062/140] Grouping the cycles by their years and making sure the latest cycle is displayed first --- .../presentation/pages/periods_history.dart | 322 ++++++++++-------- 1 file changed, 171 insertions(+), 151 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 9b77e31b..608e5f9f 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -5,7 +5,6 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/custom import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; - class PeriodsHistory extends StatefulWidget { const PeriodsHistory({super.key}); @@ -16,36 +15,31 @@ class PeriodsHistory extends StatefulWidget { class _PeriodsHistoryState extends State { final averagePeriod = calculateAveragePeriodLength(cycles); final averageCycles = calculateAverageCycleLength(cycles); - // final List> periodHistory = [ - // {'start': 'July 1', 'end': 'July 7'}, - // {'start': 'August 1', 'end': 'August 7'}, - // {'start': 'September 2', 'end': 'September 8'}, - // {'start': 'October 3', 'end': 'October 9'}, - // {'start': 'November 4', 'end': 'November 10'}, - // {'start': 'December 5', 'end': 'December 11'}, - // {'start': 'January 6', 'end': 'January 12'}, - // {'start': 'February 7', 'end': 'February 13'}, - // {'start': 'March 8', 'end': 'March 14'}, - // {'start': 'April 9', 'end': 'April 15'}, - // {'start': 'May 10', 'end': 'May 16'}, - // {'start': 'June 11', 'end': 'June 17'}, - // {'start': 'July 12', 'end': 'July 18'}, - // {'start': 'August 13', 'end': 'August 19'}, - // {'start': 'September 14', 'end': 'September 20'}, - // {'start': 'October 15', 'end': 'October 21'}, - // {'start': 'November 16', 'end': 'November 22'}, - // {'start': 'December 17', 'end': 'December 23'}, - // {'start': 'January 18', 'end': 'January 24'}, - // {'start': 'February 19', 'end': 'February 25'}, - // ]; // Function to format the date as "MMM d" String formatDate(DateTime date) { return DateFormat('MMM d').format(date); } + // Function to group cycles by year + Map> groupCyclesByYear(List cycles) { + final Map> groupedCycles = {}; + for (var cycle in cycles) { + final year = cycle.periodStart.year; + if (!groupedCycles.containsKey(year)) { + groupedCycles[year] = []; + } + groupedCycles[year]!.add(cycle); + } + return groupedCycles; + } + @override Widget build(BuildContext context) { + // Group cycles by year and reverse the list to show the latest first + final groupedCycles = groupCyclesByYear(cycles); + final sortedYears = groupedCycles.keys.toList()..sort((a, b) => b.compareTo(a)); + return Scaffold( body: ListView( children: [ @@ -54,150 +48,176 @@ class _PeriodsHistoryState extends State { color: Constants.periodPlanner, ), const SizedBox(height: 10), - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - //The first Card showing both Average period and cycle lengths - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - "My Cycles", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.bold, - ), + SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + // The first Card showing both Average period and cycle lengths + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + "My Cycles", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - //Card showing Average Period days - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - const Text( - "Average Period", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.w500, - ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + // Card showing Average Period days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + "Average Period", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, ), - const SizedBox(height: 8.0), - Text( - "$averagePeriod days", - style: const TextStyle( - fontSize: 30.0, - fontWeight: FontWeight.bold, - color: Colors.pink, - ), + ), + const SizedBox(height: 8.0), + Text( + "$averagePeriod days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - ], - ), + ), + ], ), ), ), - Expanded( - //Card Showing Average Cycle days - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - const Text( - 'Average Cycle', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.w500, - ), + ), + Expanded( + // Card Showing Average Cycle days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + 'Average Cycle', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w500, ), - const SizedBox(height: 8.0), - Text( - "$averageCycles days", - style: const TextStyle( - fontSize: 30.0, - fontWeight: FontWeight.bold, - color: Colors.blue, - ), + ), + const SizedBox(height: 8.0), + Text( + "$averageCycles days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.blue, ), - ], - ), + ), + ], ), ), ), - ], - ), - const SizedBox(height: 10) - ], - ), + ), + ], + ), + const SizedBox(height: 10), + ], ), ), - const SizedBox(height: 20), - //Card Showing period history - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), - child: Column( - children: [ - const Text( - "History", - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: Colors.pink - ), + ), + const SizedBox(height: 20), + // Card Showing period history + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), + child: Column( + children: [ + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: cycles.length, - itemBuilder: (context, index) { - final cycle = cycles[index]; - final start = formatDate(cycle.periodStart); - final end = formatDate(cycle.periodEnd); - return ListTile( - title: const Text("2024"), - subtitle: Text( - "$start - $end", - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - trailing: IconButton( - onPressed: () {}, - icon: const Icon(Icons.arrow_forward_ios), + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: sortedYears.length, + itemBuilder: (context, index) { + final year = sortedYears[index]; + final cyclesInYear = groupedCycles[year]!; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + "$year", + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), ), - ); - } - ), - ], - ), + ...cyclesInYear.reversed.map((cycle) { + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + final cycleDays = cycle.cycleLength; + return ListTile( + title: Text( + "$start - $end", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text( + "Length of cycle: $cycleDays days", + style: const TextStyle( + fontSize: 16.0, + ), + ), + trailing: IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_forward_ios), + ), + ); + }).toList(), + ], + ); + }, + ), + ], ), ), - ], - ), + ), + ], ), ), ), @@ -205,4 +225,4 @@ class _PeriodsHistoryState extends State { ), ); } -} \ No newline at end of file +} From 28bca99bb4b827d3c2b10140a3209f48eec54aaf Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 30 Aug 2024 16:09:09 +0300 Subject: [PATCH 063/140] Started working on allowing editing of period days from history although it is not quite complete. --- lib/src/app/navigation/app_router.dart | 13 +- .../presentation/pages/editPeriodsScreen.dart | 201 +++++++----------- .../pages/periodPlannerScreen.dart | 23 +- .../presentation/pages/periods_history.dart | 15 +- 4 files changed, 113 insertions(+), 139 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 88e5627f..0941f8b5 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -405,8 +405,19 @@ final List secureRoutes = [ name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, path: 'period-planner-period-history', builder: (BuildContext context, GoRouterState state) { - return PeriodsHistory(); + return const PeriodsHistory(); }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + path: 'period-planner-edit-periods', + builder: (BuildContext context, GoRouterState state) { + final startDate = state.extra != null ? (state.extra as Map)['startDate'] as DateTime : null; + final endDate = state.extra != null ? (state.extra as Map)['endDate'] as DateTime : null; + return EditPeriods(initialStartDate: startDate, initialEndDate: endDate); + }, + ), + ], ), ], ), diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index e87293c2..1aa3a59a 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,133 +1,78 @@ -// import 'package:flutter/material.dart'; -// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -// import 'package:nishauri/src/utils/constants.dart'; -// import 'package:table_calendar/table_calendar.dart'; +import 'package:flutter/material.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:table_calendar/table_calendar.dart'; -// class EditPeriodsScreen extends StatefulWidget { +class EditPeriods extends StatefulWidget { + final DateTime? initialStartDate; + final DateTime? initialEndDate; + const EditPeriods({super.key, this.initialStartDate, this.initialEndDate}); -// const EditPeriodsScreen({super.key}); + @override + State createState() => _EditPeriodsState(); +} -// @override -// State createState() => _EditPeriodsScreenState(); -// } +class _EditPeriodsState extends State { + late DateTime _focusedDay; + DateTime? _rangeStart; + DateTime? _rangeEnd; -// class _EditPeriodsScreenState extends State { -// // DateTime? _periodStart; -// // DateTime? _periodEnd; -// // Cycle? _cycle; -// Map _periodRanges = {}; - + @override + void initState() { + super.initState(); + + _focusedDay = widget.initialStartDate ?? DateTime.now(); + _rangeStart = widget.initialStartDate; + _rangeEnd = widget.initialEndDate; + } -// @override -// void initState() { -// super.initState(); - -// // Gather all period ranges from all cycles -// for (Cycle cycle in cycles) { -// _periodRanges[cycle.periodStart] = cycle.periodEnd; -// } - -// // Here, selecting the last cycle added to the list -// // if (cycles.isNotEmpty) { -// // _cycle = cycles.last; -// // _periodStart = _cycle?.periodStart; -// // _periodEnd = _cycle?.periodEnd; -// // } - -// } - -// void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { -// setState(() { -// if (start != null && end != null) { -// // Assuming you're editing the last cycle for simplicity -// Cycle lastCycle = cycles.last; -// lastCycle.periodStart = start; -// lastCycle.periodEnd = end; - -// // Update the period ranges map -// _periodRanges[start] = end; -// } -// }); -// } - -// void _applyChanges() { -// // Save the updated cycle list and recalculate important dates -// for (Cycle cycle in cycles) { -// Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); -// cycle.fertileStart = updatedCycle.fertileStart; -// cycle.fertileEnd = updatedCycle.fertileEnd; -// cycle.ovulation = updatedCycle.ovulation; -// cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; -// cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; -// } - -// Navigator.of(context).pop(); // Go back to the previous screen -// } - -// @override -// Widget build(BuildContext context) { -// final theme = Theme.of(context); - -// return Scaffold( -// body: Column( -// children: [ -// CustomAppBar( -// title: "Edit Periods 📅", -// color: Constants.periodPlanner.withOpacity(1.0), -// ), -// TableCalendar( -// focusedDay: DateTime.now(), -// firstDay: DateTime(2020), -// lastDay: DateTime.now(), -// rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, -// rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, -// onRangeSelected: _onRangeSelected, -// calendarFormat: CalendarFormat.month, -// headerStyle: const HeaderStyle( -// formatButtonVisible: false, -// ), -// calendarStyle: const CalendarStyle( -// todayDecoration: BoxDecoration( -// color: Colors.blue, -// shape: BoxShape.circle, -// ), -// rangeStartDecoration: BoxDecoration( -// color: Colors.pink, -// shape: BoxShape.circle, -// ), -// rangeEndDecoration: BoxDecoration( -// color: Colors.pink, -// shape: BoxShape.circle, -// ), -// rangeHighlightColor: Constants.periodPlanner, -// ), -// ), -// Expanded( -// child: Align( -// alignment: Alignment.bottomCenter, -// child: Padding( -// padding: const EdgeInsets.all(16.0), -// child: ElevatedButton( -// style: ElevatedButton.styleFrom( -// backgroundColor: Constants.periodPlanner, -// ), -// onPressed: () { -// _applyChanges(); -// }, -// child: Text( -// 'Apply Changes', -// style: theme.textTheme.titleSmall?.copyWith( -// color: Colors.white, -// ), -// ), -// ), -// ), -// ), -// ), -// ], -// ), -// ); -// } -// } \ No newline at end of file + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + title: "Edit Period 🌸", + color: Constants.periodPlanner, + ), + TableCalendar( + focusedDay: _focusedDay, + firstDay: DateTime(2021), + lastDay: DateTime(2100), + rangeStartDay: _rangeStart, + rangeEndDay: _rangeEnd, + onRangeSelected: (start, end, focusedDay) { + setState(() { + _rangeStart = start; + _rangeEnd = end; + _focusedDay = focusedDay; + }); + }, + calendarStyle: const CalendarStyle( + todayDecoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + rangeStartDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeEndDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeHighlightColor: Constants.periodPlanner, + selectedDecoration: BoxDecoration( + color: Constants.periodPlanner, + shape: BoxShape.circle, + ), + ), + headerStyle: const HeaderStyle( + formatButtonVisible: false, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index dfe337fe..6d0b0410 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -50,12 +50,14 @@ class _PeriodPlannerScreenState extends State { _periodEnd = latestCycle.periodEnd; _ovulationDate = latestCycle.ovulation; _nextPeriodStart = latestCycle.predictedPeriodStart; - _nextPeriodEnd = latestCycle.predictedPeriodEnd; + _nextPeriodEnd = latestCycle.predictedPeriodEnd; + + //_autoAddPeriodDay(); } events = EventUtils.generateEvents(cycles); //_updateEvents(); } - + //Method for updating events void _updateEvents() { setState(() { events = EventUtils.generateEvents(cycles); @@ -71,10 +73,17 @@ class _PeriodPlannerScreenState extends State { }); } - - - - + //Method for auto adding the latest predicted period day as the period start + void _autoAddPeriodDay() { + if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { + setState(() { + _periodStart = _nextPeriodStart; + _periodEnd = _nextPeriodEnd; + final Cycle newCycle = predictCycle(_periodStart, _periodEnd); + cycles.add(newCycle); + }); + } + } @override Widget build(BuildContext context) { @@ -286,7 +295,7 @@ class _PeriodPlannerScreenState extends State { if (cycle.periodStart == _periodStart) { cycle.periodEnd = _periodEnd; } - } + } _updateEvents(); printCycles(cycles); diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 608e5f9f..6c62be94 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class PeriodsHistory extends StatefulWidget { const PeriodsHistory({super.key}); @@ -170,8 +172,7 @@ class _PeriodsHistoryState extends State { itemCount: sortedYears.length, itemBuilder: (context, index) { final year = sortedYears[index]; - final cyclesInYear = groupedCycles[year]!; - + final cyclesInYear = groupedCycles[year]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -204,7 +205,15 @@ class _PeriodsHistoryState extends State { ), ), trailing: IconButton( - onPressed: () {}, + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + extra: { + 'startDate': cycle.periodStart, + 'endDate' : cycle.periodEnd, + } + ); + }, icon: const Icon(Icons.arrow_forward_ios), ), ); From b57cf68a53d325ec74327789a35cd0390bce4bc4 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 2 Sep 2024 13:14:24 +0300 Subject: [PATCH 064/140] Ensuring every entry in the period history has its own card and making the calendar in the weekly format static --- .../pages/periodPlannerScreen.dart | 22 +-- .../presentation/pages/periods_history.dart | 133 +++++++++--------- .../presentation/widgets/customCalendar.dart | 130 +++++++++++------ 3 files changed, 162 insertions(+), 123 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 6d0b0410..eb77c887 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -74,16 +74,16 @@ class _PeriodPlannerScreenState extends State { } //Method for auto adding the latest predicted period day as the period start - void _autoAddPeriodDay() { - if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { - setState(() { - _periodStart = _nextPeriodStart; - _periodEnd = _nextPeriodEnd; - final Cycle newCycle = predictCycle(_periodStart, _periodEnd); - cycles.add(newCycle); - }); - } - } + // void _autoAddPeriodDay() { + // if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { + // setState(() { + // _periodStart = _nextPeriodStart; + // _periodEnd = _nextPeriodEnd; + // final Cycle newCycle = predictCycle(_periodStart, _periodEnd); + // cycles.add(newCycle); + // }); + // } + // } @override Widget build(BuildContext context) { @@ -223,7 +223,7 @@ class _PeriodPlannerScreenState extends State { events: events, headerButton: true, inPeriods: inPeriods, - ), + ), ), const SizedBox(height: Constants.SPACING), Stack( diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 6c62be94..58f3fd8a 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -149,82 +149,77 @@ class _PeriodsHistoryState extends State { ), const SizedBox(height: 20), // Card Showing period history - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - child: Padding( - padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), - child: Column( + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: sortedYears.length, + itemBuilder: (context, index) { + final year = sortedYears[index]; + final cyclesInYear = groupedCycles[year]!; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( - "History", - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: Colors.pink, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + "$year", + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), ), - ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: sortedYears.length, - itemBuilder: (context, index) { - final year = sortedYears[index]; - final cyclesInYear = groupedCycles[year]!; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Text( - "$year", - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), + const SizedBox(height: 10), + ...cyclesInYear.reversed.map((cycle) { + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + final cycleDays = cycle.cycleLength; + return Card( + elevation: 4.0, + margin: const EdgeInsets.symmetric(vertical: 8.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: ListTile( + title: Text( + "$start - $end", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, ), - ...cyclesInYear.reversed.map((cycle) { - final start = formatDate(cycle.periodStart); - final end = formatDate(cycle.periodEnd); - final cycleDays = cycle.cycleLength; - return ListTile( - title: Text( - "$start - $end", - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - subtitle: Text( - "Length of cycle: $cycleDays days", - style: const TextStyle( - fontSize: 16.0, - ), - ), - trailing: IconButton( - onPressed: () { - context.goNamed( - RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - extra: { - 'startDate': cycle.periodStart, - 'endDate' : cycle.periodEnd, - } - ); - }, - icon: const Icon(Icons.arrow_forward_ios), - ), + ), + subtitle: Text( + "Length of cycle: $cycleDays days", + style: const TextStyle( + fontSize: 16.0, + ), + ), + trailing: IconButton( + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + extra: { + 'startDate': cycle.periodStart, + 'endDate': cycle.periodEnd, + }, ); - }).toList(), - ], - ); - }, - ), + }, + icon: const Icon(Icons.arrow_forward_ios), + ), + ), + ); + }).toList(), ], - ), - ), + ); + }, ), ], ), diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 45bf6068..ff587c60 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -10,18 +10,21 @@ import 'package:uuid/uuid.dart'; // Function to calculate Average Cycle days int calculateAverageCycleLength(List cycles) { if (cycles.length < 2) { - debugPrint("Not enough cycles to calculate an average, defaulting to 28 days."); + debugPrint( + "Not enough cycles to calculate an average, defaulting to 28 days."); return 28; // Default to 28 if there aren't enough cycles } int totalLength = 0; for (int i = 1; i < cycles.length; i++) { - int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; + int cycleLength = + cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; debugPrint("Cycle Length before adjustment for cycle $i: $cycleLength"); // Cap to a minimum cycle length of 21 days if (cycleLength < 21) { - debugPrint("Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); + debugPrint( + "Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); cycleLength = 26; } @@ -30,10 +33,12 @@ int calculateAverageCycleLength(List cycles) { } int averageCycle = (totalLength / (cycles.length - 1)).round(); - debugPrint("Calculated Average Cycle Length before final check: $averageCycle"); + debugPrint( + "Calculated Average Cycle Length before final check: $averageCycle"); if (averageCycle < 21) { - debugPrint("Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); + debugPrint( + "Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); return 26; } @@ -41,8 +46,6 @@ int calculateAverageCycleLength(List cycles) { return averageCycle; } - - //Function for calculating Average Period days int calculateAveragePeriodLength(List cycles) { if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles @@ -54,13 +57,14 @@ int calculateAveragePeriodLength(List cycles) { } int averagePeriodLength = (totalPeriodLength / cycles.length).round(); if (averagePeriodLength < 3) { - return 4; + return 4; } debugPrint("Total Period Length: $totalPeriodLength"); debugPrint("Number of Cycles: ${cycles.length}"); debugPrint("Average Period Length: $averagePeriodLength"); return averagePeriodLength; } + // DateTime normalizeToMidnight(DateTime dateTime) { // return DateTime(dateTime.year, dateTime.month, dateTime.day); // } @@ -75,8 +79,10 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { // Calculate average period length from the period Start to the Period End int averagePeriodLength = calculateAveragePeriodLength(cycles); - DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength - 1)); - DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); + DateTime predictedPeriodStart = + periodStart.add(Duration(days: averageCycleLength - 1)); + DateTime predictedPeriodEnd = + predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) DateTime ovulation = predictedPeriodStart.subtract(const Duration(days: 14)); @@ -91,45 +97,49 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { : averageCycleLength; // Calculate cycle length only if there are previous cycles //Calculating period Length of each cycle - int periodLength = periodEnd.difference(periodStart).inDays + 1; + int periodLength = periodEnd.difference(periodStart).inDays + 1; return Cycle( - cycleId: cycleId, - periodStart: periodStart, - periodEnd: periodEnd, - fertileStart: fertileStart, - fertileEnd: fertileEnd, - ovulation: ovulation, - predictedPeriodStart: predictedPeriodStart, + cycleId: cycleId, + periodStart: periodStart, + periodEnd: periodEnd, + fertileStart: fertileStart, + fertileEnd: fertileEnd, + ovulation: ovulation, + predictedPeriodStart: predictedPeriodStart, predictedPeriodEnd: predictedPeriodEnd, cycleLength: cycleLength, periodLength: periodLength, ); -} +} + class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; final bool headerButton; final bool? inPeriods; - const CustomCalendar({ + const CustomCalendar({ Key? key, - this.initialFormat = CalendarFormat.month, - required this.events, + this.initialFormat = CalendarFormat.month, + required this.events, this.headerButton = false, this.inPeriods, - }) : super(key: key); + }) : super(key: key); @override _CustomCalendarState createState() => _CustomCalendarState(); } -class _CustomCalendarState extends State{ + +class _CustomCalendarState extends State { late CalendarFormat _calendarFormat; late DateTime _focusedDay; + late DateTime _firstDay; + late DateTime _lastDay; //late Map> _flatEvents; late Map> _filteredEvents; - @override + @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; @@ -139,6 +149,8 @@ class _CustomCalendarState extends State{ _focusedDay = _calendarFormat == CalendarFormat.week ? _getNextPredictedPeriodDate() ?? DateTime.now() : DateTime.now(); + _firstDay = _getFirstEventDate(); + _lastDay = _getLastEventDate(); } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -175,32 +187,65 @@ class _CustomCalendarState extends State{ } return filteredEvents; - } - + } + //Function for getting the focused day DateTime? _getNextPredictedPeriodDate() { - for (var entry in _filteredEvents.entries) { - if (widget.inPeriods == true) { - // Return the first date with a 'Period Day' event - if (entry.value.any((event) => event.title == 'Period Day')) { - return entry.key; + for (var entry in _filteredEvents.entries) { + if (widget.inPeriods == true) { + // Return the first date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + return entry.key; + } + } else { + // Return the first date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + return entry.key; + } } - } else { - // Return the first date with a 'Predicted Period Day' event - if (entry.value.any((event) => event.title == 'Predicted Period Day')) { - return entry.key; + } + return null; + } + + /*Getting the first date to be displayed on the calendar + if the function _getNextPredictedPeriodDate, the start date of the calendar is 2010 + */ + DateTime _getFirstEventDate() { + DateTime? firstEventDate = _getNextPredictedPeriodDate(); + return _calendarFormat == CalendarFormat.week ? firstEventDate ?? DateTime(2010): DateTime(2010); // Fallback to DateTime(2010) if null + } + + /*Getting the last date to be displayed on the calendar + if the function _getNextPredictedPeriodDate, the last date of the calendar is 2100 + */ + DateTime _getLastEventDate() { + DateTime? lastEventDate; + + for (var entry in _filteredEvents.entries.toList().reversed) { + if (widget.inPeriods == true) { + // Return the last date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + lastEventDate = entry.key; + break; + } + } else { + // Return the last date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + lastEventDate = entry.key; + break; + } } } + + return _calendarFormat == CalendarFormat.week ? lastEventDate ?? DateTime(2100): DateTime(2100); // Fallback to DateTime(2100) if null } - return null; -} @override Widget build(BuildContext context) { return TableCalendar( key: ValueKey(widget.events), - firstDay: DateTime(2010), - lastDay: DateTime(2100), + firstDay: _firstDay, + lastDay: _lastDay, focusedDay: _focusedDay, // onDaySelected: (selectedDay, focusedDay) { // setState(() { @@ -213,7 +258,7 @@ class _CustomCalendarState extends State{ }, headerVisible: true, headerStyle: HeaderStyle( - formatButtonVisible: widget.headerButton, + formatButtonVisible: widget.headerButton, ), onFormatChanged: (format) { // Show the modal when the format button is pressed @@ -250,7 +295,7 @@ class _CustomCalendarState extends State{ return null; } final eventList = events.cast(); - + // debugPrint("-----From CustomCalendar------"); // debugPrint('Successfully cast events for date: $date, events: $eventList'); @@ -260,4 +305,3 @@ class _CustomCalendarState extends State{ ); } } - From 29c6b3c1fe63a470a98df55910d417a5bb0c69fe Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 2 Sep 2024 15:51:05 +0300 Subject: [PATCH 065/140] Allowing users to edit their periods however there are some issues to solve since screens are not updating --- .../presentation/pages/editPeriodsScreen.dart | 106 ++++++++++++++++-- .../presentation/pages/logPeriods.dart | 33 +++--- 2 files changed, 113 insertions(+), 26 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 1aa3a59a..f888d068 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,12 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; class EditPeriods extends StatefulWidget { final DateTime? initialStartDate; final DateTime? initialEndDate; - const EditPeriods({super.key, this.initialStartDate, this.initialEndDate}); + const EditPeriods( + {super.key, this.initialStartDate, this.initialEndDate}); @override State createState() => _EditPeriodsState(); @@ -17,17 +22,50 @@ class _EditPeriodsState extends State { DateTime? _rangeStart; DateTime? _rangeEnd; - @override + @override void initState() { super.initState(); - + _focusedDay = widget.initialStartDate ?? DateTime.now(); _rangeStart = widget.initialStartDate; _rangeEnd = widget.initialEndDate; } + void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { + setState(() { + _rangeStart = start; + _rangeEnd = end; + _focusedDay = focusedDay ?? _focusedDay; + }); + } + + //Function for updating the entries in the list database + void _updateCycle() { + if (_rangeStart != null && _rangeEnd != null) { + //Finding the current cycle to update + Cycle currentCycle = cycles.firstWhere( + (cycle) => + cycle.periodStart == widget.initialStartDate && + cycle.periodEnd == widget.initialEndDate, + ); + + // Predict the new cycle based on the updated period start and end dates + Cycle updatedCycle = predictCycle(_rangeStart!, _rangeEnd!); + + //Replace the old cycle with the updated one + int index = cycles.indexOf(currentCycle); + cycles[index] = updatedCycle; + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Periods updated successfully!')), + ); + Navigator.pop(context); + } + } + @override Widget build(BuildContext context) { + final theme = Theme.of(context); return Scaffold( body: Column( children: [ @@ -41,13 +79,8 @@ class _EditPeriodsState extends State { lastDay: DateTime(2100), rangeStartDay: _rangeStart, rangeEndDay: _rangeEnd, - onRangeSelected: (start, end, focusedDay) { - setState(() { - _rangeStart = start; - _rangeEnd = end; - _focusedDay = focusedDay; - }); - }, + rangeSelectionMode: RangeSelectionMode.toggledOn, + onRangeSelected: _onRangeSelected, calendarStyle: const CalendarStyle( todayDecoration: BoxDecoration( color: Colors.blue, @@ -71,8 +104,59 @@ class _EditPeriodsState extends State { formatButtonVisible: false, ), ), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // if (_startDate != null) { + // final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date + // _updateOrAddCycle(_startDate!, endDate); + // printCycles(cycles); + // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + // } else { + // ScaffoldMessenger.of(context).showSnackBar( + // const SnackBar(content: Text('Please select your Period start and end dates.')), + // ); + // } + if (_rangeStart == null || _rangeEnd == null) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Invalid Selection'), + content: const Text('Please select both start and end of your periods!!'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('OK'), + ), + ], + ), + ); + } else { + _updateCycle(); + context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); + } + }, + child: Text( + 'Apply', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), + ), ], ), ); } -} \ No newline at end of file +} diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 5d7dc983..8eccbc25 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -43,6 +43,7 @@ class _LogPeriodScreenState extends State { DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); //late Map> _filteredEvents; + //final latestCycle = cycles.last; final bool _isNewUser = cycles.isEmpty; int averagePeriods = calculateAveragePeriodLength(cycles); @@ -51,13 +52,9 @@ class _LogPeriodScreenState extends State { void initState() { super.initState(); if (!_isNewUser) { - //_filteredEvents = _filterEventsForLatestCycle(); _initializePredictedPeriodRange(); _setFocusedDayForRegularUser(); } - // else { - // _filteredEvents = {}; - // } } // Map> _filterEventsForLatestCycle() { @@ -100,8 +97,7 @@ class _LogPeriodScreenState extends State { // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day - return - difference <= 7; // Ensure the range does not exceed 7 days + return difference <= 7; // Ensure the range does not exceed 7 days } void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { @@ -129,8 +125,8 @@ class _LogPeriodScreenState extends State { }); } } - //Function to handle adding and updating log entries in list Database - void _updateOrAddCycle(DateTime start, [DateTime? end]) { + //Function to handle adding log entries in list Database + void addCycle(DateTime start, [DateTime? end]) { // If end date is not provided, set it to the start date end ??= start; @@ -184,23 +180,30 @@ class _LogPeriodScreenState extends State { final theme = Theme.of(context); return Scaffold( body: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ CustomAppBar( title: "Enter Periods 📅", - subTitle: _isNewUser - ? "Please enter your previous period start and end date." - : "Please enter when your Periods have started", color: Constants.periodPlanner.withOpacity(1.0), ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + _isNewUser + ? "Please enter your previous period start and end date." + : "Please enter when your Periods have started", + style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + ), + ), TableCalendar( focusedDay: _focusedDay, firstDay: DateTime(2021), lastDay: DateTime(2100), rangeStartDay: _startDate, - rangeEndDay: _isNewUser ? _endDate : _endDate, + rangeEndDay: _endDate, onRangeSelected: _isNewUser ? _onRangeSelected : null, onDaySelected: _isNewUser ? null : _onDaySelected, - rangeSelectionMode: _isNewUser ? RangeSelectionMode.toggledOn : RangeSelectionMode.toggledOn, + rangeSelectionMode: RangeSelectionMode.toggledOn, // onPageChanged: (focusedDay) { // _focusedDay = focusedDay; @@ -251,8 +254,8 @@ class _LogPeriodScreenState extends State { ), onPressed: () { if (_startDate != null) { - final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date - _updateOrAddCycle(_startDate!, endDate); + final endDate = _endDate ?? _startDate!.add(const Duration(days: 1)); // The else statement handles where a period only happens for a single day hence the end date will be same day as start date + addCycle(_startDate!, endDate); printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); } else { From 6ba97def2e2fd0455082e2ccbd5fec7b1555d1f1 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 6 Sep 2024 07:56:42 +0300 Subject: [PATCH 066/140] :construction: Add insight --- assets/data/self_screening_insight.json | 59 ++++++++++ assets/images/insight_board.svg | 36 ++++++ lib/src/app/navigation/app_router.dart | 20 +++- .../common/data/models/announcement.dart | 1 + .../data/models/announcement.freezed.dart | 25 ++++- .../common/data/models/announcement.g.dart | 2 + .../common/presentation/pages/blog.dart | 2 +- .../data/providers/insight_provider.dart | 12 ++ .../data/repositories/insight_repository.dart | 12 ++ .../data/services/insight_service.dart | 18 +++ .../presentation/pages/bpInsightScreen.dart | 104 ++++++++++++++++++ .../presentation/pages/insight_screen.dart | 96 ++++++++++++++++ .../{ => pages}/self_screening_menu.dart | 51 +++++---- lib/src/utils/routes.dart | 3 + 14 files changed, 415 insertions(+), 26 deletions(-) create mode 100644 assets/data/self_screening_insight.json create mode 100644 assets/images/insight_board.svg create mode 100644 lib/src/features/self_screening/data/providers/insight_provider.dart create mode 100644 lib/src/features/self_screening/data/repositories/insight_repository.dart create mode 100644 lib/src/features/self_screening/data/services/insight_service.dart create mode 100644 lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart create mode 100644 lib/src/features/self_screening/presentation/pages/insight_screen.dart rename lib/src/features/self_screening/presentation/{ => pages}/self_screening_menu.dart (70%) diff --git a/assets/data/self_screening_insight.json b/assets/data/self_screening_insight.json new file mode 100644 index 00000000..d20d02c9 --- /dev/null +++ b/assets/data/self_screening_insight.json @@ -0,0 +1,59 @@ +[ + { + "id": "1", + "image": "assets/images/Calendar-home.svg", + "source": "assets/images/appointment-empty-boy.svg", + "header": "Insight", + "title": "What is blood pressure", + "description": "Need to reschedule? No worries! Life happens, and we're here to make it easy. Just let us know when works best for you, and we'll find a new time that fits perfectly. Your health is our priority!\n\n **Importance:** \n- **Flexibility:** It provides you with the flexibility to adjust your appointments according to your changing schedules, making it easier to manage unexpected events or conflicts.\n- **Adherence:** It ensures you keep your appointments\n\n **How to Access:** \n- Open the application and on the future appointment \n- Click reschedule appointment\n- Select preferred date, time and reason for rescheduling request\n- You will receive notification upon approval of your request. \n\n Need to shift your health check? No worries—reschedule in a snap and keep your wellness on track!" + }, + { + "id": "2", + "image": "assets/images/lab-home.svg", + "source": "assets/images/lab-home.svg", + "header": "Insight", + "title": "Details of blood pressure level", + "description": "Get your lab results with ease—your health insights are just a click away!\n\n **Importance:** \n- **Timely Information:** Quick access to lab results enables you to make informed decisions promptly, which is essential for timely treatment and intervention.\n- **Empowerment:** It empowers you by giving them direct access to your health information, fostering a sense of ownership and engagement in your healthcare journey.\n\n **How to Access:** \n- Go to Lab results module under apps \n- View Lab results trends and line list \n\nAccess to lab results is an essential aspect of modern healthcare, contributing to your empowerment, better care, and improved health outcomes!" + }, + { + "id": "3", + "image": "assets/images/insight_board.svg", + "source": "assets/images/insight_board.svg", + "header": "Insight", + "title": "Disclaimer", + "description": "Self-screening is intended for monitoring and tracking your health, not for diagnosing medical conditions.\n\n\nUsers can input their daily measurement readings into the app, which then generates charts and graphs to help monitor their health based on the data provided. Please note that the app does not measure the readings itself but only records and tracks the user-entered data.\n\nThe app currently draws information from reputable sources such as the CDC and WHO. However, please be aware that the data provided may not always reflect real-life situations accurately.\n\nThe app is intended for informational purposes only and is not a medical device. Users experiencing health issues should consult with doctors or healthcare professionals for appropriate advice and treatment." + }, + { + "id": "4", + "image": "assets/images/Hospital building-bro.svg", + "source": "assets/images/Hospital building-bro.svg", + "header": "Insight", + "title": "Some other facts of blood pressure", + "description": "Need your meds delivered? Request a drug drop with just a click and have your prescriptions conveniently brought to your door!\n\n **Importance:** \n- **Convenience:** Save time and effort by bringing medications directly to your door.\n- **Adherence:** By ensuring that you receive medications on time, dawa drop feature help improve adherence to prescribed treatment plans and reduce missed doses.\n- **Accessibility:** We provide access to medications for individuals with mobility issues, those living in remote areas, or those who lack transportation.\n- **Privacy:** Dawa Drop offers a discreet way to receive prescriptions, which can be important for individuals who prefer to keep their health conditions and medications private.\n\n **How to Access:**\n- Go to Dawa Drop module under apps\n- Select Request for Drug Delivery\n- Select Refill appointment drug\n- Fill the drug request form and submit.\n- Your will receive notification on the progress of your request till delivery.\nOverall, drug delivery drops enhance the convenience, safety, and accessibility of medications, improving overall patient care and satisfaction!" + }, + { + "id": "5", + "image": "assets/images/Medical prescription-bro.svg", + "source": "assets/images/Medical prescription-bro.svg", + "header": "Insight", + "title": "How to prevent and manage low blood pressure", + "description": "Need to find a facility? Our directory makes it easy—locate contacts and services at your fingertips!\n\n**Importance:**\n- **Communication:** Facilitates better communication by providing contact information for various facility ensuring that inquiries are directed to the right place.\n- **Emergency:** Having a clear directory helps quickly locate nearby facilities incase of emergencies.\n\n**How to Access:**\n- Go to Facility Directory module under apps\n- View Search facility by name or MFL code and view results\n- Click on the contacts details for call\nDiscover what you need with ease—our facility directory puts every department and service right at your fingertips!" + }, + { + "id": "6", + "image": "assets/images/Medical prescription-bro.svg", + "source": "assets/images/Medical prescription-bro.svg", + "header": "Insight", + "title": "Knowledge of blood pressure drugs", + "description": "Need to find a facility? Our directory makes it easy—locate contacts and services at your fingertips!\n\n**Importance:**\n- **Communication:** Facilitates better communication by providing contact information for various facility ensuring that inquiries are directed to the right place.\n- **Emergency:** Having a clear directory helps quickly locate nearby facilities incase of emergencies.\n\n**How to Access:**\n- Go to Facility Directory module under apps\n- View Search facility by name or MFL code and view results\n- Click on the contacts details for call\nDiscover what you need with ease—our facility directory puts every department and service right at your fingertips!" + } +, + { + "id": "7", + "image": "assets/images/Medical prescription-bro.svg", + "source": "assets/images/Medical prescription-bro.svg", + "header": "Insight", + "title": "Foods to help manage high and low blood pressure", + "description": "Need to find a facility? Our directory makes it easy—locate contacts and services at your fingertips!\n\n**Importance:**\n- **Communication:** Facilitates better communication by providing contact information for various facility ensuring that inquiries are directed to the right place.\n- **Emergency:** Having a clear directory helps quickly locate nearby facilities incase of emergencies.\n\n**How to Access:**\n- Go to Facility Directory module under apps\n- View Search facility by name or MFL code and view results\n- Click on the contacts details for call\nDiscover what you need with ease—our facility directory puts every department and service right at your fingertips!" + } +] \ No newline at end of file diff --git a/assets/images/insight_board.svg b/assets/images/insight_board.svg new file mode 100644 index 00000000..697f0e9e --- /dev/null +++ b/assets/images/insight_board.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 346d022d..673dd240 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -67,7 +67,9 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/periodPl import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlanner.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; -import 'package:nishauri/src/features/self_screening/presentation/self_screening_menu.dart'; +import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; +import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; +import 'package:nishauri/src/features/self_screening/presentation/pages/self_screening_menu.dart'; import 'package:nishauri/src/features/treatment_support/presentation/pages/TreatmentSupport.dart'; import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/features/user/presentation/pages/ProfileScreen.dart'; @@ -522,6 +524,22 @@ final List selfScreeningRoutes = [ return BloodSugarScreen(); }, ), + GoRoute( + name: RouteNames.INSIGHT, + path: 'insight', + builder: (BuildContext context, GoRouterState state) { + return const InsightScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.BP_INSIGHT, + path: 'bp-insight', + builder: (BuildContext context, GoRouterState state) { + return const BpInsightScreen(); + }, + ), + ] + ), ]; final List hivProgramRoutes = [ diff --git a/lib/src/features/common/data/models/announcement.dart b/lib/src/features/common/data/models/announcement.dart index cbfb61b9..236f53ba 100644 --- a/lib/src/features/common/data/models/announcement.dart +++ b/lib/src/features/common/data/models/announcement.dart @@ -10,6 +10,7 @@ class Announcement with _$Announcement { required String image, required String source, required String title, + String? header, String? description, }) = _Announcement; diff --git a/lib/src/features/common/data/models/announcement.freezed.dart b/lib/src/features/common/data/models/announcement.freezed.dart index 86629d39..deba9606 100644 --- a/lib/src/features/common/data/models/announcement.freezed.dart +++ b/lib/src/features/common/data/models/announcement.freezed.dart @@ -24,6 +24,7 @@ mixin _$Announcement { String get image => throw _privateConstructorUsedError; String get source => throw _privateConstructorUsedError; String get title => throw _privateConstructorUsedError; + String? get header => throw _privateConstructorUsedError; String? get description => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @@ -43,6 +44,7 @@ abstract class $AnnouncementCopyWith<$Res> { String image, String source, String title, + String? header, String? description}); } @@ -63,6 +65,7 @@ class _$AnnouncementCopyWithImpl<$Res, $Val extends Announcement> Object? image = null, Object? source = null, Object? title = null, + Object? header = freezed, Object? description = freezed, }) { return _then(_value.copyWith( @@ -82,6 +85,10 @@ class _$AnnouncementCopyWithImpl<$Res, $Val extends Announcement> ? _value.title : title // ignore: cast_nullable_to_non_nullable as String, + header: freezed == header + ? _value.header + : header // ignore: cast_nullable_to_non_nullable + as String?, description: freezed == description ? _value.description : description // ignore: cast_nullable_to_non_nullable @@ -103,6 +110,7 @@ abstract class _$$AnnouncementImplCopyWith<$Res> String image, String source, String title, + String? header, String? description}); } @@ -121,6 +129,7 @@ class __$$AnnouncementImplCopyWithImpl<$Res> Object? image = null, Object? source = null, Object? title = null, + Object? header = freezed, Object? description = freezed, }) { return _then(_$AnnouncementImpl( @@ -140,6 +149,10 @@ class __$$AnnouncementImplCopyWithImpl<$Res> ? _value.title : title // ignore: cast_nullable_to_non_nullable as String, + header: freezed == header + ? _value.header + : header // ignore: cast_nullable_to_non_nullable + as String?, description: freezed == description ? _value.description : description // ignore: cast_nullable_to_non_nullable @@ -156,6 +169,7 @@ class _$AnnouncementImpl with DiagnosticableTreeMixin implements _Announcement { required this.image, required this.source, required this.title, + this.header, this.description}); factory _$AnnouncementImpl.fromJson(Map json) => @@ -170,11 +184,13 @@ class _$AnnouncementImpl with DiagnosticableTreeMixin implements _Announcement { @override final String title; @override + final String? header; + @override final String? description; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'Announcement(id: $id, image: $image, source: $source, title: $title, description: $description)'; + return 'Announcement(id: $id, image: $image, source: $source, title: $title, header: $header, description: $description)'; } @override @@ -186,6 +202,7 @@ class _$AnnouncementImpl with DiagnosticableTreeMixin implements _Announcement { ..add(DiagnosticsProperty('image', image)) ..add(DiagnosticsProperty('source', source)) ..add(DiagnosticsProperty('title', title)) + ..add(DiagnosticsProperty('header', header)) ..add(DiagnosticsProperty('description', description)); } @@ -198,6 +215,7 @@ class _$AnnouncementImpl with DiagnosticableTreeMixin implements _Announcement { (identical(other.image, image) || other.image == image) && (identical(other.source, source) || other.source == source) && (identical(other.title, title) || other.title == title) && + (identical(other.header, header) || other.header == header) && (identical(other.description, description) || other.description == description)); } @@ -205,7 +223,7 @@ class _$AnnouncementImpl with DiagnosticableTreeMixin implements _Announcement { @JsonKey(ignore: true) @override int get hashCode => - Object.hash(runtimeType, id, image, source, title, description); + Object.hash(runtimeType, id, image, source, title, header, description); @JsonKey(ignore: true) @override @@ -227,6 +245,7 @@ abstract class _Announcement implements Announcement { required final String image, required final String source, required final String title, + final String? header, final String? description}) = _$AnnouncementImpl; factory _Announcement.fromJson(Map json) = @@ -241,6 +260,8 @@ abstract class _Announcement implements Announcement { @override String get title; @override + String? get header; + @override String? get description; @override @JsonKey(ignore: true) diff --git a/lib/src/features/common/data/models/announcement.g.dart b/lib/src/features/common/data/models/announcement.g.dart index 46374ddc..3144df4f 100644 --- a/lib/src/features/common/data/models/announcement.g.dart +++ b/lib/src/features/common/data/models/announcement.g.dart @@ -12,6 +12,7 @@ _$AnnouncementImpl _$$AnnouncementImplFromJson(Map json) => image: json['image'] as String, source: json['source'] as String, title: json['title'] as String, + header: json['header'] as String?, description: json['description'] as String?, ); @@ -21,5 +22,6 @@ Map _$$AnnouncementImplToJson(_$AnnouncementImpl instance) => 'image': instance.image, 'source': instance.source, 'title': instance.title, + 'header': instance.header, 'description': instance.description, }; diff --git a/lib/src/features/common/presentation/pages/blog.dart b/lib/src/features/common/presentation/pages/blog.dart index 366957ec..bda33cef 100644 --- a/lib/src/features/common/presentation/pages/blog.dart +++ b/lib/src/features/common/presentation/pages/blog.dart @@ -19,7 +19,7 @@ class BlogPostScreen extends StatelessWidget { body: Column( children: [ CustomAppBar( - title: "Did you know 💡", + title: announcement.header?? "Did you know 💡", color: Constants.labResultsColor.withOpacity(0.5),), Expanded( diff --git a/lib/src/features/self_screening/data/providers/insight_provider.dart b/lib/src/features/self_screening/data/providers/insight_provider.dart new file mode 100644 index 00000000..e78d73af --- /dev/null +++ b/lib/src/features/self_screening/data/providers/insight_provider.dart @@ -0,0 +1,12 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/common/data/models/announcement.dart'; +import 'package:nishauri/src/features/common/data/repositories/announceent_repository.dart'; +import 'package:nishauri/src/features/common/data/services/announcement_service.dart'; +import 'package:nishauri/src/features/self_screening/data/repositories/insight_repository.dart'; +import 'package:nishauri/src/features/self_screening/data/services/insight_service.dart'; + +final insightProvider = FutureProvider>((ref) async { + final service = InsightService(); + final repo = InsightRepository(service); + return await repo.getInsights(); +}); \ No newline at end of file diff --git a/lib/src/features/self_screening/data/repositories/insight_repository.dart b/lib/src/features/self_screening/data/repositories/insight_repository.dart new file mode 100644 index 00000000..d0214780 --- /dev/null +++ b/lib/src/features/self_screening/data/repositories/insight_repository.dart @@ -0,0 +1,12 @@ +import 'package:nishauri/src/features/common/data/models/announcement.dart'; +import 'package:nishauri/src/features/self_screening/data/services/insight_service.dart'; + +class InsightRepository { + final InsightService _service; + + InsightRepository(this._service); + + Future> getInsights() async { + return await _service.getInsights(); + } +} diff --git a/lib/src/features/self_screening/data/services/insight_service.dart b/lib/src/features/self_screening/data/services/insight_service.dart new file mode 100644 index 00000000..7825b353 --- /dev/null +++ b/lib/src/features/self_screening/data/services/insight_service.dart @@ -0,0 +1,18 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:nishauri/src/features/common/data/models/announcement.dart'; +import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; +import 'package:nishauri/src/utils/helpers.dart'; + +class InsightService extends HTTPService { + Future> getInsights() async { + final data = await loadJsonData("assets/data/self_screening_insight.json"); + final json = jsonDecode(data); + final announce = json + .map((an) => Announcement.fromJson(Map.from(an))).toList(); + + log("$announce"); + return [...announce]; + } +} diff --git a/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart b/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart new file mode 100644 index 00000000..0874b889 --- /dev/null +++ b/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/utils/helpers.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +class BpInsightScreen extends HookConsumerWidget { + const BpInsightScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final bpInsightAsync = ref.watch(insightProvider); + + return bpInsightAsync.when( + data: (data) { + if (data.isEmpty) { + return const BackgroundImageWidget( + svgImage: "assets/images/appointments-empty.svg", + notFoundText: "No Content", + ); + } + + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomAppBar( + title: "Blood Pressure Awhearness🌡️", + color: Constants.bmiCalculatorColor, + ), + Expanded( + child: ListView.builder( + itemCount: data.length, + itemBuilder: (BuildContext context, int index) { + final insight = data[index]; + return Column( + children: [ + const Divider(), + InkWell( + onTap: () { + context.goNamed(RouteNames.BLOG_POST, extra: insight); + }, + child: Card( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + SvgPicture.asset( + insight.image, + width: double.infinity, + height: getOrientationAwareScreenSize(context).height * 0.05, + fit: BoxFit.cover, + ), + const SizedBox(width: Constants.SPACING), + Text( + insight.title ?? '', + style: theme.textTheme.titleSmall, + ), + ], + ), + ], + ), + ), + ), + ), + ], + ); + }, + ), + ), + ], + ), + ); + }, + error: (error, _) => BackgroundImageWidget( + svgImage: 'assets/images/background.svg', + notFoundText: error.toString(), + ), + loading: () => Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Loading insight content.", + style: theme.textTheme.headline6, + ), + const SizedBox(height: Constants.SPACING * 2), + const CircularProgressIndicator(), + ], + ), + ), + ); + } +} diff --git a/lib/src/features/self_screening/presentation/pages/insight_screen.dart b/lib/src/features/self_screening/presentation/pages/insight_screen.dart new file mode 100644 index 00000000..7432226f --- /dev/null +++ b/lib/src/features/self_screening/presentation/pages/insight_screen.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/common/presentation/pages/HomeScreen.dart'; +import 'package:nishauri/src/features/dawa_drop/presentation/pages/program_appointments.dart'; +import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class InsightScreen extends StatelessWidget { + const InsightScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final pages = [ + const BpInsightScreen(), + const ProgramAppointmentsScreen(), + const ProgramAppointmentsScreen(), + const ProgramAppointmentsScreen(), + ]; + + final theme = Theme.of(context); + + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const CustomAppBar( + title: "Insight 📖", + subTitle: "Unlock your health insights with knowledge on different self-screening tools", + color: Constants.appointmentsColor, + ), + Expanded( + child: ListView.builder( + itemCount: pages.length, + itemBuilder: (BuildContext context, int index) { + return GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => pages[index]), + ); + }, + child: Column( + children: [ + Card( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + index == 0 + ? Icons.calculate_outlined + : index == 1 + ? Icons.trending_up + : index == 2 + ? Icons.bloodtype_outlined + : Icons.calendar_month_sharp, + color: index == 0 + ? Constants.bmiCalculatorColor + : index == 1 + ? Constants.bpShortCutBgColor + : index == 2 + ? Constants.bloodSugarColor + : Constants.periodPlannerShortcutBgColor, + ), + const SizedBox(width: Constants.SPACING), + Text( + index == 0 + ? 'BMI Calculator' + : index == 1 + ? 'Blood Pressure Monitor' + : index == 2 + ? 'Blood Sugar Monitor' + : 'Period Planner', + style: theme.textTheme.titleMedium, + ), + ], + ), + ], + ), + ), + ), + const SizedBox(height: Constants.SPACING), + ], + ), + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/features/self_screening/presentation/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart similarity index 70% rename from lib/src/features/self_screening/presentation/self_screening_menu.dart rename to lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 442da579..c11d61f6 100644 --- a/lib/src/features/self_screening/presentation/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/features/common/presentation/pages/HomeScreen.dart'; -import 'package:nishauri/src/features/common/presentation/pages/SettingsScreen.dart'; +import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; @@ -45,19 +45,14 @@ List _menuItems(BuildContext context) => [ ), ]; -class SelfScreening extends StatefulWidget { +class SelfScreening extends HookConsumerWidget { const SelfScreening({super.key}); @override - _SelfScreeningState createState() => _SelfScreeningState(); -} - -class _SelfScreeningState extends State { - - @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); final _items = _menuItems(context); + final insightAsync = ref.watch(insightProvider); return Scaffold( body: Column( @@ -83,23 +78,35 @@ class _SelfScreeningState extends State { floatingActionButton: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ + // insightAsync.when( + // data: (data){ + // final insight = data.map((e) => e).where((element) => element.id=="3").single; + // return FloatingActionButton( + // tooltip: "Insight", + // hoverColor: Constants.bmiCalculatorShortcutBgColor, + // onPressed: () { + // context.goNamed(RouteNames.BLOG_POST, extra: insight); + // + // }, + // backgroundColor: Constants.bmiCalculatorShortcutBgColor, + // child: const Icon(Icons.insights), + // ); + // }, + // error: (error, _) => Container(), + // loading: () => Container(), + // ), + SizedBox(height: 10), FloatingActionButton( - tooltip: "Insight", + tooltip: "Module insight", hoverColor: Constants.bmiCalculatorShortcutBgColor, - onPressed: () { }, - backgroundColor: Constants.bmiCalculatorShortcutBgColor, - child: const Icon(Icons.insights), - ), - SizedBox(height: 10,), - FloatingActionButton( - tooltip: "Settings", - hoverColor: Constants.bmiCalculatorShortcutBgColor, - onPressed: () { }, + onPressed: () { + context.goNamed(RouteNames.INSIGHT); + }, backgroundColor: Constants.bmiCalculatorShortcutBgColor, child: const Icon(Icons.settings_applications_sharp), ), ], - ) + ), ); } } diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index a61b9779..d77690ad 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -70,6 +70,8 @@ class RouteNames { static const CHAT_HCW = "chat-hcw"; static const CHAT_DETAIL = "chat-detail"; static const CHAT_USER = "chat-user"; + static const INSIGHT = "insight"; + static const BP_INSIGHT = "bp-insight"; } @@ -105,6 +107,7 @@ class MenuItemNames { static const PERIOD_PLANNER = "Period Planner"; static const CHAT_HCW = "Chat with HCW"; static const CHAT_DETAIL = "Chat Detail"; + static const INSIGHT = "Insight"; } From a2b68bb56693adb891e573e240e499c2abccc8ba Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 6 Sep 2024 16:50:40 +0300 Subject: [PATCH 067/140] Ensured the state updates in all the screens in use when user edits periods and also worked on a highlighter for the period events --- lib/src/app/navigation/app_router.dart | 72 +++++++++---------- .../data/providers/cycles_provider.dart | 25 +++++++ .../presentation/pages/editPeriodsScreen.dart | 31 +++++--- .../presentation/pages/logPeriods.dart | 34 ++++----- .../pages/periodPlannerScreen.dart | 41 +++++++---- .../presentation/pages/periods_history.dart | 10 ++- .../presentation/widgets/eventsMaker.dart | 57 ++++++++++----- .../presentation/self_screening_menu.dart | 11 ++- 8 files changed, 178 insertions(+), 103 deletions(-) create mode 100644 lib/src/features/period_planner/data/providers/cycles_provider.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 0941f8b5..68834b80 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -393,42 +393,6 @@ final List secureRoutes = [ }, ) ]), - //Routes for the Period Planner - GoRoute( - name: RouteNames.PERIOD_PLANNER_SCREEN, - path: 'period-planner-screen', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerScreen(); - }, - routes: [ - GoRoute( - name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, - path: 'period-planner-period-history', - builder: (BuildContext context, GoRouterState state) { - return const PeriodsHistory(); - }, - routes: [ - GoRoute( - name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - path: 'period-planner-edit-periods', - builder: (BuildContext context, GoRouterState state) { - final startDate = state.extra != null ? (state.extra as Map)['startDate'] as DateTime : null; - final endDate = state.extra != null ? (state.extra as Map)['endDate'] as DateTime : null; - return EditPeriods(initialStartDate: startDate, initialEndDate: endDate); - }, - ), - ], - ), - ], - ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, - path: 'period-planner-log-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return LogPeriodScreen(); - }, - ), - ]; final List openRoutes = [ @@ -505,6 +469,42 @@ final List selfScreeningRoutes = [ return BloodSugarScreen(); }, ), + //Routes for the Period Planner + GoRoute( + name: RouteNames.PERIOD_PLANNER_SCREEN, + path: 'period-planner-screen', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlannerScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, + path: 'period-planner-period-history', + builder: (BuildContext context, GoRouterState state) { + return const PeriodsHistory(); + }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + path: 'period-planner-edit-periods', + builder: (BuildContext context, GoRouterState state) { + final startDate = state.extra != null ? (state.extra as Map)['startDate'] as DateTime : null; + final endDate = state.extra != null ? (state.extra as Map)['endDate'] as DateTime : null; + final id = (state.extra! as Map)['id'] as String; + return EditPeriods(initialStartDate: startDate, initialEndDate: endDate, cycleId: id,); + }, + ), + ], + ), + ], + ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return LogPeriodScreen(); + }, + ), ]; final List hivProgramRoutes = [ diff --git a/lib/src/features/period_planner/data/providers/cycles_provider.dart b/lib/src/features/period_planner/data/providers/cycles_provider.dart new file mode 100644 index 00000000..97d31da2 --- /dev/null +++ b/lib/src/features/period_planner/data/providers/cycles_provider.dart @@ -0,0 +1,25 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../models/cycle.dart'; + +final cyclesProvider = StateNotifierProvider>((ref) { + return CyclesNotifier(); +}); + +class CyclesNotifier extends StateNotifier> { + CyclesNotifier():super(cycles); + + void addCycle(Cycle newCycle) { + state = [...state, newCycle]; + } + + void updatedCycle(String cycleId, Cycle updatedCycle) { + state = [ + for (final cycle in state) + if (cycle.cycleId == cycleId) updatedCycle else cycle + ]; + } + + // void removeCycle(String cycleId) { + // state = state.where((cycle) => cycle.cycleId != cycleId).toList(); + // } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index f888d068..2e8cfd3e 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,23 +1,27 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/logPeriods.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; -class EditPeriods extends StatefulWidget { +class EditPeriods extends ConsumerStatefulWidget { final DateTime? initialStartDate; final DateTime? initialEndDate; + final String? cycleId; const EditPeriods( - {super.key, this.initialStartDate, this.initialEndDate}); + {super.key, this.initialStartDate, this.initialEndDate, this.cycleId}); @override - State createState() => _EditPeriodsState(); + ConsumerState createState() => _EditPeriodsState(); } -class _EditPeriodsState extends State { +class _EditPeriodsState extends ConsumerState { late DateTime _focusedDay; DateTime? _rangeStart; DateTime? _rangeEnd; @@ -42,24 +46,28 @@ class _EditPeriodsState extends State { //Function for updating the entries in the list database void _updateCycle() { if (_rangeStart != null && _rangeEnd != null) { - //Finding the current cycle to update + // Finding the current cycle using cycleId instead of periodStart and periodEnd Cycle currentCycle = cycles.firstWhere( (cycle) => - cycle.periodStart == widget.initialStartDate && - cycle.periodEnd == widget.initialEndDate, + cycle.cycleId == widget.cycleId, // Use cycleId for identification ); // Predict the new cycle based on the updated period start and end dates - Cycle updatedCycle = predictCycle(_rangeStart!, _rangeEnd!); + Cycle updatedCycle = predictCycle(_rangeStart!, _rangeEnd!, cycleId: currentCycle.cycleId); - //Replace the old cycle with the updated one + ref.read(cyclesProvider.notifier).updatedCycle(currentCycle.cycleId, updatedCycle); + + // Replace the old cycle with the updated one using index int index = cycles.indexOf(currentCycle); cycles[index] = updatedCycle; + debugPrint("Updated Cycle Length: ${updatedCycle.cycleLength}"); + printCycles(cycles); + ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Periods updated successfully!')), ); - Navigator.pop(context); + Navigator.pop(context, true); } } @@ -129,7 +137,8 @@ class _EditPeriodsState extends State { context: context, builder: (context) => AlertDialog( title: const Text('Invalid Selection'), - content: const Text('Please select both start and end of your periods!!'), + content: const Text( + 'Please select both start and end of your periods!!'), actions: [ TextButton( onPressed: () { diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 8eccbc25..f5da977e 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; @@ -31,26 +33,28 @@ void printCycles(List cycles) { //This is the screen the user interacts when they are logging their Period Days -class LogPeriodScreen extends StatefulWidget { +class LogPeriodScreen extends ConsumerStatefulWidget { @override - State createState() => _LogPeriodScreenState(); + ConsumerState createState() => _LogPeriodScreenState(); } -class _LogPeriodScreenState extends State { +class _LogPeriodScreenState extends ConsumerState { DateTime _focusedDay = DateTime.now(); DateTime? _startDate; DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); //late Map> _filteredEvents; //final latestCycle = cycles.last; - final bool _isNewUser = cycles.isEmpty; + bool _isNewUser = cycles.isEmpty; int averagePeriods = calculateAveragePeriodLength(cycles); @override void initState() { super.initState(); + final cycles = ref.read(cyclesProvider); + _isNewUser = cycles.isEmpty; if (!_isNewUser) { _initializePredictedPeriodRange(); _setFocusedDayForRegularUser(); @@ -76,12 +80,14 @@ class _LogPeriodScreenState extends State { // } void _initializePredictedPeriodRange() { + final cycles = ref.read(cyclesProvider); final latestCycle = cycles.last; _startDate = latestCycle.predictedPeriodStart; _endDate = latestCycle.predictedPeriodEnd; } void _setFocusedDayForRegularUser() { + final cycles = ref.read(cyclesProvider); final latestCycle = cycles.last; _focusedDay = latestCycle.predictedPeriodStart; } @@ -149,6 +155,10 @@ class _LogPeriodScreenState extends State { // If no overlap, add a new cycle final Cycle newCycle = predictCycle(start, end); + + //using riverpod to add the cycle to the state + ref.read(cyclesProvider.notifier).addCycle(newCycle); + cycles.add(newCycle); //_updateEventsForCycle(newCycle); } @@ -204,22 +214,6 @@ class _LogPeriodScreenState extends State { onRangeSelected: _isNewUser ? _onRangeSelected : null, onDaySelected: _isNewUser ? null : _onDaySelected, rangeSelectionMode: RangeSelectionMode.toggledOn, - - // onPageChanged: (focusedDay) { - // _focusedDay = focusedDay; - // }, - // eventLoader: (day) { - // return _filteredEvents[day] ?? []; - // }, - // calendarBuilders: CalendarBuilders( - // markerBuilder: (context, date, events) { - // if (events.isEmpty) { - // return null; - // } - // final eventList = events.cast(); - // return EventsMaker(date: date, events: eventList); - // }, - // ), calendarStyle: const CalendarStyle( todayDecoration: BoxDecoration( color: Colors.blue, diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index eb77c887..576f155d 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -1,8 +1,10 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/logPeriods.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; @@ -21,14 +23,14 @@ import 'package:table_calendar/table_calendar.dart'; date1.month == date2.month && date1.day == date2.day; } -class PeriodPlannerScreen extends StatefulWidget { +class PeriodPlannerScreen extends ConsumerStatefulWidget { const PeriodPlannerScreen({super.key}); @override - State createState() => _PeriodPlannerScreenState(); + ConsumerState createState() => _PeriodPlannerScreenState(); } -class _PeriodPlannerScreenState extends State { +class _PeriodPlannerScreenState extends ConsumerState { DateTime _currentDate = DateTime.now(); late DateTime _periodStart; late DateTime _periodEnd; @@ -40,22 +42,27 @@ class _PeriodPlannerScreenState extends State { @override - void initState() { + void initState() { super.initState(); + // Initialize the state with data from the cycles provider + _updateFromCycles(); + } + + // Listen for state changes from cyclesProvider + void _updateFromCycles() { + final cycles = ref.read(cyclesProvider); - //events = _generateEvents(cycles); if (cycles.isNotEmpty) { Cycle latestCycle = cycles.last; - _periodStart = latestCycle.periodStart; - _periodEnd = latestCycle.periodEnd; - _ovulationDate = latestCycle.ovulation; - _nextPeriodStart = latestCycle.predictedPeriodStart; - _nextPeriodEnd = latestCycle.predictedPeriodEnd; - - //_autoAddPeriodDay(); + setState(() { + _periodStart = latestCycle.periodStart; + _periodEnd = latestCycle.periodEnd; + _ovulationDate = latestCycle.ovulation; + _nextPeriodStart = latestCycle.predictedPeriodStart; + _nextPeriodEnd = latestCycle.predictedPeriodEnd; + events = EventUtils.generateEvents(cycles); + }); } - events = EventUtils.generateEvents(cycles); - //_updateEvents(); } //Method for updating events void _updateEvents() { @@ -87,6 +94,12 @@ class _PeriodPlannerScreenState extends State { @override Widget build(BuildContext context) { + final cycles = ref.watch(cyclesProvider); + + // If cycles are updated, recalculate the events and UI elements + if(cycles.isNotEmpty) { + _updateFromCycles(); + } int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 58f3fd8a..9b5081ad 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -1,20 +1,22 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -class PeriodsHistory extends StatefulWidget { +class PeriodsHistory extends ConsumerStatefulWidget { const PeriodsHistory({super.key}); @override - State createState() => _PeriodsHistoryState(); + ConsumerState createState() => _PeriodsHistoryState(); } -class _PeriodsHistoryState extends State { +class _PeriodsHistoryState extends ConsumerState { final averagePeriod = calculateAveragePeriodLength(cycles); final averageCycles = calculateAverageCycleLength(cycles); @@ -38,6 +40,7 @@ class _PeriodsHistoryState extends State { @override Widget build(BuildContext context) { + final cycles = ref.watch(cyclesProvider); // Group cycles by year and reverse the list to show the latest first final groupedCycles = groupCyclesByYear(cycles); final sortedYears = groupedCycles.keys.toList()..sort((a, b) => b.compareTo(a)); @@ -209,6 +212,7 @@ class _PeriodsHistoryState extends State { extra: { 'startDate': cycle.periodStart, 'endDate': cycle.periodEnd, + 'id': cycle.cycleId, }, ); }, diff --git a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart index 88aec81e..77cda650 100644 --- a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart +++ b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart @@ -22,24 +22,45 @@ class EventsMaker extends StatelessWidget { Widget build(BuildContext context) { //debugPrint("----From EventMaker Class----"); //debugPrint("Coloured Events $events"); - return Positioned( - right: 1, - bottom: 1, - child: Row( - mainAxisSize: MainAxisSize.min, - children: events.map((event) { - Color color = event.color; - return Container( - margin: const EdgeInsets.symmetric(horizontal: 0.5), - width: 7.0, - height: 7.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: color, + // return Positioned( + // right: 20, + // bottom: 1, + // child: Row( + // mainAxisSize: MainAxisSize.min, + // children: events.map((event) { + // Color color = event.color; + // return Container( + // margin: const EdgeInsets.symmetric(horizontal: 0.5), + // width: 7.0, + // height: 7.0, + // decoration: BoxDecoration( + // shape: BoxShape.circle, + // color: color, + // ), + // ); + // }).toList(), + // ), + // ); + + //Whole date highlighted + return Stack( + children: events.map((event) { + return Container( + margin: const EdgeInsets.all(4.0), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: event.color, + ), + alignment: Alignment.center, + child: Text( + date.day.toString(), + style: const TextStyle( + color: Colors.white, + //fontWeight: FontWeight.bold, ), - ); - }).toList(), - ), + ), + ); + }).toList(), ); } -} \ No newline at end of file +} diff --git a/lib/src/features/self_screening/presentation/self_screening_menu.dart b/lib/src/features/self_screening/presentation/self_screening_menu.dart index 1638703c..d56082fa 100644 --- a/lib/src/features/self_screening/presentation/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/self_screening_menu.dart @@ -7,6 +7,8 @@ import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; +import '../../period_planner/data/models/cycle.dart'; + _menuItems(BuildContext context) => [ MenuItem( icon: const Icon(Icons.calculate), @@ -37,7 +39,14 @@ _menuItems(BuildContext context) => [ icon: const Icon(Icons.calendar_month_outlined), shortcutIcon: Icon(Icons.calendar_month_outlined), title: MenuItemNames.PERIOD_PLANNER, - onPressed: () => context.goNamed(MenuItemNames.PERIOD_PLANNER), + onPressed: () { + if(cycles.isEmpty) { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + } + else { + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + } + }, color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), ), ]; From 38aaaf2611360c32f152a72513f5f1df61bba48f Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 9 Sep 2024 10:34:42 +0300 Subject: [PATCH 068/140] program update --- .../presentation/widgets/Greetings.dart | 147 +++++++++++------- 1 file changed, 87 insertions(+), 60 deletions(-) diff --git a/lib/src/features/common/presentation/widgets/Greetings.dart b/lib/src/features/common/presentation/widgets/Greetings.dart index 4d1c5845..150c5f13 100644 --- a/lib/src/features/common/presentation/widgets/Greetings.dart +++ b/lib/src/features/common/presentation/widgets/Greetings.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; @@ -27,8 +29,7 @@ class Greetings extends ConsumerWidget { final programState = ref.watch(userProgramProvider); // Check if the program list is empty or if all programs are inactive - final showUpdateProgram = - programState.when( + final showUpdateProgram = programState.when( data: (programs) => programs.isEmpty || programs.every((program) => program.isActive == false), error: (error, stack) => false, @@ -36,7 +37,7 @@ class Greetings extends ConsumerWidget { ); return Container( - width: double.infinity, // Use double.infinity instead of double.maxFinite + width: double.infinity, padding: const EdgeInsets.all(Constants.SPACING), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -44,7 +45,7 @@ class Greetings extends ConsumerWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: Constants.SMALL_SPACING), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( flex: 2, @@ -92,62 +93,7 @@ class Greetings extends ConsumerWidget { ), if (showUpdateProgram) Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Text( - "Update program", - style: theme.textTheme.bodyLarge?.copyWith( - color: theme.colorScheme.primary, - fontWeight: FontWeight.w400, - ), - ), - ), - IconButton( - icon: const Icon( - Icons.info_outline, - size: 20, - color: Constants.bpBgColor, - ), - onPressed: () { - Dialogs.bottomMaterialDialog( - msg: 'Tap to Choose and Enrol in a Program', - context: context, - color: Constants.dawaDropShortcutBgColor, - title: 'Take Control of Your Health – Join A Program and Start Your Journey Today!', - actions: [ - IconsOutlineButton( - onPressed: () { - context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); - Navigator.of(context).pop(); - }, - text: 'Opt-In', - iconData: Icons.add, - textStyle: TextStyle(color: Colors.white), - color: Constants.programsColor, - iconColor: Colors.white, - ), - IconsButton( - onPressed: () { - Navigator.of(context).pop(); - }, - text: 'Not now', - iconData: Icons.cancel_outlined, - color: Constants.bpShortCutBgColor, - textStyle: TextStyle(color: Colors.white), - iconColor: Colors.white, - ), - ], - ); - }, - ), - ], - ), - ], - ), + child: BlinkingText(), ), ], ), @@ -157,3 +103,84 @@ class Greetings extends ConsumerWidget { ); } } + +class BlinkingText extends StatefulWidget { + @override + _BlinkingTextState createState() => _BlinkingTextState(); +} + +class _BlinkingTextState extends State with SingleTickerProviderStateMixin { + late AnimationController _animationController; + + @override + void initState() { + super.initState(); + _animationController = AnimationController( + duration: const Duration(seconds: 1), + vsync: this, + )..repeat(reverse: true); + } + + @override + void dispose() { + _animationController.dispose(); + super.dispose(); + } + + void _onTap() { + Dialogs.bottomMaterialDialog( + msg: 'Tap to Choose and Enrol in a Program', + msgStyle: const TextStyle(color: Constants.labResultsColor), + context: context, + color: Constants.labResultsShortcutBgColor, + title: 'Take Control of Your Health – Join A Program and Start Your Journey Today!', + titleStyle: const TextStyle(color: Constants.labResultsColor, fontWeight: FontWeight.w600), + actions: [ + IconsOutlineButton( + onPressed: () { + context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); + Navigator.of(context).pop(); + }, + text: 'Opt-In', + iconData: Icons.add, + textStyle: const TextStyle(color: Colors.white), + color: Constants.labResultsColor, + iconColor: Colors.white, + ), + IconsButton( + onPressed: () { + Navigator.of(context).pop(); + }, + text: 'Not now', + iconData: Icons.cancel_outlined, + color: Constants.labResultsShortcutBgColor, + textStyle: TextStyle(color: Colors.white), + iconColor: Colors.white, + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return GestureDetector( + onTap: _onTap, + child: AnimatedBuilder( + animation: _animationController, + builder: (context, child) { + return Opacity( + opacity: _animationController.value, + child: Text( + "Tap to update program", + style: theme.textTheme.bodyMedium?.copyWith( + color: theme.colorScheme.primary, + fontWeight: FontWeight.w400, + ), + ), + ); + }, + ), + ); + } +} From 818e26daaad0cc5bcb12fc0ffd0345dff4db33de Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 9 Sep 2024 20:08:02 +0300 Subject: [PATCH 069/140] Added a validation of ensuring a user cannot select future dates and also worked on calculation of cycle lengths. Needs more work though. --- .../presentation/pages/editPeriodsScreen.dart | 43 +++----- .../presentation/pages/logPeriods.dart | 98 +++++++++++++------ .../presentation/widgets/customCalendar.dart | 34 ++++--- 3 files changed, 101 insertions(+), 74 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 2e8cfd3e..e32fbf41 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -14,8 +14,7 @@ class EditPeriods extends ConsumerStatefulWidget { final DateTime? initialStartDate; final DateTime? initialEndDate; final String? cycleId; - const EditPeriods( - {super.key, this.initialStartDate, this.initialEndDate, this.cycleId}); + const EditPeriods({super.key, this.initialStartDate, this.initialEndDate, this.cycleId}); @override ConsumerState createState() => _EditPeriodsState(); @@ -25,6 +24,7 @@ class _EditPeriodsState extends ConsumerState { late DateTime _focusedDay; DateTime? _rangeStart; DateTime? _rangeEnd; + final today = DateTime.now(); @override void initState() { @@ -59,7 +59,9 @@ class _EditPeriodsState extends ConsumerState { // Replace the old cycle with the updated one using index int index = cycles.indexOf(currentCycle); - cycles[index] = updatedCycle; + setState(() { + cycles[index] = updatedCycle; + }); debugPrint("Updated Cycle Length: ${updatedCycle.cycleLength}"); printCycles(cycles); @@ -122,34 +124,17 @@ class _EditPeriodsState extends ConsumerState { backgroundColor: Constants.periodPlanner, ), onPressed: () { - // if (_startDate != null) { - // final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date - // _updateOrAddCycle(_startDate!, endDate); - // printCycles(cycles); - // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - // } else { - // ScaffoldMessenger.of(context).showSnackBar( - // const SnackBar(content: Text('Please select your Period start and end dates.')), - // ); - // } if (_rangeStart == null || _rangeEnd == null) { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text('Invalid Selection'), - content: const Text( - 'Please select both start and end of your periods!!'), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text('OK'), - ), - ], - ), + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please select your Period start and end dates.')), ); - } else { + } + else if(_rangeStart!.isAfter(today) || _rangeEnd!.isAfter(today)) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('You cannot select dates in the future. Please select valid dates.')), + ); + } + else { _updateCycle(); context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); } diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index f5da977e..8798af42 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -26,15 +26,13 @@ void printCycles(List cycles) { debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); debugPrint('Cycle Length: ${cycle.cycleLength}'); debugPrint('Period Length: ${cycle.periodLength}'); - debugPrint('---'); + debugPrint('---'); } } - //This is the screen the user interacts when they are logging their Period Days class LogPeriodScreen extends ConsumerStatefulWidget { - @override ConsumerState createState() => _LogPeriodScreenState(); } @@ -48,8 +46,8 @@ class _LogPeriodScreenState extends ConsumerState { //final latestCycle = cycles.last; bool _isNewUser = cycles.isEmpty; int averagePeriods = calculateAveragePeriodLength(cycles); - - + final today = DateTime.now(); + @override void initState() { super.initState(); @@ -58,7 +56,7 @@ class _LogPeriodScreenState extends ConsumerState { if (!_isNewUser) { _initializePredictedPeriodRange(); _setFocusedDayForRegularUser(); - } + } } // Map> _filterEventsForLatestCycle() { @@ -92,7 +90,20 @@ class _LogPeriodScreenState extends ConsumerState { _focusedDay = latestCycle.predictedPeriodStart; } + //Function handling selection of period days for a regular user void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { + // final today = DateTime.now(); + + // // Check if the selected day is in the future + // if (selectedDay.isAfter(today)) { + // ScaffoldMessenger.of(context).showSnackBar( + // const SnackBar( + // content: Text('You cannot select a date in the future. Please select a valid date.'), + // ), + // ); + // return; + // } + setState(() { _startDate = selectedDay; _endDate = _startDate?.add(Duration(days: averagePeriods - 1)); // Only start date is used for regular users @@ -100,14 +111,37 @@ class _LogPeriodScreenState extends ConsumerState { debugPrint("Average Period Length from Log Periods is $averagePeriods"); }); } + + // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { - final difference = end.difference(start).inDays + 1; // +1 to include the start day + final difference = + end.difference(start).inDays + 1; // +1 to include the start day return difference <= 7; // Ensure the range does not exceed 7 days } + //Function handling selection of period days for a new user void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { - if (start != null && end != null && !_isDateRangeValid(start, end)) { + // If either start or end date is after today, show an error + if (start != null && end != null && (start.isAfter(today) || end.isAfter(today))) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Invalid Selection'), + content: const Text('You cannot select dates in the future. Please select valid dates.'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('OK'), + ), + ], + ), + ); + } + // Also check if date range is valid (max 7 days) + else if (start != null && end != null && !_isDateRangeValid(start, end)) { showDialog( context: context, builder: (context) => AlertDialog( @@ -123,30 +157,33 @@ class _LogPeriodScreenState extends ConsumerState { ], ), ); - } else { + } + else { setState(() { _startDate = start; _endDate = end; _focusedDay = focusedDay ?? _focusedDay; }); } - } + } + //Function to handle adding log entries in list Database void addCycle(DateTime start, [DateTime? end]) { // If end date is not provided, set it to the start date end ??= start; - final DateTime now = DateTime.now(); - if (isSameDay(start, now) || isSameDay(end, now)) { - end = start.add( Duration(days: averagePeriods - 1)); - } + // final DateTime now = DateTime.now(); + // if (isSameDay(start, now) || isSameDay(end, now)) { + // end = start.add( Duration(days: averagePeriods - 1)); + // } //Handling cases where a user might log an already logged date in their previous cycle, hence warning them using a snackbar for (Cycle cycle in cycles) { if (_datesOverlap(cycle.periodStart, cycle.periodEnd, start, end)) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( - content: Text('The selected period overlaps with an existing cycle. Please choose different dates.'), + content: Text( + 'The selected period overlaps with an existing cycle. Please choose different dates.'), ), ); return; // Exit the function without adding the cycle @@ -163,7 +200,6 @@ class _LogPeriodScreenState extends ConsumerState { //_updateEventsForCycle(newCycle); } - // void _updateEventsForCycle(Cycle cycle) { // // Remove old events for this cycle from the events map // events.remove(cycle.cycleId); @@ -179,9 +215,10 @@ class _LogPeriodScreenState extends ConsumerState { // } // Function to check if two date ranges overlap - bool _datesOverlap(DateTime start1, DateTime end1, DateTime start2, DateTime end2) { - return (start1.isBefore(end2) || isSameDay(start1, end2)) && - (start2.isBefore(end1) || isSameDay(start2, end1)); + bool _datesOverlap( + DateTime start1, DateTime end1, DateTime start2, DateTime end2) { + return (start1.isBefore(end2) || isSameDay(start1, end2)) && + (start2.isBefore(end1) || isSameDay(start2, end1)); } @override @@ -199,9 +236,9 @@ class _LogPeriodScreenState extends ConsumerState { Padding( padding: const EdgeInsets.all(8.0), child: Text( - _isNewUser - ? "Please enter your previous period start and end date." - : "Please enter when your Periods have started", + _isNewUser + ? "Please enter your previous period start and end date." + : "Please enter when your Periods have started", style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold), ), ), @@ -247,17 +284,23 @@ class _LogPeriodScreenState extends ConsumerState { backgroundColor: Constants.periodPlanner, ), onPressed: () { - if (_startDate != null) { + if (_startDate != null && !_startDate!.isAfter(today)) { final endDate = _endDate ?? _startDate!.add(const Duration(days: 1)); // The else statement handles where a period only happens for a single day hence the end date will be same day as start date addCycle(_startDate!, endDate); printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } else { + } + else if (_startDate!.isAfter(today)) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('You cannot select dates in the future. Please select valid dates.')), + ); + } + else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Please select your Period start and end dates.')), ); } - }, + }, child: Text( 'Apply', style: theme.textTheme.titleSmall?.copyWith( @@ -273,8 +316,3 @@ class _LogPeriodScreenState extends ConsumerState { ); } } - - - - - diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index ff587c60..112333d4 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -19,16 +19,14 @@ int calculateAverageCycleLength(List cycles) { for (int i = 1; i < cycles.length; i++) { int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; - debugPrint("Cycle Length before adjustment for cycle $i: $cycleLength"); + debugPrint("Cycle Length for cycle $i: $cycleLength"); // Cap to a minimum cycle length of 21 days - if (cycleLength < 21) { - debugPrint( - "Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); - cycleLength = 26; - } - - debugPrint("Cycle Length after check for cycle $i: $cycleLength"); + // if (cycleLength < 21) { + // debugPrint( + // "Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); + // cycleLength = 26; + // } totalLength += cycleLength; } @@ -69,9 +67,11 @@ int calculateAveragePeriodLength(List cycles) { // return DateTime(dateTime.year, dateTime.month, dateTime.day); // } //Algorithm for calculating Next Period Days, Ovulation and Fertile Days -Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { +Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {String? cycleId}) { var uuid = const Uuid(); - String cycleId = uuid.v4(); //Generating a unique id + // String cycleId = uuid.v4(); //Generating a unique id + + int index = cycles.indexWhere((cycle) => cycle.periodStart == periodStart); // Calculate average cycle length from previous cycles int averageCycleLength = calculateAverageCycleLength(cycles); @@ -92,15 +92,15 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { DateTime fertileEnd = ovulation.subtract(const Duration(days: 1)); //Calculating cycle Length between the previous cycle start and the latest cycle start - int cycleLength = (cycles.isNotEmpty) - ? periodStart.difference(cycles.last.periodStart).inDays - : averageCycleLength; // Calculate cycle length only if there are previous cycles - + int cycleLength = (index > 0) + ? periodStart.difference(cycles[index - 1].periodStart).inDays + : averageCycleLength; // If it's the first entry, use the average + //Calculating period Length of each cycle int periodLength = periodEnd.difference(periodStart).inDays + 1; return Cycle( - cycleId: cycleId, + cycleId: cycleId ?? uuid.v4(), periodStart: periodStart, periodEnd: periodEnd, fertileStart: fertileStart, @@ -259,6 +259,10 @@ class _CustomCalendarState extends State { headerVisible: true, headerStyle: HeaderStyle( formatButtonVisible: widget.headerButton, + //Conditionally hide chevrons if the calendar is in a weekly format + leftChevronVisible: _calendarFormat != CalendarFormat.week, + rightChevronVisible: _calendarFormat != CalendarFormat.week, + headerPadding: const EdgeInsets.all(8.0), ), onFormatChanged: (format) { // Show the modal when the format button is pressed From c29fdd0723dd19255c9b5d144f0b25b288e40ef8 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 10 Sep 2024 10:06:58 +0300 Subject: [PATCH 070/140] Add pop up dialogue on first installation --- .../common/presentation/pages/HomeScreen.dart | 21 +++++++++ .../presentation/widgets/Greetings.dart | 6 --- lib/src/shared/dialog/dialog.dart | 47 +++++++++++++++++++ 3 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 lib/src/shared/dialog/dialog.dart diff --git a/lib/src/features/common/presentation/pages/HomeScreen.dart b/lib/src/features/common/presentation/pages/HomeScreen.dart index aed40d9f..d2ebde3f 100644 --- a/lib/src/features/common/presentation/pages/HomeScreen.dart +++ b/lib/src/features/common/presentation/pages/HomeScreen.dart @@ -6,6 +6,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:material_dialogs/dialogs.dart'; import 'package:nishauri/src/app/navigation/drawer/UserDrawerHeader.dart'; import 'package:nishauri/src/app/navigation/drawer/customeDrawer.dart'; import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; @@ -17,8 +18,11 @@ import 'package:nishauri/src/features/common/presentation/widgets/Greetings.dart import 'package:nishauri/src/features/common/presentation/widgets/ShortcutsUi.dart'; import 'package:nishauri/src/features/hiv/data/providers/art_appointmen_provider.dart'; import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; +import 'package:nishauri/src/features/user_preference/data/providers/settings_provider.dart'; +import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; import 'package:nishauri/src/hooks/use_local_avatar.dart'; import 'package:nishauri/src/local_storage/LocalStorage.dart'; +import 'package:nishauri/src/shared/dialog/dialog.dart'; import 'package:nishauri/src/shared/display/AppAvatar.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:carousel_slider/carousel_slider.dart'; @@ -67,6 +71,23 @@ class _HomeScreenState extends ConsumerState { final theme = Theme.of(context); final asyncUser = ref.watch(userProvider); final size = getOrientationAwareScreenSize(context); + final programState = ref.watch(userProgramProvider); + final settings = ref.watch(settingsNotifierProvider); + + // Handle dialog display + WidgetsBinding.instance.addPostFrameCallback((_) { + // Check if the program list is empty or if all programs are inactive + final showUpdateProgram = programState.when( + data: (programs) => programs.isEmpty || programs.every((program) => program.isActive == false), + error: (error, stack) => false, + loading: () => false, + ); + + if (showUpdateProgram && settings.firstNuruAccess) { + HealthProgramDialog(context).show(); + } + }); + return Scaffold( key: _scaffoldKey, drawer: CustomDrawer(), diff --git a/lib/src/features/common/presentation/widgets/Greetings.dart b/lib/src/features/common/presentation/widgets/Greetings.dart index 150c5f13..ffc9ea5f 100644 --- a/lib/src/features/common/presentation/widgets/Greetings.dart +++ b/lib/src/features/common/presentation/widgets/Greetings.dart @@ -7,13 +7,7 @@ import 'package:intl/intl.dart'; import 'package:material_dialogs/dialogs.dart'; import 'package:material_dialogs/widgets/buttons/icon_button.dart'; import 'package:material_dialogs/widgets/buttons/icon_outline_button.dart'; -import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; -import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; -import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/features/clinic_card/data/providers/programProvider.dart'; -import 'package:nishauri/src/features/common/data/providers/shortcut_provider.dart'; import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/shared/dialog/dialog.dart b/lib/src/shared/dialog/dialog.dart new file mode 100644 index 00000000..9e00fa5a --- /dev/null +++ b/lib/src/shared/dialog/dialog.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:material_dialogs/material_dialogs.dart'; +import 'package:material_dialogs/widgets/buttons/icon_button.dart'; +import 'package:material_dialogs/widgets/buttons/icon_outline_button.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +class HealthProgramDialog { + final BuildContext context; + + HealthProgramDialog(this.context); + + void show() { + Dialogs.bottomMaterialDialog( + msg: 'Tap to Choose and Enrol in a Program', + msgStyle: const TextStyle(color: Constants.labResultsColor), + context: context, + color: Constants.labResultsShortcutBgColor, + title: 'Take Control of Your Health – Join A Program and Start Your Journey Today!', + titleStyle: const TextStyle(color: Constants.labResultsColor, fontWeight: FontWeight.w600), + actions: [ + IconsOutlineButton( + onPressed: () { + Navigator.of(context).pop(); + context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); + }, + text: 'Opt-In', + iconData: Icons.add, + textStyle: const TextStyle(color: Colors.white), + color: Constants.labResultsColor, + iconColor: Colors.white, + ), + IconsButton( + onPressed: () { + Navigator.of(context).pop(); + }, + text: 'Not now', + iconData: Icons.cancel_outlined, + color: Constants.labResultsShortcutBgColor, + textStyle: const TextStyle(color: Colors.white), + iconColor: Colors.white, + ), + ], + ); + } +} From bdcdffd84f847cbb9bfbe86b25bc8efff89aa2f0 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 21 Aug 2024 23:32:00 +0300 Subject: [PATCH 071/140] Worked on making Algorithm more flexible. Currently working on overlapping days between ovulation days. --- .../period_planner/data/models/cycle.dart | 20 +- .../presentation/pages/logPeriods.dart | 8 +- .../pages/periodPlannerScreen.dart | 17 +- .../presentation/widgets/customCalendar.dart | 190 ++++++++++++++---- .../period_planner/utils/event_utils.dart | 12 +- 5 files changed, 185 insertions(+), 62 deletions(-) diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart index ca7d416b..ff4a273c 100644 --- a/lib/src/features/period_planner/data/models/cycle.dart +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -18,14 +18,16 @@ class Cycle{ - String cycleId; - DateTime periodStart; - DateTime periodEnd; - DateTime fertileStart; - DateTime fertileEnd; - DateTime ovulation; - DateTime predictedPeriodStart; - DateTime predictedPeriodEnd; + String cycleId; + DateTime periodStart; + DateTime periodEnd; + DateTime fertileStart; + DateTime fertileEnd; + DateTime ovulation; + DateTime predictedPeriodStart; + DateTime predictedPeriodEnd; + int cycleLength; + int periodLength; Cycle({ required this.cycleId, @@ -36,6 +38,8 @@ class Cycle{ required this.ovulation, required this.predictedPeriodStart, required this.predictedPeriodEnd, + required this.cycleLength, + required this.periodLength, }); } diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 70510baf..f4d487c6 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -22,6 +22,8 @@ void printCycles(List cycles) { debugPrint('Ovulation: ${cycle.ovulation}'); debugPrint('Predicted Period Start: ${cycle.predictedPeriodStart}'); debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); + debugPrint('Cycle Length: ${cycle.cycleLength}'); + debugPrint('Period Length: ${cycle.periodLength}'); debugPrint('---'); // Separator between cycles for clarity } } @@ -50,9 +52,9 @@ class _LogPeriodScreenState extends State { final Map> flattenedEvents = {}; nestedEvents.forEach((cycleId, dateMap) { - print("Processing cycle: $cycleId"); // Debug: Print current cycleId + //print("Processing cycle: $cycleId"); // Debug: Print current cycleId dateMap.forEach((date, events) { - print("Date: $date, Events: $events"); // Debug: Print date and events being processed + //print("Date: $date, Events: $events"); // Debug: Print date and events being processed if (flattenedEvents.containsKey(date)) { flattenedEvents[date]!.addAll(events); } else { @@ -61,7 +63,7 @@ class _LogPeriodScreenState extends State { }); }); - print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events + //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events return flattenedEvents; } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index a144da92..fac59d9f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -322,16 +322,17 @@ class _PeriodPlannerScreenState extends State { } _updateEvents(); + printCycles(cycles); // Debug print to check the state update - debugPrint("After User has logged end of Period"); - debugPrint('Period Start after update: $_periodStart'); - debugPrint('Period End after update: $_periodEnd'); - debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - debugPrint('Current Date after update: $_currentDate'); - debugPrint('Is In Period after update: $isInPeriod'); - debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); - debugPrint("--------"); + // debugPrint("After User has logged end of Period"); + // debugPrint('Period Start after update: $_periodStart'); + // debugPrint('Period End after update: $_periodEnd'); + // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); + // debugPrint('Current Date after update: $_currentDate'); + // debugPrint('Is In Period after update: $isInPeriod'); + // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); + // debugPrint("--------"); }); //printCycles(cycles); Navigator.of(context).pop(); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 80a690f3..f2ecc243 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -6,13 +6,62 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/modalC import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; -//Algorithm -Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLength = 28, int averagePeriodLength = 6}) { +//Function to calculate Average Cycle days +int calculateAverageCycleLength(List cycles) { + if (cycles.length < 2) return 28; // Default to 28 if there aren't enough cycles + + int totalLength = 0; + for (int i = 1; i < cycles.length; i++) { + int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; + debugPrint("Cycle Length $i: $cycleLength"); + totalLength += cycleLength; + } + int averageCycle = (totalLength / (cycles.length - 1)).round(); + debugPrint("Total Length: $totalLength"); + debugPrint("Cycles.Length: ${cycles.length - 1}"); + debugPrint("Average Cycle Length: $averageCycle"); + return averageCycle; +} + +//Function for calculating Average Period days +int calculateAveragePeriodLength(List cycles) { + if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles + + int totalPeriodLength = 0; + for (Cycle cycle in cycles) { + debugPrint("Period Length : ${cycle.periodLength}"); + totalPeriodLength += cycle.periodLength; + } + int averagePeriodLength = (totalPeriodLength / cycles.length).round(); + debugPrint("Total Period Length: $totalPeriodLength"); + debugPrint("Number of Cycles: ${cycles.length}"); + debugPrint("Average Period Length: $averagePeriodLength"); + return averagePeriodLength; +} + + + + +// DateTime normalizeToMidnight(DateTime dateTime) { +// return DateTime(dateTime.year, dateTime.month, dateTime.day); +// } + + + + +//Algorithm for calculating Next Period Days, Ovulation and Fertile Days +Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { var uuid = const Uuid(); String cycleId = uuid.v4(); //Generating a unique id + // Calculate average cycle length from previous cycles + int averageCycleLength = calculateAverageCycleLength(cycles); + + // Calculate average period length from the period Start to the Period End + int averagePeriodLength = calculateAveragePeriodLength(cycles); + DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength)); - DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength)); + DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) DateTime ovulation = predictedPeriodStart.subtract(const Duration(days: 14)); @@ -21,6 +70,14 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe DateTime fertileStart = ovulation.subtract(const Duration(days: 5)); DateTime fertileEnd = ovulation.subtract(const Duration(days: 1)); + //Calculating cycle Length between the previous cycle start and the latest cycle start + int cycleLength = (cycles.isNotEmpty) + ? periodStart.difference(cycles.last.periodStart).inDays + : averageCycleLength; // Calculate cycle length only if there are previous cycles + + //Calculating period Length of each cycle + int periodLength = periodEnd.difference(periodStart).inDays + 1; + return Cycle( cycleId: cycleId, periodStart: periodStart, @@ -30,6 +87,8 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {int averageCycleLe ovulation: ovulation, predictedPeriodStart: predictedPeriodStart, predictedPeriodEnd: predictedPeriodEnd, + cycleLength: cycleLength, + periodLength: periodLength, ); } @@ -38,7 +97,7 @@ class CustomCalendar extends StatefulWidget { final Map>> events; final bool headerButton; - CustomCalendar({ + const CustomCalendar({ Key? key, this.initialFormat = CalendarFormat.month, required this.events, @@ -77,43 +136,100 @@ class _CustomCalendarState extends State{ return flattenedEvents; } - Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; - - //Finding the latest cycleId - final latestCycleId = widget.events.keys.last; - - if (widget.events.containsKey(latestCycleId)) { - final latestCycleEvents = widget.events[latestCycleId]!; - - //Add events from the latest cycle - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { - filteredEvents[date] = List.from(events); - } - }); - - //Removing predicted period days from previous cycles - widget.events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - dateMap.forEach((date, events) { - final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - if (newEventList.isNotEmpty) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } + // Map> _filterEventsForLatestCycle() { + // final Map> filteredEvents = {}; + + // //Finding the latest cycleId + // final latestCycleId = widget.events.keys.last; + + // if (widget.events.containsKey(latestCycleId)) { + // final latestCycleEvents = widget.events[latestCycleId]!; + + // //Add events from the latest cycle + // latestCycleEvents.forEach((date, events) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(events); + // } else { + // filteredEvents[date] = List.from(events); + // } + // }); + + // //Removing predicted period days from previous cycles + // widget.events.forEach((cycleId, dateMap) { + // if (cycleId != latestCycleId) { + // dateMap.forEach((date, events) { + // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); + // if (newEventList.isNotEmpty) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(newEventList); + // } else { + // filteredEvents[date] = List.from(newEventList); + // } + // } + // }); + // } + // }); + // } + // return filteredEvents; + // } + +Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; + + // Find the latest cycleId + final latestCycleId = widget.events.keys.last; + + if (widget.events.containsKey(latestCycleId)) { + // Get events from the latest cycle + final latestCycleEvents = widget.events[latestCycleId]!; + + // Add all events from the latest cycle to the filtered events + latestCycleEvents.forEach((date, events) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(events); + } else { + filteredEvents[date] = List.from(events); + } + }); + + // Now process previous cycles + widget.events.forEach((cycleId, dateMap) { + if (cycleId != latestCycleId) { + dateMap.forEach((date, events) { + // Check if this date is already occupied by a 'Period Day' from the latest cycle + final isCollision = filteredEvents.containsKey(date) && + filteredEvents[date]!.any((event) => event.title == 'Period Day'); + + // We only add events that are not 'Predicted Period Day' and that do not collide with new period days + final filteredEventList = events.where((event) { + // Remove all 'Predicted Period Day' events + if (event.title == 'Predicted Period Day') { + return false; + } + // If there's a collision, don't include 'Fertile Day' or 'Ovulation Day' + if (isCollision && (event.title == 'Fertile Day' || event.title == 'Ovulation Day')) { + return false; } - }); - } + return true; // Keep all other events + }).toList(); + + // Add these filtered events to the final list if they aren't empty + if (filteredEventList.isNotEmpty) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(filteredEventList); + } else { + filteredEvents[date] = List.from(filteredEventList); + } + } }); - } - return filteredEvents; + } + }); } + return filteredEvents; +} + + @override Widget build(BuildContext context) { return TableCalendar( diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 7352ddb7..82b647cc 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -7,7 +7,7 @@ class EventUtils { static Map>> generateEvents(List cycles) { Map>> events= {}; - debugPrint("-----Generating New Events From Event Utils-----"); + //debugPrint("-----Generating New Events From Event Utils-----"); for (Cycle cycle in cycles) { String cycleId = cycle.cycleId; @@ -62,15 +62,15 @@ class EventUtils { } events.forEach((id, events) { - print("Cycle Id: $id"); - print("["); + //print("Cycle Id: $id"); + //print("["); events.forEach((date, event) { - print("Date: $date, Event: $event\n"); + //print("Date: $date, Event: $event\n"); }); - print("]"); + //print("]"); }); - print("--------------"); + //print("--------------"); return events; } } From a19e39e09bc65ad8843ab1cb63038a567cd8d22d Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 22 Aug 2024 21:44:19 +0300 Subject: [PATCH 072/140] Adjust Algorithm by adding a cap on the average cycle and period length --- .../pages/periodPlannerScreen.dart | 23 +-- .../presentation/widgets/customCalendar.dart | 181 +++++++++++++++--- .../period_planner/utils/event_utils.dart | 20 +- 3 files changed, 179 insertions(+), 45 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index fac59d9f..38aeb80a 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -256,19 +256,20 @@ class _PeriodPlannerScreenState extends State { onPressed: () { // setState(() { // // Log the period start here - // isInPeriod = true; - // isDangerZone = false; - // _currentDate = DateTime.now(); + isInPeriod = true; + isDangerZone = false; + _currentDate = DateTime.now(); + int averagePeriods = calculateAveragePeriodLength(cycles); - // final Cycle predictedCycle = predictCycle( - // _periodStart = DateTime.now(), - // _periodEnd = DateTime.now().add(const Duration(days: 6)), - // ); - // cycles.add(predictedCycle); + final Cycle predictedCycle = predictCycle( + _periodStart = DateTime.now(), + _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), + ); + cycles.add(predictedCycle); - // _ovulationDate = predictedCycle.ovulation; - // _nextPeriodStart = predictedCycle.predictedPeriodStart; - // _updateEvents(); + _ovulationDate = predictedCycle.ovulation; + _nextPeriodStart = predictedCycle.predictedPeriodStart; + _updateEvents(); // // Debug print to check the state update // debugPrint("After User has logged Period"); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index f2ecc243..13904525 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -7,22 +7,42 @@ import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; //Function to calculate Average Cycle days +// Function to calculate Average Cycle days int calculateAverageCycleLength(List cycles) { - if (cycles.length < 2) return 28; // Default to 28 if there aren't enough cycles + if (cycles.length < 2) { + debugPrint("Not enough cycles to calculate an average, defaulting to 28 days."); + return 28; // Default to 28 if there aren't enough cycles + } int totalLength = 0; for (int i = 1; i < cycles.length; i++) { int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; - debugPrint("Cycle Length $i: $cycleLength"); + debugPrint("Cycle Length before adjustment for cycle $i: $cycleLength"); + + // Cap to a minimum cycle length of 21 days + if (cycleLength < 21) { + debugPrint("Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); + cycleLength = 26; + } + + debugPrint("Cycle Length after check for cycle $i: $cycleLength"); totalLength += cycleLength; } + int averageCycle = (totalLength / (cycles.length - 1)).round(); - debugPrint("Total Length: $totalLength"); - debugPrint("Cycles.Length: ${cycles.length - 1}"); - debugPrint("Average Cycle Length: $averageCycle"); + debugPrint("Calculated Average Cycle Length before final check: $averageCycle"); + + if (averageCycle < 21) { + debugPrint("Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); + return 26; + } + + debugPrint("Final Average Cycle Length: $averageCycle"); return averageCycle; } + + //Function for calculating Average Period days int calculateAveragePeriodLength(List cycles) { if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles @@ -33,6 +53,9 @@ int calculateAveragePeriodLength(List cycles) { totalPeriodLength += cycle.periodLength; } int averagePeriodLength = (totalPeriodLength / cycles.length).round(); + if (averagePeriodLength < 3) { + return 4; + } debugPrint("Total Period Length: $totalPeriodLength"); debugPrint("Number of Cycles: ${cycles.length}"); debugPrint("Average Period Length: $averagePeriodLength"); @@ -92,6 +115,37 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { ); } + //Removing predicted period days from previous cycles + // widget.events.forEach((cycleId, dateMap) { + // if (cycleId != latestCycleId) { + // dateMap.forEach((date, events) { + // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); + // if (newEventList.isNotEmpty) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(newEventList); + // } else { + // filteredEvents[date] = List.from(newEventList); + // } + // } + // }); + + // /* + // Checks if the period date from the latest cycle collides with the + // Ovulation days or Fertile Days of Previous Cycles or if they are before + // */ + // dateMap.forEach((date, events) { + // final hasCollision = events.any((event) { + // return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + // latestCycleEvents.keys.any((latestDate) { + // // Check if the latest period days collide with fertile/ovulation days + // return isSameDay(latestDate, (date)) || + // latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + // }); + // }); + // debugPrint("Has Collision: $hasCollision"); + // }); + // } + // }); class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; @@ -173,17 +227,79 @@ class _CustomCalendarState extends State{ // return filteredEvents; // } +//Second Improvement +// Map> _filterEventsForLatestCycle() { +// final Map> filteredEvents = {}; + +// // Finding the latest cycleId +// final latestCycleId = widget.events.keys.last; + +// if (widget.events.containsKey(latestCycleId)) { +// final latestCycleEvents = widget.events[latestCycleId]!; + +// // Add events from the latest cycle +// latestCycleEvents.forEach((date, events) { +// if (filteredEvents.containsKey(date)) { +// filteredEvents[date]!.addAll(events); +// } else { +// filteredEvents[date] = List.from(events); +// } +// }); + +// // Removing predicted period days and handling collisions with fertile/ovulation days from previous cycles +// widget.events.forEach((cycleId, dateMap) { +// if (cycleId != latestCycleId) { +// bool shouldOmitFertileOvulationDays = false; + +// // Check if any of the latest period days collide with fertile/ovulation days from previous cycles +// dateMap.forEach((date, events) { +// final hasCollision = events.any((event) { +// return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && +// latestCycleEvents.keys.any((latestDate) { +// // Check if the latest period days collide with fertile/ovulation days +// return latestDate.isAtSameMomentAs(date) || +// latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); +// }); +// }); + +// // isSameDay(latestDate, (date)) + +// if (hasCollision) { +// shouldOmitFertileOvulationDays = true; +// } +// }); + +// // Add non-colliding events from previous cycles +// dateMap.forEach((date, events) { +// if (!shouldOmitFertileOvulationDays || events.any((event) => event.title != 'Fertile Day' && event.title != 'Ovulation Day')) { +// final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); +// if (newEventList.isNotEmpty) { +// if (filteredEvents.containsKey(date)) { +// filteredEvents[date]!.addAll(newEventList); +// } else { +// filteredEvents[date] = List.from(newEventList); +// } +// } +// } +// }); +// } +// }); +// } + +// return filteredEvents; +// } + Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; - // Find the latest cycleId + // Step 1: Identify the latest cycle final latestCycleId = widget.events.keys.last; if (widget.events.containsKey(latestCycleId)) { - // Get events from the latest cycle final latestCycleEvents = widget.events[latestCycleId]!; + print("Latest Events: $latestCycleEvents"); - // Add all events from the latest cycle to the filtered events + // Step 2: Add all events from the latest cycle to filteredEvents latestCycleEvents.forEach((date, events) { if (filteredEvents.containsKey(date)) { filteredEvents[date]!.addAll(events); @@ -192,33 +308,49 @@ Map> _filterEventsForLatestCycle() { } }); - // Now process previous cycles + // Step 3: Filter previous cycles + + widget.events.forEach((cycleId, dateMap) { if (cycleId != latestCycleId) { + bool shouldOmitFertileOvulationDays = false; + + // Check if any of the latest period days collide with fertile/ovulation days from previous cycles dateMap.forEach((date, events) { - // Check if this date is already occupied by a 'Period Day' from the latest cycle - final isCollision = filteredEvents.containsKey(date) && - filteredEvents[date]!.any((event) => event.title == 'Period Day'); + final hasCollision = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + latestCycleEvents.keys.any((latestDate) { + // Check if the latest period days collide with fertile/ovulation days + return latestDate.isAtSameMomentAs(date) || + latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + print("Collided Events: $hasCollision"); + + if (hasCollision) { + shouldOmitFertileOvulationDays = true; + } + }); - // We only add events that are not 'Predicted Period Day' and that do not collide with new period days - final filteredEventList = events.where((event) { - // Remove all 'Predicted Period Day' events + // Filter out the events based on collision detection and omit predicted period days regardless + dateMap.forEach((date, events) { + final newEventList = events.where((event) { + // Always omit predicted period days if (event.title == 'Predicted Period Day') { return false; } - // If there's a collision, don't include 'Fertile Day' or 'Ovulation Day' - if (isCollision && (event.title == 'Fertile Day' || event.title == 'Ovulation Day')) { - return false; - } - return true; // Keep all other events + // Remove fertile and ovulation days if there was a collision + return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); }).toList(); - // Add these filtered events to the final list if they aren't empty - if (filteredEventList.isNotEmpty) { + + + if (newEventList.isNotEmpty) { + print("new Event List: $newEventList"); if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(filteredEventList); + filteredEvents[date]!.addAll(newEventList); } else { - filteredEvents[date] = List.from(filteredEventList); + filteredEvents[date] = List.from(newEventList); } } }); @@ -229,7 +361,6 @@ Map> _filterEventsForLatestCycle() { return filteredEvents; } - @override Widget build(BuildContext context) { return TableCalendar( diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 82b647cc..5279e601 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -61,17 +61,19 @@ class EventUtils { } } - events.forEach((id, events) { - //print("Cycle Id: $id"); - //print("["); - events.forEach((date, event) { - //print("Date: $date, Event: $event\n"); - }); - //print("]"); - }); + // events.forEach((id, events) { + // print("Cycle Id: $id"); + // print("["); + // events.forEach((date, event) { + // print("Date: $date, Event: $event\n"); + // }); + // print("]"); + // }); - //print("--------------"); + // print("--------------"); return events; } } + + From e65610cda1953f737a0ce6be1e2ed7cf2b13a8eb Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 11:43:49 +0300 Subject: [PATCH 073/140] Handled cases where user period days collides with fertile and ovulation days of previous cycles by removing them from the calendar so as to reduce the mess. --- .../presentation/pages/logPeriods.dart | 7 +- .../pages/periodPlannerScreen.dart | 24 ++-- .../presentation/widgets/customCalendar.dart | 128 ++++-------------- 3 files changed, 40 insertions(+), 119 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index f4d487c6..4af95f6b 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -41,6 +41,7 @@ class _LogPeriodScreenState extends State { Map>> events = EventUtils.generateEvents(cycles); late Map> _flatEvents; + @override void initState() { super.initState(); @@ -65,7 +66,8 @@ class _LogPeriodScreenState extends State { //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events return flattenedEvents; -} + } + // Method to validate date range bool _isDateRangeValid(DateTime start, DateTime end) { @@ -106,8 +108,9 @@ class _LogPeriodScreenState extends State { end ??= start; final DateTime now = DateTime.now(); + int averagePeriods = calculateAveragePeriodLength(cycles); if (isSameDay(start, now) || isSameDay(end, now)) { - end = start.add(const Duration(days: 6)); + end = start.add( Duration(days: averagePeriods)); } for (Cycle cycle in cycles) { diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 38aeb80a..4c0bf4d9 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -256,20 +256,20 @@ class _PeriodPlannerScreenState extends State { onPressed: () { // setState(() { // // Log the period start here - isInPeriod = true; - isDangerZone = false; - _currentDate = DateTime.now(); - int averagePeriods = calculateAveragePeriodLength(cycles); + // isInPeriod = true; + // isDangerZone = false; + // _currentDate = DateTime.now(); + // int averagePeriods = calculateAveragePeriodLength(cycles); - final Cycle predictedCycle = predictCycle( - _periodStart = DateTime.now(), - _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), - ); - cycles.add(predictedCycle); + // final Cycle predictedCycle = predictCycle( + // _periodStart = DateTime.now(), + // _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), + // ); + // cycles.add(predictedCycle); - _ovulationDate = predictedCycle.ovulation; - _nextPeriodStart = predictedCycle.predictedPeriodStart; - _updateEvents(); + // _ovulationDate = predictedCycle.ovulation; + // _nextPeriodStart = predictedCycle.predictedPeriodStart; + // _updateEvents(); // // Debug print to check the state update // debugPrint("After User has logged Period"); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 13904525..6218f2f9 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -190,105 +190,6 @@ class _CustomCalendarState extends State{ return flattenedEvents; } - // Map> _filterEventsForLatestCycle() { - // final Map> filteredEvents = {}; - - // //Finding the latest cycleId - // final latestCycleId = widget.events.keys.last; - - // if (widget.events.containsKey(latestCycleId)) { - // final latestCycleEvents = widget.events[latestCycleId]!; - - // //Add events from the latest cycle - // latestCycleEvents.forEach((date, events) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(events); - // } else { - // filteredEvents[date] = List.from(events); - // } - // }); - - // //Removing predicted period days from previous cycles - // widget.events.forEach((cycleId, dateMap) { - // if (cycleId != latestCycleId) { - // dateMap.forEach((date, events) { - // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - // if (newEventList.isNotEmpty) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(newEventList); - // } else { - // filteredEvents[date] = List.from(newEventList); - // } - // } - // }); - // } - // }); - // } - // return filteredEvents; - // } - -//Second Improvement -// Map> _filterEventsForLatestCycle() { -// final Map> filteredEvents = {}; - -// // Finding the latest cycleId -// final latestCycleId = widget.events.keys.last; - -// if (widget.events.containsKey(latestCycleId)) { -// final latestCycleEvents = widget.events[latestCycleId]!; - -// // Add events from the latest cycle -// latestCycleEvents.forEach((date, events) { -// if (filteredEvents.containsKey(date)) { -// filteredEvents[date]!.addAll(events); -// } else { -// filteredEvents[date] = List.from(events); -// } -// }); - -// // Removing predicted period days and handling collisions with fertile/ovulation days from previous cycles -// widget.events.forEach((cycleId, dateMap) { -// if (cycleId != latestCycleId) { -// bool shouldOmitFertileOvulationDays = false; - -// // Check if any of the latest period days collide with fertile/ovulation days from previous cycles -// dateMap.forEach((date, events) { -// final hasCollision = events.any((event) { -// return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && -// latestCycleEvents.keys.any((latestDate) { -// // Check if the latest period days collide with fertile/ovulation days -// return latestDate.isAtSameMomentAs(date) || -// latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); -// }); -// }); - -// // isSameDay(latestDate, (date)) - -// if (hasCollision) { -// shouldOmitFertileOvulationDays = true; -// } -// }); - -// // Add non-colliding events from previous cycles -// dateMap.forEach((date, events) { -// if (!shouldOmitFertileOvulationDays || events.any((event) => event.title != 'Fertile Day' && event.title != 'Ovulation Day')) { -// final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); -// if (newEventList.isNotEmpty) { -// if (filteredEvents.containsKey(date)) { -// filteredEvents[date]!.addAll(newEventList); -// } else { -// filteredEvents[date] = List.from(newEventList); -// } -// } -// } -// }); -// } -// }); -// } - -// return filteredEvents; -// } - Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; @@ -309,8 +210,6 @@ Map> _filterEventsForLatestCycle() { }); // Step 3: Filter previous cycles - - widget.events.forEach((cycleId, dateMap) { if (cycleId != latestCycleId) { bool shouldOmitFertileOvulationDays = false; @@ -318,10 +217,10 @@ Map> _filterEventsForLatestCycle() { // Check if any of the latest period days collide with fertile/ovulation days from previous cycles dateMap.forEach((date, events) { final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && latestCycleEvents.keys.any((latestDate) { // Check if the latest period days collide with fertile/ovulation days - return latestDate.isAtSameMomentAs(date) || + return isSameDay(latestDate, date) || latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); }); }); @@ -332,6 +231,26 @@ Map> _filterEventsForLatestCycle() { } }); + // Additional step: Check if previous cycles' dates also collide with those of later cycles + widget.events.forEach((laterCycleId, laterDateMap) { + //condition ensures that we only consider cycles that are neither the current one nor the latest one + if (laterCycleId != cycleId && laterCycleId != latestCycleId) { + dateMap.forEach((date, events) { + final hasCollisionWithlaterCycle = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + laterDateMap.keys.any((laterDate) { + return isSameDay(laterDate, date) || + laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + + if (hasCollisionWithlaterCycle) { + shouldOmitFertileOvulationDays = true; + } + }); + } + }); + // Filter out the events based on collision detection and omit predicted period days regardless dateMap.forEach((date, events) { final newEventList = events.where((event) { @@ -343,8 +262,6 @@ Map> _filterEventsForLatestCycle() { return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); }).toList(); - - if (newEventList.isNotEmpty) { print("new Event List: $newEventList"); if (filteredEvents.containsKey(date)) { @@ -361,6 +278,7 @@ Map> _filterEventsForLatestCycle() { return filteredEvents; } + @override Widget build(BuildContext context) { return TableCalendar( From 287810b51eb1fb503a00351b259cce70a923e55c Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 12:19:57 +0300 Subject: [PATCH 074/140] Testing --- .../presentation/widgets/customCalendar.dart | 35 ++----------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 6218f2f9..99bfb422 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -113,39 +113,7 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { cycleLength: cycleLength, periodLength: periodLength, ); -} - - //Removing predicted period days from previous cycles - // widget.events.forEach((cycleId, dateMap) { - // if (cycleId != latestCycleId) { - // dateMap.forEach((date, events) { - // final newEventList = events.where((event) => event.title != 'Predicted Period Day').toList(); - // if (newEventList.isNotEmpty) { - // if (filteredEvents.containsKey(date)) { - // filteredEvents[date]!.addAll(newEventList); - // } else { - // filteredEvents[date] = List.from(newEventList); - // } - // } - // }); - - // /* - // Checks if the period date from the latest cycle collides with the - // Ovulation days or Fertile Days of Previous Cycles or if they are before - // */ - // dateMap.forEach((date, events) { - // final hasCollision = events.any((event) { - // return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - // latestCycleEvents.keys.any((latestDate) { - // // Check if the latest period days collide with fertile/ovulation days - // return isSameDay(latestDate, (date)) || - // latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - // }); - // }); - // debugPrint("Has Collision: $hasCollision"); - // }); - // } - // }); +} class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; @@ -190,6 +158,7 @@ class _CustomCalendarState extends State{ return flattenedEvents; } +//This is for filtering events on the calendar Map> _filterEventsForLatestCycle() { final Map> filteredEvents = {}; From ed411a634462b406c1b23d491ebefe15bd3d99f6 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 23 Aug 2024 16:06:16 +0300 Subject: [PATCH 075/140] Adjusting a few Terminologies used in the Application --- .../presentation/pages/logPeriods.dart | 107 ++++++++++++++++- .../presentation/pages/periodPlanner.dart | 10 +- .../pages/periodPlannerScreen.dart | 112 +++++------------- .../period_planner/utils/event_utils.dart | 8 +- 4 files changed, 144 insertions(+), 93 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 4af95f6b..a8b5d59d 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -40,12 +40,23 @@ class _LogPeriodScreenState extends State { DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); late Map> _flatEvents; + late Map> _filteredEvents; @override - void initState() { + void initState() { super.initState(); + // _flatEvents = _flattenEvents(events); + // _filteredEvents = _filterEventsForLatestCycle(); + + if (events.isNotEmpty) { _flatEvents = _flattenEvents(events); + _filteredEvents = _filterEventsForLatestCycle(); + } else { + _flatEvents = {}; + _filteredEvents = {}; + } + } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -68,6 +79,94 @@ class _LogPeriodScreenState extends State { return flattenedEvents; } + Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; + + // Step 1: Identify the latest cycle + final latestCycleId = events.keys.last; + + if (events.containsKey(latestCycleId)) { + final latestCycleEvents = events[latestCycleId]!; + print("Latest Events: $latestCycleEvents"); + + // Step 2: Add all events from the latest cycle to filteredEvents + latestCycleEvents.forEach((date, events) { + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(events); + } else { + filteredEvents[date] = List.from(events); + } + }); + + // Step 3: Filter previous cycles + events.forEach((cycleId, dateMap) { + if (cycleId != latestCycleId) { + bool shouldOmitFertileOvulationDays = false; + + // Check if any of the latest period days collide with fertile/ovulation days from previous cycles + dateMap.forEach((date, events) { + final hasCollision = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + latestCycleEvents.keys.any((latestDate) { + // Check if the latest period days collide with fertile/ovulation days + return isSameDay(latestDate, date) || + latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + print("Collided Events: $hasCollision"); + + if (hasCollision) { + shouldOmitFertileOvulationDays = true; + } + }); + + // Additional step: Check if previous cycles' dates also collide with those of later cycles + events.forEach((laterCycleId, laterDateMap) { + //condition ensures that we only consider cycles that are neither the current one nor the latest one + if (laterCycleId != cycleId && laterCycleId != latestCycleId) { + dateMap.forEach((date, events) { + final hasCollisionWithlaterCycle = events.any((event) { + return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && + laterDateMap.keys.any((laterDate) { + return isSameDay(laterDate, date) || + laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); + }); + }); + + if (hasCollisionWithlaterCycle) { + shouldOmitFertileOvulationDays = true; + } + }); + } + }); + + // Filter out the events based on collision detection and omit predicted period days regardless + dateMap.forEach((date, events) { + final newEventList = events.where((event) { + // Always omit predicted period days + if (event.title == 'Predicted Period Day') { + return false; + } + // Remove fertile and ovulation days if there was a collision + return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); + }).toList(); + + if (newEventList.isNotEmpty) { + print("new Event List: $newEventList"); + if (filteredEvents.containsKey(date)) { + filteredEvents[date]!.addAll(newEventList); + } else { + filteredEvents[date] = List.from(newEventList); + } + } + }); + } + }); + } + + return filteredEvents; +} + // Method to validate date range bool _isDateRangeValid(DateTime start, DateTime end) { @@ -113,9 +212,9 @@ class _LogPeriodScreenState extends State { end = start.add( Duration(days: averagePeriods)); } + //Handling cases where a user might log an already logged date in their previous cycle, hence warning them using a snackbar for (Cycle cycle in cycles) { if (_datesOverlap(cycle.periodStart, cycle.periodEnd, start, end)) { - // Show an alert or a Snackbar ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('The selected period overlaps with an existing cycle. Please choose different dates.'), @@ -176,7 +275,7 @@ class _LogPeriodScreenState extends State { _focusedDay = focusedDay; }, eventLoader: (day) { - return _flatEvents[day] ?? []; + return _filteredEvents[day] ?? []; }, calendarBuilders: CalendarBuilders( markerBuilder: (context, date, events) { @@ -221,7 +320,7 @@ class _LogPeriodScreenState extends State { ), onPressed: () { if (_startDate != null) { - final endDate = _endDate ?? _startDate!; + final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date _updateOrAddCycle(_startDate!, endDate); printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index c93ad167..73b4e4e6 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -109,11 +109,11 @@ class PeriodPlanner extends StatelessWidget { description: 'View and manage your menstrual cycles with a detailed calendar.', icon: Icons.calendar_today, ), - FeatureTile( - title: 'Partner Tracking', - description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', - icon: Icons.people, - ), + // FeatureTile( + // title: 'Partner Tracking', + // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', + // icon: Icons.people, + // ), ], ), ), diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 4c0bf4d9..de780255 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -113,12 +113,12 @@ class _PeriodPlannerScreenState extends State { progressValue = 0.2; title = 'Period'; message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; - buttonText = 'Log End Period'; + buttonText = 'Period End'; chances = 'Low Chances of Getting Pregnant'; } else if (isCloseToOvulation) { progressValue = 0.3; title = 'Ovulation in'; - message = '$daysToOvulation days'; + message = '$daysToOvulation day${daysToOvulation > 1 ? 's': ''}'; buttonText = ''; chances = 'High Chances of Getting Pregnant'; } else if (veryCloseToOvulation) { @@ -136,26 +136,26 @@ class _PeriodPlannerScreenState extends State { } else if (afterOvulation) { progressValue = 0.7; title = 'Next Period in'; - message = '$daysToNextPeriod days'; - buttonText = 'Log Period'; + message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's': ''}'; + buttonText = 'Period Start'; chances = 'High Chances of Getting Pregnant'; } else if (veryCloseToPeriod) { progressValue = 0.7; title = 'Next Period is'; message = 'Tomorrow'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'Low Chances of Getting Pregnant'; } else if (duringPredictedPeriodRange) { progressValue = 1.0; title = 'Periods May happen'; message = 'Today'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'Low Chances of Getting Pregnant'; } else if(isDangerZone) { progressValue = 1.0; title = 'Periods Overdue by'; message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; - buttonText = 'Log Period'; + buttonText = 'Period Start'; chances = 'High Chances of Getting Pregnant'; } @@ -176,7 +176,7 @@ class _PeriodPlannerScreenState extends State { body: Column( children: [ const CustomAppBar( - title: "Track Periods 🌸", + title: "My Flow Tracker 🌺", color: Constants.periodPlanner, ), //const SizedBox(height: Constants.SPACING), @@ -237,58 +237,8 @@ class _PeriodPlannerScreenState extends State { ElevatedButton( onPressed: () { //Logging Start of new period - if (buttonText == 'Log Period') { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Confirm Log Period'), - content: const Text('Are you sure you want to log your period?'), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.of(context).pop(); // Close the dialog - }, - ), - TextButton( - child: const Text('Confirm'), - onPressed: () { - // setState(() { - // // Log the period start here - // isInPeriod = true; - // isDangerZone = false; - // _currentDate = DateTime.now(); - // int averagePeriods = calculateAveragePeriodLength(cycles); - - // final Cycle predictedCycle = predictCycle( - // _periodStart = DateTime.now(), - // _periodEnd = DateTime.now().add(Duration(days: averagePeriods)), - // ); - // cycles.add(predictedCycle); - - // _ovulationDate = predictedCycle.ovulation; - // _nextPeriodStart = predictedCycle.predictedPeriodStart; - // _updateEvents(); - - // // Debug print to check the state update - // debugPrint("After User has logged Period"); - // debugPrint('Period Start after update: $_periodStart'); - // debugPrint('Period End after update: $_periodEnd'); - // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - // debugPrint('Current Date after update: $_currentDate'); - // debugPrint('Is In Period after update: $isInPeriod'); - // debugPrint("--------"); - // }); - printCycles(cycles); - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - }, - ), - ], - ); - }, - ); - + if (buttonText == 'Period Start') { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); } //Logging end of new period else{ @@ -414,27 +364,27 @@ class _PeriodPlannerScreenState extends State { ), ), ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - }, - child: Text( - 'Edit period dates', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), + // Align( + // alignment: Alignment.bottomCenter, + // child: Padding( + // padding: const EdgeInsets.all(16.0), + // child: ElevatedButton( + // style: ElevatedButton.styleFrom( + // backgroundColor: Constants.periodPlanner, + // ), + // onPressed: () { + // // To add functionality later + // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + // }, + // child: Text( + // 'Edit period dates', + // style: theme.textTheme.titleSmall?.copyWith( + // color: Colors.white, + // ), + // ), + // ), + // ), + // ), ], ), ); diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 5279e601..8a3962bd 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:table_calendar/table_calendar.dart'; class EventUtils { @@ -16,9 +17,10 @@ class EventUtils { } Map> updatedEvents = events[cycleId]!; + // Add period days for (DateTime date = cycle.periodStart; - date.isBefore(cycle.periodEnd) || date.isAtSameMomentAs(cycle.periodEnd); + date.isBefore(cycle.periodEnd) || isSameDay(date, cycle.periodEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, @@ -30,7 +32,7 @@ class EventUtils { // Add fertile window days for (DateTime date = cycle.fertileStart; - date.isBefore(cycle.fertileEnd) || date.isAtSameMomentAs(cycle.fertileEnd); + date.isBefore(cycle.fertileEnd) || isSameDay(date, cycle.fertileEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, @@ -50,7 +52,7 @@ class EventUtils { // Add predicted period start for (DateTime date = cycle.predictedPeriodStart; - date.isBefore(cycle.predictedPeriodEnd) || date.isAtSameMomentAs(cycle.predictedPeriodEnd); + date.isBefore(cycle.predictedPeriodEnd) || isSameDay(date, cycle.predictedPeriodEnd); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, From 37665f867ea1b9fd8224e4b8b6535c65dd8818a9 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 27 Aug 2024 18:12:28 +0300 Subject: [PATCH 076/140] Changed the routing for the application, made some few changes on the main screen like on the weekly calendar and adding a card --- lib/src/app/navigation/app_router.dart | 55 +--- lib/src/app/navigation/menu/menuItems.dart | 1 + .../presentation/pages/editPeriodsScreen.dart | 236 +++++++------- .../presentation/pages/logPeriods.dart | 17 +- .../presentation/pages/periodCalendar.dart | 172 +++++------ .../presentation/pages/periodPlanner.dart | 288 +++++++++--------- .../presentation/pages/periodPlannerMenu.dart | 282 ++++++++--------- .../pages/periodPlannerScreen.dart | 142 ++++++--- .../presentation/widgets/customCalendar.dart | 117 +++---- .../presentation/widgets/eventsMaker.dart | 20 +- .../presentation/widgets/logItems.dart | 154 +++++----- .../presentation/widgets/logger.dart | 22 +- .../presentation/widgets/loggerWidget.dart | 182 +++++------ .../period_planner/utils/event_utils.dart | 8 + 14 files changed, 832 insertions(+), 864 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 673dd240..64968747 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -396,59 +396,20 @@ final List secureRoutes = [ ]), //Routes for the Period Planner GoRoute( - name: RouteNames.PERIOD_PLANNER, - path: 'period-planner', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlanner(); + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return LogPeriodScreen(); }, - routes: periodPlannerRoutes, - ), -]; - -final List periodPlannerRoutes = [ - GoRoute( - name: RouteNames.PERIOD_PLANNER_MENU, - path: 'period-planner-menu', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerMenu(); - }, - routes: [ - GoRoute( + GoRoute( name: RouteNames.PERIOD_PLANNER_SCREEN, - path: 'period-planner-screen', - builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerScreen(); - }, - ), - - GoRoute( - name: RouteNames.PERIOD_PLANNER_CALENDAR, - path: 'period-planner-calendar', + path: 'period-planner-screen', builder: (BuildContext context, GoRouterState state) { - return const PeriodCalendar(); + return const PeriodPlannerScreen(); }, - routes: [ - GoRoute( - name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - path: 'period-planner-edit-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return EditPeriodsScreen(); - }, - ), - ] ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, - path: 'period-planner-log-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return LogPeriodScreen(); - }, - ), - ]), - - -]; +]; final List openRoutes = [ GoRoute( diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 368e495a..f1af7f9d 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 0731c3a4..e87293c2 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,133 +1,133 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:table_calendar/table_calendar.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:table_calendar/table_calendar.dart'; -class EditPeriodsScreen extends StatefulWidget { +// class EditPeriodsScreen extends StatefulWidget { - const EditPeriodsScreen({super.key}); +// const EditPeriodsScreen({super.key}); - @override - State createState() => _EditPeriodsScreenState(); -} +// @override +// State createState() => _EditPeriodsScreenState(); +// } -class _EditPeriodsScreenState extends State { - // DateTime? _periodStart; - // DateTime? _periodEnd; - // Cycle? _cycle; - Map _periodRanges = {}; +// class _EditPeriodsScreenState extends State { +// // DateTime? _periodStart; +// // DateTime? _periodEnd; +// // Cycle? _cycle; +// Map _periodRanges = {}; - @override - void initState() { - super.initState(); +// @override +// void initState() { +// super.initState(); - // Gather all period ranges from all cycles - for (Cycle cycle in cycles) { - _periodRanges[cycle.periodStart] = cycle.periodEnd; - } +// // Gather all period ranges from all cycles +// for (Cycle cycle in cycles) { +// _periodRanges[cycle.periodStart] = cycle.periodEnd; +// } - // Here, selecting the last cycle added to the list - // if (cycles.isNotEmpty) { - // _cycle = cycles.last; - // _periodStart = _cycle?.periodStart; - // _periodEnd = _cycle?.periodEnd; - // } +// // Here, selecting the last cycle added to the list +// // if (cycles.isNotEmpty) { +// // _cycle = cycles.last; +// // _periodStart = _cycle?.periodStart; +// // _periodEnd = _cycle?.periodEnd; +// // } - } +// } - void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { - setState(() { - if (start != null && end != null) { - // Assuming you're editing the last cycle for simplicity - Cycle lastCycle = cycles.last; - lastCycle.periodStart = start; - lastCycle.periodEnd = end; +// void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { +// setState(() { +// if (start != null && end != null) { +// // Assuming you're editing the last cycle for simplicity +// Cycle lastCycle = cycles.last; +// lastCycle.periodStart = start; +// lastCycle.periodEnd = end; - // Update the period ranges map - _periodRanges[start] = end; - } - }); - } +// // Update the period ranges map +// _periodRanges[start] = end; +// } +// }); +// } - void _applyChanges() { - // Save the updated cycle list and recalculate important dates - for (Cycle cycle in cycles) { - Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); - cycle.fertileStart = updatedCycle.fertileStart; - cycle.fertileEnd = updatedCycle.fertileEnd; - cycle.ovulation = updatedCycle.ovulation; - cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; - cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; - } +// void _applyChanges() { +// // Save the updated cycle list and recalculate important dates +// for (Cycle cycle in cycles) { +// Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); +// cycle.fertileStart = updatedCycle.fertileStart; +// cycle.fertileEnd = updatedCycle.fertileEnd; +// cycle.ovulation = updatedCycle.ovulation; +// cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; +// cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; +// } - Navigator.of(context).pop(); // Go back to the previous screen - } +// Navigator.of(context).pop(); // Go back to the previous screen +// } - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Edit Periods 📅", - color: Constants.periodPlanner.withOpacity(1.0), - ), - TableCalendar( - focusedDay: DateTime.now(), - firstDay: DateTime(2020), - lastDay: DateTime.now(), - rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, - rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, - onRangeSelected: _onRangeSelected, - calendarFormat: CalendarFormat.month, - headerStyle: const HeaderStyle( - formatButtonVisible: false, - ), - calendarStyle: const CalendarStyle( - todayDecoration: BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - rangeStartDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeEndDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeHighlightColor: Constants.periodPlanner, - ), - ), - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - _applyChanges(); - }, - child: Text( - 'Apply Changes', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ), - ], - ), - ); - } -} \ No newline at end of file +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Edit Periods 📅", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// TableCalendar( +// focusedDay: DateTime.now(), +// firstDay: DateTime(2020), +// lastDay: DateTime.now(), +// rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, +// rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, +// onRangeSelected: _onRangeSelected, +// calendarFormat: CalendarFormat.month, +// headerStyle: const HeaderStyle( +// formatButtonVisible: false, +// ), +// calendarStyle: const CalendarStyle( +// todayDecoration: BoxDecoration( +// color: Colors.blue, +// shape: BoxShape.circle, +// ), +// rangeStartDecoration: BoxDecoration( +// color: Colors.pink, +// shape: BoxShape.circle, +// ), +// rangeEndDecoration: BoxDecoration( +// color: Colors.pink, +// shape: BoxShape.circle, +// ), +// rangeHighlightColor: Constants.periodPlanner, +// ), +// ), +// Expanded( +// child: Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// _applyChanges(); +// }, +// child: Text( +// 'Apply Changes', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index a8b5d59d..0834a2b6 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -24,10 +24,13 @@ void printCycles(List cycles) { debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); debugPrint('Cycle Length: ${cycle.cycleLength}'); debugPrint('Period Length: ${cycle.periodLength}'); - debugPrint('---'); // Separator between cycles for clarity + debugPrint('---'); } } + +//This is the screen the user interacts when they are logging their Period Days + class LogPeriodScreen extends StatefulWidget { @override @@ -42,7 +45,6 @@ class _LogPeriodScreenState extends State { late Map> _flatEvents; late Map> _filteredEvents; - @override void initState() { super.initState(); @@ -60,6 +62,7 @@ class _LogPeriodScreenState extends State { } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values + //These are events generated from the events utils class Map> _flattenEvents(Map>> nestedEvents) { final Map> flattenedEvents = {}; @@ -168,10 +171,11 @@ class _LogPeriodScreenState extends State { } - // Method to validate date range + // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day - return difference <= 7; // Ensure the range does not exceed 7 days + return + difference <= 7; // Ensure the range does not exceed 7 days } void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { @@ -230,6 +234,7 @@ class _LogPeriodScreenState extends State { //_updateEventsForCycle(newCycle); } + // void _updateEventsForCycle(Cycle cycle) { // // Remove old events for this cycle from the events map // events.remove(cycle.cycleId); @@ -267,10 +272,12 @@ class _LogPeriodScreenState extends State { focusedDay: _focusedDay, firstDay: DateTime(2020), lastDay: DateTime.now(), - rangeStartDay: _startDate, + rangeStartDay: _startDate , rangeEndDay: _endDate, onRangeSelected: _onRangeSelected, + rangeSelectionMode: RangeSelectionMode.toggledOn, + onPageChanged: (focusedDay) { _focusedDay = focusedDay; }, diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index 3bacf4f9..d4de7a21 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -1,91 +1,91 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -import 'package:nishauri/src/features/period_planner/data/models/events.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; +// import 'package:flutter/material.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +// import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; -class PeriodCalendar extends StatelessWidget { - const PeriodCalendar({super.key}); +// class PeriodCalendar extends StatelessWidget { +// const PeriodCalendar({super.key}); - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - Map>> events = {}; - events = EventUtils.generateEvents(cycles); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Calendar 🗓️", - color: Constants.periodPlanner.withOpacity(1.0), - ), - Expanded( - child: Column( - children: [ - CustomCalendar( - events: events - ), - const SizedBox(height: 20), - const Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Key:", - style: TextStyle( - color: Constants.periodPlanner, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - const Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CalendarKey(color: Colors.red, label: 'Today'), - CalendarKey(color: Colors.pink, label: 'Period Days'), - CalendarKey(color: Colors.green, label: 'Fertile Days'), - CalendarKey(color: Colors.blue, label: 'Ovulation Day'), - CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), - ], - ), - ], - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - }, - child: Text( - 'Edit period dates', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ], - ), - ); - } +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// Map>> events = {}; +// events = EventUtils.generateEvents(cycles); +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Calendar 🗓️", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// Expanded( +// child: Column( +// children: [ +// CustomCalendar( +// events: events +// ), +// const SizedBox(height: 20), +// const Row( +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// Padding( +// padding: EdgeInsets.all(8.0), +// child: Text( +// "Key:", +// style: TextStyle( +// color: Constants.periodPlanner, +// fontSize: 20, +// fontWeight: FontWeight.bold, +// ), +// ), +// ), +// ], +// ), +// const Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// CalendarKey(color: Colors.red, label: 'Today'), +// CalendarKey(color: Colors.pink, label: 'Period Days'), +// CalendarKey(color: Colors.green, label: 'Fertile Days'), +// CalendarKey(color: Colors.blue, label: 'Ovulation Day'), +// CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), +// ], +// ), +// ], +// ), +// ), +// Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// // To add functionality later +// context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); +// }, +// child: Text( +// 'Edit period dates', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// ); +// } -} +// } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index 73b4e4e6..1176bbe8 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -1,149 +1,149 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_svg/flutter_svg.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; -class PeriodPlanner extends StatelessWidget { - const PeriodPlanner({super.key}); +// class PeriodPlanner extends StatelessWidget { +// const PeriodPlanner({super.key}); - @override - Widget build(BuildContext context) { - return Scaffold( - body: Column( - children: [ - const CustomAppBar( - title: "Period Planner App 🌸", - color: Constants.periodPlanner, - ), - Expanded( - child: SingleChildScrollView( - child: Column( - children: [ - Container( - padding: const EdgeInsets.all(20.0), - decoration: BoxDecoration( - color: Constants.periodPlanner.withOpacity(1.0), - image: const DecorationImage( - image: AssetImage("assets/images/contours.png"), - opacity: 0.1, - fit: BoxFit.cover, - ), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - DecoratedBox( - decoration: const BoxDecoration(), - child: SvgPicture.asset( - "assets/images/period_planner2.svg", - fit: BoxFit.contain, - height: 100, - width: 100, - ), - ), - const SizedBox(height: 20.0), - const Text( - 'Track Your Cycle with Ease', - style: TextStyle( - color: Colors.white, - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 10.0), - const Text( - 'Stay healthy And Well Informed', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: 20.0), - ElevatedButton( - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_MENU); - }, - style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric( - vertical: 15.0, - horizontal: 40.0, - ), - ), - child: const Text( - 'Get Started', - style: TextStyle( - fontSize: 18.0, - ), - ), - ), - ], - ), - ), - const SizedBox(height: 20.0), - Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Features', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 10.0), - FeatureTile( - title: 'Track Your Period', - description: 'Keep an accurate record of your menstrual cycles to better understand your health.', - icon: Icons.track_changes, - ), - FeatureTile( - title: 'Period Calendar', - description: 'View and manage your menstrual cycles with a detailed calendar.', - icon: Icons.calendar_today, - ), - // FeatureTile( - // title: 'Partner Tracking', - // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', - // icon: Icons.people, - // ), - ], - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// body: Column( +// children: [ +// const CustomAppBar( +// title: "Period Planner App 🌸", +// color: Constants.periodPlanner, +// ), +// Expanded( +// child: SingleChildScrollView( +// child: Column( +// children: [ +// Container( +// padding: const EdgeInsets.all(20.0), +// decoration: BoxDecoration( +// color: Constants.periodPlanner.withOpacity(1.0), +// image: const DecorationImage( +// image: AssetImage("assets/images/contours.png"), +// opacity: 0.1, +// fit: BoxFit.cover, +// ), +// ), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.stretch, +// children: [ +// DecoratedBox( +// decoration: const BoxDecoration(), +// child: SvgPicture.asset( +// "assets/images/period_planner2.svg", +// fit: BoxFit.contain, +// height: 100, +// width: 100, +// ), +// ), +// const SizedBox(height: 20.0), +// const Text( +// 'Track Your Cycle with Ease', +// style: TextStyle( +// color: Colors.white, +// fontSize: 20.0, +// fontWeight: FontWeight.bold, +// ), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 10.0), +// const Text( +// 'Stay healthy And Well Informed', +// style: TextStyle( +// color: Colors.white, +// fontSize: 16.0, +// ), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 20.0), +// ElevatedButton( +// onPressed: () { +// context.goNamed(RouteNames.PERIOD_PLANNER_MENU); +// }, +// style: ElevatedButton.styleFrom( +// padding: const EdgeInsets.symmetric( +// vertical: 15.0, +// horizontal: 40.0, +// ), +// ), +// child: const Text( +// 'Get Started', +// style: TextStyle( +// fontSize: 18.0, +// ), +// ), +// ), +// ], +// ), +// ), +// const SizedBox(height: 20.0), +// Padding( +// padding: const EdgeInsets.all(20.0), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// const Text( +// 'Features', +// style: TextStyle( +// fontSize: 20.0, +// fontWeight: FontWeight.bold, +// ), +// ), +// const SizedBox(height: 10.0), +// FeatureTile( +// title: 'Track Your Period', +// description: 'Keep an accurate record of your menstrual cycles to better understand your health.', +// icon: Icons.track_changes, +// ), +// FeatureTile( +// title: 'Period Calendar', +// description: 'View and manage your menstrual cycles with a detailed calendar.', +// icon: Icons.calendar_today, +// ), +// // FeatureTile( +// // title: 'Partner Tracking', +// // description: 'Allow your partner to keep track of your cycle and stay informed about your health as well.', +// // icon: Icons.people, +// // ), +// ], +// ), +// ), +// ], +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } -class FeatureTile extends StatelessWidget { - final String title; - final String description; - final IconData icon; +// class FeatureTile extends StatelessWidget { +// final String title; +// final String description; +// final IconData icon; - FeatureTile({ - required this.title, - required this.description, - required this.icon, - }); +// FeatureTile({ +// required this.title, +// required this.description, +// required this.icon, +// }); - @override - Widget build(BuildContext context) { - return ListTile( - leading: Icon(icon), - title: Text(title), - subtitle: Text(description), - ); - } -} +// @override +// Widget build(BuildContext context) { +// return ListTile( +// leading: Icon(icon), +// title: Text(title), +// subtitle: Text(description), +// ); +// } +// } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart index 27a8c80f..cfbab66f 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -1,145 +1,145 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; -import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -class PeriodPlannerMenu extends StatelessWidget { - const PeriodPlannerMenu({super.key}); +// import 'package:flutter/material.dart'; +// import 'package:flutter_svg/svg.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; +// import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; +// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +// class PeriodPlannerMenu extends StatelessWidget { +// const PeriodPlannerMenu({super.key}); - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final _items = _menuItems(context); +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// final _items = _menuItems(context); - return Scaffold( - body: Column( - children: [ - CustomAppBar( - title: "Period Planner 🌸", - color: Constants.periodPlanner.withOpacity(1.0), - ), - Expanded( - child: MenuItemsBuilder( - crossAxisCount: 2, - itemBuilder: (item) => Card( - margin: const EdgeInsets.all(Constants.SPACING), - clipBehavior: Clip.antiAlias, - child: InkWell( - splashColor: Constants.periodPlannerShortcutBgColor, - onTap: item.onPressed, - child: Container( - padding: const EdgeInsets.all(Constants.SPACING), - decoration: BoxDecoration( - color: item.color ?? theme.colorScheme.primary, - image: const DecorationImage( - image: AssetImage("assets/images/contours.png"), - opacity: 0.2, - fit: BoxFit.cover, - ), - ), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - item.icon, - const SizedBox(height: Constants.SPACING), - Text( - item.title ?? '', - style: theme.textTheme.titleMedium?.copyWith( - color: Colors.white, - fontWeight: FontWeight.normal, - overflow: TextOverflow.ellipsis, - ), - textAlign: TextAlign.center, - ), - ], - ), - ), - ), - ), - ), - items: _items, - ), - ), - ], - ), - ); - } -} +// return Scaffold( +// body: Column( +// children: [ +// CustomAppBar( +// title: "Period Planner 🌸", +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// Expanded( +// child: MenuItemsBuilder( +// crossAxisCount: 2, +// itemBuilder: (item) => Card( +// margin: const EdgeInsets.all(Constants.SPACING), +// clipBehavior: Clip.antiAlias, +// child: InkWell( +// splashColor: Constants.periodPlannerShortcutBgColor, +// onTap: item.onPressed, +// child: Container( +// padding: const EdgeInsets.all(Constants.SPACING), +// decoration: BoxDecoration( +// color: item.color ?? theme.colorScheme.primary, +// image: const DecorationImage( +// image: AssetImage("assets/images/contours.png"), +// opacity: 0.2, +// fit: BoxFit.cover, +// ), +// ), +// child: Center( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// item.icon, +// const SizedBox(height: Constants.SPACING), +// Text( +// item.title ?? '', +// style: theme.textTheme.titleMedium?.copyWith( +// color: Colors.white, +// fontWeight: FontWeight.normal, +// overflow: TextOverflow.ellipsis, +// ), +// textAlign: TextAlign.center, +// ), +// ], +// ), +// ), +// ), +// ), +// ), +// items: _items, +// ), +// ), +// ], +// ), +// ); +// } +// } -_menuItems(BuildContext context) => [ - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_planner4.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Track Periods", - onPressed: () { - if(cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - } - else { - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } - } , - color: Constants.periodPlanner.withOpacity(1.0), - ), - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/period_calender1.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: 80, - height: 80, - ), - shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", - semanticsLabel: "Periods", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize), - title: "Calendar", - onPressed: () { - if(cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - } - else { - context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); - } - }, - color: Constants.periodPlanner.withOpacity(1.0), - ), - // MenuItem( - // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/partners2.svg", - // semanticsLabel: "Periods", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", - // semanticsLabel: "Periods", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize), - // title: "Partners", - // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), - // color: Constants.periodPlanner.withOpacity(1.0), - // ), - ]; \ No newline at end of file +// _menuItems(BuildContext context) => [ +// MenuItem( +// shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/period_planner4.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/period_planner4.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Track Periods", +// onPressed: () { +// if(cycles.isEmpty) { +// context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); +// } +// else { +// context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); +// } +// } , +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// MenuItem( +// shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/period_calender1.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/period_calender1.svg", +// semanticsLabel: "Periods", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Calendar", +// onPressed: () { +// if(cycles.isEmpty) { +// context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); +// } +// else { +// context.goNamed(RouteNames.PERIOD_PLANNER_CALENDAR); +// } +// }, +// color: Constants.periodPlanner.withOpacity(1.0), +// ), +// // MenuItem( +// // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// // icon: SvgPicture.asset( +// // "assets/images/partners2.svg", +// // semanticsLabel: "Periods", +// // fit: BoxFit.contain, +// // width: 80, +// // height: 80, +// // ), +// // shortcutIcon: SvgPicture.asset("assets/images/partners2.svg", +// // semanticsLabel: "Periods", +// // fit: BoxFit.contain, +// // width: Constants.shortcutIconSize, +// // height: Constants.shortcutIconSize), +// // title: "Partners", +// // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), +// // color: Constants.periodPlanner.withOpacity(1.0), +// // ), +// ]; \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index de780255..b51bea2c 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -78,8 +78,6 @@ class _PeriodPlannerScreenState extends State { @override Widget build(BuildContext context) { - //late bool endOfPeriod; // handling when user has logged end of period - //handling the days before, after or during the various phases in the Menstrual Cycle int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; @@ -90,17 +88,15 @@ class _PeriodPlannerScreenState extends State { bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && !isInPeriod && daysToOvulation>=1 ; bool veryCloseToOvulation = _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); - //two days after ovulation -- I'm thinking about it though bool afterOvulation = _currentDate.isAfter(_ovulationDate) && (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod>0); bool duringPredictedPeriodRange = _currentDate.isAfter(_nextPeriodStart) && _currentDate.isBefore(_nextPeriodEnd) || isSameDay(_currentDate, _nextPeriodStart) || isSameDay(_currentDate, _nextPeriodEnd); bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); - - - + bool inPeriods = isInPeriod; + // Determine progress value and messages based on the current date double progressValue = 0.0; String message = ''; @@ -114,49 +110,49 @@ class _PeriodPlannerScreenState extends State { title = 'Period'; message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; buttonText = 'Period End'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if (isCloseToOvulation) { progressValue = 0.3; title = 'Ovulation in'; message = '$daysToOvulation day${daysToOvulation > 1 ? 's': ''}'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (veryCloseToOvulation) { progressValue = 0.4; title = 'Ovulation is'; message = 'Tomorrow'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (isOvulation) { progressValue = 0.5; title = 'Ovulation is'; message = 'Today'; - buttonText = ''; - chances = 'High Chances of Getting Pregnant'; + buttonText = 'Period Start'; + chances = 'High'; } else if (afterOvulation) { progressValue = 0.7; title = 'Next Period in'; message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's': ''}'; buttonText = 'Period Start'; - chances = 'High Chances of Getting Pregnant'; + chances = 'Low'; } else if (veryCloseToPeriod) { progressValue = 0.7; title = 'Next Period is'; message = 'Tomorrow'; buttonText = 'Period Start'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if (duringPredictedPeriodRange) { progressValue = 1.0; title = 'Periods May happen'; message = 'Today'; buttonText = 'Period Start'; - chances = 'Low Chances of Getting Pregnant'; + chances = 'Low'; } else if(isDangerZone) { progressValue = 1.0; title = 'Periods Overdue by'; message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; buttonText = 'Period Start'; - chances = 'High Chances of Getting Pregnant'; + chances = 'High'; } final theme = Theme.of(context); @@ -169,9 +165,6 @@ class _PeriodPlannerScreenState extends State { // debugPrint('-----Widget Rebuild-----'); // debugPrint('Is In Period: $isInPeriod'); // debugPrint('Is close to Ovulation: $isCloseToOvulation'); - - - return Scaffold( body: Column( children: [ @@ -187,6 +180,32 @@ class _PeriodPlannerScreenState extends State { padding: const EdgeInsets.all(16.0), child: Column( children: [ + Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const Text( + "Your Chances of Getting Pregnant are:", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + ), + Text( + chances, + style: const TextStyle( + fontSize: 34, + color: Constants.periodPlanner, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ) + ), + const SizedBox(height: Constants.SPACING), SizedBox( height: 150, child: CustomCalendar( @@ -194,15 +213,16 @@ class _PeriodPlannerScreenState extends State { initialFormat: CalendarFormat.week, events: events, headerButton: true, + inPeriods: inPeriods, ), ), - const SizedBox(height: 40), + const SizedBox(height: Constants.SPACING), Stack( alignment: Alignment.center, children: [ SizedBox( - width: Constants.SPACING * 30, // Adjust the width as needed - height: Constants.SPACING * 30, // Adjust the height as needed + width: 300, // Adjust the width as needed + height: 300, // Adjust the height as needed child: CircularProgressIndicator( value: progressValue, strokeWidth: 10, @@ -210,6 +230,7 @@ class _PeriodPlannerScreenState extends State { valueColor: AlwaysStoppedAnimation( isDangerZone ? Colors.red : Constants.periodPlanner, ), + ), ), Column( @@ -227,12 +248,7 @@ class _PeriodPlannerScreenState extends State { message, style: TextStyle(fontSize: 38, color: isDangerZone ? Colors.red: Constants.periodPlanner, fontWeight: FontWeight.bold), ), - const SizedBox(height: Constants.SPACING), - Text( - chances, - style: const TextStyle(fontSize: 16), - ), - const SizedBox(height: Constants.SPACING), + const SizedBox(height: Constants.SPACING + 10), if (buttonText.isNotEmpty) ElevatedButton( onPressed: () { @@ -314,6 +330,32 @@ class _PeriodPlannerScreenState extends State { ), ], ), + // const SizedBox(height: Constants.SPACING), + // Card( + // child: Padding( + // padding: const EdgeInsets.all(16.0), + // child: Column( + // children: [ + // const Text( + // "Your Chances of Getting Pregnant are:", + // style: TextStyle( + // fontSize: 14, + // fontWeight: FontWeight.bold, + // ), + // // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + // ), + // Text( + // chances, + // style: const TextStyle( + // fontSize: 34, + // color: Constants.periodPlanner, + // fontWeight: FontWeight.bold, + // ), + // ), + // ], + // ), + // ) + // ), //const SizedBox(height: 20,), // const Text( @@ -364,27 +406,27 @@ class _PeriodPlannerScreenState extends State { ), ), ), - // Align( - // alignment: Alignment.bottomCenter, - // child: Padding( - // padding: const EdgeInsets.all(16.0), - // child: ElevatedButton( - // style: ElevatedButton.styleFrom( - // backgroundColor: Constants.periodPlanner, - // ), - // onPressed: () { - // // To add functionality later - // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); - // }, - // child: Text( - // 'Edit period dates', - // style: theme.textTheme.titleSmall?.copyWith( - // color: Colors.white, - // ), - // ), - // ), - // ), - // ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // To add functionality later + // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + }, + child: Text( + 'Periods History', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), ], ), ); diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 99bfb422..460935c8 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -118,12 +118,14 @@ class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; final bool headerButton; + final bool? inPeriods; const CustomCalendar({ Key? key, this.initialFormat = CalendarFormat.month, required this.events, this.headerButton = false, + this.inPeriods, }) : super(key: key); @override @@ -131,6 +133,7 @@ class CustomCalendar extends StatefulWidget { } class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; + late DateTime _focusedDay; late Map> _flatEvents; late Map> _filteredEvents; @@ -140,6 +143,10 @@ class _CustomCalendarState extends State{ _calendarFormat = widget.initialFormat; _flatEvents = _flattenEvents(widget.events); _filteredEvents = _filterEventsForLatestCycle(); + // Determine the focused day based on the calendar format + _focusedDay = _calendarFormat == CalendarFormat.week + ? _getNextPredictedPeriodDate() ?? DateTime.now() + : DateTime.now(); } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -159,102 +166,50 @@ class _CustomCalendarState extends State{ } //This is for filtering events on the calendar -Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; + Map> _filterEventsForLatestCycle() { + final Map> filteredEvents = {}; - // Step 1: Identify the latest cycle - final latestCycleId = widget.events.keys.last; + // Identify the latest cycle + final latestCycleId = widget.events.keys.last; - if (widget.events.containsKey(latestCycleId)) { - final latestCycleEvents = widget.events[latestCycleId]!; - print("Latest Events: $latestCycleEvents"); + // If the latest cycle exists, add its events to the filteredEvents map + if (widget.events.containsKey(latestCycleId)) { + final latestCycleEvents = widget.events[latestCycleId]!; - // Step 2: Add all events from the latest cycle to filteredEvents - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { + // Directly add all events from the latest cycle + latestCycleEvents.forEach((date, events) { filteredEvents[date] = List.from(events); - } - }); + }); + } - // Step 3: Filter previous cycles - widget.events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - bool shouldOmitFertileOvulationDays = false; - - // Check if any of the latest period days collide with fertile/ovulation days from previous cycles - dateMap.forEach((date, events) { - final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - latestCycleEvents.keys.any((latestDate) { - // Check if the latest period days collide with fertile/ovulation days - return isSameDay(latestDate, date) || - latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - print("Collided Events: $hasCollision"); - - if (hasCollision) { - shouldOmitFertileOvulationDays = true; - } - }); - - // Additional step: Check if previous cycles' dates also collide with those of later cycles - widget.events.forEach((laterCycleId, laterDateMap) { - //condition ensures that we only consider cycles that are neither the current one nor the latest one - if (laterCycleId != cycleId && laterCycleId != latestCycleId) { - dateMap.forEach((date, events) { - final hasCollisionWithlaterCycle = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - laterDateMap.keys.any((laterDate) { - return isSameDay(laterDate, date) || - laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - - if (hasCollisionWithlaterCycle) { - shouldOmitFertileOvulationDays = true; - } - }); - } - }); - - // Filter out the events based on collision detection and omit predicted period days regardless - dateMap.forEach((date, events) { - final newEventList = events.where((event) { - // Always omit predicted period days - if (event.title == 'Predicted Period Day') { - return false; - } - // Remove fertile and ovulation days if there was a collision - return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); - }).toList(); - - if (newEventList.isNotEmpty) { - print("new Event List: $newEventList"); - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } - } - }); + return filteredEvents; + } + + + DateTime? _getNextPredictedPeriodDate() { + for (var entry in _filteredEvents.entries) { + if (widget.inPeriods == true) { + // Return the first date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + return entry.key; } - }); + } else { + // Return the first date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + return entry.key; + } + } } - - return filteredEvents; + return null; } - @override Widget build(BuildContext context) { return TableCalendar( key: ValueKey(widget.events), firstDay: DateTime(2010), lastDay: DateTime(2100), - focusedDay: DateTime.now(), + focusedDay: _focusedDay, // onDaySelected: (selectedDay, focusedDay) { // setState(() { // _focusedDay = focusedDay; diff --git a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart index 628b8fc8..88aec81e 100644 --- a/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart +++ b/lib/src/features/period_planner/presentation/widgets/eventsMaker.dart @@ -1,6 +1,13 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +/* +This is responsible for the highlighting of the various events as you will see in the calendar +based on their Event Title and Color +For Example if the event is a Period Day, since the corresponding color is pink, +the day in the calendar will be highlighted in Pink. The same applies for the other events that is +Fertile days, Ovulation days and Predicted Period Days. +*/ class EventsMaker extends StatelessWidget { const EventsMaker({ super.key, @@ -11,13 +18,6 @@ class EventsMaker extends StatelessWidget { final DateTime date; final List events; - //Calculating Opacity - // double _calculateOpacity(DateTime eventStart, DateTime eventEnd, DateTime currentDate) { - // int totalDays = eventEnd.difference(eventStart).inDays + 1; - // int currentDayIndex = currentDate.difference(eventStart).inDays; - // return (1 - (currentDayIndex / totalDays)).clamp(0.2, 1.0); - // } - @override Widget build(BuildContext context) { //debugPrint("----From EventMaker Class----"); @@ -28,13 +28,7 @@ class EventsMaker extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, children: events.map((event) { - // Example: Assuming you have the start and end dates for the event - // DateTime eventStart = date; // Update this to the actual event start date - // DateTime eventEnd = date.add(Duration(days: events.length - 1)); // Update this to the actual event end date - - // double opacity = _calculateOpacity(eventStart, eventEnd, date); Color color = event.color; - return Container( margin: const EdgeInsets.symmetric(horizontal: 0.5), width: 7.0, diff --git a/lib/src/features/period_planner/presentation/widgets/logItems.dart b/lib/src/features/period_planner/presentation/widgets/logItems.dart index 5af15dbd..3b6353bb 100644 --- a/lib/src/features/period_planner/presentation/widgets/logItems.dart +++ b/lib/src/features/period_planner/presentation/widgets/logItems.dart @@ -1,80 +1,80 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; -class LogItems { - static List getSymptoms() { - Color symptomsColor = Colors.pink; - return [ - Logger( - icon: Icons.favorite, - label: 'Cramps', - color: symptomsColor, - ), - Logger( - icon: Icons.sentiment_satisfied, - label: 'Mood swings', - color: symptomsColor, - ), - Logger( - icon: Icons.battery_alert, - label: 'Fatigue', - color: symptomsColor, - ), - // Add more symptom loggers as needed - ]; - } +// class LogItems { +// static List getSymptoms() { +// Color symptomsColor = Colors.pink; +// return [ +// Logger( +// icon: Icons.favorite, +// label: 'Cramps', +// color: symptomsColor, +// ), +// Logger( +// icon: Icons.sentiment_satisfied, +// label: 'Mood swings', +// color: symptomsColor, +// ), +// Logger( +// icon: Icons.battery_alert, +// label: 'Fatigue', +// color: symptomsColor, +// ), +// // Add more symptom loggers as needed +// ]; +// } - static List getDischarge() { - Color dischargeColor = Colors.blue; - return [ - Logger( - icon: Icons.water_drop, - label: 'No discharge', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Egg whites', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Sticky', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Brown', - color: dischargeColor, - ), - Logger( - icon: Icons.water_drop, - label: 'Yellow or Green', - color: dischargeColor, - ), - // Add more discharge loggers as needed - ]; - } +// static List getDischarge() { +// Color dischargeColor = Colors.blue; +// return [ +// Logger( +// icon: Icons.water_drop, +// label: 'No discharge', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Egg whites', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Sticky', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Brown', +// color: dischargeColor, +// ), +// Logger( +// icon: Icons.water_drop, +// label: 'Yellow or Green', +// color: dischargeColor, +// ), +// // Add more discharge loggers as needed +// ]; +// } - static List getMoods() { - Color moodsColor = Colors.orange; - return [ - Logger( - icon: Icons.sentiment_very_satisfied, - label: 'Happy', - color: moodsColor, - ), - Logger( - icon: Icons.sentiment_dissatisfied, - label: 'Sad', - color: moodsColor, - ), - Logger( - icon: Icons.sentiment_neutral, - label: 'Anxious', - color: moodsColor, - ), - // Add more mood loggers as needed - ]; - } -} +// static List getMoods() { +// Color moodsColor = Colors.orange; +// return [ +// Logger( +// icon: Icons.sentiment_very_satisfied, +// label: 'Happy', +// color: moodsColor, +// ), +// Logger( +// icon: Icons.sentiment_dissatisfied, +// label: 'Sad', +// color: moodsColor, +// ), +// Logger( +// icon: Icons.sentiment_neutral, +// label: 'Anxious', +// color: moodsColor, +// ), +// // Add more mood loggers as needed +// ]; +// } +// } diff --git a/lib/src/features/period_planner/presentation/widgets/logger.dart b/lib/src/features/period_planner/presentation/widgets/logger.dart index 4c3765a2..4291da82 100644 --- a/lib/src/features/period_planner/presentation/widgets/logger.dart +++ b/lib/src/features/period_planner/presentation/widgets/logger.dart @@ -1,13 +1,13 @@ -import 'package:flutter/material.dart'; +// import 'package:flutter/material.dart'; -class Logger { - final IconData icon; - final String label; - final Color color; +// class Logger { +// final IconData icon; +// final String label; +// final Color color; - Logger({ - required this.icon, - required this.label, - required this.color, - }); -} \ No newline at end of file +// Logger({ +// required this.icon, +// required this.label, +// required this.color, +// }); +// } \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart index 37e4048c..e608b8c8 100644 --- a/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart +++ b/lib/src/features/period_planner/presentation/widgets/loggerWidget.dart @@ -1,98 +1,98 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; -import 'package:nishauri/src/utils/constants.dart'; +// import 'package:flutter/material.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/logger.dart'; +// import 'package:nishauri/src/utils/constants.dart'; -class LoggerWidget extends StatefulWidget { - final String heading; - final List items; +// class LoggerWidget extends StatefulWidget { +// final String heading; +// final List items; - LoggerWidget({required this.heading, required this.items}); +// LoggerWidget({required this.heading, required this.items}); - @override - _LoggerWidgetState createState() => _LoggerWidgetState(); -} +// @override +// _LoggerWidgetState createState() => _LoggerWidgetState(); +// } -class _LoggerWidgetState extends State { - // Create a list to keep track of the selected items - late List _selectedItems; +// class _LoggerWidgetState extends State { +// // Create a list to keep track of the selected items +// late List _selectedItems; - @override - void initState() { - super.initState(); - // Initialize the list with false (none of the items are selected initially) - _selectedItems = List.filled(widget.items.length, false); - } +// @override +// void initState() { +// super.initState(); +// // Initialize the list with false (none of the items are selected initially) +// _selectedItems = List.filled(widget.items.length, false); +// } - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - widget.heading, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 16), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: widget.items - .asMap() - .entries - .map((entry) => _buildItemCard(entry.key, entry.value)) - .toList(), - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - // To add functionality later - }, - child: Text( - 'Click to Apply', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, - ), - ), - ), - ), - ), - ], - ); - } +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return Column( +// crossAxisAlignment: CrossAxisAlignment.stretch, +// children: [ +// Text( +// widget.heading, +// textAlign: TextAlign.center, +// style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), +// ), +// const SizedBox(height: 16), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: Row( +// children: widget.items +// .asMap() +// .entries +// .map((entry) => _buildItemCard(entry.key, entry.value)) +// .toList(), +// ), +// ), +// Align( +// alignment: Alignment.bottomCenter, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: ElevatedButton( +// style: ElevatedButton.styleFrom( +// backgroundColor: Constants.periodPlanner, +// ), +// onPressed: () { +// // To add functionality later +// }, +// child: Text( +// 'Click to Apply', +// style: theme.textTheme.titleSmall?.copyWith( +// color: Colors.white, +// ), +// ), +// ), +// ), +// ), +// ], +// ); +// } - Widget _buildItemCard(int index, Logger item) { - return GestureDetector( - onTap: () { - setState(() { - _selectedItems[index] = !_selectedItems[index]; - }); - }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - Stack( - alignment: Alignment.center, - children: [ - Icon(item.icon, size: 40, color: item.color), - if (_selectedItems[index]) - Icon(Icons.check_circle, size: 40, color: Colors.green.withOpacity(0.9)), - ], - ), - const SizedBox(height: 8), - Text(item.label), - ], - ), - ), - ); - } -} +// Widget _buildItemCard(int index, Logger item) { +// return GestureDetector( +// onTap: () { +// setState(() { +// _selectedItems[index] = !_selectedItems[index]; +// }); +// }, +// child: Padding( +// padding: const EdgeInsets.symmetric(horizontal: 8.0), +// child: Column( +// children: [ +// Stack( +// alignment: Alignment.center, +// children: [ +// Icon(item.icon, size: 40, color: item.color), +// if (_selectedItems[index]) +// Icon(Icons.check_circle, size: 40, color: Colors.green.withOpacity(0.9)), +// ], +// ), +// const SizedBox(height: 8), +// Text(item.label), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 8a3962bd..4fe5e40a 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -3,10 +3,18 @@ import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:table_calendar/table_calendar.dart'; +/* +This class is responsible for generating events based the logged period days +and the days the algorithm predicts(Fertile, Ovulation and Predicted Next Period days) +The Events in this case are Period, Fertile, Ovulation and Predicted Period Day of a cycle. +The Days that are within Period Days are give a title of Period Day and a color of Colors.pink. +The rest happens for the other days. +*/ class EventUtils { static Map>> generateEvents(List cycles) { Map>> events= {}; + //debugPrint("-----Generating New Events From Event Utils-----"); From f012502ed64c4e3777e704278ee9839dbc26dd80 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 28 Aug 2024 15:45:24 +0300 Subject: [PATCH 077/140] Handling cases whereby new users and regular users interact with the screen for logging periods. That is new users can log period start and end and regular log period start and the end is set based on the calculated average period Length. --- .../presentation/pages/logPeriods.dart | 224 ++++++------------ .../presentation/widgets/customCalendar.dart | 42 ++-- 2 files changed, 91 insertions(+), 175 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 0834a2b6..5d7dc983 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -42,136 +42,62 @@ class _LogPeriodScreenState extends State { DateTime? _startDate; DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); - late Map> _flatEvents; - late Map> _filteredEvents; - - @override - void initState() { + //late Map> _filteredEvents; + final bool _isNewUser = cycles.isEmpty; + int averagePeriods = calculateAveragePeriodLength(cycles); + + + @override + void initState() { super.initState(); - // _flatEvents = _flattenEvents(events); - // _filteredEvents = _filterEventsForLatestCycle(); - - if (events.isNotEmpty) { - _flatEvents = _flattenEvents(events); - _filteredEvents = _filterEventsForLatestCycle(); - } else { - _flatEvents = {}; - _filteredEvents = {}; + if (!_isNewUser) { + //_filteredEvents = _filterEventsForLatestCycle(); + _initializePredictedPeriodRange(); + _setFocusedDayForRegularUser(); + } + // else { + // _filteredEvents = {}; + // } } - } - - //To flatten the events so that it can be in the form of DateTime as the key and the events as the values - //These are events generated from the events utils class - Map> _flattenEvents(Map>> nestedEvents) { - final Map> flattenedEvents = {}; - - nestedEvents.forEach((cycleId, dateMap) { - //print("Processing cycle: $cycleId"); // Debug: Print current cycleId - dateMap.forEach((date, events) { - //print("Date: $date, Events: $events"); // Debug: Print date and events being processed - if (flattenedEvents.containsKey(date)) { - flattenedEvents[date]!.addAll(events); - } else { - flattenedEvents[date] = List.from(events); - } - }); - }); + // Map> _filterEventsForLatestCycle() { + // final Map> filteredEvents = {}; + + // final latestCycleId = events.keys.last; + // if (events.containsKey(latestCycleId)) { + // final latestCycleEvents = events[latestCycleId]!; + // latestCycleEvents.forEach((date, events) { + // if (filteredEvents.containsKey(date)) { + // filteredEvents[date]!.addAll(events); + // } else { + // filteredEvents[date] = List.from(events); + // } + // }); + // } + + // return filteredEvents; + // } - //print("Flattened Events: $flattenedEvents"); // Debug: Print final flattened events - return flattenedEvents; + void _initializePredictedPeriodRange() { + final latestCycle = cycles.last; + _startDate = latestCycle.predictedPeriodStart; + _endDate = latestCycle.predictedPeriodEnd; } - Map> _filterEventsForLatestCycle() { - final Map> filteredEvents = {}; - - // Step 1: Identify the latest cycle - final latestCycleId = events.keys.last; - - if (events.containsKey(latestCycleId)) { - final latestCycleEvents = events[latestCycleId]!; - print("Latest Events: $latestCycleEvents"); - - // Step 2: Add all events from the latest cycle to filteredEvents - latestCycleEvents.forEach((date, events) { - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(events); - } else { - filteredEvents[date] = List.from(events); - } - }); - - // Step 3: Filter previous cycles - events.forEach((cycleId, dateMap) { - if (cycleId != latestCycleId) { - bool shouldOmitFertileOvulationDays = false; - - // Check if any of the latest period days collide with fertile/ovulation days from previous cycles - dateMap.forEach((date, events) { - final hasCollision = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - latestCycleEvents.keys.any((latestDate) { - // Check if the latest period days collide with fertile/ovulation days - return isSameDay(latestDate, date) || - latestDate.isAfter(date) && latestDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - print("Collided Events: $hasCollision"); - - if (hasCollision) { - shouldOmitFertileOvulationDays = true; - } - }); - - // Additional step: Check if previous cycles' dates also collide with those of later cycles - events.forEach((laterCycleId, laterDateMap) { - //condition ensures that we only consider cycles that are neither the current one nor the latest one - if (laterCycleId != cycleId && laterCycleId != latestCycleId) { - dateMap.forEach((date, events) { - final hasCollisionWithlaterCycle = events.any((event) { - return (event.title == 'Fertile Day' || event.title == 'Ovulation Day') && - laterDateMap.keys.any((laterDate) { - return isSameDay(laterDate, date) || - laterDate.isAfter(date) && laterDate.isBefore(date.add(const Duration(days: 5))); - }); - }); - - if (hasCollisionWithlaterCycle) { - shouldOmitFertileOvulationDays = true; - } - }); - } - }); - - // Filter out the events based on collision detection and omit predicted period days regardless - dateMap.forEach((date, events) { - final newEventList = events.where((event) { - // Always omit predicted period days - if (event.title == 'Predicted Period Day') { - return false; - } - // Remove fertile and ovulation days if there was a collision - return !shouldOmitFertileOvulationDays || (event.title != 'Fertile Day' && event.title != 'Ovulation Day'); - }).toList(); + void _setFocusedDayForRegularUser() { + final latestCycle = cycles.last; + _focusedDay = latestCycle.predictedPeriodStart; + } - if (newEventList.isNotEmpty) { - print("new Event List: $newEventList"); - if (filteredEvents.containsKey(date)) { - filteredEvents[date]!.addAll(newEventList); - } else { - filteredEvents[date] = List.from(newEventList); - } - } - }); - } + void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { + setState(() { + _startDate = selectedDay; + _endDate = _startDate?.add(Duration(days: averagePeriods - 1)); // Only start date is used for regular users + _focusedDay = focusedDay; + debugPrint("Average Period Length from Log Periods is $averagePeriods"); }); } - - return filteredEvents; -} - - - // Method to validate date range ensuring selection does not exceed 7 days + // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day return @@ -203,17 +129,14 @@ class _LogPeriodScreenState extends State { }); } } - - //Function to handle adding and updating log entries in list Database void _updateOrAddCycle(DateTime start, [DateTime? end]) { // If end date is not provided, set it to the start date end ??= start; final DateTime now = DateTime.now(); - int averagePeriods = calculateAveragePeriodLength(cycles); if (isSameDay(start, now) || isSameDay(end, now)) { - end = start.add( Duration(days: averagePeriods)); + end = start.add( Duration(days: averagePeriods - 1)); } //Handling cases where a user might log an already logged date in their previous cycle, hence warning them using a snackbar @@ -255,8 +178,6 @@ class _LogPeriodScreenState extends State { (start2.isBefore(end1) || isSameDay(start2, end1)); } - - @override Widget build(BuildContext context) { //events = EventUtils.generateEvents(cycles); @@ -265,34 +186,37 @@ class _LogPeriodScreenState extends State { body: Column( children: [ CustomAppBar( - title: "Log Periods 📅", + title: "Enter Periods 📅", + subTitle: _isNewUser + ? "Please enter your previous period start and end date." + : "Please enter when your Periods have started", color: Constants.periodPlanner.withOpacity(1.0), ), TableCalendar( focusedDay: _focusedDay, - firstDay: DateTime(2020), - lastDay: DateTime.now(), - rangeStartDay: _startDate , - rangeEndDay: _endDate, - onRangeSelected: _onRangeSelected, - - rangeSelectionMode: RangeSelectionMode.toggledOn, + firstDay: DateTime(2021), + lastDay: DateTime(2100), + rangeStartDay: _startDate, + rangeEndDay: _isNewUser ? _endDate : _endDate, + onRangeSelected: _isNewUser ? _onRangeSelected : null, + onDaySelected: _isNewUser ? null : _onDaySelected, + rangeSelectionMode: _isNewUser ? RangeSelectionMode.toggledOn : RangeSelectionMode.toggledOn, - onPageChanged: (focusedDay) { - _focusedDay = focusedDay; - }, - eventLoader: (day) { - return _filteredEvents[day] ?? []; - }, - calendarBuilders: CalendarBuilders( - markerBuilder: (context, date, events) { - if (events.isEmpty) { - return null; - } - final eventList = events.cast(); - return EventsMaker(date: date, events: eventList); - }, - ), + // onPageChanged: (focusedDay) { + // _focusedDay = focusedDay; + // }, + // eventLoader: (day) { + // return _filteredEvents[day] ?? []; + // }, + // calendarBuilders: CalendarBuilders( + // markerBuilder: (context, date, events) { + // if (events.isEmpty) { + // return null; + // } + // final eventList = events.cast(); + // return EventsMaker(date: date, events: eventList); + // }, + // ), calendarStyle: const CalendarStyle( todayDecoration: BoxDecoration( color: Colors.blue, diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 460935c8..45bf6068 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -61,17 +61,9 @@ int calculateAveragePeriodLength(List cycles) { debugPrint("Average Period Length: $averagePeriodLength"); return averagePeriodLength; } - - - - // DateTime normalizeToMidnight(DateTime dateTime) { // return DateTime(dateTime.year, dateTime.month, dateTime.day); // } - - - - //Algorithm for calculating Next Period Days, Ovulation and Fertile Days Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { var uuid = const Uuid(); @@ -83,7 +75,7 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { // Calculate average period length from the period Start to the Period End int averagePeriodLength = calculateAveragePeriodLength(cycles); - DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength)); + DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength - 1)); DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) @@ -134,14 +126,14 @@ class CustomCalendar extends StatefulWidget { class _CustomCalendarState extends State{ late CalendarFormat _calendarFormat; late DateTime _focusedDay; - late Map> _flatEvents; + //late Map> _flatEvents; late Map> _filteredEvents; @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; - _flatEvents = _flattenEvents(widget.events); + //_flatEvents = _flattenEvents(widget.events); _filteredEvents = _filterEventsForLatestCycle(); // Determine the focused day based on the calendar format _focusedDay = _calendarFormat == CalendarFormat.week @@ -150,20 +142,20 @@ class _CustomCalendarState extends State{ } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values - Map> _flattenEvents(Map>> nestedEvents) { - final Map> flattenedEvents = {}; - - nestedEvents.forEach((cycleId, dateMap) { - dateMap.forEach((date, events) { - if (flattenedEvents.containsKey(date)) { - flattenedEvents[date]!.addAll(events); - } else { - flattenedEvents[date] = List.from(events); - } - }); - }); - return flattenedEvents; - } + // Map> _flattenEvents(Map>> nestedEvents) { + // final Map> flattenedEvents = {}; + + // nestedEvents.forEach((cycleId, dateMap) { + // dateMap.forEach((date, events) { + // if (flattenedEvents.containsKey(date)) { + // flattenedEvents[date]!.addAll(events); + // } else { + // flattenedEvents[date] = List.from(events); + // } + // }); + // }); + // return flattenedEvents; + // } //This is for filtering events on the calendar Map> _filterEventsForLatestCycle() { From d83118d89dae06b4af1793211cde7d789c577d4f Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 29 Aug 2024 18:01:22 +0300 Subject: [PATCH 078/140] Added Period History in the Menstrual Calendar Feature --- lib/src/app/navigation/app_router.dart | 35 ++- .../pages/periodPlannerScreen.dart | 9 +- .../presentation/pages/periods_history.dart | 208 ++++++++++++++++++ lib/src/utils/routes.dart | 2 + 4 files changed, 237 insertions(+), 17 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/pages/periods_history.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 64968747..e950034e 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -66,6 +66,7 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/periodCa import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlanner.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; @@ -394,21 +395,31 @@ final List secureRoutes = [ }, ) ]), - //Routes for the Period Planner - GoRoute( - name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, - path: 'period-planner-log-period-calendar', - builder: (BuildContext context, GoRouterState state) { - return LogPeriodScreen(); - }, - ), - GoRoute( - name: RouteNames.PERIOD_PLANNER_SCREEN, - path: 'period-planner-screen', + //Routes for the Period Planner + GoRoute( + name: RouteNames.PERIOD_PLANNER_SCREEN, + path: 'period-planner-screen', + builder: (BuildContext context, GoRouterState state) { + return const PeriodPlannerScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, + path: 'period-planner-period-history', builder: (BuildContext context, GoRouterState state) { - return const PeriodPlannerScreen(); + return PeriodsHistory(); }, ), + ], + ), + GoRoute( + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return LogPeriodScreen(); + }, + ), + ]; final List openRoutes = [ diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index b51bea2c..dfe337fe 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -195,9 +195,9 @@ class _PeriodPlannerScreenState extends State { ), Text( chances, - style: const TextStyle( + style: TextStyle( fontSize: 34, - color: Constants.periodPlanner, + color: chances == 'High' ? Colors.red : Colors.blue, fontWeight: FontWeight.bold, ), ), @@ -414,9 +414,8 @@ class _PeriodPlannerScreenState extends State { style: ElevatedButton.styleFrom( backgroundColor: Constants.periodPlanner, ), - onPressed: () { - // To add functionality later - // context.goNamed(RouteNames.PERIOD_PLANNER_EDIT_PERIODS); + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); }, child: Text( 'Periods History', diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart new file mode 100644 index 00000000..9b77e31b --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -0,0 +1,208 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + + +class PeriodsHistory extends StatefulWidget { + const PeriodsHistory({super.key}); + + @override + State createState() => _PeriodsHistoryState(); +} + +class _PeriodsHistoryState extends State { + final averagePeriod = calculateAveragePeriodLength(cycles); + final averageCycles = calculateAverageCycleLength(cycles); + // final List> periodHistory = [ + // {'start': 'July 1', 'end': 'July 7'}, + // {'start': 'August 1', 'end': 'August 7'}, + // {'start': 'September 2', 'end': 'September 8'}, + // {'start': 'October 3', 'end': 'October 9'}, + // {'start': 'November 4', 'end': 'November 10'}, + // {'start': 'December 5', 'end': 'December 11'}, + // {'start': 'January 6', 'end': 'January 12'}, + // {'start': 'February 7', 'end': 'February 13'}, + // {'start': 'March 8', 'end': 'March 14'}, + // {'start': 'April 9', 'end': 'April 15'}, + // {'start': 'May 10', 'end': 'May 16'}, + // {'start': 'June 11', 'end': 'June 17'}, + // {'start': 'July 12', 'end': 'July 18'}, + // {'start': 'August 13', 'end': 'August 19'}, + // {'start': 'September 14', 'end': 'September 20'}, + // {'start': 'October 15', 'end': 'October 21'}, + // {'start': 'November 16', 'end': 'November 22'}, + // {'start': 'December 17', 'end': 'December 23'}, + // {'start': 'January 18', 'end': 'January 24'}, + // {'start': 'February 19', 'end': 'February 25'}, + // ]; + + // Function to format the date as "MMM d" + String formatDate(DateTime date) { + return DateFormat('MMM d').format(date); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: ListView( + children: [ + const CustomAppBar( + title: "My Period History 🌼", + color: Constants.periodPlanner, + ), + const SizedBox(height: 10), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + //The first Card showing both Average period and cycle lengths + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + "My Cycles", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + //Card showing Average Period days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + "Average Period", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 8.0), + Text( + "$averagePeriod days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.pink, + ), + ), + ], + ), + ), + ), + ), + Expanded( + //Card Showing Average Cycle days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + 'Average Cycle', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 8.0), + Text( + "$averageCycles days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.blue, + ), + ), + ], + ), + ), + ), + ), + ], + ), + const SizedBox(height: 10) + ], + ), + ), + ), + const SizedBox(height: 20), + //Card Showing period history + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), + child: Column( + children: [ + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink + ), + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: cycles.length, + itemBuilder: (context, index) { + final cycle = cycles[index]; + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + return ListTile( + title: const Text("2024"), + subtitle: Text( + "$start - $end", + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + trailing: IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_forward_ios), + ), + ); + } + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index d77690ad..6a53ba13 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -67,12 +67,14 @@ class RouteNames { static const PERIOD_PLANNER_CALENDAR = "Period Planner Calendar"; static const PERIOD_PLANNER_LOG_PERIODS = "period-planner-log-periods"; static const PERIOD_PLANNER_EDIT_PERIODS = "period-planner-edit-periods"; + static const PERIOD_PLANNER_PERIOD_HISTORY = "period-planner-period-history"; static const CHAT_HCW = "chat-hcw"; static const CHAT_DETAIL = "chat-detail"; static const CHAT_USER = "chat-user"; static const INSIGHT = "insight"; static const BP_INSIGHT = "bp-insight"; + } class MenuItemNames { From 56e7f35db1783cb4fe1ee0d08310f7b316467ebf Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 29 Aug 2024 19:05:24 +0300 Subject: [PATCH 079/140] Grouping the cycles by their years and making sure the latest cycle is displayed first --- .../presentation/pages/periods_history.dart | 322 ++++++++++-------- 1 file changed, 171 insertions(+), 151 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 9b77e31b..608e5f9f 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -5,7 +5,6 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/custom import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; - class PeriodsHistory extends StatefulWidget { const PeriodsHistory({super.key}); @@ -16,36 +15,31 @@ class PeriodsHistory extends StatefulWidget { class _PeriodsHistoryState extends State { final averagePeriod = calculateAveragePeriodLength(cycles); final averageCycles = calculateAverageCycleLength(cycles); - // final List> periodHistory = [ - // {'start': 'July 1', 'end': 'July 7'}, - // {'start': 'August 1', 'end': 'August 7'}, - // {'start': 'September 2', 'end': 'September 8'}, - // {'start': 'October 3', 'end': 'October 9'}, - // {'start': 'November 4', 'end': 'November 10'}, - // {'start': 'December 5', 'end': 'December 11'}, - // {'start': 'January 6', 'end': 'January 12'}, - // {'start': 'February 7', 'end': 'February 13'}, - // {'start': 'March 8', 'end': 'March 14'}, - // {'start': 'April 9', 'end': 'April 15'}, - // {'start': 'May 10', 'end': 'May 16'}, - // {'start': 'June 11', 'end': 'June 17'}, - // {'start': 'July 12', 'end': 'July 18'}, - // {'start': 'August 13', 'end': 'August 19'}, - // {'start': 'September 14', 'end': 'September 20'}, - // {'start': 'October 15', 'end': 'October 21'}, - // {'start': 'November 16', 'end': 'November 22'}, - // {'start': 'December 17', 'end': 'December 23'}, - // {'start': 'January 18', 'end': 'January 24'}, - // {'start': 'February 19', 'end': 'February 25'}, - // ]; // Function to format the date as "MMM d" String formatDate(DateTime date) { return DateFormat('MMM d').format(date); } + // Function to group cycles by year + Map> groupCyclesByYear(List cycles) { + final Map> groupedCycles = {}; + for (var cycle in cycles) { + final year = cycle.periodStart.year; + if (!groupedCycles.containsKey(year)) { + groupedCycles[year] = []; + } + groupedCycles[year]!.add(cycle); + } + return groupedCycles; + } + @override Widget build(BuildContext context) { + // Group cycles by year and reverse the list to show the latest first + final groupedCycles = groupCyclesByYear(cycles); + final sortedYears = groupedCycles.keys.toList()..sort((a, b) => b.compareTo(a)); + return Scaffold( body: ListView( children: [ @@ -54,150 +48,176 @@ class _PeriodsHistoryState extends State { color: Constants.periodPlanner, ), const SizedBox(height: 10), - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - //The first Card showing both Average period and cycle lengths - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - "My Cycles", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.bold, - ), + SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + // The first Card showing both Average period and cycle lengths + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + "My Cycles", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - //Card showing Average Period days - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - const Text( - "Average Period", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.w500, - ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + // Card showing Average Period days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + "Average Period", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, ), - const SizedBox(height: 8.0), - Text( - "$averagePeriod days", - style: const TextStyle( - fontSize: 30.0, - fontWeight: FontWeight.bold, - color: Colors.pink, - ), + ), + const SizedBox(height: 8.0), + Text( + "$averagePeriod days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - ], - ), + ), + ], ), ), ), - Expanded( - //Card Showing Average Cycle days - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - const Text( - 'Average Cycle', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.w500, - ), + ), + Expanded( + // Card Showing Average Cycle days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + 'Average Cycle', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w500, ), - const SizedBox(height: 8.0), - Text( - "$averageCycles days", - style: const TextStyle( - fontSize: 30.0, - fontWeight: FontWeight.bold, - color: Colors.blue, - ), + ), + const SizedBox(height: 8.0), + Text( + "$averageCycles days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.blue, ), - ], - ), + ), + ], ), ), ), - ], - ), - const SizedBox(height: 10) - ], - ), + ), + ], + ), + const SizedBox(height: 10), + ], ), ), - const SizedBox(height: 20), - //Card Showing period history - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), - child: Column( - children: [ - const Text( - "History", - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: Colors.pink - ), + ), + const SizedBox(height: 20), + // Card Showing period history + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), + child: Column( + children: [ + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: cycles.length, - itemBuilder: (context, index) { - final cycle = cycles[index]; - final start = formatDate(cycle.periodStart); - final end = formatDate(cycle.periodEnd); - return ListTile( - title: const Text("2024"), - subtitle: Text( - "$start - $end", - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - ), - trailing: IconButton( - onPressed: () {}, - icon: const Icon(Icons.arrow_forward_ios), + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: sortedYears.length, + itemBuilder: (context, index) { + final year = sortedYears[index]; + final cyclesInYear = groupedCycles[year]!; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + "$year", + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), ), - ); - } - ), - ], - ), + ...cyclesInYear.reversed.map((cycle) { + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + final cycleDays = cycle.cycleLength; + return ListTile( + title: Text( + "$start - $end", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text( + "Length of cycle: $cycleDays days", + style: const TextStyle( + fontSize: 16.0, + ), + ), + trailing: IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_forward_ios), + ), + ); + }).toList(), + ], + ); + }, + ), + ], ), ), - ], - ), + ), + ], ), ), ), @@ -205,4 +225,4 @@ class _PeriodsHistoryState extends State { ), ); } -} \ No newline at end of file +} From 154242717db1e7e1f551b3b34f77a87e2988287f Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Fri, 30 Aug 2024 16:09:09 +0300 Subject: [PATCH 080/140] Started working on allowing editing of period days from history although it is not quite complete. --- lib/src/app/navigation/app_router.dart | 13 +- .../presentation/pages/editPeriodsScreen.dart | 201 +++++++----------- .../pages/periodPlannerScreen.dart | 23 +- .../presentation/pages/periods_history.dart | 15 +- 4 files changed, 113 insertions(+), 139 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index e950034e..bc66be6c 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -407,8 +407,19 @@ final List secureRoutes = [ name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, path: 'period-planner-period-history', builder: (BuildContext context, GoRouterState state) { - return PeriodsHistory(); + return const PeriodsHistory(); }, + routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + path: 'period-planner-edit-periods', + builder: (BuildContext context, GoRouterState state) { + final startDate = state.extra != null ? (state.extra as Map)['startDate'] as DateTime : null; + final endDate = state.extra != null ? (state.extra as Map)['endDate'] as DateTime : null; + return EditPeriods(initialStartDate: startDate, initialEndDate: endDate); + }, + ), + ], ), ], ), diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index e87293c2..1aa3a59a 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,133 +1,78 @@ -// import 'package:flutter/material.dart'; -// import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -// import 'package:nishauri/src/utils/constants.dart'; -// import 'package:table_calendar/table_calendar.dart'; +import 'package:flutter/material.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:table_calendar/table_calendar.dart'; -// class EditPeriodsScreen extends StatefulWidget { +class EditPeriods extends StatefulWidget { + final DateTime? initialStartDate; + final DateTime? initialEndDate; + const EditPeriods({super.key, this.initialStartDate, this.initialEndDate}); -// const EditPeriodsScreen({super.key}); + @override + State createState() => _EditPeriodsState(); +} -// @override -// State createState() => _EditPeriodsScreenState(); -// } +class _EditPeriodsState extends State { + late DateTime _focusedDay; + DateTime? _rangeStart; + DateTime? _rangeEnd; -// class _EditPeriodsScreenState extends State { -// // DateTime? _periodStart; -// // DateTime? _periodEnd; -// // Cycle? _cycle; -// Map _periodRanges = {}; - + @override + void initState() { + super.initState(); + + _focusedDay = widget.initialStartDate ?? DateTime.now(); + _rangeStart = widget.initialStartDate; + _rangeEnd = widget.initialEndDate; + } -// @override -// void initState() { -// super.initState(); - -// // Gather all period ranges from all cycles -// for (Cycle cycle in cycles) { -// _periodRanges[cycle.periodStart] = cycle.periodEnd; -// } - -// // Here, selecting the last cycle added to the list -// // if (cycles.isNotEmpty) { -// // _cycle = cycles.last; -// // _periodStart = _cycle?.periodStart; -// // _periodEnd = _cycle?.periodEnd; -// // } - -// } - -// void _onRangeSelected(DateTime? start, DateTime? end, DateTime focusedDay) { -// setState(() { -// if (start != null && end != null) { -// // Assuming you're editing the last cycle for simplicity -// Cycle lastCycle = cycles.last; -// lastCycle.periodStart = start; -// lastCycle.periodEnd = end; - -// // Update the period ranges map -// _periodRanges[start] = end; -// } -// }); -// } - -// void _applyChanges() { -// // Save the updated cycle list and recalculate important dates -// for (Cycle cycle in cycles) { -// Cycle updatedCycle = predictCycle(cycle.periodStart, cycle.periodEnd); -// cycle.fertileStart = updatedCycle.fertileStart; -// cycle.fertileEnd = updatedCycle.fertileEnd; -// cycle.ovulation = updatedCycle.ovulation; -// cycle.predictedPeriodStart = updatedCycle.predictedPeriodStart; -// cycle.predictedPeriodEnd = updatedCycle.predictedPeriodEnd; -// } - -// Navigator.of(context).pop(); // Go back to the previous screen -// } - -// @override -// Widget build(BuildContext context) { -// final theme = Theme.of(context); - -// return Scaffold( -// body: Column( -// children: [ -// CustomAppBar( -// title: "Edit Periods 📅", -// color: Constants.periodPlanner.withOpacity(1.0), -// ), -// TableCalendar( -// focusedDay: DateTime.now(), -// firstDay: DateTime(2020), -// lastDay: DateTime.now(), -// rangeStartDay: _periodRanges.isNotEmpty ? _periodRanges.keys.first : null, -// rangeEndDay: _periodRanges.isNotEmpty ? _periodRanges.values.last : null, -// onRangeSelected: _onRangeSelected, -// calendarFormat: CalendarFormat.month, -// headerStyle: const HeaderStyle( -// formatButtonVisible: false, -// ), -// calendarStyle: const CalendarStyle( -// todayDecoration: BoxDecoration( -// color: Colors.blue, -// shape: BoxShape.circle, -// ), -// rangeStartDecoration: BoxDecoration( -// color: Colors.pink, -// shape: BoxShape.circle, -// ), -// rangeEndDecoration: BoxDecoration( -// color: Colors.pink, -// shape: BoxShape.circle, -// ), -// rangeHighlightColor: Constants.periodPlanner, -// ), -// ), -// Expanded( -// child: Align( -// alignment: Alignment.bottomCenter, -// child: Padding( -// padding: const EdgeInsets.all(16.0), -// child: ElevatedButton( -// style: ElevatedButton.styleFrom( -// backgroundColor: Constants.periodPlanner, -// ), -// onPressed: () { -// _applyChanges(); -// }, -// child: Text( -// 'Apply Changes', -// style: theme.textTheme.titleSmall?.copyWith( -// color: Colors.white, -// ), -// ), -// ), -// ), -// ), -// ), -// ], -// ), -// ); -// } -// } \ No newline at end of file + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + title: "Edit Period 🌸", + color: Constants.periodPlanner, + ), + TableCalendar( + focusedDay: _focusedDay, + firstDay: DateTime(2021), + lastDay: DateTime(2100), + rangeStartDay: _rangeStart, + rangeEndDay: _rangeEnd, + onRangeSelected: (start, end, focusedDay) { + setState(() { + _rangeStart = start; + _rangeEnd = end; + _focusedDay = focusedDay; + }); + }, + calendarStyle: const CalendarStyle( + todayDecoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + rangeStartDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeEndDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeHighlightColor: Constants.periodPlanner, + selectedDecoration: BoxDecoration( + color: Constants.periodPlanner, + shape: BoxShape.circle, + ), + ), + headerStyle: const HeaderStyle( + formatButtonVisible: false, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index dfe337fe..6d0b0410 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -50,12 +50,14 @@ class _PeriodPlannerScreenState extends State { _periodEnd = latestCycle.periodEnd; _ovulationDate = latestCycle.ovulation; _nextPeriodStart = latestCycle.predictedPeriodStart; - _nextPeriodEnd = latestCycle.predictedPeriodEnd; + _nextPeriodEnd = latestCycle.predictedPeriodEnd; + + //_autoAddPeriodDay(); } events = EventUtils.generateEvents(cycles); //_updateEvents(); } - + //Method for updating events void _updateEvents() { setState(() { events = EventUtils.generateEvents(cycles); @@ -71,10 +73,17 @@ class _PeriodPlannerScreenState extends State { }); } - - - - + //Method for auto adding the latest predicted period day as the period start + void _autoAddPeriodDay() { + if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { + setState(() { + _periodStart = _nextPeriodStart; + _periodEnd = _nextPeriodEnd; + final Cycle newCycle = predictCycle(_periodStart, _periodEnd); + cycles.add(newCycle); + }); + } + } @override Widget build(BuildContext context) { @@ -286,7 +295,7 @@ class _PeriodPlannerScreenState extends State { if (cycle.periodStart == _periodStart) { cycle.periodEnd = _periodEnd; } - } + } _updateEvents(); printCycles(cycles); diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 608e5f9f..6c62be94 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class PeriodsHistory extends StatefulWidget { const PeriodsHistory({super.key}); @@ -170,8 +172,7 @@ class _PeriodsHistoryState extends State { itemCount: sortedYears.length, itemBuilder: (context, index) { final year = sortedYears[index]; - final cyclesInYear = groupedCycles[year]!; - + final cyclesInYear = groupedCycles[year]!; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -204,7 +205,15 @@ class _PeriodsHistoryState extends State { ), ), trailing: IconButton( - onPressed: () {}, + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + extra: { + 'startDate': cycle.periodStart, + 'endDate' : cycle.periodEnd, + } + ); + }, icon: const Icon(Icons.arrow_forward_ios), ), ); From f6303ea924e75cafff42def3481dac0e51ddb4ec Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 2 Sep 2024 13:14:24 +0300 Subject: [PATCH 081/140] Ensuring every entry in the period history has its own card and making the calendar in the weekly format static --- .../pages/periodPlannerScreen.dart | 22 +-- .../presentation/pages/periods_history.dart | 133 +++++++++--------- .../presentation/widgets/customCalendar.dart | 130 +++++++++++------ 3 files changed, 162 insertions(+), 123 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 6d0b0410..eb77c887 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -74,16 +74,16 @@ class _PeriodPlannerScreenState extends State { } //Method for auto adding the latest predicted period day as the period start - void _autoAddPeriodDay() { - if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { - setState(() { - _periodStart = _nextPeriodStart; - _periodEnd = _nextPeriodEnd; - final Cycle newCycle = predictCycle(_periodStart, _periodEnd); - cycles.add(newCycle); - }); - } - } + // void _autoAddPeriodDay() { + // if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { + // setState(() { + // _periodStart = _nextPeriodStart; + // _periodEnd = _nextPeriodEnd; + // final Cycle newCycle = predictCycle(_periodStart, _periodEnd); + // cycles.add(newCycle); + // }); + // } + // } @override Widget build(BuildContext context) { @@ -223,7 +223,7 @@ class _PeriodPlannerScreenState extends State { events: events, headerButton: true, inPeriods: inPeriods, - ), + ), ), const SizedBox(height: Constants.SPACING), Stack( diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 6c62be94..58f3fd8a 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -149,82 +149,77 @@ class _PeriodsHistoryState extends State { ), const SizedBox(height: 20), // Card Showing period history - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink, ), - child: Padding( - padding: const EdgeInsets.fromLTRB(8, 8, 0, 8), - child: Column( + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: sortedYears.length, + itemBuilder: (context, index) { + final year = sortedYears[index]; + final cyclesInYear = groupedCycles[year]!; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( - "History", - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: Colors.pink, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + "$year", + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), ), - ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: sortedYears.length, - itemBuilder: (context, index) { - final year = sortedYears[index]; - final cyclesInYear = groupedCycles[year]!; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Text( - "$year", - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), + const SizedBox(height: 10), + ...cyclesInYear.reversed.map((cycle) { + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + final cycleDays = cycle.cycleLength; + return Card( + elevation: 4.0, + margin: const EdgeInsets.symmetric(vertical: 8.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: ListTile( + title: Text( + "$start - $end", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, ), - ...cyclesInYear.reversed.map((cycle) { - final start = formatDate(cycle.periodStart); - final end = formatDate(cycle.periodEnd); - final cycleDays = cycle.cycleLength; - return ListTile( - title: Text( - "$start - $end", - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - subtitle: Text( - "Length of cycle: $cycleDays days", - style: const TextStyle( - fontSize: 16.0, - ), - ), - trailing: IconButton( - onPressed: () { - context.goNamed( - RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - extra: { - 'startDate': cycle.periodStart, - 'endDate' : cycle.periodEnd, - } - ); - }, - icon: const Icon(Icons.arrow_forward_ios), - ), + ), + subtitle: Text( + "Length of cycle: $cycleDays days", + style: const TextStyle( + fontSize: 16.0, + ), + ), + trailing: IconButton( + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + extra: { + 'startDate': cycle.periodStart, + 'endDate': cycle.periodEnd, + }, ); - }).toList(), - ], - ); - }, - ), + }, + icon: const Icon(Icons.arrow_forward_ios), + ), + ), + ); + }).toList(), ], - ), - ), + ); + }, ), ], ), diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 45bf6068..ff587c60 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -10,18 +10,21 @@ import 'package:uuid/uuid.dart'; // Function to calculate Average Cycle days int calculateAverageCycleLength(List cycles) { if (cycles.length < 2) { - debugPrint("Not enough cycles to calculate an average, defaulting to 28 days."); + debugPrint( + "Not enough cycles to calculate an average, defaulting to 28 days."); return 28; // Default to 28 if there aren't enough cycles } int totalLength = 0; for (int i = 1; i < cycles.length; i++) { - int cycleLength = cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; + int cycleLength = + cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; debugPrint("Cycle Length before adjustment for cycle $i: $cycleLength"); // Cap to a minimum cycle length of 21 days if (cycleLength < 21) { - debugPrint("Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); + debugPrint( + "Cycle Length $cycleLength is less than 21 days, defaulting to 26 days."); cycleLength = 26; } @@ -30,10 +33,12 @@ int calculateAverageCycleLength(List cycles) { } int averageCycle = (totalLength / (cycles.length - 1)).round(); - debugPrint("Calculated Average Cycle Length before final check: $averageCycle"); + debugPrint( + "Calculated Average Cycle Length before final check: $averageCycle"); if (averageCycle < 21) { - debugPrint("Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); + debugPrint( + "Average Cycle Length $averageCycle is less than 21 days, defaulting to 26 days."); return 26; } @@ -41,8 +46,6 @@ int calculateAverageCycleLength(List cycles) { return averageCycle; } - - //Function for calculating Average Period days int calculateAveragePeriodLength(List cycles) { if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles @@ -54,13 +57,14 @@ int calculateAveragePeriodLength(List cycles) { } int averagePeriodLength = (totalPeriodLength / cycles.length).round(); if (averagePeriodLength < 3) { - return 4; + return 4; } debugPrint("Total Period Length: $totalPeriodLength"); debugPrint("Number of Cycles: ${cycles.length}"); debugPrint("Average Period Length: $averagePeriodLength"); return averagePeriodLength; } + // DateTime normalizeToMidnight(DateTime dateTime) { // return DateTime(dateTime.year, dateTime.month, dateTime.day); // } @@ -75,8 +79,10 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { // Calculate average period length from the period Start to the Period End int averagePeriodLength = calculateAveragePeriodLength(cycles); - DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength - 1)); - DateTime predictedPeriodEnd = predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); + DateTime predictedPeriodStart = + periodStart.add(Duration(days: averageCycleLength - 1)); + DateTime predictedPeriodEnd = + predictedPeriodStart.add(Duration(days: averagePeriodLength - 1)); //calculating ovulation day (14 days before predicted period start) DateTime ovulation = predictedPeriodStart.subtract(const Duration(days: 14)); @@ -91,45 +97,49 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd) { : averageCycleLength; // Calculate cycle length only if there are previous cycles //Calculating period Length of each cycle - int periodLength = periodEnd.difference(periodStart).inDays + 1; + int periodLength = periodEnd.difference(periodStart).inDays + 1; return Cycle( - cycleId: cycleId, - periodStart: periodStart, - periodEnd: periodEnd, - fertileStart: fertileStart, - fertileEnd: fertileEnd, - ovulation: ovulation, - predictedPeriodStart: predictedPeriodStart, + cycleId: cycleId, + periodStart: periodStart, + periodEnd: periodEnd, + fertileStart: fertileStart, + fertileEnd: fertileEnd, + ovulation: ovulation, + predictedPeriodStart: predictedPeriodStart, predictedPeriodEnd: predictedPeriodEnd, cycleLength: cycleLength, periodLength: periodLength, ); -} +} + class CustomCalendar extends StatefulWidget { final CalendarFormat initialFormat; final Map>> events; final bool headerButton; final bool? inPeriods; - const CustomCalendar({ + const CustomCalendar({ Key? key, - this.initialFormat = CalendarFormat.month, - required this.events, + this.initialFormat = CalendarFormat.month, + required this.events, this.headerButton = false, this.inPeriods, - }) : super(key: key); + }) : super(key: key); @override _CustomCalendarState createState() => _CustomCalendarState(); } -class _CustomCalendarState extends State{ + +class _CustomCalendarState extends State { late CalendarFormat _calendarFormat; late DateTime _focusedDay; + late DateTime _firstDay; + late DateTime _lastDay; //late Map> _flatEvents; late Map> _filteredEvents; - @override + @override void initState() { super.initState(); _calendarFormat = widget.initialFormat; @@ -139,6 +149,8 @@ class _CustomCalendarState extends State{ _focusedDay = _calendarFormat == CalendarFormat.week ? _getNextPredictedPeriodDate() ?? DateTime.now() : DateTime.now(); + _firstDay = _getFirstEventDate(); + _lastDay = _getLastEventDate(); } //To flatten the events so that it can be in the form of DateTime as the key and the events as the values @@ -175,32 +187,65 @@ class _CustomCalendarState extends State{ } return filteredEvents; - } - + } + //Function for getting the focused day DateTime? _getNextPredictedPeriodDate() { - for (var entry in _filteredEvents.entries) { - if (widget.inPeriods == true) { - // Return the first date with a 'Period Day' event - if (entry.value.any((event) => event.title == 'Period Day')) { - return entry.key; + for (var entry in _filteredEvents.entries) { + if (widget.inPeriods == true) { + // Return the first date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + return entry.key; + } + } else { + // Return the first date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + return entry.key; + } } - } else { - // Return the first date with a 'Predicted Period Day' event - if (entry.value.any((event) => event.title == 'Predicted Period Day')) { - return entry.key; + } + return null; + } + + /*Getting the first date to be displayed on the calendar + if the function _getNextPredictedPeriodDate, the start date of the calendar is 2010 + */ + DateTime _getFirstEventDate() { + DateTime? firstEventDate = _getNextPredictedPeriodDate(); + return _calendarFormat == CalendarFormat.week ? firstEventDate ?? DateTime(2010): DateTime(2010); // Fallback to DateTime(2010) if null + } + + /*Getting the last date to be displayed on the calendar + if the function _getNextPredictedPeriodDate, the last date of the calendar is 2100 + */ + DateTime _getLastEventDate() { + DateTime? lastEventDate; + + for (var entry in _filteredEvents.entries.toList().reversed) { + if (widget.inPeriods == true) { + // Return the last date with a 'Period Day' event + if (entry.value.any((event) => event.title == 'Period Day')) { + lastEventDate = entry.key; + break; + } + } else { + // Return the last date with a 'Predicted Period Day' event + if (entry.value.any((event) => event.title == 'Predicted Period Day')) { + lastEventDate = entry.key; + break; + } } } + + return _calendarFormat == CalendarFormat.week ? lastEventDate ?? DateTime(2100): DateTime(2100); // Fallback to DateTime(2100) if null } - return null; -} @override Widget build(BuildContext context) { return TableCalendar( key: ValueKey(widget.events), - firstDay: DateTime(2010), - lastDay: DateTime(2100), + firstDay: _firstDay, + lastDay: _lastDay, focusedDay: _focusedDay, // onDaySelected: (selectedDay, focusedDay) { // setState(() { @@ -213,7 +258,7 @@ class _CustomCalendarState extends State{ }, headerVisible: true, headerStyle: HeaderStyle( - formatButtonVisible: widget.headerButton, + formatButtonVisible: widget.headerButton, ), onFormatChanged: (format) { // Show the modal when the format button is pressed @@ -250,7 +295,7 @@ class _CustomCalendarState extends State{ return null; } final eventList = events.cast(); - + // debugPrint("-----From CustomCalendar------"); // debugPrint('Successfully cast events for date: $date, events: $eventList'); @@ -260,4 +305,3 @@ class _CustomCalendarState extends State{ ); } } - From 1e5482c2cb3881c2c7e9283e9d07e05066f54c0b Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 2 Sep 2024 15:51:05 +0300 Subject: [PATCH 082/140] Allowing users to edit their periods however there are some issues to solve since screens are not updating --- .../presentation/pages/editPeriodsScreen.dart | 106 ++++++++++++++++-- .../presentation/pages/logPeriods.dart | 33 +++--- 2 files changed, 113 insertions(+), 26 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 1aa3a59a..f888d068 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,12 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; class EditPeriods extends StatefulWidget { final DateTime? initialStartDate; final DateTime? initialEndDate; - const EditPeriods({super.key, this.initialStartDate, this.initialEndDate}); + const EditPeriods( + {super.key, this.initialStartDate, this.initialEndDate}); @override State createState() => _EditPeriodsState(); @@ -17,17 +22,50 @@ class _EditPeriodsState extends State { DateTime? _rangeStart; DateTime? _rangeEnd; - @override + @override void initState() { super.initState(); - + _focusedDay = widget.initialStartDate ?? DateTime.now(); _rangeStart = widget.initialStartDate; _rangeEnd = widget.initialEndDate; } + void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { + setState(() { + _rangeStart = start; + _rangeEnd = end; + _focusedDay = focusedDay ?? _focusedDay; + }); + } + + //Function for updating the entries in the list database + void _updateCycle() { + if (_rangeStart != null && _rangeEnd != null) { + //Finding the current cycle to update + Cycle currentCycle = cycles.firstWhere( + (cycle) => + cycle.periodStart == widget.initialStartDate && + cycle.periodEnd == widget.initialEndDate, + ); + + // Predict the new cycle based on the updated period start and end dates + Cycle updatedCycle = predictCycle(_rangeStart!, _rangeEnd!); + + //Replace the old cycle with the updated one + int index = cycles.indexOf(currentCycle); + cycles[index] = updatedCycle; + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Periods updated successfully!')), + ); + Navigator.pop(context); + } + } + @override Widget build(BuildContext context) { + final theme = Theme.of(context); return Scaffold( body: Column( children: [ @@ -41,13 +79,8 @@ class _EditPeriodsState extends State { lastDay: DateTime(2100), rangeStartDay: _rangeStart, rangeEndDay: _rangeEnd, - onRangeSelected: (start, end, focusedDay) { - setState(() { - _rangeStart = start; - _rangeEnd = end; - _focusedDay = focusedDay; - }); - }, + rangeSelectionMode: RangeSelectionMode.toggledOn, + onRangeSelected: _onRangeSelected, calendarStyle: const CalendarStyle( todayDecoration: BoxDecoration( color: Colors.blue, @@ -71,8 +104,59 @@ class _EditPeriodsState extends State { formatButtonVisible: false, ), ), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + // if (_startDate != null) { + // final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date + // _updateOrAddCycle(_startDate!, endDate); + // printCycles(cycles); + // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + // } else { + // ScaffoldMessenger.of(context).showSnackBar( + // const SnackBar(content: Text('Please select your Period start and end dates.')), + // ); + // } + if (_rangeStart == null || _rangeEnd == null) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Invalid Selection'), + content: const Text('Please select both start and end of your periods!!'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('OK'), + ), + ], + ), + ); + } else { + _updateCycle(); + context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); + } + }, + child: Text( + 'Apply', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), + ), + ), + ), + ), ], ), ); } -} \ No newline at end of file +} diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 5d7dc983..8eccbc25 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -43,6 +43,7 @@ class _LogPeriodScreenState extends State { DateTime? _endDate; Map>> events = EventUtils.generateEvents(cycles); //late Map> _filteredEvents; + //final latestCycle = cycles.last; final bool _isNewUser = cycles.isEmpty; int averagePeriods = calculateAveragePeriodLength(cycles); @@ -51,13 +52,9 @@ class _LogPeriodScreenState extends State { void initState() { super.initState(); if (!_isNewUser) { - //_filteredEvents = _filterEventsForLatestCycle(); _initializePredictedPeriodRange(); _setFocusedDayForRegularUser(); } - // else { - // _filteredEvents = {}; - // } } // Map> _filterEventsForLatestCycle() { @@ -100,8 +97,7 @@ class _LogPeriodScreenState extends State { // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = end.difference(start).inDays + 1; // +1 to include the start day - return - difference <= 7; // Ensure the range does not exceed 7 days + return difference <= 7; // Ensure the range does not exceed 7 days } void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { @@ -129,8 +125,8 @@ class _LogPeriodScreenState extends State { }); } } - //Function to handle adding and updating log entries in list Database - void _updateOrAddCycle(DateTime start, [DateTime? end]) { + //Function to handle adding log entries in list Database + void addCycle(DateTime start, [DateTime? end]) { // If end date is not provided, set it to the start date end ??= start; @@ -184,23 +180,30 @@ class _LogPeriodScreenState extends State { final theme = Theme.of(context); return Scaffold( body: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ CustomAppBar( title: "Enter Periods 📅", - subTitle: _isNewUser - ? "Please enter your previous period start and end date." - : "Please enter when your Periods have started", color: Constants.periodPlanner.withOpacity(1.0), ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + _isNewUser + ? "Please enter your previous period start and end date." + : "Please enter when your Periods have started", + style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + ), + ), TableCalendar( focusedDay: _focusedDay, firstDay: DateTime(2021), lastDay: DateTime(2100), rangeStartDay: _startDate, - rangeEndDay: _isNewUser ? _endDate : _endDate, + rangeEndDay: _endDate, onRangeSelected: _isNewUser ? _onRangeSelected : null, onDaySelected: _isNewUser ? null : _onDaySelected, - rangeSelectionMode: _isNewUser ? RangeSelectionMode.toggledOn : RangeSelectionMode.toggledOn, + rangeSelectionMode: RangeSelectionMode.toggledOn, // onPageChanged: (focusedDay) { // _focusedDay = focusedDay; @@ -251,8 +254,8 @@ class _LogPeriodScreenState extends State { ), onPressed: () { if (_startDate != null) { - final endDate = _endDate ?? _startDate!; // The else statement handles where a period only happens for a single day hence the end date will be same day as start date - _updateOrAddCycle(_startDate!, endDate); + final endDate = _endDate ?? _startDate!.add(const Duration(days: 1)); // The else statement handles where a period only happens for a single day hence the end date will be same day as start date + addCycle(_startDate!, endDate); printCycles(cycles); context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); } else { From 22bd9332af51a52ac24b474c2e344fd42d3cd3fc Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Tue, 10 Sep 2024 13:07:49 +0300 Subject: [PATCH 083/140] Added conditiion for period planner in self screening menu whereby it checks whether a user is a new user or a regular user --- .../presentation/pages/self_screening_menu.dart | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index c11d61f6..22155fbd 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -5,6 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; @@ -40,7 +41,14 @@ List _menuItems(BuildContext context) => [ icon: const Icon(Icons.calendar_month_outlined), shortcutIcon: const Icon(Icons.calendar_month_outlined), title: MenuItemNames.PERIOD_PLANNER, - onPressed: () => context.goNamed(MenuItemNames.PERIOD_PLANNER), + onPressed: () { + if(cycles.isEmpty) { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + } + else { + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + } + }, color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), ), ]; From d4e35b7fa7cd3acf63363aa24483c74f2d0af76c Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 11 Sep 2024 11:44:57 +0300 Subject: [PATCH 084/140] :construction: insight --- assets/data/self_screening_bs.json | 50 + assets/data/self_screening_insight.json | 50 +- assets/images/food.svg | 2022 +++++++++++++++++ assets/images/heart.svg | 1447 ++++++++++++ .../pages/AppointmentsScreen.dart | 2 +- .../art/presentation/FacilityDirectory.dart | 2 +- .../presentation/pages/BloodSugarScreen.dart | 2 +- .../pages/BMICalculatorResultsScreen.dart | 2 +- .../pages/BMICalculatorScreen.dart | 2 +- .../presentation/pages/BMIHistoryScreen.dart | 2 +- .../presentation/pages/bpMonitorScreen.dart | 2 +- .../presentation/pages/ClinicCardScreen.dart | 2 +- .../common/presentation/pages/FaqPage.dart | 2 +- .../common/presentation/pages/blog.dart | 2 +- .../pages/ConfirmDeliveryScreen.dart | 2 +- .../presentation/pages/dawa_drop_menu.dart | 2 +- .../presentation/pages/dawa_drop_screen.dart | 2 +- .../presentation/pages/dispatched_drugs.dart | 2 +- .../pages/program_appointments.dart | 2 +- .../presentation/pages/request_drug.dart | 2 +- .../DrugOrderWizardFormScreen.dart | 2 +- .../pages/request_order/DrugOrders.dart | 2 +- .../widget/orders/DeliveryProgression.dart | 2 +- .../hiv/presentation/pages/HIVMenu.dart | 2 +- .../presentation/pages/RegimenHistory.dart | 2 +- .../appointments/ARTAppointmentDetail.dart | 2 +- .../presentation/pages/LabResultsScreen.dart | 2 +- .../presentation/pages/editPeriodsScreen.dart | 2 +- .../presentation/pages/logPeriods.dart | 2 +- .../presentation/pages/periodCalendar.dart | 2 +- .../presentation/pages/periodPlanner.dart | 2 +- .../presentation/pages/periodPlannerMenu.dart | 2 +- .../pages/periodPlannerScreen.dart | 2 +- .../presentation/pages/periods_history.dart | 2 +- .../programs/presentation/pages/programs.dart | 2 +- .../data/providers/insight_provider.dart | 10 +- .../data/repositories/bs_repository.dart | 12 + .../data/services/bs_service.dart | 18 + .../presentation/common/insight_common.dart | 120 + .../presentation/pages/bpInsightScreen.dart | 98 +- .../presentation/pages/bsInsightScreen.dart | 22 + .../presentation/pages/insight_screen.dart | 21 +- .../pages/self_screening_menu.dart | 2 +- .../pages/ProgramRegistrationScreen.dart | 2 +- .../pages/ProgramUpdateScreen.dart | 2 +- .../{CustomeAppBar.dart => CustomAppBar.dart} | 0 .../display/background_image_widget.dart | 2 +- 47 files changed, 3774 insertions(+), 166 deletions(-) create mode 100644 assets/data/self_screening_bs.json create mode 100644 assets/images/food.svg create mode 100644 assets/images/heart.svg create mode 100644 lib/src/features/self_screening/data/repositories/bs_repository.dart create mode 100644 lib/src/features/self_screening/data/services/bs_service.dart create mode 100644 lib/src/features/self_screening/presentation/common/insight_common.dart create mode 100644 lib/src/features/self_screening/presentation/pages/bsInsightScreen.dart rename lib/src/shared/display/{CustomeAppBar.dart => CustomAppBar.dart} (100%) diff --git a/assets/data/self_screening_bs.json b/assets/data/self_screening_bs.json new file mode 100644 index 00000000..3e4573b4 --- /dev/null +++ b/assets/data/self_screening_bs.json @@ -0,0 +1,50 @@ +[ +{ +"id": "1", +"image": "assets/images/doctors.svg", +"source": "assets/images/doctors.svg", +"header": "Insight Blood Sugar", +"title": "What is blood sugar", +"description": "According to the World Health Organization (WHO), blood sugar is defined as the amount of glucose present in the blood. Blood sugar is usually expressed in terms of two measurements: **fasting blood sugar** (the level of glucose in the blood after an overnight fast) and **postprandial blood sugar** (the level of glucose in the blood after a meal).\n\n **Blood Sugar Classification (WHO, 2018)**\n- **Normal blood sugar:** Less than 100 mg/dL (fasting) and less than 140 mg/dL (postprandial).\n- **Impaired fasting glucose:** 100-125 mg/dL (fasting).\n- **Impaired glucose tolerance:** 140-199 mg/dL (postprandial).\n- **Diabetes:** 126 mg/dL or higher (fasting) and 200 mg/dL or higher (postprandial).\n\n **Source:**\n- *World Health Organization. (2018). WHO Guidelines for the Management of Diabetes.*" +}, +{ +"id": "2", +"image": "assets/images/heart.svg", +"source": "assets/images/heart.svg", +"header": "Insight Blood Sugar", +"title": "Details of blood sugar level", +"description": "According to the World Health Organization (WHO), the following are the details of blood sugar levels:\n\n **Blood Sugar Classification (WHO, 2018)**\n- **Normal blood sugar:**\n- *Fasting blood sugar: Less than 100 mg/dL*\n- *Postprandial blood sugar: Less than 140 mg/dL*\n- **Impaired fasting glucose:**\n- *Fasting blood sugar: 100-125 mg/dL*\n- **Impaired glucose tolerance:**\n- *Postprandial blood sugar: 140-199 mg/dL*\n- **Diabetes:**\n- *Fasting blood sugar: 126 mg/dL or higher*\n- *Postprandial blood sugar: 200 mg/dL or higher*\n\n **Additional definitions:** \n- **Glycemic control:** The ability to maintain blood sugar levels within a target range.\n- **Hypoglycemia:** Blood sugar levels below 70 mg/dL.\n- **Hyperglycemia:** Blood sugar levels above 180 mg/dL.\n\n **WHO Guidelines for Blood Sugar Measurement**\n- Blood sugar should be measured in a fasting state, at least 8 hours after the last meal.\n- The measurement should be taken using a glucometer or a laboratory test.\n- Two or more readings should be taken, with the average value used for classification.\n\n **Interpretation of Blood Sugar Readings**\n- **Single reading:** A single blood sugar reading is not sufficient to diagnose diabetes. Multiple readings should be taken over time to confirm the diagnosis.\n- **Variability:** Blood sugar can vary throughout the day. A single reading may not accurately reflect an individual's usual blood sugar.\n- **Trend:** A trend of increasing blood sugar over time is more important than a single reading.\n\n**Note:** \n- It's essential to note that these values are general guidelines, and individual cases may vary. It's always best to consult with a healthcare professional for a proper diagnosis and management of blood sugar levels.\n- These reference values are for adults aged 18 years and older.\n\n\n **Source:**\n- *World Health Organization. (2018). WHO Guidelines for the Management of Diabetes.*" +}, +{ +"id": "3", +"image": "assets/images/insight_board.svg", +"source": "assets/images/insight_board.svg", +"header": "Module Disclaimer", +"title": "Disclaimer", +"description": "Self-screening is intended for monitoring and tracking your health, not for diagnosing medical conditions.\n\n\nUsers can input their daily measurement readings into the app, which then generates charts and graphs to help monitor their health based on the data provided. Please note that the app does not measure the readings itself but only records and tracks the user-entered data.\n\nThe app currently draws information from reputable sources such as the CDC and WHO. However, please be aware that the data provided may not always reflect real-life situations accurately.\n\nThe app is intended for informational purposes only and is not a medical device. Users experiencing health issues should consult with doctors or healthcare professionals for appropriate advice and treatment." +}, +{ +"id": "4", +"image": "assets/images/Medical prescription-bro.svg", +"source": "assets/images/Medical prescription-bro.svg", +"header": "Insight Blood Sugar", +"title": "How to prevent and manage high and low blood sugar", +"description": "According to the World Health Organization (WHO), preventing and managing high and low blood sugar requires a combination of lifestyle changes, dietary modifications, and medical treatment. Here are the WHO-recommended guidelines for preventing and managing high and low blood sugar:\n\n **Prevention:**\n- **Maintain a healthy lifestyle:** Engage in regular physical activity, eat a balanced diet, and avoid smoking and excessive alcohol consumption.\n- **Monitor blood sugar:** Regularly monitor blood sugar to detect any changes or abnormalities.\n- **Get enough sleep:** Aim for 7-8 hours of sleep per night to help regulate blood sugar.\n **Dietary Recommendations:**\n- **Eat a balanced diet:** Focus on whole, unprocessed foods like vegetables, fruits, whole grains, lean proteins, and healthy fats.\n- **Choose low-carb foods:** Limit foods high in carbohydrates, added sugars, and saturated fats.\n- **Stay hydrated:** Drink plenty of water and other fluids to help regulate blood sugar.\n- **Limit caffeine and nicotine:** Both caffeine and nicotine can cause blood sugar to rise.\n\n **Management:**\n- **Medications:** If you have diabetes, your doctor may prescribe medications to help manage blood sugar. These medications may include:\n- *Metformin (Glucophage) to decrease glucose production in the liver*\n- *Sulfonylureas (Glyburide) to stimulate insulin release*\n- *Pioglitazone (Actos) to increase insulin sensitivity*\n- **Insulin therapy:** If you have type 1 diabetes or insulin-dependent type 2 diabetes, you may need insulin therapy to manage blood sugar.\n- **Monitoring:** Regularly monitor blood sugar to adjust treatment as needed.\n\n**Managing High Blood Sugar Episodes:**\n- **Drink water:** Drink water or other fluids to help lower blood sugar.\n- **Take medication:** Take medication as prescribed by your doctor to help lower blood sugar.\n- **Eat a snack:** Eat a snack rich in carbohydrates and protein to help lower blood sugar.\n- **Avoid strenuous activity:** Avoid strenuous activity until blood sugar returns to normal.\n\n**Managing Low Blood Sugar Episodes:**\n- **Eat a snack:** Eat a snack rich in carbohydrates and protein to help raise blood sugar.\n- **Drink juice or soda:** Drink juice or soda to help raise blood sugar.\n- **Take glucose tablets:** Take glucose tablets as prescribed by your doctor to help raise blood sugar.\n- **Seek medical attention:** Seek medical attention if symptoms persist or worsen.\n\n**WHO Guidelines for Blood Sugar Management:**\n- **Definition:** High blood sugar is defined as a fasting blood sugar ≥ 126 mg/dL or a postprandial blood sugar ≥ 200 mg/dL.\n- **Classification:** High blood sugar can be classified into three categories:\n- **Mild:** fasting blood sugar 126-140 mg/dL or postprandial blood sugar 200-240 mg/dL\n- **Moderate:** fasting blood sugar 141-160 mg/dL or postprandial blood sugar 241-280 mg/dL\n- **Severe:** fasting blood sugar ≥ 161 mg/dL or postprandial blood sugar ≥ 281 mg/dL\n- **Treatment goals:** The treatment goal for high blood sugar is to achieve a fasting blood sugar < 100 mg/dL and a postprandial blood sugar < 140 mg/dL.\n\n**Source:**\n- *World Health Organization. (2018). Diabetes*\n- *World Health Organization. (2019). Blood Sugar*\n- *World Health Organization. (2018). Guidelines for the Management of Diabetes*" +}, +{ +"id": "5", +"image": "assets/images/pills.svg", +"source": "assets/images/pills.svg", +"header": "Insight Blood Sugar", +"title": "Knowledge of blood sugar drugs", +"description": "According to the World Health Organization (WHO), the following are some common blood sugar drugs, their mechanisms of action, and potential side effects:\n\n**Metformin:**\n- **Mechanism of action:** Decreases glucose production in the liver and increases insulin sensitivity.\n- *Side effects: Gastrointestinal upset, diarrhea, abdominal pain.*\n\n**Sulfonylureas:**\n- **Mechanism of action:** Stimulates insulin release from the pancreas.\n- *Side effects: Hypoglycemia, weight gain, skin rash.*\n\n**Pioglitazone:**\n- **Mechanism of action:** Increases insulin sensitivity and decreases glucose production in the liver.\n- *Side effects: Edema, weight gain, increased risk of bladder cancer.*\n\n**Insulin:**\n- **Mechanism of action:** Lowers blood sugar by facilitating glucose uptake in cells.\n- *Side effects: Hypoglycemia, weight gain, injection site reactions.*\n\n**GLP-1 Receptor Agonists:**\n- **Mechanism of action:** Increases insulin release and decreases glucagon release.\n- *Side effects: Nausea, vomiting, diarrhea, increased risk of pancreatitis.*\n\n**SGLT-2 Inhibitors:**\n- **Mechanism of action:** Increases glucose excretion in the urine.\n- *Side effects: Genital mycotic infections, urinary tract infections, increased risk of kidney damage.*\n\n**WHO Guidelines for Blood Sugar Management:**\n- 1. **Lifestyle modifications**: Encourage lifestyle modifications, such as regular physical activity, a balanced diet, and stress reduction.\n- 2. **Pharmacological treatment**: Use pharmacological treatment to achieve a fasting blood sugar < 100 mg/dL and a postprandial blood sugar < 140 mg/dL.\n- 3. **Combination therapy**: Use combination therapy to achieve blood sugar targets, especially in patients with multiple risk factors.\n- 4. **Monitoring**: Regularly monitor blood sugar and adjust treatment as needed.\n\n**Sources:**\n- *World Health Organization. (2018).*\n- World Health Organization. (2019). Blood Sugar.*\n- World Health Organization. (2018). Guidelines for the Management of Diabetes.*" +}, +{ +"id": "6", +"image": "assets/images/food.svg", +"source": "assets/images/food.svg", +"header": "Insight Blood Sugar", +"title": "Foods to help manage high and low blood sugar", +"description": "According to the World Health Organization (WHO), the following foods can help manage high and low blood sugar:\n\n**Foods to Help Manage High Blood Sugar:**\n- **Leafy Greens:** Spinach, kale, and collard greens are rich in fiber, vitamins, and minerals that can help lower blood sugar.\n- **Berries:** Berries such as blueberries, strawberries, and raspberries are rich in antioxidants and fiber that can help lower blood sugar.\n- **Fatty Fish:** Fatty fish such as salmon, tuna, and mackerel are rich in omega-3 fatty acids that can help lower inflammation and improve insulin sensitivity.\n- **Whole Grains:** Whole grains such as brown rice, quinoa, and whole wheat bread can help lower blood sugar by reducing carbohydrate intake and increasing fiber intake.\n- **Legumes:** Legumes such as lentils, chickpeas, and black beans are rich in protein, fiber, and complex carbohydrates that can help lower blood sugar.\n- **Nuts and Seeds:** Nuts and seeds such as almonds, sunflower seeds, and pumpkin seeds are rich in healthy fats, protein, and fiber that can help lower blood sugar.\n- **Herbs and Spices:** Herbs and spices such as cinnamon, turmeric, and ginger have anti-inflammatory properties that can help lower blood sugar.\n- **Low-Fat Dairy:** Low-fat dairy products such as milk, cheese, and yogurt are rich in protein, calcium, and vitamins that can help lower blood sugar.\n\n**Foods to Help Manage Low Blood Sugar:**\n- **Fast-Acting Carbohydrates:** Foods high in fast-acting carbohydrates such as white bread, sugary snacks, and sweetened beverages can help raise blood sugar quickly.\n- **Fruits:** Fruits such as bananas, apples, and oranges are rich in natural sugars that can help raise blood sugar.\n- **Dried Fruits:** Dried fruits such as dates, apricots, and prunes are rich in natural sugars that can help raise blood sugar.\n- **Honey and Maple Syrup:** Honey and maple syrup are natural sweeteners that can help raise blood sugar.\n- **Candy and Chocolate:** Candy and chocolate are high in sugar and can help raise blood sugar quickly.\n\n**WHO Guidelines for Blood Sugar Management:**\n- **Dietary Recommendations:** Encourage a balanced diet that is low in added sugars, saturated fats, and refined carbohydrates, and high in whole, unprocessed foods.\n- **Carbohydrate Intake:** Limit carbohydrate intake to 45-65% of total daily calories.\n- **Fiber Intake:** Increase fiber intake to at least 25 grams per day.\n- **Protein Intake:** Increase protein intake to at least 0.8 grams per kilogram of body weight per day.\n\n**Sources:**\n- *World Health Organization. (2018).*\n- World Health Organization. (2019). Blood Sugar.*\n- World Health Organization. (2018). Guidelines for the Management of Diabetes.*" +} +] \ No newline at end of file diff --git a/assets/data/self_screening_insight.json b/assets/data/self_screening_insight.json index d20d02c9..7811abba 100644 --- a/assets/data/self_screening_insight.json +++ b/assets/data/self_screening_insight.json @@ -1,59 +1,51 @@ [ { "id": "1", - "image": "assets/images/Calendar-home.svg", - "source": "assets/images/appointment-empty-boy.svg", - "header": "Insight", + "image": "assets/images/doctors.svg", + "source": "assets/images/doctors.svg", + "header": "Insight Blood Pressure", "title": "What is blood pressure", - "description": "Need to reschedule? No worries! Life happens, and we're here to make it easy. Just let us know when works best for you, and we'll find a new time that fits perfectly. Your health is our priority!\n\n **Importance:** \n- **Flexibility:** It provides you with the flexibility to adjust your appointments according to your changing schedules, making it easier to manage unexpected events or conflicts.\n- **Adherence:** It ensures you keep your appointments\n\n **How to Access:** \n- Open the application and on the future appointment \n- Click reschedule appointment\n- Select preferred date, time and reason for rescheduling request\n- You will receive notification upon approval of your request. \n\n Need to shift your health check? No worries—reschedule in a snap and keep your wellness on track!" + "description": "According to the World Health Organization (WHO), blood pressure is defined as the force exerted by the blood on the walls of the arteries as it circulates throughout the body. Blood pressure is usually expressed in terms of two measurements: **systolic pressure** (the pressure in the arteries when the heart beats) and **diastolic pressure** (the pressure in the arteries when the heart is at rest between beats).\n\n **Blood Pressure Classification (WHO, 2018)**\n- **Optimal blood pressure:** Less than 120/80 mmHg.\n- **Normal blood pressure:** 120-129/80-84 mmHg\n- **Elevated blood pressure:** 130-139/85-89 mmHg.\n- **Grade 1 hypertension:** 140-159/90-99 mmHg.\n- **Grade 2 hypertension:** 160-179/100-109 mmHg\n- **Grade 3 hypertension:** 180 or higher/110 or higher mmHg.\n\n **Source:**\n- *World Health Organization. (2018). WHO Guidelines for the Management of Hypertension.*" }, { "id": "2", - "image": "assets/images/lab-home.svg", - "source": "assets/images/lab-home.svg", - "header": "Insight", + "image": "assets/images/heart.svg", + "source": "assets/images/heart.svg", + "header": "Insight Blood Pressure", "title": "Details of blood pressure level", - "description": "Get your lab results with ease—your health insights are just a click away!\n\n **Importance:** \n- **Timely Information:** Quick access to lab results enables you to make informed decisions promptly, which is essential for timely treatment and intervention.\n- **Empowerment:** It empowers you by giving them direct access to your health information, fostering a sense of ownership and engagement in your healthcare journey.\n\n **How to Access:** \n- Go to Lab results module under apps \n- View Lab results trends and line list \n\nAccess to lab results is an essential aspect of modern healthcare, contributing to your empowerment, better care, and improved health outcomes!" + "description": "According to the World Health Organization (WHO), the following are the details of blood pressure levels:\n\n **Blood Pressure Classification (WHO, 2018)**\n- **Optimal blood pressure:**\n- *Systolic blood pressure (SBP): Less than 120 mmHg*\n- *Diastolic blood pressure (DBP): Less than 80mmHg*\n- **Normal blood pressure:**\n- *SBP 120-129 mmHg* \n- *DBP 80-84 mmHg*\n- **Elevated blood pressure:**\n- *SBP 130-139 mmHg* \n- *DBP 85-89 mmHg*\n- **Grade 1 hypertension:** \n- *SBP 140-159* \n- *DBP 90-99 mmHg*\n- **Grade 2 hypertension:** \n- *SBP 160-179* \n- *100-109 mmHg*\n- **Grade 3 hypertension:** \n- *180 or higher mmHg*\n- *110 or higher mmHg*\n\n **Additional definitions:** \n- **Isolated systolic hypertension:** SBP ≥ 140 mmHg and DBP < 90 mmHg. \n- **Isolated diastolic hypertension:** SBP < 140 mmHg and DBP ≥ 90 mmHg. \n- **White coat hypertension:** Elevated blood pressure in a clinical setting, but normal blood pressure at home.\n- **Masked hypertension:** Normal blood pressure in a clinical setting, but elevated blood pressure at home\n\n **WHO Guidelines for Blood Pressure Measurement**\n- Blood pressure should be measured in a seated position, with the arm at heart level.\n- The cuff should be of the correct size for the arm.\n- The measurement should be taken after a period of rest (at least 5 minutes).\n- Two or more readings should be taken, with the average value used for classification.\n\n **Interpretation of Blood Pressure Readings**\n- **Single reading:** A single blood pressure reading is not sufficient to diagnose hypertension. Multiple readings should be taken over time to confirm the diagnosis.\n- **Variability:** Blood pressure can vary throughout the day. A single reading may not accurately reflect an individual's usual blood pressure.\n- **Trend:** A trend of increasing blood pressure over time is more important than a single reading.\n\n**Note:** \n- It's important to note that these values are general guidelines, and individual cases may vary. It's always best to consult with a healthcare professional for a proper diagnosis and management of blood pressure levels.\n- These reference values are for adults aged 18 years and older.\n\n\n **Source:**\n- *World Health Organization. (2018). WHO Guidelines for the Management of Hypertension.*" }, { "id": "3", "image": "assets/images/insight_board.svg", "source": "assets/images/insight_board.svg", - "header": "Insight", + "header": "Module Disclaimer", "title": "Disclaimer", "description": "Self-screening is intended for monitoring and tracking your health, not for diagnosing medical conditions.\n\n\nUsers can input their daily measurement readings into the app, which then generates charts and graphs to help monitor their health based on the data provided. Please note that the app does not measure the readings itself but only records and tracks the user-entered data.\n\nThe app currently draws information from reputable sources such as the CDC and WHO. However, please be aware that the data provided may not always reflect real-life situations accurately.\n\nThe app is intended for informational purposes only and is not a medical device. Users experiencing health issues should consult with doctors or healthcare professionals for appropriate advice and treatment." }, { "id": "4", - "image": "assets/images/Hospital building-bro.svg", - "source": "assets/images/Hospital building-bro.svg", - "header": "Insight", - "title": "Some other facts of blood pressure", - "description": "Need your meds delivered? Request a drug drop with just a click and have your prescriptions conveniently brought to your door!\n\n **Importance:** \n- **Convenience:** Save time and effort by bringing medications directly to your door.\n- **Adherence:** By ensuring that you receive medications on time, dawa drop feature help improve adherence to prescribed treatment plans and reduce missed doses.\n- **Accessibility:** We provide access to medications for individuals with mobility issues, those living in remote areas, or those who lack transportation.\n- **Privacy:** Dawa Drop offers a discreet way to receive prescriptions, which can be important for individuals who prefer to keep their health conditions and medications private.\n\n **How to Access:**\n- Go to Dawa Drop module under apps\n- Select Request for Drug Delivery\n- Select Refill appointment drug\n- Fill the drug request form and submit.\n- Your will receive notification on the progress of your request till delivery.\nOverall, drug delivery drops enhance the convenience, safety, and accessibility of medications, improving overall patient care and satisfaction!" - }, - { - "id": "5", "image": "assets/images/Medical prescription-bro.svg", "source": "assets/images/Medical prescription-bro.svg", - "header": "Insight", + "header": "Insight Blood Pressure", "title": "How to prevent and manage low blood pressure", - "description": "Need to find a facility? Our directory makes it easy—locate contacts and services at your fingertips!\n\n**Importance:**\n- **Communication:** Facilitates better communication by providing contact information for various facility ensuring that inquiries are directed to the right place.\n- **Emergency:** Having a clear directory helps quickly locate nearby facilities incase of emergencies.\n\n**How to Access:**\n- Go to Facility Directory module under apps\n- View Search facility by name or MFL code and view results\n- Click on the contacts details for call\nDiscover what you need with ease—our facility directory puts every department and service right at your fingertips!" + "description": "According to the World Health Organization (WHO), preventing and managing low blood pressure (hypotension) requires a combination of lifestyle changes, dietary modifications, and medical treatment. Here are the WHO-recommended guidelines for preventing and managing low blood pressure:\n\n **Prevention:**\n- **Maintain a healthy lifestyle:** Engage in regular physical activity, eat a balanced diet, and avoid smoking and excessive alcohol consumption.\n- **Stay hydrated:** Drink plenty of water and other fluids to help maintain blood volume and prevent dehydration.\n- **Manage stress:** Practice stress-reducing techniques like meditation, deep breathing, or yoga.\n- **Get enough sleep:** Aim for 7-8 hours of sleep per night to help regulate blood pressure.\n **Dietary Recommendations:**\n- **Increase salt intake:** Consume more salt to help increase blood volume and blood pressure. However, be mindful of excessive salt consumption, which can lead to other health problems.\n- **Eat small, frequent meals:** Eating smaller meals throughout the day can help prevent a drop in blood pressure after meals.\n- **Include blood-pressure-boosting foods:** Foods rich in vitamin B12, such as fish, eggs, and dairy products, can help increase blood pressure.\n- **Avoid caffeine and nicotine:** Both caffeine and nicotine can cause blood vessels to constrict, leading to a drop in blood pressure.\n\n **Management:**\n- **Monitor blood pressure:** Regularly monitor blood pressure to detect any changes or abnormalities.\n- **Medications:** If you have chronic low blood pressure, your doctor may prescribe medications to help increase blood pressure. These medications may include:\n- *Fludrocortisone (Florinef) to increase blood volume*/n- *Midodrine (ProAmatine) to constrict blood vessels and increase blood pressure*\n- *Ephedrine to increase blood pressure and heart rate*\n- **Compression stockings:** Wearing compression stockings can help improve circulation and increase blood pressure.\n- **Elevating the head of your bed:** Raising the head of your bed by 4-6 inches can help improve circulation and increase blood pressure.\n\n**Managing Low Blood Pressure Episodes:**\n- **Lie down:** If you experience a sudden drop in blood pressure, lie down and elevate your legs above the level of your heart.\n- **Drink water or other fluids:** Drink water or other fluids to help increase blood volume and blood pressure.\n- **Eat a snack:** Eating a snack rich in carbohydrates and protein can help increase blood sugar and blood pressure.\n- **Avoid standing up quickly:** When standing up, do so slowly and carefully to avoid a sudden drop in blood pressure.\n\n**WHO Guidelines for Low Blood Pressure:**\n- **Definition:** Low blood pressure is defined as a systolic blood pressure <90 mmHg or a diastolic blood pressure <60 mmHg.\n- **Classification:** Low blood pressure can be classified into three categories:\n- **Mild:** systolic blood pressure 90-100 mmHg or diastolic blood pressure 60-70 mmHg\n- **Moderate:** systolic blood pressure 80-89 mmHg or diastolic blood pressure 50-59 mmHg\n- **Severe:** systolic blood pressure <80 mmHg or diastolic blood pressure <50 mmHg\n- **Treatment goals:** The treatment goal for low blood pressure is to increase blood pressure to a level that is sufficient to maintain adequate organ perfusion and prevent symptoms.\n**Source:**\n- *World Health Organization. (2018). Hypotension*\n- *World Health Organization. (2019). Blood Pressure*\n- *World Health Organization. (2018). Guidelines for the Management of Hypotension*" }, { - "id": "6", - "image": "assets/images/Medical prescription-bro.svg", - "source": "assets/images/Medical prescription-bro.svg", - "header": "Insight", + "id": "5", + "image": "assets/images/pills.svg", + "source": "assets/images/pills.svg", + "header": "Insight Blood Pressure", "title": "Knowledge of blood pressure drugs", - "description": "Need to find a facility? Our directory makes it easy—locate contacts and services at your fingertips!\n\n**Importance:**\n- **Communication:** Facilitates better communication by providing contact information for various facility ensuring that inquiries are directed to the right place.\n- **Emergency:** Having a clear directory helps quickly locate nearby facilities incase of emergencies.\n\n**How to Access:**\n- Go to Facility Directory module under apps\n- View Search facility by name or MFL code and view results\n- Click on the contacts details for call\nDiscover what you need with ease—our facility directory puts every department and service right at your fingertips!" + "description": "According to the World Health Organization (WHO), the following are some common blood pressure drugs, their mechanisms of action, and potential side effects:\n\n**Diuretics:**\n- **Hydrochlorothiazide (HCTZ)**: Increases urine production, reducing blood volume and pressure.\n- *Side effects: Increased urination, potassium loss, dehydration.*\n- **Furosemide (Lasix)**: Increases urine production, reducing blood volume and pressure.\n- *Side effects: Increased urination, potassium loss, dehydration.*\n- **Spironolactone (Aldactone)**: Blocks aldosterone, reducing sodium reabsorption and increasing potassium levels.\n- *Side effects: Breast tenderness, gynecomastia, hyperkalemia.*\n\n**Beta Blockers:**\n- **Metoprolol (Lopressor)**: Reduces heart rate and contractility, decreasing cardiac output and blood pressure.\n- *Side effects: Fatigue, dizziness, bradycardia, bronchospasm.*\n- **Atenolol (Tenormin)**: Reduces heart rate and contractility, decreasing cardiac output and blood pressure.\n- *Side effects: Fatigue, dizziness, bradycardia, bronchospasm.*\n- **Propranolol (Inderal)**: Reduces heart rate and contractility, decreasing cardiac output and blood pressure.\n- *Side effects: Fatigue, dizziness, bradycardia, bronchospasm.*\n\n **Angiotensin-Converting Enzyme (ACE) Inhibitors:**\n- **Enalapril (Vasotec)**: Blocks angiotensin-converting enzyme, reducing angiotensin II levels and blood pressure.\n- *Side effects: Cough, hyperkalemia, renal impairment.*\n- **Lisinopril (Zestril)**: Blocks angiotensin-converting enzyme, reducing angiotensin II levels and blood pressure.\n- *Side effects: Cough, hyperkalemia, renal impairment.*\n- **Captopril (Capoten)**: Blocks angiotensin-converting enzyme, reducing angiotensin II levels and blood pressure.\n- *Side effects: Cough, hyperkalemia, renal impairment.*\n\n**Angiotensin Receptor Blockers (ARBs):**\n- **Losartan (Cozaar)**: Blocks angiotensin II receptors, reducing blood pressure.\n- *Side effects: Hyperkalemia, renal impairment, dizziness.*\n- **Valsartan (Diovan)**: Blocks angiotensin II receptors, reducing blood pressure.\n- *Side effects: Hyperkalemia, renal impairment, dizziness.*\n- **Candesartan (Atacand)**: Blocks angiotensin II receptors, reducing blood pressure.\n- *Side effects: Hyperkalemia, renal impairment, dizziness.*\n\n**Calcium Channel Blockers:**\n- **Amlodipine (Norvasc)**: Blocks calcium channels, reducing blood pressure.\n- *Side effects: Edema, dizziness, flushing.*\n- **Verapamil (Calan)**: Blocks calcium channels, reducing blood pressure.\n- *Side effects: Constipation, dizziness, bradycardia.*\n- **Diltiazem (Cardizem)**: Blocks calcium channels, reducing blood pressure.\n- *Side effects: Constipation, dizziness, bradycardia.*\n\n**Alpha Blockers:**\n- **Prazosin (Minipress)**: Blocks alpha receptors, reducing blood pressure.\n- *Side effects: Orthostatic hypotension, dizziness, nasal congestion.*\n- **Terazosin (Hytrin)**: Blocks alpha receptors, reducing blood pressure.\n- *Side effects: Orthostatic hypotension, dizziness, nasal congestion.*\n\n**Centrally Acting Agents:**\n- **Clonidine (Catapres)**: Stimulates alpha receptors in the brain, reducing blood pressure.\n- *Side effects: Drowsiness, dry mouth, constipation.*\n- **Methyldopa (Aldomet)**: Stimulates alpha receptors in the brain, reducing blood pressure.\n- *Side effects: Drowsiness, dry mouth, constipation.*\n\n**Vasodilators:**\n- **Hydralazine (Apresoline)**: Dilates blood vessels, reducing blood pressure.\n- *Side effects: Headache, tachycardia, lupus-like syndrome.*\n- **Minoxidil (Loniten)**: Dilates blood vessels, reducing blood pressure.\n- *Side effects: Hirsutism, tachycardia, pericardial effusion.*\n\n**WHO Guidelines for Blood Pressure Management:**\n- 1. **Lifestyle modifications**: Encourage lifestyle modifications, such as regular physical activity, a balanced diet, and stress reduction.\n- 2. **Pharmacological treatment**: Use pharmacological treatment to achieve a blood pressure target of <140/90 mmHg.\n- 3. **Combination therapy**: Use combination therapy to achieve blood pressure targets, especially in patients with multiple risk factors.\n- 4. **Monitoring**: Regularly monitor blood pressure and adjust treatment as needed.\n\n**Sources:**\n- *World Health Organization. (2018).*\n- World Health Organization. (2019). Blood Pressure.*\n- World Health Organization. (2018). Guidelines for the Management of Hypertension.*" } , { - "id": "7", - "image": "assets/images/Medical prescription-bro.svg", - "source": "assets/images/Medical prescription-bro.svg", - "header": "Insight", + "id": "6", + "image": "assets/images/food.svg", + "source": "assets/images/food.svg", + "header": "Insight Blood Pressure", "title": "Foods to help manage high and low blood pressure", - "description": "Need to find a facility? Our directory makes it easy—locate contacts and services at your fingertips!\n\n**Importance:**\n- **Communication:** Facilitates better communication by providing contact information for various facility ensuring that inquiries are directed to the right place.\n- **Emergency:** Having a clear directory helps quickly locate nearby facilities incase of emergencies.\n\n**How to Access:**\n- Go to Facility Directory module under apps\n- View Search facility by name or MFL code and view results\n- Click on the contacts details for call\nDiscover what you need with ease—our facility directory puts every department and service right at your fingertips!" + "description": "According to the World Health Organization (WHO), the following foods can help manage high and low blood pressure:\n\n**Foods to Help Manage High Blood Pressure:**\n- **Leafy Greens:** Spinach, kale, and collard greens are rich in potassium, calcium, and magnesium, which can help lower blood pressure.\n- **Berries:** Berries such as blueberries, strawberries, and raspberries are rich in flavonoids, which can help improve blood vessel function and lower blood pressure.\n- **Beets:** Beets are rich in nitrates, which can help relax blood vessels and lower blood pressure.\n- **Olive Oil:** Olive oil is rich in monounsaturated fats, which can help lower total cholesterol and LDL ('bad') cholesterol levels.\n- **Fatty Fish:** Fatty fish such as salmon, tuna, and mackerel are rich in omega-3 fatty acids, which can help lower triglycerides and blood pressure.\n- **Whole Grains:** Whole grains such as brown rice, quinoa, and whole wheat bread can help lower blood pressure by reducing sodium intake and increasing potassium intake.\n- **Legumes:** Legumes such as lentils, chickpeas, and black beans are rich in potassium, magnesium, and fiber, which can help lower blood pressure.\n- **Nuts and Seeds:** Nuts and seeds such as almonds, sunflower seeds, and pumpkin seeds are rich in magnesium and potassium, which can help lower blood pressure.\n- **Herbs and Spices:** Herbs and spices such as garlic, ginger, and turmeric have anti-inflammatory properties that can help lower blood pressure.\n- **Low-Fat Dairy:** Low-fat dairy products such as milk, cheese, and yogurt are rich in calcium, potassium, and magnesium, which can help lower blood pressure.\n\n**Foods to Help Manage Low Blood Pressure:**\n- **Salt-Rich Foods:** Foods high in salt such as soy sauce, fish sauce, and processed meats can help increase blood pressure.\n- **Caffeine:** Caffeine can help increase blood pressure by constricting blood vessels.\n- **Sugar-Rich Foods:** Foods high in sugar such as candy, baked goods, and sweetened beverages can help increase blood pressure.\n- **Refined Carbohydrates:** Refined carbohydrates such as white bread, sugary snacks, and sweetened beverages can help increase blood pressure.\n- **Foods High in Tyramine:** Foods high in tyramine such as aged cheese, wine, and fermented meats can help increase blood pressure.\n- **Ginseng:** Ginseng can help increase blood pressure by stimulating the nervous system.\n- **Licorice Root:** Licorice root can help increase blood pressure by increasing aldosterone levels.\n- **Cayenne Pepper:** Cayenne pepper can help increase blood pressure by constricting blood vessels.\n- **Ginger:** Ginger can help increase blood pressure by stimulating the nervous system.\n- **Foods High in Vitamin B12:** Foods high in vitamin B12 such as fish, eggs, and dairy products can help increase blood pressure.\n\n**WHO Guidelines for Blood Pressure Management:**\n- **Dietary Recommendations:** Encourage a balanced diet that is low in sodium, added sugars, and saturated fats, and high in fruits, vegetables, whole grains, and lean protein sources.\n- **Sodium Intake:** Limit sodium intake to less than 2,000 mg per day.\n- **Potassium Intake:** Increase potassium intake to at least 3,500 mg per day.\n- **Calcium Intake:** Increase calcium intake to at least 1,000 mg per day.\n- **Magnesium Intake:** Increase magnesium intake to at least 400 mg per day.\n\n**Sources:**\n- *World Health Organization. (2018).*\n- World Health Organization. (2019). Blood Pressure.*\n- World Health Organization. (2018). Guidelines for the Management of Hypertension.*" } ] \ No newline at end of file diff --git a/assets/images/food.svg b/assets/images/food.svg new file mode 100644 index 00000000..cec19f48 --- /dev/null +++ b/assets/images/food.svg @@ -0,0 +1,2022 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/heart.svg b/assets/images/heart.svg new file mode 100644 index 00000000..32483330 --- /dev/null +++ b/assets/images/heart.svg @@ -0,0 +1,1447 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/src/features/appointments/presentation/pages/AppointmentsScreen.dart b/lib/src/features/appointments/presentation/pages/AppointmentsScreen.dart index 52e6030b..4195c355 100644 --- a/lib/src/features/appointments/presentation/pages/AppointmentsScreen.dart +++ b/lib/src/features/appointments/presentation/pages/AppointmentsScreen.dart @@ -5,7 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/appointments/presentation/widgets/CurrentAppoints.dart'; import 'package:nishauri/src/features/appointments/presentation/widgets/PreviousAppointments.dart'; import 'package:nishauri/src/shared/display/CustomTabBar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; class AppointmentsScreen extends HookConsumerWidget { diff --git a/lib/src/features/art/presentation/FacilityDirectory.dart b/lib/src/features/art/presentation/FacilityDirectory.dart index 319f6df6..9fd4488b 100644 --- a/lib/src/features/art/presentation/FacilityDirectory.dart +++ b/lib/src/features/art/presentation/FacilityDirectory.dart @@ -5,7 +5,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/art/model/Facility.dart'; import 'package:nishauri/src/features/art/services/FacilityDirectorySerivice.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart index 8c3c6f2b..3c313537 100644 --- a/lib/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -7,7 +7,7 @@ import 'package:nishauri/src/features/blood_sugar/data/providers/blood_sugar_pro import 'package:nishauri/src/features/blood_sugar/presentation/pages/AddBloodSugarScreen.dart'; import 'package:nishauri/src/features/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart'; import 'package:nishauri/src/shared/charts/CustomLineChart.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart b/lib/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart index 80955249..cfd69aba 100644 --- a/lib/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart +++ b/lib/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart @@ -5,7 +5,7 @@ import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/bmi/data/providers/bmi_status_nutrition_provider.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/helpers.dart'; diff --git a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart index 85533761..53c8ba8b 100644 --- a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart +++ b/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart @@ -13,7 +13,7 @@ import 'package:nishauri/src/features/bmi/presentation/widgets/HeightPicker.dart import 'package:nishauri/src/features/bmi/presentation/widgets/HeightUnitsPicker.dart'; import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/RadioGroup.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/shared/input/QuanterSizer.dart'; diff --git a/lib/src/features/bmi/presentation/pages/BMIHistoryScreen.dart b/lib/src/features/bmi/presentation/pages/BMIHistoryScreen.dart index 8814f200..2e5fbb76 100644 --- a/lib/src/features/bmi/presentation/pages/BMIHistoryScreen.dart +++ b/lib/src/features/bmi/presentation/pages/BMIHistoryScreen.dart @@ -5,7 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/bmi/presentation/widgets/BMILineGraph.dart'; import 'package:nishauri/src/features/bmi/presentation/widgets/BMILineList.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/bp/presentation/pages/bpMonitorScreen.dart index 12044120..427f540f 100644 --- a/lib/src/features/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/bp/presentation/pages/bpMonitorScreen.dart @@ -5,7 +5,7 @@ import 'package:nishauri/src/features/bp/data/models/blood_pressure.dart'; import 'package:nishauri/src/features/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/features/bp/presentation/pages/BPLinelistScreen.dart'; import 'package:nishauri/src/features/bp/presentation/pages/trend_chart_screen.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 0691d2dd..ca11e178 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -7,7 +7,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/clinic_card/data/providers/programProvider.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/clinicalDetails.dart'; import 'package:nishauri/src/shared/display/CustomTabBar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/common/presentation/pages/FaqPage.dart b/lib/src/features/common/presentation/pages/FaqPage.dart index 2d5c8980..bd25ecdb 100644 --- a/lib/src/features/common/presentation/pages/FaqPage.dart +++ b/lib/src/features/common/presentation/pages/FaqPage.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:nishauri/src/features/common/data/models/faq_model.dart'; import 'package:nishauri/src/features/common/data/services/FAQ_service.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/helpers.dart'; diff --git a/lib/src/features/common/presentation/pages/blog.dart b/lib/src/features/common/presentation/pages/blog.dart index bda33cef..f04e8b83 100644 --- a/lib/src/features/common/presentation/pages/blog.dart +++ b/lib/src/features/common/presentation/pages/blog.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:nishauri/src/features/common/data/models/announcement.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/scafold_stack_body.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/helpers.dart'; diff --git a/lib/src/features/confirm_delivery/presentation/pages/ConfirmDeliveryScreen.dart b/lib/src/features/confirm_delivery/presentation/pages/ConfirmDeliveryScreen.dart index ee1a991e..46f33669 100644 --- a/lib/src/features/confirm_delivery/presentation/pages/ConfirmDeliveryScreen.dart +++ b/lib/src/features/confirm_delivery/presentation/pages/ConfirmDeliveryScreen.dart @@ -9,7 +9,7 @@ import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; import 'package:nishauri/src/features/confirm_delivery/data/modules/confirm_delivery.dart'; import 'package:nishauri/src/features/confirm_delivery/data/providers/confirm_delivery_provider.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/Logo.dart'; import 'package:nishauri/src/shared/display/verify.dart'; import 'package:nishauri/src/shared/exeptions/http_exceptions.dart'; diff --git a/lib/src/features/dawa_drop/presentation/pages/dawa_drop_menu.dart b/lib/src/features/dawa_drop/presentation/pages/dawa_drop_menu.dart index ce57d617..c6cf3c29 100644 --- a/lib/src/features/dawa_drop/presentation/pages/dawa_drop_menu.dart +++ b/lib/src/features/dawa_drop/presentation/pages/dawa_drop_menu.dart @@ -4,7 +4,7 @@ import 'package:go_router/go_router.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/dawa_drop/presentation/pages/dawa_drop_screen.dart b/lib/src/features/dawa_drop/presentation/pages/dawa_drop_screen.dart index 28e2538c..4e8e83c8 100644 --- a/lib/src/features/dawa_drop/presentation/pages/dawa_drop_screen.dart +++ b/lib/src/features/dawa_drop/presentation/pages/dawa_drop_screen.dart @@ -6,7 +6,7 @@ import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/dawa_drop_menu.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/widget/DawaDropGetStartedWidget.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/meds.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/dawa_drop/presentation/pages/dispatched_drugs.dart b/lib/src/features/dawa_drop/presentation/pages/dispatched_drugs.dart index 72447c99..99087c0c 100644 --- a/lib/src/features/dawa_drop/presentation/pages/dispatched_drugs.dart +++ b/lib/src/features/dawa_drop/presentation/pages/dispatched_drugs.dart @@ -7,7 +7,7 @@ import 'package:intl/intl.dart'; import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; import 'package:nishauri/src/local_storage/LocalStorage.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/shared/interfaces/notification_service.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart b/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart index dac572fe..c90d37cb 100644 --- a/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart +++ b/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart @@ -3,7 +3,7 @@ import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/appointments/data/providers/appointment_provider.dart'; import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/dawa_drop/presentation/pages/request_drug.dart b/lib/src/features/dawa_drop/presentation/pages/request_drug.dart index d8d562e7..606ff7f1 100644 --- a/lib/src/features/dawa_drop/presentation/pages/request_drug.dart +++ b/lib/src/features/dawa_drop/presentation/pages/request_drug.dart @@ -3,7 +3,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/dawa_drop/presentation/pages/request_order/DrugOrderWizardFormScreen.dart b/lib/src/features/dawa_drop/presentation/pages/request_order/DrugOrderWizardFormScreen.dart index f4fcbcae..e09d0c16 100644 --- a/lib/src/features/dawa_drop/presentation/pages/request_order/DrugOrderWizardFormScreen.dart +++ b/lib/src/features/dawa_drop/presentation/pages/request_order/DrugOrderWizardFormScreen.dart @@ -15,7 +15,7 @@ import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/forms/ReviewAndSubmit.dart'; import 'package:nishauri/src/features/hiv/data/models/event/art_event.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart b/lib/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart index 25400310..d5d6a2de 100644 --- a/lib/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart +++ b/lib/src/features/dawa_drop/presentation/pages/request_order/DrugOrders.dart @@ -7,7 +7,7 @@ import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provid import 'package:nishauri/src/features/dawa_drop/presentation/widget/orders/FulfilledOrders.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/widget/orders/active_orders.dart'; import 'package:nishauri/src/shared/display/CustomTabBar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/dawa_drop/presentation/widget/orders/DeliveryProgression.dart b/lib/src/features/dawa_drop/presentation/widget/orders/DeliveryProgression.dart index dde2cd63..cb9186c0 100644 --- a/lib/src/features/dawa_drop/presentation/widget/orders/DeliveryProgression.dart +++ b/lib/src/features/dawa_drop/presentation/widget/orders/DeliveryProgression.dart @@ -6,7 +6,7 @@ import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/hiv/presentation/pages/HIVMenu.dart b/lib/src/features/hiv/presentation/pages/HIVMenu.dart index 8662430e..17d874a5 100644 --- a/lib/src/features/hiv/presentation/pages/HIVMenu.dart +++ b/lib/src/features/hiv/presentation/pages/HIVMenu.dart @@ -3,7 +3,7 @@ import 'package:go_router/go_router.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/routes.dart'; _menuItems(BuildContext context) => [ diff --git a/lib/src/features/hiv/presentation/pages/RegimenHistory.dart b/lib/src/features/hiv/presentation/pages/RegimenHistory.dart index 6ad9668c..c550bff0 100644 --- a/lib/src/features/hiv/presentation/pages/RegimenHistory.dart +++ b/lib/src/features/hiv/presentation/pages/RegimenHistory.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/hiv/data/providers/art_regimen_provider.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/hiv/presentation/pages/appointments/ARTAppointmentDetail.dart b/lib/src/features/hiv/presentation/pages/appointments/ARTAppointmentDetail.dart index 62b3ba1b..7a0a23df 100644 --- a/lib/src/features/hiv/presentation/pages/appointments/ARTAppointmentDetail.dart +++ b/lib/src/features/hiv/presentation/pages/appointments/ARTAppointmentDetail.dart @@ -5,7 +5,7 @@ import 'package:intl/intl.dart'; import 'package:nishauri/src/features/appointments/data/models/appointment.dart'; import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; import 'package:nishauri/src/features/hiv/data/models/appointment/art_appointment.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/lab/presentation/pages/LabResultsScreen.dart b/lib/src/features/lab/presentation/pages/LabResultsScreen.dart index 61b38d12..7715c66d 100644 --- a/lib/src/features/lab/presentation/pages/LabResultsScreen.dart +++ b/lib/src/features/lab/presentation/pages/LabResultsScreen.dart @@ -13,7 +13,7 @@ import 'package:nishauri/src/features/lab/presentation/widget/ViralLoadResult.da import 'package:nishauri/src/features/lab/presentation/widget/ViralLoadTrend.dart'; import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; import 'package:nishauri/src/shared/display/CustomTabBar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index e32fbf41..1fdf13ca 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -5,7 +5,7 @@ import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/logPeriods.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index c0deb291..f7100a40 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -7,7 +7,7 @@ import 'package:nishauri/src/features/period_planner/data/providers/cycles_provi import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart index d4de7a21..59727617 100644 --- a/lib/src/features/period_planner/presentation/pages/periodCalendar.dart +++ b/lib/src/features/period_planner/presentation/pages/periodCalendar.dart @@ -5,7 +5,7 @@ // import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; // import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; // import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; -// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/shared/display/CustomAppBar.dart'; // import 'package:nishauri/src/utils/constants.dart'; // import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart index 1176bbe8..3062d396 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlanner.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlanner.dart @@ -3,7 +3,7 @@ // import 'package:go_router/go_router.dart'; // import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; // import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; -// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/shared/display/CustomAppBar.dart'; // import 'package:nishauri/src/utils/constants.dart'; // import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart index cfbab66f..eef05f2e 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerMenu.dart @@ -3,7 +3,7 @@ // import 'package:go_router/go_router.dart'; // import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; // import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/shared/display/CustomAppBar.dart'; // import 'package:nishauri/src/utils/constants.dart'; // import 'package:nishauri/src/utils/routes.dart'; // import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 576f155d..f6b3c666 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -11,7 +11,7 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/custom import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/loggerWidget.dart'; import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 9b5081ad..3952a77d 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -5,7 +5,7 @@ import 'package:intl/intl.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/programs/presentation/pages/programs.dart b/lib/src/features/programs/presentation/pages/programs.dart index 588d7f81..c4facae6 100644 --- a/lib/src/features/programs/presentation/pages/programs.dart +++ b/lib/src/features/programs/presentation/pages/programs.dart @@ -9,7 +9,7 @@ import 'package:intl/intl.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/shared/display/dialogs.dart'; import 'package:nishauri/src/shared/input/Button.dart'; diff --git a/lib/src/features/self_screening/data/providers/insight_provider.dart b/lib/src/features/self_screening/data/providers/insight_provider.dart index e78d73af..676dc43c 100644 --- a/lib/src/features/self_screening/data/providers/insight_provider.dart +++ b/lib/src/features/self_screening/data/providers/insight_provider.dart @@ -1,12 +1,18 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:nishauri/src/features/common/data/models/announcement.dart'; -import 'package:nishauri/src/features/common/data/repositories/announceent_repository.dart'; -import 'package:nishauri/src/features/common/data/services/announcement_service.dart'; +import 'package:nishauri/src/features/self_screening/data/repositories/bs_repository.dart'; import 'package:nishauri/src/features/self_screening/data/repositories/insight_repository.dart'; +import 'package:nishauri/src/features/self_screening/data/services/bs_service.dart'; import 'package:nishauri/src/features/self_screening/data/services/insight_service.dart'; final insightProvider = FutureProvider>((ref) async { final service = InsightService(); final repo = InsightRepository(service); return await repo.getInsights(); +}); + +final bsInsightProvider = FutureProvider>((ref) async { + final service = BsService(); + final repo = BsRepository(service); + return await repo.getBsInsights(); }); \ No newline at end of file diff --git a/lib/src/features/self_screening/data/repositories/bs_repository.dart b/lib/src/features/self_screening/data/repositories/bs_repository.dart new file mode 100644 index 00000000..26a71cd0 --- /dev/null +++ b/lib/src/features/self_screening/data/repositories/bs_repository.dart @@ -0,0 +1,12 @@ +import 'package:nishauri/src/features/common/data/models/announcement.dart'; +import 'package:nishauri/src/features/self_screening/data/services/bs_service.dart'; + +class BsRepository { + final BsService _service; + + BsRepository(this._service); + + Future> getBsInsights() async { + return await _service.getBsInsights(); + } +} diff --git a/lib/src/features/self_screening/data/services/bs_service.dart b/lib/src/features/self_screening/data/services/bs_service.dart new file mode 100644 index 00000000..4a53a553 --- /dev/null +++ b/lib/src/features/self_screening/data/services/bs_service.dart @@ -0,0 +1,18 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:nishauri/src/features/common/data/models/announcement.dart'; +import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; +import 'package:nishauri/src/utils/helpers.dart'; + +class BsService extends HTTPService { + Future> getBsInsights() async { + final data = await loadJsonData("assets/data/self_screening_bs.json"); + final json = jsonDecode(data); + final announce = json + .map((an) => Announcement.fromJson(Map.from(an))).toList(); + + log("$announce"); + return [...announce]; + } +} diff --git a/lib/src/features/self_screening/presentation/common/insight_common.dart b/lib/src/features/self_screening/presentation/common/insight_common.dart new file mode 100644 index 00000000..7583f9fd --- /dev/null +++ b/lib/src/features/self_screening/presentation/common/insight_common.dart @@ -0,0 +1,120 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/common/data/models/announcement.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/utils/helpers.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +class InsightCommon extends HookConsumerWidget { + final String appBarTitle; + final Color appBarColor; + final AsyncValue> insightAsync; + + const InsightCommon({ + Key? key, + required this.appBarTitle, + required this.appBarColor, + required this.insightAsync, + }) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + + return insightAsync.when( + data: (data) { + if (data.isEmpty) { + return const BackgroundImageWidget( + svgImage: "assets/images/appointments-empty.svg", + notFoundText: "No Content", + ); + } + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomAppBar( + title: appBarTitle, + color: appBarColor, + ), + Expanded( + child: ListView.builder( + itemCount: data.length, + itemBuilder: (BuildContext context, int index) { + final insight = data[index]; + if (insight.id != "3") { + return Column( + children: [ + const Divider(), + InkWell( + onTap: () { + context.goNamed( + RouteNames.BLOG_POST, + extra: insight, + ); + }, + child: Card( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Adjusted to use Flexible + Flexible( + child: SvgPicture.asset( + insight.image, + height: getOrientationAwareScreenSize(context).height * 0.05, + fit: BoxFit.cover, + ), + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child: Text( + insight.title ?? '', + style: theme.textTheme.titleSmall, + overflow: TextOverflow.visible, + maxLines: 3, + ), + ), + ], + ), + ), + ), + ), + ], + ); + } else { + return SizedBox.shrink(); // Return an empty widget if id == "3" + } + }, + ), + ), + ], + ), + ); + }, + error: (error, _) => BackgroundImageWidget( + svgImage: 'assets/images/background.svg', + notFoundText: error.toString(), + ), + loading: () => Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Loading insight content.", + style: theme.textTheme.headline6, + ), + const SizedBox(height: Constants.SPACING * 2), + const CircularProgressIndicator(), + ], + ), + ), + ); + } +} diff --git a/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart b/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart index 0874b889..9590b379 100644 --- a/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart +++ b/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart @@ -1,104 +1,22 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/features/self_screening/presentation/common/insight_common.dart'; import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/shared/display/background_image_widget.dart'; -import 'package:nishauri/src/utils/helpers.dart'; -import 'package:nishauri/src/utils/routes.dart'; class BpInsightScreen extends HookConsumerWidget { const BpInsightScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context, WidgetRef ref) { - final theme = Theme.of(context); - final bpInsightAsync = ref.watch(insightProvider); + const title = "Blood Pressure Awareness 🌡"; + const color = Constants.bmiCalculatorColor; + final insightAsync = ref.watch(insightProvider); - return bpInsightAsync.when( - data: (data) { - if (data.isEmpty) { - return const BackgroundImageWidget( - svgImage: "assets/images/appointments-empty.svg", - notFoundText: "No Content", - ); - } - - return Scaffold( - body: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - CustomAppBar( - title: "Blood Pressure Awhearness🌡️", - color: Constants.bmiCalculatorColor, - ), - Expanded( - child: ListView.builder( - itemCount: data.length, - itemBuilder: (BuildContext context, int index) { - final insight = data[index]; - return Column( - children: [ - const Divider(), - InkWell( - onTap: () { - context.goNamed(RouteNames.BLOG_POST, extra: insight); - }, - child: Card( - child: Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - SvgPicture.asset( - insight.image, - width: double.infinity, - height: getOrientationAwareScreenSize(context).height * 0.05, - fit: BoxFit.cover, - ), - const SizedBox(width: Constants.SPACING), - Text( - insight.title ?? '', - style: theme.textTheme.titleSmall, - ), - ], - ), - ], - ), - ), - ), - ), - ], - ); - }, - ), - ), - ], - ), - ); - }, - error: (error, _) => BackgroundImageWidget( - svgImage: 'assets/images/background.svg', - notFoundText: error.toString(), - ), - loading: () => Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - "Loading insight content.", - style: theme.textTheme.headline6, - ), - const SizedBox(height: Constants.SPACING * 2), - const CircularProgressIndicator(), - ], - ), - ), + return InsightCommon( + appBarTitle: title, + appBarColor: color, + insightAsync: insightAsync, ); } } diff --git a/lib/src/features/self_screening/presentation/pages/bsInsightScreen.dart b/lib/src/features/self_screening/presentation/pages/bsInsightScreen.dart new file mode 100644 index 00000000..cf355696 --- /dev/null +++ b/lib/src/features/self_screening/presentation/pages/bsInsightScreen.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/self_screening/presentation/common/insight_common.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; + +class BsInsightScreen extends HookConsumerWidget { + const BsInsightScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + const title = "Blood Sugar Awareness 🌡"; + const color = Constants.bmiCalculatorColor; + final insightAsync = ref.watch(bsInsightProvider); + + return InsightCommon( + appBarTitle: title, + appBarColor: color, + insightAsync: insightAsync, + ); + } +} diff --git a/lib/src/features/self_screening/presentation/pages/insight_screen.dart b/lib/src/features/self_screening/presentation/pages/insight_screen.dart index 7432226f..09afc3ac 100644 --- a/lib/src/features/self_screening/presentation/pages/insight_screen.dart +++ b/lib/src/features/self_screening/presentation/pages/insight_screen.dart @@ -2,7 +2,8 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/features/common/presentation/pages/HomeScreen.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/program_appointments.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/features/self_screening/presentation/pages/bsInsightScreen.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; class InsightScreen extends StatelessWidget { @@ -11,10 +12,10 @@ class InsightScreen extends StatelessWidget { @override Widget build(BuildContext context) { final pages = [ + // const BpInsightScreen(), const BpInsightScreen(), - const ProgramAppointmentsScreen(), - const ProgramAppointmentsScreen(), - const ProgramAppointmentsScreen(), + const BsInsightScreen(), + // const BpInsightScreen(), ]; final theme = Theme.of(context); @@ -51,16 +52,16 @@ class InsightScreen extends StatelessWidget { children: [ Icon( index == 0 - ? Icons.calculate_outlined - : index == 1 ? Icons.trending_up + : index == 1 + ? Icons.bloodtype_outlined : index == 2 ? Icons.bloodtype_outlined : Icons.calendar_month_sharp, color: index == 0 - ? Constants.bmiCalculatorColor - : index == 1 ? Constants.bpShortCutBgColor + : index == 1 + ? Constants.bloodSugarColor : index == 2 ? Constants.bloodSugarColor : Constants.periodPlannerShortcutBgColor, @@ -68,9 +69,9 @@ class InsightScreen extends StatelessWidget { const SizedBox(width: Constants.SPACING), Text( index == 0 - ? 'BMI Calculator' + ? 'Blood Pressure Awareness' : index == 1 - ? 'Blood Pressure Monitor' + ? 'Blood Sugar Awareness' : index == 2 ? 'Blood Sugar Monitor' : 'Period Planner', diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 22155fbd..8b1231ba 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -7,7 +7,7 @@ import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; diff --git a/lib/src/features/user_programs/presentation/pages/ProgramRegistrationScreen.dart b/lib/src/features/user_programs/presentation/pages/ProgramRegistrationScreen.dart index 1ba9094a..27a2b671 100644 --- a/lib/src/features/user_programs/presentation/pages/ProgramRegistrationScreen.dart +++ b/lib/src/features/user_programs/presentation/pages/ProgramRegistrationScreen.dart @@ -8,7 +8,7 @@ import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/LinkedRichText.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/shared/layouts/ResponsiveWidgetFormLayout.dart'; diff --git a/lib/src/features/user_programs/presentation/pages/ProgramUpdateScreen.dart b/lib/src/features/user_programs/presentation/pages/ProgramUpdateScreen.dart index df373cd4..dc0136fc 100644 --- a/lib/src/features/user_programs/presentation/pages/ProgramUpdateScreen.dart +++ b/lib/src/features/user_programs/presentation/pages/ProgramUpdateScreen.dart @@ -7,7 +7,7 @@ import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; import 'package:nishauri/src/features/user_programs/data/models/user_program.dart'; import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/shared/layouts/ResponsiveWidgetFormLayout.dart'; import 'package:nishauri/src/shared/styles/input_styles.dart'; diff --git a/lib/src/shared/display/CustomeAppBar.dart b/lib/src/shared/display/CustomAppBar.dart similarity index 100% rename from lib/src/shared/display/CustomeAppBar.dart rename to lib/src/shared/display/CustomAppBar.dart diff --git a/lib/src/shared/display/background_image_widget.dart b/lib/src/shared/display/background_image_widget.dart index 7b90b562..7f8aab72 100644 --- a/lib/src/shared/display/background_image_widget.dart +++ b/lib/src/shared/display/background_image_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; class BackgroundImageWidget extends StatelessWidget { final String svgImage; From c80ac322b757eeec63e557750ef23a74f7b15ebc Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 11 Sep 2024 17:47:00 +0300 Subject: [PATCH 085/140] Handled the calculation of cycle length and period length together with their respective averages --- lib/src/app/navigation/app_router.dart | 7 ++-- .../period_planner/data/models/cycle.dart | 25 +++++++------ .../presentation/pages/editPeriodsScreen.dart | 2 ++ .../presentation/pages/logPeriods.dart | 3 ++ .../pages/periodPlannerScreen.dart | 5 +++ .../presentation/pages/periods_history.dart | 14 +++++--- .../presentation/widgets/customCalendar.dart | 35 ++++++++++++++++--- 7 files changed, 69 insertions(+), 22 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 5ada1260..acdbb3bc 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -490,9 +490,10 @@ final List selfScreeningRoutes = [ name: RouteNames.PERIOD_PLANNER_EDIT_PERIODS, path: 'period-planner-edit-periods', builder: (BuildContext context, GoRouterState state) { - final startDate = state.extra != null ? (state.extra as Map)['startDate'] as DateTime : null; - final endDate = state.extra != null ? (state.extra as Map)['endDate'] as DateTime : null; - final id = (state.extra! as Map)['id'] as String; + final extra = state.extra as Map; + final startDate = extra['startDate'] as DateTime; + final endDate = extra['endDate'] as DateTime; + final id = extra['id'] as String; return EditPeriods(initialStartDate: startDate, initialEndDate: endDate, cycleId: id,); }, ), diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart index ff4a273c..4fbf82f2 100644 --- a/lib/src/features/period_planner/data/models/cycle.dart +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -1,22 +1,27 @@ // import 'package:freezed_annotation/freezed_annotation.dart'; +// part 'cycle.freezed.dart'; +// part 'cycle.g.dart'; + // @Freezed() // class Cycle with _$Cycle { // const factory Cycle({ -// String cycleId, -// DateTime periodStart, -// DateTime periodEnd, -// DateTime fertileStart, -// DateTime fertileEnd, -// DateTime ovulation, -// DateTime predictedPeriodStart, -// DateTime predictedPeriodEnd, +// required String cycleId, +// required DateTime periodStart, +// required DateTime periodEnd, +// required DateTime fertileStart, +// required DateTime fertileEnd, +// required DateTime ovulation, +// required DateTime predictedPeriodStart, +// required DateTime predictedPeriodEnd, +// required int cycleLength, +// required int periodLength, // }) = _Cycle; -// factory Cycle.fromJson(Map json)=> _$CycleFromJson(json); +// factory Cycle.fromJson(Map json) +// => _$CycleFromJson(json); // } - class Cycle{ String cycleId; DateTime periodStart; diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index e32fbf41..36bbb542 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -63,6 +63,8 @@ class _EditPeriodsState extends ConsumerState { cycles[index] = updatedCycle; }); + updateCycleLengths(cycles); + debugPrint("Updated Cycle Length: ${updatedCycle.cycleLength}"); printCycles(cycles); diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index c0deb291..6f7ba115 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -197,6 +197,9 @@ class _LogPeriodScreenState extends ConsumerState { ref.read(cyclesProvider.notifier).addCycle(newCycle); cycles.add(newCycle); + + //update cycle lengths after adding the new cycle + updateCycleLengths(cycles); //_updateEventsForCycle(newCycle); } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 576f155d..39a81b53 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -307,7 +307,12 @@ class _PeriodPlannerScreenState extends ConsumerState { for (var cycle in cycles) { if (cycle.periodStart == _periodStart) { cycle.periodEnd = _periodEnd; + + //Recalculating period length + cycle.periodLength = _periodEnd.difference(_periodStart).inDays + 1; } + + } _updateEvents(); diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 9b5081ad..69114a47 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -17,9 +17,6 @@ class PeriodsHistory extends ConsumerStatefulWidget { } class _PeriodsHistoryState extends ConsumerState { - final averagePeriod = calculateAveragePeriodLength(cycles); - final averageCycles = calculateAverageCycleLength(cycles); - // Function to format the date as "MMM d" String formatDate(DateTime date) { return DateFormat('MMM d').format(date); @@ -41,6 +38,9 @@ class _PeriodsHistoryState extends ConsumerState { @override Widget build(BuildContext context) { final cycles = ref.watch(cyclesProvider); + + final averagePeriod = calculateAveragePeriodLength(cycles); + final averageCycles = calculateAverageCycleLength(cycles); // Group cycles by year and reverse the list to show the latest first final groupedCycles = groupCyclesByYear(cycles); final sortedYears = groupedCycles.keys.toList()..sort((a, b) => b.compareTo(a)); @@ -185,6 +185,10 @@ class _PeriodsHistoryState extends ConsumerState { final start = formatDate(cycle.periodStart); final end = formatDate(cycle.periodEnd); final cycleDays = cycle.cycleLength; + + // Check if the current cycle is the last entry + bool isLastCycle = cycle == cyclesInYear.last; + return Card( elevation: 4.0, margin: const EdgeInsets.symmetric(vertical: 8.0), @@ -200,7 +204,9 @@ class _PeriodsHistoryState extends ConsumerState { ), ), subtitle: Text( - "Length of cycle: $cycleDays days", + isLastCycle + ? "Estimated Cycle Length: $cycleDays days" + : "Length of cycle: $cycleDays days", style: const TextStyle( fontSize: 16.0, ), diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 112333d4..f6e271b1 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -6,7 +6,21 @@ import 'package:nishauri/src/features/period_planner/presentation/widgets/modalC import 'package:table_calendar/table_calendar.dart'; import 'package:uuid/uuid.dart'; -//Function to calculate Average Cycle days +//Function to update Cycle days +void updateCycleLengths(List cycles) { + // Start from the second last cycle because the last one does not have a successor yet + for (int i = 0; i < cycles.length - 1; i++) { + int cycleLength = cycles[i + 1].periodStart.difference(cycles[i].periodStart).inDays; + cycles[i].cycleLength = cycleLength; + } + + // The last cycle in the list should still use the average cycle length + if (cycles.isNotEmpty) { + cycles.last.cycleLength = calculateAverageCycleLength(cycles); + } +} + + // Function to calculate Average Cycle days int calculateAverageCycleLength(List cycles) { if (cycles.length < 2) { @@ -91,10 +105,21 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {String? cycleId}) DateTime fertileStart = ovulation.subtract(const Duration(days: 5)); DateTime fertileEnd = ovulation.subtract(const Duration(days: 1)); - //Calculating cycle Length between the previous cycle start and the latest cycle start - int cycleLength = (index > 0) - ? periodStart.difference(cycles[index - 1].periodStart).inDays - : averageCycleLength; // If it's the first entry, use the average + //Calculating cycle Length + // int cycleLength = (index > 0) + // ? periodStart.difference(cycles[index - 1].periodStart).inDays + // : averageCycleLength; + int cycleLength; + if (index > 0 && index < cycles.length - 1) { + // If the current cycle has a succeeding cycle, calculate based on difference between two cycles + cycleLength = periodStart.difference(cycles[index - 1].periodStart).inDays; + } else if (index == cycles.length - 1) { + // If it's the last cycle (no succeeding cycle), use the average cycle length as a placeholder + cycleLength = averageCycleLength; + } else { + // For the very first cycle or other fallback cases, use average cycle length + cycleLength = averageCycleLength; + } //Calculating period Length of each cycle int periodLength = periodEnd.difference(periodStart).inDays + 1; From 64a5faecdff4e69b89e162e74671dd3455686c9e Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 12 Sep 2024 12:48:46 +0300 Subject: [PATCH 086/140] Ensuring the latest cycle event is display in the history only if user has confirmed period end date or if current end date is after the period end date --- .../pages/periodPlannerScreen.dart | 12 ++- .../presentation/pages/periods_history.dart | 99 +++++++++++-------- 2 files changed, 65 insertions(+), 46 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 39a81b53..72225830 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -6,6 +6,7 @@ import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/logPeriods.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; @@ -118,7 +119,7 @@ class _PeriodPlannerScreenState extends ConsumerState { bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); bool inPeriods = isInPeriod; - + // Determine progress value and messages based on the current date double progressValue = 0.0; String message = ''; @@ -308,11 +309,12 @@ class _PeriodPlannerScreenState extends ConsumerState { if (cycle.periodStart == _periodStart) { cycle.periodEnd = _periodEnd; + // Setting the external period confirmation status to true + periodConfirmedMap[cycle.cycleId] = true; + //Recalculating period length cycle.periodLength = _periodEnd.difference(_periodStart).inDays + 1; - } - - + } } _updateEvents(); @@ -327,7 +329,7 @@ class _PeriodPlannerScreenState extends ConsumerState { // debugPrint('Is In Period after update: $isInPeriod'); // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); // debugPrint("--------"); - }); + }); //printCycles(cycles); Navigator.of(context).pop(); }, diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 69114a47..55d87b31 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -9,6 +9,9 @@ import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; +//Map containing period cycles in which the user has confirmed period end date +Map periodConfirmedMap = {}; + class PeriodsHistory extends ConsumerStatefulWidget { const PeriodsHistory({super.key}); @@ -43,7 +46,8 @@ class _PeriodsHistoryState extends ConsumerState { final averageCycles = calculateAverageCycleLength(cycles); // Group cycles by year and reverse the list to show the latest first final groupedCycles = groupCyclesByYear(cycles); - final sortedYears = groupedCycles.keys.toList()..sort((a, b) => b.compareTo(a)); + final sortedYears = groupedCycles.keys.toList() + ..sort((a, b) => b.compareTo(a)); return Scaffold( body: ListView( @@ -171,7 +175,8 @@ class _PeriodsHistoryState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), + padding: + const EdgeInsets.symmetric(horizontal: 8.0), child: Text( "$year", style: const TextStyle( @@ -182,50 +187,62 @@ class _PeriodsHistoryState extends ConsumerState { ), const SizedBox(height: 10), ...cyclesInYear.reversed.map((cycle) { - final start = formatDate(cycle.periodStart); - final end = formatDate(cycle.periodEnd); - final cycleDays = cycle.cycleLength; + // Only display cycles that are either confirmed or whose end date has passed + final bool isPeriodConfirmed = + periodConfirmedMap[cycle.cycleId] ?? false; + final bool hasPeriodEnded = + DateTime.now().isAfter(cycle.periodEnd); - // Check if the current cycle is the last entry - bool isLastCycle = cycle == cyclesInYear.last; + if (isPeriodConfirmed || hasPeriodEnded) { + final start = formatDate(cycle.periodStart); + final end = formatDate(cycle.periodEnd); + final cycleDays = cycle.cycleLength; - return Card( - elevation: 4.0, - margin: const EdgeInsets.symmetric(vertical: 8.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: ListTile( - title: Text( - "$start - $end", - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), + // Check if the current cycle is the last entry + bool isLastCycle = cycle == cyclesInYear.last; + + return Card( + elevation: 4.0, + margin: + const EdgeInsets.symmetric(vertical: 8.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), ), - subtitle: Text( - isLastCycle - ? "Estimated Cycle Length: $cycleDays days" - : "Length of cycle: $cycleDays days", - style: const TextStyle( - fontSize: 16.0, + child: ListTile( + title: Text( + "$start - $end", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text( + isLastCycle + ? "Estimated Cycle Length: $cycleDays days" + : "Length of cycle: $cycleDays days", + style: const TextStyle( + fontSize: 16.0, + ), + ), + trailing: IconButton( + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_EDIT_PERIODS, + extra: { + 'startDate': cycle.periodStart, + 'endDate': cycle.periodEnd, + 'id': cycle.cycleId, + }, + ); + }, + icon: const Icon(Icons.arrow_forward_ios), ), ), - trailing: IconButton( - onPressed: () { - context.goNamed( - RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - extra: { - 'startDate': cycle.periodStart, - 'endDate': cycle.periodEnd, - 'id': cycle.cycleId, - }, - ); - }, - icon: const Icon(Icons.arrow_forward_ios), - ), - ), - ); + ); + } else { + // Skip displaying cycles that haven't been confirmed or whose end date hasn't passed + return const SizedBox.shrink(); + } }).toList(), ], ); From 736bee2ac33ab641d86b0ac38ea3db62185c8362 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Thu, 12 Sep 2024 22:15:59 +0300 Subject: [PATCH 087/140] Handling period overdue days by using shared preferences needs more work. --- .../pages/periodPlannerScreen.dart | 407 +++++++++++++----- 1 file changed, 300 insertions(+), 107 deletions(-) diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 72225830..cb23cf5e 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -15,41 +15,42 @@ import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:table_calendar/table_calendar.dart'; - //Function to check if two dates are on the same day by truncating the time part - bool isSameDay(DateTime date1, DateTime date2) { - return date1.year == date2.year && - date1.month == date2.month && - date1.day == date2.day; - } +bool isSameDay(DateTime date1, DateTime date2) { + return date1.year == date2.year && + date1.month == date2.month && + date1.day == date2.day; +} + class PeriodPlannerScreen extends ConsumerStatefulWidget { const PeriodPlannerScreen({super.key}); @override - ConsumerState createState() => _PeriodPlannerScreenState(); + ConsumerState createState() => + _PeriodPlannerScreenState(); } class _PeriodPlannerScreenState extends ConsumerState { DateTime _currentDate = DateTime.now(); late DateTime _periodStart; - late DateTime _periodEnd; - late DateTime _ovulationDate; + late DateTime _periodEnd; + late DateTime _ovulationDate; late DateTime _nextPeriodStart; late DateTime _nextPeriodEnd; Map>> events = {}; - - @override - void initState() { + void initState() { super.initState(); // Initialize the state with data from the cycles provider _updateFromCycles(); + _checkOverdueDialog(); } - // Listen for state changes from cyclesProvider + // Listen for state changes from cyclesProvider void _updateFromCycles() { final cycles = ref.read(cyclesProvider); @@ -65,6 +66,7 @@ class _PeriodPlannerScreenState extends ConsumerState { }); } } + //Method for updating events void _updateEvents() { setState(() { @@ -72,15 +74,165 @@ class _PeriodPlannerScreenState extends ConsumerState { // print("Updated Events: $events"); // print("Updated Events"); // events.forEach((cycleId, dateMap) { - // dateMap.forEach((date, events) { + // dateMap.forEach((date, events) { // print("Cycle ID $cycleId ,Date: $date, Events: $events"); // }); // }); - //print("Updated Events: $events"); - //print("-------------"); + //print("Updated Events: $events"); + //print("-------------"); }); } + Future _checkOverdueDialog() async { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + String? lastDialogDateStr = prefs.getString('lastDialogDate'); + DateTime? lastDialogDate = + lastDialogDateStr != null ? DateTime.parse(lastDialogDateStr) : null; + + if (lastDialogDate == null || !isSameDay(_currentDate, lastDialogDate)) { + //If the dialog hasn't been shown today and the user's periods are overdue + bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); + if (isDangerZone) { + _overdueDialog(); + //storing the current date as the last dialog shown date + prefs.setString('lastDialogDate', _currentDate.toIso8601String()); + } + } + } + + void _overdueDialog() { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text("Periods Overdue"), + content: const Text( + "We have noticed that your periods are currently overdue, we would just like you to confirm whether your periods have started"), + actions: [ + TextButton( + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + }, + child: const Text("Yes, they have"), + ), + TextButton( + onPressed: () { + _pregnancyDialogue(); + }, + child: const Text("No, they haven't"), + ), + ], + ); + }, + ); + } + + void _pregnancyDialogue() { + final GlobalKey _formKey = GlobalKey(); + showDialog( + // barrierDismissible: false, + context: context, + builder: (BuildContext context) { + String? dropdownValue; + String? pregnancyDropDownValue; + + return StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return AlertDialog( + title: const Text("Periods Overdue"), + content: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text("Have you taken a pregnancy test?"), + const SizedBox( + height: 8, + ), + DropdownButtonFormField( + value: dropdownValue, + items: const [ + DropdownMenuItem( + value: "Yes", + child: Text("Yes"), + ), + DropdownMenuItem( + value: "No", + child: Text("No"), + ), + ], + onChanged: (String? value) { + setState(() { + dropdownValue = value; + }); + }, + validator: (value) => + value == null ? 'Please Select an Option' : null, + autovalidateMode: AutovalidateMode.onUserInteraction, + decoration: const InputDecoration( + labelText: "Select an Option", + border: OutlineInputBorder(), + ), + ), + const SizedBox( + height: 16, + ), + if (dropdownValue == "Yes") + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("If Yes: Are you pregnant?"), + const SizedBox( + height: 8, + ), + DropdownButtonFormField( + value: pregnancyDropDownValue, + items: const [ + DropdownMenuItem( + value: "Yes", + child: Text("Yes"), + ), + DropdownMenuItem( + value: "No", + child: Text("No"), + ) + ], + onChanged: (String? value) { + setState(() { + pregnancyDropDownValue = value; + }); + }, + validator: (value) => + value == null ? 'Please select an option' : null, + autovalidateMode: AutovalidateMode.onUserInteraction, + decoration: const InputDecoration( + labelText: 'Select an option', + border: OutlineInputBorder(), + ), + ), + ], + ), + if (dropdownValue == "No") + const Text("It is recommended you take a pregnancy test."), + ], + ), + ), + actions: [ + TextButton( + onPressed: () { + if (_formKey.currentState!.validate()) { + Navigator.of(context).pop(); + } + }, + child: const Text("Submit"), + ), + ], + ); + }); + }, + ); + } + //Method for auto adding the latest predicted period day as the period start // void _autoAddPeriodDay() { // if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { @@ -98,7 +250,7 @@ class _PeriodPlannerScreenState extends ConsumerState { final cycles = ref.watch(cyclesProvider); // If cycles are updated, recalculate the events and UI elements - if(cycles.isNotEmpty) { + if (cycles.isNotEmpty) { _updateFromCycles(); } int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; @@ -106,17 +258,25 @@ class _PeriodPlannerScreenState extends ConsumerState { int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; //int predictedDays = _nextPeriodEnd.difference(_nextPeriodStart).inDays; - bool isInPeriod = (isSameDay(_currentDate, _periodStart) || _currentDate.isAfter(_periodStart)) && _currentDate.isBefore(_periodEnd); - bool veryCloseToPeriod = _currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod == 0; - bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && !isInPeriod && daysToOvulation>=1 ; - bool veryCloseToOvulation = _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; - bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); - bool afterOvulation = _currentDate.isAfter(_ovulationDate) && (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod>0); + bool isInPeriod = (isSameDay(_currentDate, _periodStart) || + _currentDate.isAfter(_periodStart)) && + _currentDate.isBefore(_periodEnd); + bool veryCloseToPeriod = + _currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod == 0; + bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && + !isInPeriod && + daysToOvulation >= 1; + bool veryCloseToOvulation = + _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; + bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || + (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); + bool afterOvulation = _currentDate.isAfter(_ovulationDate) && + (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod > 0); bool duringPredictedPeriodRange = _currentDate.isAfter(_nextPeriodStart) && - _currentDate.isBefore(_nextPeriodEnd) || - isSameDay(_currentDate, _nextPeriodStart) || - isSameDay(_currentDate, _nextPeriodEnd); - bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); + _currentDate.isBefore(_nextPeriodEnd) || + isSameDay(_currentDate, _nextPeriodStart) || + isSameDay(_currentDate, _nextPeriodEnd); + bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); bool inPeriods = isInPeriod; @@ -127,7 +287,6 @@ class _PeriodPlannerScreenState extends ConsumerState { String title = ''; String chances = ''; - if (isInPeriod) { progressValue = 0.2; title = 'Period'; @@ -137,7 +296,7 @@ class _PeriodPlannerScreenState extends ConsumerState { } else if (isCloseToOvulation) { progressValue = 0.3; title = 'Ovulation in'; - message = '$daysToOvulation day${daysToOvulation > 1 ? 's': ''}'; + message = '$daysToOvulation day${daysToOvulation > 1 ? 's' : ''}'; buttonText = 'Period Start'; chances = 'High'; } else if (veryCloseToOvulation) { @@ -154,12 +313,12 @@ class _PeriodPlannerScreenState extends ConsumerState { chances = 'High'; } else if (afterOvulation) { progressValue = 0.7; - title = 'Next Period in'; - message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's': ''}'; + title = 'Next Period in'; + message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's' : ''}'; buttonText = 'Period Start'; chances = 'Low'; } else if (veryCloseToPeriod) { - progressValue = 0.7; + progressValue = 0.7; title = 'Next Period is'; message = 'Tomorrow'; buttonText = 'Period Start'; @@ -170,13 +329,13 @@ class _PeriodPlannerScreenState extends ConsumerState { message = 'Today'; buttonText = 'Period Start'; chances = 'Low'; - } else if(isDangerZone) { + } else if (isDangerZone) { progressValue = 1.0; title = 'Periods Overdue by'; - message = '$overdueDays Day${overdueDays > 1 ? 's': ''}'; + message = '$overdueDays Day${overdueDays > 1 ? 's' : ''}'; buttonText = 'Period Start'; chances = 'High'; - } + } final theme = Theme.of(context); @@ -203,37 +362,37 @@ class _PeriodPlannerScreenState extends ConsumerState { padding: const EdgeInsets.all(16.0), child: Column( children: [ - Card( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - const Text( - "Your Chances of Getting Pregnant are:", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - ), - // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const Text( + "Your Chances of Getting Pregnant are:", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, ), - Text( - chances, - style: TextStyle( - fontSize: 34, - color: chances == 'High' ? Colors.red : Colors.blue, - fontWeight: FontWeight.bold, - ), + // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + ), + Text( + chances, + style: TextStyle( + fontSize: 34, + color: + chances == 'High' ? Colors.red : Colors.blue, + fontWeight: FontWeight.bold, ), - ], - ), - ) - ), + ), + ], + ), + )), const SizedBox(height: Constants.SPACING), SizedBox( height: 150, child: CustomCalendar( key: ValueKey(events), - initialFormat: CalendarFormat.week, + initialFormat: CalendarFormat.week, events: events, headerButton: true, inPeriods: inPeriods, @@ -247,75 +406,95 @@ class _PeriodPlannerScreenState extends ConsumerState { width: 300, // Adjust the width as needed height: 300, // Adjust the height as needed child: CircularProgressIndicator( - value: progressValue, - strokeWidth: 10, + value: progressValue, + strokeWidth: 20, backgroundColor: Colors.grey, valueColor: AlwaysStoppedAnimation( - isDangerZone ? Colors.red : Constants.periodPlanner, + isDangerZone + ? Colors.red + : Constants.periodPlanner, ), - ), ), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ + if (isDangerZone) + const SizedBox(height: Constants.SPACING + 20), Text( title, style: const TextStyle( - fontSize: 20, + fontSize: 20, fontWeight: FontWeight.bold, - ), + ), ), const SizedBox(height: Constants.SPACING), Text( message, - style: TextStyle(fontSize: 38, color: isDangerZone ? Colors.red: Constants.periodPlanner, fontWeight: FontWeight.bold), + style: TextStyle( + fontSize: 38, + color: isDangerZone + ? Colors.red + : Constants.periodPlanner, + fontWeight: FontWeight.bold), ), const SizedBox(height: Constants.SPACING + 10), if (buttonText.isNotEmpty) ElevatedButton( onPressed: () { //Logging Start of new period - if (buttonText == 'Period Start') { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + if (buttonText == 'Period Start') { + context.goNamed( + RouteNames.PERIOD_PLANNER_LOG_PERIODS); } //Logging end of new period - else{ + else { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text('Confirming End of Period'), - content: const Text('Are you sure you want to log the end of your period?'), + title: const Text( + 'Confirming End of Period'), + content: const Text( + 'Are you sure you want to log the end of your period?'), actions: [ TextButton( child: const Text('Cancel'), onPressed: () { - Navigator.of(context).pop(); // Close the dialog + Navigator.of(context) + .pop(); // Close the dialog }, ), TextButton( child: const Text('Confirm'), onPressed: () { setState(() { - // Log the period start here + // Log the period start here isCloseToOvulation = true; isInPeriod = false; _currentDate = DateTime.now(); _periodEnd = _currentDate; - + //updating period end in my List for now for (var cycle in cycles) { - if (cycle.periodStart == _periodStart) { - cycle.periodEnd = _periodEnd; + if (cycle.periodStart == + _periodStart) { + cycle.periodEnd = + _periodEnd; // Setting the external period confirmation status to true - periodConfirmedMap[cycle.cycleId] = true; + periodConfirmedMap[ + cycle.cycleId] = true; //Recalculating period length - cycle.periodLength = _periodEnd.difference(_periodStart).inDays + 1; - } - } + cycle.periodLength = + _periodEnd + .difference( + _periodStart) + .inDays + + 1; + } + } _updateEvents(); printCycles(cycles); @@ -327,11 +506,11 @@ class _PeriodPlannerScreenState extends ConsumerState { // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); // debugPrint('Current Date after update: $_currentDate'); // debugPrint('Is In Period after update: $isInPeriod'); - // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); + // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); // debugPrint("--------"); }); //printCycles(cycles); - Navigator.of(context).pop(); + Navigator.of(context).pop(); }, ), ], @@ -339,28 +518,42 @@ class _PeriodPlannerScreenState extends ConsumerState { }, ); } - }, style: ElevatedButton.styleFrom( foregroundColor: Colors.black, - backgroundColor: isDangerZone ? Colors.red: Constants.periodPlanner, + backgroundColor: isDangerZone + ? Colors.red + : Constants.periodPlanner, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), ), child: Text( buttonText, style: const TextStyle(fontSize: 18), ), ), - const SizedBox(height: 20), + const SizedBox(height: 10), + //where to put the icon button + if (isDangerZone) + IconButton( + onPressed: () { + _overdueDialog(); + }, + icon: const Icon( + Icons.info_sharp, + color: Colors.blue, + size: 40, + ), + ), ], ), ], ), // const SizedBox(height: Constants.SPACING), - // Card( + // Card( // child: Padding( // padding: const EdgeInsets.all(16.0), // child: Column( @@ -368,7 +561,7 @@ class _PeriodPlannerScreenState extends ConsumerState { // const Text( // "Your Chances of Getting Pregnant are:", // style: TextStyle( - // fontSize: 14, + // fontSize: 14, // fontWeight: FontWeight.bold, // ), // // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), @@ -376,8 +569,8 @@ class _PeriodPlannerScreenState extends ConsumerState { // Text( // chances, // style: const TextStyle( - // fontSize: 34, - // color: Constants.periodPlanner, + // fontSize: 34, + // color: Constants.periodPlanner, // fontWeight: FontWeight.bold, // ), // ), @@ -385,7 +578,7 @@ class _PeriodPlannerScreenState extends ConsumerState { // ), // ) // ), - + //const SizedBox(height: 20,), // const Text( // "Please give your Daily Insights:", @@ -401,11 +594,11 @@ class _PeriodPlannerScreenState extends ConsumerState { // enlargeCenterPage: true, // enableInfiniteScroll: false, // initialPage: 0, - // autoPlay: false, + // autoPlay: false, // ), // items: [ // CarouselCard( - // svgPath: "assets/images/symptoms.svg", + // svgPath: "assets/images/symptoms.svg", // title: "Symptoms", // destination: LoggerWidget( // heading: "Log Symptoms", @@ -413,21 +606,21 @@ class _PeriodPlannerScreenState extends ConsumerState { // ) // ), // CarouselCard( - // svgPath: "assets/images/discharge1.svg", + // svgPath: "assets/images/discharge1.svg", // title: "Discharge", // destination: LoggerWidget( - // heading: "Log Discharge", + // heading: "Log Discharge", // items: LogItems.getDischarge(), // ) // ), // CarouselCard( - // svgPath: "assets/images/moods1.svg", + // svgPath: "assets/images/moods1.svg", // title: "Mood", // destination: LoggerWidget( - // heading: "How are you feeling?", + // heading: "How are you feeling?", // items: LogItems.getMoods(), // ), - // ), + // ), // ], // ), ], @@ -443,20 +636,20 @@ class _PeriodPlannerScreenState extends ConsumerState { style: ElevatedButton.styleFrom( backgroundColor: Constants.periodPlanner, ), - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); - }, - child: Text( - 'Periods History', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); + }, + child: Text( + 'Periods History', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), ), ), - ), ), ), ], ), ); } -} \ No newline at end of file +} From 0a5c009c11007113bb45f2d7e204efe946495e8e Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 13 Sep 2024 12:10:40 +0300 Subject: [PATCH 088/140] settings --- .../common/presentation/pages/HomeScreen.dart | 4 +++- .../presentation/pages/SettingsScreen.dart | 15 +++++++++++++++ .../pages/self_screening_menu.dart | 19 ++++++------------- .../user_preference/data/models/Setings.dart | 7 ++++++- .../controlers/SettingsControler.dart | 15 ++++++++++++--- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/lib/src/features/common/presentation/pages/HomeScreen.dart b/lib/src/features/common/presentation/pages/HomeScreen.dart index d2ebde3f..0d3dbacc 100644 --- a/lib/src/features/common/presentation/pages/HomeScreen.dart +++ b/lib/src/features/common/presentation/pages/HomeScreen.dart @@ -73,6 +73,7 @@ class _HomeScreenState extends ConsumerState { final size = getOrientationAwareScreenSize(context); final programState = ref.watch(userProgramProvider); final settings = ref.watch(settingsNotifierProvider); + final updateSettings = ref.read(settingsNotifierProvider.notifier); // Handle dialog display WidgetsBinding.instance.addPostFrameCallback((_) { @@ -83,8 +84,9 @@ class _HomeScreenState extends ConsumerState { loading: () => false, ); - if (showUpdateProgram && settings.firstNuruAccess) { + if (showUpdateProgram && settings.firstTimeNoProgram) { HealthProgramDialog(context).show(); + updateSettings.updateSettings(firstTimeNoProgram: false); } }); diff --git a/lib/src/features/common/presentation/pages/SettingsScreen.dart b/lib/src/features/common/presentation/pages/SettingsScreen.dart index 50615581..1bd7ed46 100644 --- a/lib/src/features/common/presentation/pages/SettingsScreen.dart +++ b/lib/src/features/common/presentation/pages/SettingsScreen.dart @@ -116,6 +116,21 @@ List<_SettingsItem> _settingsItem(BuildContext context) => <_SettingsItem>[ ); }, ), + ), + _SettingsItem( + title: "Enable self screening reminder", + subTitle: "Enable daily log reminders for self-screening", + leadingIcon: Icons.display_settings, + trailingIcon: Consumer( + builder: (context, ref, child) { + final settings = ref.read(settingsNotifierProvider.notifier); + + return Switch( + value: true, + onChanged: (value) => false, + ); + }, + ), ), ]; diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 8b1231ba..d99aa3d9 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -86,24 +86,17 @@ class SelfScreening extends HookConsumerWidget { floatingActionButton: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ - // insightAsync.when( - // data: (data){ - // final insight = data.map((e) => e).where((element) => element.id=="3").single; - // return FloatingActionButton( + // FloatingActionButton( // tooltip: "Insight", // hoverColor: Constants.bmiCalculatorShortcutBgColor, // onPressed: () { - // context.goNamed(RouteNames.BLOG_POST, extra: insight); + // context.goNamed(RouteNames.SETTINGS); // // }, // backgroundColor: Constants.bmiCalculatorShortcutBgColor, - // child: const Icon(Icons.insights), - // ); - // }, - // error: (error, _) => Container(), - // loading: () => Container(), - // ), - SizedBox(height: 10), + // child: const Icon(Icons.settings), + // ), + // SizedBox(height: 10), FloatingActionButton( tooltip: "Module insight", hoverColor: Constants.bmiCalculatorShortcutBgColor, @@ -111,7 +104,7 @@ class SelfScreening extends HookConsumerWidget { context.goNamed(RouteNames.INSIGHT); }, backgroundColor: Constants.bmiCalculatorShortcutBgColor, - child: const Icon(Icons.settings_applications_sharp), + child: const Icon(Icons.insights), ), ], ), diff --git a/lib/src/features/user_preference/data/models/Setings.dart b/lib/src/features/user_preference/data/models/Setings.dart index a6d4b785..a33ba810 100644 --- a/lib/src/features/user_preference/data/models/Setings.dart +++ b/lib/src/features/user_preference/data/models/Setings.dart @@ -7,6 +7,7 @@ class Settings { final bool isBiometricEnabled; final bool firstTimeInstallation; final bool firstNuruAccess; + final bool firstTimeNoProgram; Settings( {required this.userToken, @@ -16,6 +17,7 @@ class Settings { required this.isBiometricEnabled, required this.isAuthenticated, required this.firstTimeInstallation, + required this.firstTimeNoProgram, this.firstNuruAccess = false}); // Create a default instance with initial values @@ -34,7 +36,8 @@ class Settings { // Provide the initial biometric setting firstTimeInstallation: false, // Provide the initial Nuru access setting - firstNuruAccess: false); + firstNuruAccess: false, + firstTimeNoProgram: false); } // Create an instance with values copied from another Settings instance @@ -47,6 +50,7 @@ class Settings { bool? isAuthenticated, bool? firstTimeInstallation, bool? firstNuruAccess, + bool? firstTimeNoProgram, }) { return Settings( userToken: userToken ?? this.userToken, @@ -58,6 +62,7 @@ class Settings { firstTimeInstallation: firstTimeInstallation ?? this.firstTimeInstallation, firstNuruAccess: firstNuruAccess ?? this.firstNuruAccess, + firstTimeNoProgram: firstTimeNoProgram ?? this.firstTimeNoProgram, ); } diff --git a/lib/src/features/user_preference/presentation/controlers/SettingsControler.dart b/lib/src/features/user_preference/presentation/controlers/SettingsControler.dart index ae0856eb..fe2ba128 100644 --- a/lib/src/features/user_preference/presentation/controlers/SettingsControler.dart +++ b/lib/src/features/user_preference/presentation/controlers/SettingsControler.dart @@ -13,13 +13,17 @@ class SettingsController extends StateNotifier { final theme = await LocalStorage.get("theme"); final isPrivacyEnabled = await LocalStorage.get("isPrivacyEnabled"); final firstTimeInstallation = await LocalStorage.get("initial"); + final firstTimeNoProgram = await LocalStorage.get("program_update"); state = state.copyWith( theme: theme.isNotEmpty ? theme : "light", isPrivacyEnabled: isPrivacyEnabled.isEmpty ? true : isPrivacyEnabled == "1", firstTimeInstallation: firstTimeInstallation.isEmpty ? true - : firstTimeInstallation == "1"); + : firstTimeInstallation == "1", + firstTimeNoProgram: firstTimeNoProgram.isEmpty + ? true + : firstTimeNoProgram == "1"); } Future saveSettingConfig(Settings settings) async { @@ -30,6 +34,7 @@ class SettingsController extends StateNotifier { "initial", settings.firstTimeInstallation ? "1" : "0"); await LocalStorage.save( "firstNuruAccess", settings.firstNuruAccess ? "1" : "0"); + await LocalStorage.save("program_update", settings.firstTimeNoProgram ? "1" : "0"); } Future clearSettingConfig() async { @@ -47,6 +52,7 @@ class SettingsController extends StateNotifier { bool? isAuthenticated, bool? firstTimeInstallation, bool? firstNuruAccess, + bool? firstTimeNoProgram, }) { state = state.copyWith( userToken: userToken, @@ -56,7 +62,8 @@ class SettingsController extends StateNotifier { isBiometricEnabled: isBiometricEnabled, isAuthenticated: isAuthenticated, firstTimeInstallation: firstTimeInstallation, - firstNuruAccess: firstNuruAccess); + firstNuruAccess: firstNuruAccess, + firstTimeNoProgram: firstTimeNoProgram); saveSettingConfig(state); } @@ -73,6 +80,7 @@ class SettingsController extends StateNotifier { bool? isAuthenticated, bool? firstTimeInstallation, bool? firstNuruAccess, + bool? firstTimeNoProgram, }) { state = state.copyWith( userToken: userToken ?? state.userToken, @@ -83,7 +91,8 @@ class SettingsController extends StateNotifier { isAuthenticated: isAuthenticated ?? state.isAuthenticated, firstTimeInstallation: firstTimeInstallation ?? state.firstTimeInstallation, - firstNuruAccess: firstNuruAccess ?? state.firstNuruAccess); + firstNuruAccess: firstNuruAccess ?? state.firstNuruAccess, + firstTimeNoProgram:firstTimeNoProgram ?? state.firstTimeNoProgram); saveSettingConfig(state); } From 6b76154ffdec4fe43853813e3aa7d79aeccaadf4 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 16 Sep 2024 13:14:55 +0300 Subject: [PATCH 089/140] fix chat bot --- .../auth/presentation/pages/onboarding_screen.dart | 2 +- .../features/chatbot/presentations/ChatScreen.dart | 14 +++++++++----- .../user_preference/data/models/Setings.dart | 2 +- .../presentation/controlers/SettingsControler.dart | 8 +++++++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/src/features/auth/presentation/pages/onboarding_screen.dart b/lib/src/features/auth/presentation/pages/onboarding_screen.dart index 9c444a1c..3eaa939e 100644 --- a/lib/src/features/auth/presentation/pages/onboarding_screen.dart +++ b/lib/src/features/auth/presentation/pages/onboarding_screen.dart @@ -134,7 +134,7 @@ class _OnboardingScreenState extends State final settings = ref.read(settingsNotifierProvider.notifier); settings.updateSettings( - firstNuruAccess: true, + // firstNuruAccess: true, firstTimeInstallation: false); context.goNamed(RouteNames.LOGIN_SCREEN); }, diff --git a/lib/src/features/chatbot/presentations/ChatScreen.dart b/lib/src/features/chatbot/presentations/ChatScreen.dart index 3295e9af..c58708a8 100644 --- a/lib/src/features/chatbot/presentations/ChatScreen.dart +++ b/lib/src/features/chatbot/presentations/ChatScreen.dart @@ -328,7 +328,7 @@ class _ChatScreenState extends ConsumerState { setState(() { _consent = !_consent; }); - _updateConsent(type == ConsentType.accept ? true : false); + _updateConsent(_consent); Navigator.of(context).pop(); }, child: const Text('Yes'), @@ -356,6 +356,7 @@ class _ChatScreenState extends ConsumerState { consentData.isNotEmpty ? consentData.first.chatbot_consent : null; setState(() { _consent = remoteConsent == "1" ? true : false; + print("The consent name ${_consent}"); }); } catch (e) { debugPrint("Error fetching consent: $e"); @@ -383,9 +384,11 @@ class _ChatScreenState extends ConsumerState { // Check and show consent dialog for first time use void _checkAndShowConsentDialog() { final settings = ref.read(settingsNotifierProvider); + final settingUpdate = ref.read(settingsNotifierProvider.notifier); if (settings.firstNuruAccess) { debugPrint("Nuru first time use: ${settings.firstNuruAccess}"); _showConsentDialog(context, ref, ConsentType.accept); + settingUpdate.updateSettings(firstNuruAccess: false); } else { debugPrint("Nuru first time use: ${settings.firstNuruAccess}"); } @@ -424,8 +427,9 @@ class _ChatScreenState extends ConsumerState { ], ), ), - _showConsent - ? Flex( + // _showConsent + // ? + Flex( direction: Axis.horizontal, mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -449,8 +453,8 @@ class _ChatScreenState extends ConsumerState { style: TextStyle(color: Colors.green), )) ], - ) - : const SizedBox(), + ), + // : const SizedBox(), const Divider(), Expanded( child: ListView.builder( diff --git a/lib/src/features/user_preference/data/models/Setings.dart b/lib/src/features/user_preference/data/models/Setings.dart index a33ba810..e1531c8e 100644 --- a/lib/src/features/user_preference/data/models/Setings.dart +++ b/lib/src/features/user_preference/data/models/Setings.dart @@ -18,7 +18,7 @@ class Settings { required this.isAuthenticated, required this.firstTimeInstallation, required this.firstTimeNoProgram, - this.firstNuruAccess = false}); + required this.firstNuruAccess}); // Create a default instance with initial values factory Settings.defaultSettings() { diff --git a/lib/src/features/user_preference/presentation/controlers/SettingsControler.dart b/lib/src/features/user_preference/presentation/controlers/SettingsControler.dart index fe2ba128..cf0d4785 100644 --- a/lib/src/features/user_preference/presentation/controlers/SettingsControler.dart +++ b/lib/src/features/user_preference/presentation/controlers/SettingsControler.dart @@ -14,6 +14,7 @@ class SettingsController extends StateNotifier { final isPrivacyEnabled = await LocalStorage.get("isPrivacyEnabled"); final firstTimeInstallation = await LocalStorage.get("initial"); final firstTimeNoProgram = await LocalStorage.get("program_update"); + final firstNuruAccess = await LocalStorage.get("firstNuruAccess"); state = state.copyWith( theme: theme.isNotEmpty ? theme : "light", isPrivacyEnabled: @@ -23,7 +24,10 @@ class SettingsController extends StateNotifier { : firstTimeInstallation == "1", firstTimeNoProgram: firstTimeNoProgram.isEmpty ? true - : firstTimeNoProgram == "1"); + : firstTimeNoProgram == "1", + firstNuruAccess: firstNuruAccess.isEmpty + ? true + : firstNuruAccess == "1"); } Future saveSettingConfig(Settings settings) async { @@ -41,6 +45,8 @@ class SettingsController extends StateNotifier { await LocalStorage.delete("theme"); await LocalStorage.delete("isPrivacyEnabled"); await LocalStorage.delete("initial"); + await LocalStorage.delete("program_update"); + await LocalStorage.delete("firstNuruAccess"); } void updateSettings({ From 1ab55e9b583e77824a14a47811602c7790b0e66f Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 17 Sep 2024 17:08:06 +0300 Subject: [PATCH 090/140] :construction: provider facing --- lib/src/app/navigation/app_router.dart | 9 + lib/src/app/navigation/menu/menuItems.dart | 80 ++---- .../presentation/pages/MainMenuScreen.dart | 228 +++++++++--------- .../presentation/widgets/ShortcutsUi.dart | 223 +++++++++-------- .../pages/provider_main_Screen.dart | 130 ++++++++++ lib/src/features/user/data/models/user.dart | 2 + .../user/data/models/user.freezed.dart | 69 +++++- lib/src/features/user/data/models/user.g.dart | 6 + .../user/data/services/UserService.dart | 2 + .../presentation/pages/ProfileScreen.dart | 8 + lib/src/utils/constants.dart | 1 + lib/src/utils/routes.dart | 5 +- 12 files changed, 472 insertions(+), 291 deletions(-) create mode 100644 lib/src/features/provider/presentation/pages/provider_main_Screen.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 5ada1260..3d172fd6 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -68,6 +68,7 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/periodPl import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlanner.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; +import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/self_screening_menu.dart'; @@ -395,6 +396,14 @@ final List secureRoutes = [ }, ) ]), + + GoRoute( + name: RouteNames.PROVIDER_MAIN_SCREEN, + path: 'provider-main-screen', + builder: (BuildContext context, GoRouterState state) { + return const ProviderMainScreen(); + }, + ), ]; final List openRoutes = [ diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 7e599422..52aa5d10 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -26,6 +26,7 @@ class MenuItem { MenuItem getProgramMenuItemByProgramCode( BuildContext context, String programCode) { + final theme = Theme.of(context); if (programCode == ProgramCodeNameIds.HIV) { return MenuItem( icon: const Icon( @@ -110,7 +111,7 @@ MenuItem getProgramMenuItemByProgramCode( ); } -List getGenericMenuItems(BuildContext context) { +List getGenericMenuItems(BuildContext context, bool admin) { return [ // MenuItem( // icon: Icons.calendar_month_rounded, @@ -122,7 +123,6 @@ List getGenericMenuItems(BuildContext context) { // title: MenuItemNames.DASHBOARD, // onPressed: () => context.goNamed(RouteNames.DASHBOARD), // ), - MenuItem( color: Constants.programsColor, icon: FaIcon( @@ -251,65 +251,35 @@ List getGenericMenuItems(BuildContext context) { onPressed: () => context.goNamed(RouteNames.DAWA_DROP), color: Constants.dawaDropColor.withOpacity(0.5), ), - // MenuItem( - // // icon: FaIcon(FontAwesomeIcons.capsules, size: Constants.iconSize, color: Colors.teal[200],), - // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/sugar.svg", - // semanticsLabel: "Blood sugar", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset( - // "assets/images/sugar.svg", - // semanticsLabel: "Blood Sugar", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize, - // ), - // title: MenuItemNames.BLOOD_SUGAR, - // onPressed: () => context.goNamed(MenuItemNames.BLOOD_SUGAR), - // color: Constants.bloodSugarColor.withOpacity(0.5), - // ), - // MenuItem( - // icon: Icons.move_down, - // title: MenuItemNames.FACILITY_VISITS, - // onPressed: () => context.goNamed(RouteNames.FACILITY_VISITS), - // ), - // MenuItem( - // icon: Icons.send, - // title: MenuItemNames.CHAT_HCW, - // onPressed: () => context.goNamed(RouteNames.CHAT_HCW), - // ), - - // MenuItem( - // shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/period_planner2.svg", - // semanticsLabel: "Doctors", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset( - // "assets/images/period_planner2.svg", - // semanticsLabel: "Doctors", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize, - // ), - // title: MenuItemNames.PERIOD_PLANNER, - // onPressed: () => context.goNamed(RouteNames.PERIOD_PLANNER), - // color: Constants.periodPlanner, - // ), + if (admin) + MenuItem( + // icon: FaIcon(FontAwesomeIcons.capsules, size: Constants.iconSize, color: Colors.teal[200],), + shortcutBackgroundColor: Constants.providerBgColor.withOpacity(0.5), + icon: SvgPicture.asset( + "assets/images/patient.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset( + "assets/images/patient.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, + ), + title: MenuItemNames.PROVIDER_MAIN_SCREEN, + onPressed: () => context.goNamed(RouteNames.PROVIDER_MAIN_SCREEN), + color: Constants.providerBgColor, + ), ]; } List getMenuItemByNames(BuildContext context, List names) { const programNames = ProgramCodeNameIds.SUPPOTED_PROGRAM_CODES; return [ - ...getGenericMenuItems(context), + ...getGenericMenuItems(context, true), ...programNames.map((e) => getProgramMenuItemByProgramCode(context, e)), ] .where( diff --git a/lib/src/features/common/presentation/pages/MainMenuScreen.dart b/lib/src/features/common/presentation/pages/MainMenuScreen.dart index e13428d4..9d4fd2d0 100644 --- a/lib/src/features/common/presentation/pages/MainMenuScreen.dart +++ b/lib/src/features/common/presentation/pages/MainMenuScreen.dart @@ -10,6 +10,7 @@ import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; import 'package:nishauri/src/features/common/presentation/helpers/constants.dart'; import 'package:nishauri/src/features/common/presentation/widgets/Greeting2.dart'; +import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:nishauri/src/shared/input/FormInputTextField.dart'; @@ -17,11 +18,11 @@ import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/helpers.dart'; import 'package:nishauri/src/utils/routes.dart'; -class MainMenuScreen extends StatelessWidget { +class MainMenuScreen extends ConsumerWidget { const MainMenuScreen({super.key}); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); final size = getOrientationAwareScreenSize(context); @@ -37,122 +38,129 @@ class MainMenuScreen extends StatelessWidget { } } - return Scaffold( - key: _scaffoldKey, - drawer: CustomDrawer(), - body: Stack( - children: [ - Positioned( - top: 0, - right: 0, - child: SvgPicture.asset( - "assets/images/rect-bg.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: size.width * 0.45, - width: size.width * 0.45, - )), - SafeArea( - child: Consumer( - builder: (context, ref, child) { - final userProgram = ref.watch(userProgramProvider); - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: Constants.SPACING), - Padding( - padding: EdgeInsets.symmetric( - horizontal: Constants.SPACING, - vertical: Constants.SPACING), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + final userAdminAsync = ref.watch(userProvider); + return userAdminAsync.when( + data: (admin){ + final isAdmin = admin.roles.contains("provider"); + return Scaffold( + key: _scaffoldKey, + drawer: CustomDrawer(), + body: Stack( + children: [ + Positioned( + top: 0, + right: 0, + child: SvgPicture.asset( + "assets/images/rect-bg.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: size.width * 0.45, + width: size.width * 0.45, + )), + SafeArea( + child: Consumer( + builder: (context, ref, child) { + final userProgram = ref.watch(userProgramProvider); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - "App Modules📱", - style: TextStyle( - fontSize: 32, - fontWeight: FontWeight.bold, - color: theme.colorScheme.primary, + const SizedBox(height: Constants.SPACING), + Padding( + padding: EdgeInsets.symmetric( + horizontal: Constants.SPACING, + vertical: Constants.SPACING), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "App Modules📱", + style: TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: theme.colorScheme.primary, + ), + ), + Wrap( + children: [ + IconButton( + onPressed: toggleDrawer, + icon: const Icon(Icons.more_vert_outlined), + ), + ], + ) + ], ), ), - Wrap( - children: [ - IconButton( - onPressed: toggleDrawer, - icon: const Icon(Icons.more_vert_outlined), - ), - ], - ) - ], - ), - ), - const SizedBox(height: Constants.SPACING * 2), - Expanded( - child: userProgram.when( - data: (data) { - return MenuItemsBuilder( - crossAxisCount: 2, - itemBuilder: (item) => Card( - margin: const EdgeInsets.all(Constants.SPACING), - clipBehavior: Clip.antiAlias, - child: InkWell( - splashColor: theme.colorScheme.primary, - onTap: item.onPressed, - child: Container( - padding: - const EdgeInsets.all(Constants.SPACING), - decoration: BoxDecoration( - color: - item.color ?? theme.colorScheme.primary, - image: const DecorationImage( - image: AssetImage( - "assets/images/contours.png"), - opacity: 0.2, - fit: BoxFit.cover, - ), - ), - child: Column( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - item.icon, - const SizedBox(height: Constants.SPACING), - Text( - item.title ?? "", - style: theme.textTheme.titleMedium - ?.copyWith( - color: Colors.white, - fontWeight: FontWeight.normal, + const SizedBox(height: Constants.SPACING * 2), + Expanded( + child: userProgram.when( + data: (data) { + return MenuItemsBuilder( + crossAxisCount: 2, + itemBuilder: (item) => Card( + margin: const EdgeInsets.all(Constants.SPACING), + clipBehavior: Clip.antiAlias, + child: InkWell( + splashColor: theme.colorScheme.primary, + onTap: item.onPressed, + child: Container( + padding: + const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: + item.color ?? theme.colorScheme.primary, + image: const DecorationImage( + image: AssetImage( + "assets/images/contours.png"), + opacity: 0.2, + fit: BoxFit.cover, + ), + ), + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + item.icon, + const SizedBox(height: Constants.SPACING), + Text( + item.title ?? "", + style: theme.textTheme.titleMedium + ?.copyWith( + color: Colors.white, + fontWeight: FontWeight.normal, + ), + overflow: TextOverflow.ellipsis, + softWrap: true, + ), + ], ), - overflow: TextOverflow.ellipsis, - softWrap: true, ), - ], + ), ), - ), + items: [ + ...getGenericMenuItems(context, isAdmin), + ], + ); + }, + error: (error, _) => + Center(child: Text(error.toString())), + loading: () => const Center( + child: CircularProgressIndicator(), ), ), - items: [ - ...getGenericMenuItems(context), - ], - ); - }, - error: (error, _) => - Center(child: Text(error.toString())), - loading: () => const Center( - child: CircularProgressIndicator(), - ), - ), - ), - ], - ); - }, + ), + ], + ); + }, + ), + ), + ], ), - ), - ], - ), - ); + ); + }, + error: (error,_)=> Center(), + loading: () => Center(child: CircularProgressIndicator(),)); } } diff --git a/lib/src/features/common/presentation/widgets/ShortcutsUi.dart b/lib/src/features/common/presentation/widgets/ShortcutsUi.dart index 32c29a92..4e7243e9 100644 --- a/lib/src/features/common/presentation/widgets/ShortcutsUi.dart +++ b/lib/src/features/common/presentation/widgets/ShortcutsUi.dart @@ -1,8 +1,7 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import '../../../../app/navigation/menu/MenuItemsBuilder.dart'; @@ -18,6 +17,12 @@ class ShortcutsWidget extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final shortcuts = ref.watch(shortcutProvider); + final adminAsync = ref.watch(userProvider); + final isAdmin = adminAsync.when( + data: (data) => data.roles.contains("provider"), + error: (_, __) => false, // Handle error by assuming non-admin + loading: () => false, + ); final theme = Theme.of(context); return Column( @@ -35,136 +40,124 @@ class ShortcutsWidget extends HookConsumerWidget { InkWell( child: Text( "Edit Shortcuts", - style: theme.textTheme.titleSmall - ?.copyWith(color: theme.colorScheme.primary), + style: theme.textTheme.titleSmall?.copyWith( + color: theme.colorScheme.primary, + ), ), onTap: () { - _showDialog(context); + _showDialog(context, isAdmin); }, ), - ], ), ), const SizedBox(height: Constants.SPACING), Padding( - padding: - const EdgeInsets.symmetric(horizontal: Constants.SPACING * 2), - child: - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ...getMenuItemByNames(context, shortcuts).map((item) { - return GestureDetector( - onTap: item.onPressed, - onLongPress: () { - _showDialog(context); - }, - child: MenuOption( - title: item.title ?? "", - icon: item.shortcutIcon, - bgColor: item.title == "Edit Shortcut" - ? theme.colorScheme.secondary - : item.shortcutBackgroundColor, + padding: const EdgeInsets.symmetric(horizontal: Constants.SPACING * 2), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ...getMenuItemByNames(context, shortcuts).map((item) { + return GestureDetector( + onTap: item.onPressed, + onLongPress: () { + _showDialog(context, isAdmin); + }, + child: MenuOption( + title: item.title ?? "", + icon: item.shortcutIcon, + bgColor: item.title == "Edit Shortcut" + ? theme.colorScheme.secondary + : item.shortcutBackgroundColor, + ), + ); + }).toList(), + if (getMenuItemByNames(context, shortcuts).length < 3) + MenuOption( + title: "", + icon: const Icon(Icons.add), + bgColor: theme.colorScheme.secondary, + onPress: () { + _showDialog(context, isAdmin); + }, ), - ); - }).toList(), - if (getMenuItemByNames(context, shortcuts).length < 3) - MenuOption( - title: "", - icon: const Icon(Icons.add), - bgColor: theme.colorScheme.secondary, - onPress: () { - _showDialog(context); - }, - ) - ]), + ], + ), ), ], ); } -} -_showDialog(BuildContext context) { - final theme = Theme.of(context); - return showDialog( - context: context, - builder: (BuildContext context) => - AlertDialog( - icon: const Icon(Icons.construction), - title: Text( - "Select Shortcut MenuOptions", - style: theme.textTheme.titleMedium, - ), - content: SizedBox( - width: double.maxFinite, - height: MediaQuery - .of(context) - .size - .height * 0.5, - child: Consumer( - builder: (context, ref, child) { - final userProgram = ref.watch(userProgramProvider); - final shortcuts = ref.watch(shortcutProvider); - final shortcutsNotifier = ref.watch(shortcutProvider.notifier); - return userProgram.when( - data: (data) => - MenuItemsBuilder( - itemBuilder: (item) => - MenuOption( - title: item.title ?? "", - icon: item.shortcutIcon, - onPress: () { - if (shortcuts.any((element) => - element == item.title)) { - // Delete shortcut - shortcutsNotifier.deleteShortcut( - item.title ?? "", - ); - } else { - // Add shortcut - if (shortcuts.length >= - shortcutsNotifier.maxShortcuts) { - context.pop(); - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: - Text( - "Max number of shortcuts reached"))); - } else { - shortcutsNotifier.addShortcut( - item.title ?? "", - ); - } - } - }, - bgColor: shortcuts.any((element) => - element == item.title) - ? theme.colorScheme.secondary - : item.shortcutBackgroundColor, + void _showDialog(BuildContext context, bool isAdmin) { + final theme = Theme.of(context); + showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + icon: const Icon(Icons.construction), + title: Text( + "Select Shortcut MenuOptions", + style: theme.textTheme.titleMedium, + ), + content: SizedBox( + width: double.maxFinite, + height: MediaQuery.of(context).size.height * 0.5, + child: Consumer( + builder: (context, ref, child) { + final userProgram = ref.watch(userProgramProvider); + final shortcuts = ref.watch(shortcutProvider); + final shortcutsNotifier = ref.watch(shortcutProvider.notifier); + return userProgram.when( + data: (data) => MenuItemsBuilder( + itemBuilder: (item) => MenuOption( + title: item.title ?? "", + icon: item.shortcutIcon, + onPress: () { + if (shortcuts.contains(item.title)) { + // Delete shortcut + shortcutsNotifier.deleteShortcut(item.title ?? ""); + } else { + // Add shortcut + if (shortcuts.length >= shortcutsNotifier.maxShortcuts) { + context.pop(); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text("Max number of shortcuts reached"), ), - items: [ - // get generic menu items - ...getGenericMenuItems(context), - // get program menu items - ...data.where((element) => element.isActive).map((e) { - final programCode = e.id; - return getProgramMenuItemByProgramCode( - context, programCode ?? ''); - }) - ], - ), - error: (error, _) => Center(child: Text(error.toString())), - loading: () => - const Center( - child: CircularProgressIndicator(), + ); + } else { + shortcutsNotifier.addShortcut(item.title ?? ""); + } + } + }, + bgColor: shortcuts.contains(item.title) + ? theme.colorScheme.secondary + : item.shortcutBackgroundColor, ), - ); - }, - ), + items: [ + // get generic menu items + ...getGenericMenuItems(context, isAdmin), + // get program menu items + ...data.where((element) => element.isActive).map((e) { + final programCode = e.id; + return getProgramMenuItemByProgramCode(context, programCode ?? ''); + }), + ], + ), + error: (error, _) => Center(child: Text(error.toString())), + loading: () => const Center(child: CircularProgressIndicator()), + ); + }, ), - actions: [Button(title: "Ok", onPress: () { - context.pop(); - },) - ], ), - ); + actions: [ + Button( + title: "Ok", + onPress: () { + context.pop(); + }, + ), + ], + ), + ); + } } diff --git a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart new file mode 100644 index 00000000..c8bf5b13 --- /dev/null +++ b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; +import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +// _menuItems(BuildContext context) => [ +// MenuItem( +// shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/pills.svg", +// semanticsLabel: "Dawa", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/shopping-meds.svg", +// semanticsLabel: "Dawa", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Request Drugs", +// onPressed: () => context.goNamed(RouteNames.REQUEST_DRUGS), +// color: Constants.dawaDropColor.withOpacity(0.5), +// ), +// MenuItem( +// shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/shopping.svg", +// semanticsLabel: "Dawa", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", +// semanticsLabel: "Dawa", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Drug Orders", +// onPressed: () => context.goNamed(RouteNames.HIV_DRUG_ORDERS), +// color: Constants.dawaDropColor.withOpacity(0.5), +// ), +// MenuItem( +// shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, +// icon: SvgPicture.asset( +// "assets/images/review.svg", +// semanticsLabel: "Dawa", +// fit: BoxFit.contain, +// width: 80, +// height: 80, +// ), +// shortcutIcon: SvgPicture.asset("assets/images/review.svg", +// semanticsLabel: "Dawa", +// fit: BoxFit.contain, +// width: Constants.shortcutIconSize, +// height: Constants.shortcutIconSize), +// title: "Confirm Delivery", +// onPressed: () => context.goNamed(RouteNames.DISPATCHED_DRUGS), +// color: theme.primaryColorDark.withOpacity(0.5), +// ), +// ]; + +class ProviderMainScreen extends StatelessWidget { + const ProviderMainScreen({super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + // final _items = _menuItems(context); + return Scaffold( + body: Column( + children: [ + CustomAppBar( + title: "Provider Modules 🏥", + // icon: Icons.vaccines_sharp, + color: Constants.providerBgColor, + ), + Expanded( + child: Text("Provider modules"), + // child: MenuItemsBuilder( + // crossAxisCount: 2, + // itemBuilder: (item) => Card( + // margin: const EdgeInsets.all(Constants.SPACING), + // clipBehavior: Clip.antiAlias, + // child: InkWell( + // splashColor: theme.primaryColorDark.withOpacity(0.5), + // onTap: item.onPressed, + // child: Container( + // padding: const EdgeInsets.all(Constants.SPACING), + // decoration: BoxDecoration( + // color: item.color ?? theme.colorScheme.primary, + // image: const DecorationImage( + // image: AssetImage("assets/images/contours.png"), + // opacity: 0.2, + // fit: BoxFit.cover, + // ), + // ), + // child: Center( + // child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // item.icon, + // const SizedBox(height: Constants.SPACING), + // Text( + // item.title ?? '', + // style: theme.textTheme.titleMedium?.copyWith( + // color: Colors.white, + // fontWeight: FontWeight.normal, + // overflow: TextOverflow.ellipsis, + // ), + // textAlign: TextAlign.center, + // ), + // ], + // ), + // ), + // ), + // ), + // ), + // items: _items, + // ), + ) + ], + )); + } +} diff --git a/lib/src/features/user/data/models/user.dart b/lib/src/features/user/data/models/user.dart index 7c6dd01c..37ddd4b0 100644 --- a/lib/src/features/user/data/models/user.dart +++ b/lib/src/features/user/data/models/user.dart @@ -33,6 +33,8 @@ class User with _$User { String? occupation, @Default(false) bool profileUpdated, @Default(false) bool accountVerified, + @Default([]) List roles, + String? facility, }) = _User; diff --git a/lib/src/features/user/data/models/user.freezed.dart b/lib/src/features/user/data/models/user.freezed.dart index ceeb7fe9..6f5fd06c 100644 --- a/lib/src/features/user/data/models/user.freezed.dart +++ b/lib/src/features/user/data/models/user.freezed.dart @@ -47,6 +47,8 @@ mixin _$User { String? get occupation => throw _privateConstructorUsedError; bool get profileUpdated => throw _privateConstructorUsedError; bool get accountVerified => throw _privateConstructorUsedError; + List get roles => throw _privateConstructorUsedError; + String? get facility => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -82,7 +84,9 @@ abstract class $UserCopyWith<$Res> { String? primaryLanguage, String? occupation, bool profileUpdated, - bool accountVerified}); + bool accountVerified, + List roles, + String? facility}); } /// @nodoc @@ -122,6 +126,8 @@ class _$UserCopyWithImpl<$Res, $Val extends User> Object? occupation = freezed, Object? profileUpdated = null, Object? accountVerified = null, + Object? roles = null, + Object? facility = freezed, }) { return _then(_value.copyWith( id: freezed == id @@ -220,6 +226,14 @@ class _$UserCopyWithImpl<$Res, $Val extends User> ? _value.accountVerified : accountVerified // ignore: cast_nullable_to_non_nullable as bool, + roles: null == roles + ? _value.roles + : roles // ignore: cast_nullable_to_non_nullable + as List, + facility: freezed == facility + ? _value.facility + : facility // ignore: cast_nullable_to_non_nullable + as String?, ) as $Val); } } @@ -255,7 +269,9 @@ abstract class _$$UserImplCopyWith<$Res> implements $UserCopyWith<$Res> { String? primaryLanguage, String? occupation, bool profileUpdated, - bool accountVerified}); + bool accountVerified, + List roles, + String? facility}); } /// @nodoc @@ -292,6 +308,8 @@ class __$$UserImplCopyWithImpl<$Res> Object? occupation = freezed, Object? profileUpdated = null, Object? accountVerified = null, + Object? roles = null, + Object? facility = freezed, }) { return _then(_$UserImpl( id: freezed == id @@ -390,6 +408,14 @@ class __$$UserImplCopyWithImpl<$Res> ? _value.accountVerified : accountVerified // ignore: cast_nullable_to_non_nullable as bool, + roles: null == roles + ? _value._roles + : roles // ignore: cast_nullable_to_non_nullable + as List, + facility: freezed == facility + ? _value.facility + : facility // ignore: cast_nullable_to_non_nullable + as String?, )); } } @@ -421,7 +447,10 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { this.primaryLanguage, this.occupation, this.profileUpdated = false, - this.accountVerified = false}); + this.accountVerified = false, + final List roles = const [], + this.facility}) + : _roles = roles; factory _$UserImpl.fromJson(Map json) => _$$UserImplFromJson(json); @@ -479,10 +508,21 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { @override @JsonKey() final bool accountVerified; + final List _roles; + @override + @JsonKey() + List get roles { + if (_roles is EqualUnmodifiableListView) return _roles; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_roles); + } + + @override + final String? facility; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'User(id: $id, image: $image, username: $username, firstName: $firstName, lastName: $lastName, name: $name, dateOfBirth: $dateOfBirth, gender: $gender, email: $email, phoneNumber: $phoneNumber, county: $county, constituency: $constituency, bloodGroup: $bloodGroup, allergies: $allergies, disabilities: $disabilities, chronics: $chronics, weight: $weight, height: $height, maritalStatus: $maritalStatus, educationLevel: $educationLevel, primaryLanguage: $primaryLanguage, occupation: $occupation, profileUpdated: $profileUpdated, accountVerified: $accountVerified)'; + return 'User(id: $id, image: $image, username: $username, firstName: $firstName, lastName: $lastName, name: $name, dateOfBirth: $dateOfBirth, gender: $gender, email: $email, phoneNumber: $phoneNumber, county: $county, constituency: $constituency, bloodGroup: $bloodGroup, allergies: $allergies, disabilities: $disabilities, chronics: $chronics, weight: $weight, height: $height, maritalStatus: $maritalStatus, educationLevel: $educationLevel, primaryLanguage: $primaryLanguage, occupation: $occupation, profileUpdated: $profileUpdated, accountVerified: $accountVerified, roles: $roles, facility: $facility)'; } @override @@ -513,7 +553,9 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { ..add(DiagnosticsProperty('primaryLanguage', primaryLanguage)) ..add(DiagnosticsProperty('occupation', occupation)) ..add(DiagnosticsProperty('profileUpdated', profileUpdated)) - ..add(DiagnosticsProperty('accountVerified', accountVerified)); + ..add(DiagnosticsProperty('accountVerified', accountVerified)) + ..add(DiagnosticsProperty('roles', roles)) + ..add(DiagnosticsProperty('facility', facility)); } @override @@ -560,7 +602,10 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { (identical(other.profileUpdated, profileUpdated) || other.profileUpdated == profileUpdated) && (identical(other.accountVerified, accountVerified) || - other.accountVerified == accountVerified)); + other.accountVerified == accountVerified) && + const DeepCollectionEquality().equals(other._roles, _roles) && + (identical(other.facility, facility) || + other.facility == facility)); } @JsonKey(ignore: true) @@ -590,7 +635,9 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { primaryLanguage, occupation, profileUpdated, - accountVerified + accountVerified, + const DeepCollectionEquality().hash(_roles), + facility ]); @JsonKey(ignore: true) @@ -632,7 +679,9 @@ abstract class _User implements User { final String? primaryLanguage, final String? occupation, final bool profileUpdated, - final bool accountVerified}) = _$UserImpl; + final bool accountVerified, + final List roles, + final String? facility}) = _$UserImpl; factory _User.fromJson(Map json) = _$UserImpl.fromJson; @@ -687,6 +736,10 @@ abstract class _User implements User { @override bool get accountVerified; @override + List get roles; + @override + String? get facility; + @override @JsonKey(ignore: true) _$$UserImplCopyWith<_$UserImpl> get copyWith => throw _privateConstructorUsedError; diff --git a/lib/src/features/user/data/models/user.g.dart b/lib/src/features/user/data/models/user.g.dart index fcf15a0e..bee4b612 100644 --- a/lib/src/features/user/data/models/user.g.dart +++ b/lib/src/features/user/data/models/user.g.dart @@ -31,6 +31,10 @@ _$UserImpl _$$UserImplFromJson(Map json) => _$UserImpl( occupation: json['occupation'] as String?, profileUpdated: json['profileUpdated'] as bool? ?? false, accountVerified: json['accountVerified'] as bool? ?? false, + roles: + (json['roles'] as List?)?.map((e) => e as String).toList() ?? + const [], + facility: json['facility'] as String?, ); Map _$$UserImplToJson(_$UserImpl instance) => @@ -59,4 +63,6 @@ Map _$$UserImplToJson(_$UserImpl instance) => 'occupation': instance.occupation, 'profileUpdated': instance.profileUpdated, 'accountVerified': instance.accountVerified, + 'roles': instance.roles, + 'facility': instance.facility, }; diff --git a/lib/src/features/user/data/services/UserService.dart b/lib/src/features/user/data/services/UserService.dart index a65e9176..f6b77550 100644 --- a/lib/src/features/user/data/services/UserService.dart +++ b/lib/src/features/user/data/services/UserService.dart @@ -102,6 +102,8 @@ class UserService extends HTTPService { "disabilities": person["profile"]["disabilities"], "chronics": person["profile"]["chronics"], "gender": person["profile"]["gender"], + "roles": ["user", "provider"], + "facility": person["profile"]["facility"], }); } diff --git a/lib/src/features/user/presentation/pages/ProfileScreen.dart b/lib/src/features/user/presentation/pages/ProfileScreen.dart index 1d7617e8..3068b22d 100644 --- a/lib/src/features/user/presentation/pages/ProfileScreen.dart +++ b/lib/src/features/user/presentation/pages/ProfileScreen.dart @@ -76,6 +76,14 @@ class ProfileScreen extends HookWidget { : Text(user.username ?? ''), ), const Divider(), + ListTile( + leading: const Icon(Icons.perm_identity), + title: const Text("Roles"), + subtitle: user.roles.isEmpty + ? Text("") + : Text("${user.roles[0] ?? ''}, ${user.roles[1] ?? ''}"), + ), + const Divider(), ListTile( leading: const Icon(Icons.email), title: const Text("Email"), diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index 02b4c47b..2f23c51a 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -45,4 +45,5 @@ class Constants { static const bpShortCutBgColor = Color.fromARGB(255, 255, 205, 210); static const bpBgColor = Color.fromARGB(255, 255, 83, 80); static const bloodSugarColor = Color.fromARGB(255, 180, 216, 20); + static const providerBgColor = Color.fromARGB(255, 37, 102, 92); } diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 295063dc..e5c222e6 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -73,9 +73,7 @@ class RouteNames { static const CHAT_USER = "chat-user"; static const INSIGHT = "insight"; static const BP_INSIGHT = "bp-insight"; - - - + static const PROVIDER_MAIN_SCREEN = "provider-main-screen"; } class MenuItemNames { @@ -111,6 +109,7 @@ class MenuItemNames { static const CHAT_HCW = "Chat with HCW"; static const CHAT_DETAIL = "Chat Detail"; static const INSIGHT = "Insight"; + static const PROVIDER_MAIN_SCREEN = "Provider Main Screen"; } From 4cc263e6f0480e0f4bfb29126569448b9c4ecad6 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Wed, 25 Sep 2024 00:35:17 +0300 Subject: [PATCH 091/140] Adjusting the menstrual calendar feature to get, post and edit cycles based on provided endpoints. Next up, is delete. --- lib/src/app/navigation/app_router.dart | 3 +- .../period_planner/data/models/cycle.dart | 99 +- .../data/models/cycle.freezed.dart | 330 +++++++ .../period_planner/data/models/cycle.g.dart | 35 + .../data/providers/cycles_provider.dart | 52 +- .../data/repository/cycles_repository.dart | 24 + .../data/services/cycles_service.dart | 190 ++++ .../controllers/cycles_controller.dart | 71 ++ .../presentation/pages/editPeriodsScreen.dart | 211 ++--- .../presentation/pages/logPeriods.dart | 369 ++++---- .../pages/periodPlannerScreen.dart | 850 +++++++++--------- .../presentation/pages/periods_history.dart | 420 +++++---- .../presentation/widgets/customCalendar.dart | 136 +-- .../presentation/widgets/modalContent.dart | 87 +- .../period_planner/utils/event_utils.dart | 67 +- .../pages/self_screening_menu.dart | 20 +- 16 files changed, 1874 insertions(+), 1090 deletions(-) create mode 100644 lib/src/features/period_planner/data/models/cycle.freezed.dart create mode 100644 lib/src/features/period_planner/data/models/cycle.g.dart create mode 100644 lib/src/features/period_planner/data/repository/cycles_repository.dart create mode 100644 lib/src/features/period_planner/data/services/cycles_service.dart create mode 100644 lib/src/features/period_planner/presentation/controllers/cycles_controller.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index acdbb3bc..f8b112d2 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:ffi'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; @@ -493,7 +494,7 @@ final List selfScreeningRoutes = [ final extra = state.extra as Map; final startDate = extra['startDate'] as DateTime; final endDate = extra['endDate'] as DateTime; - final id = extra['id'] as String; + final id = extra['id'] as int; return EditPeriods(initialStartDate: startDate, initialEndDate: endDate, cycleId: id,); }, ), diff --git a/lib/src/features/period_planner/data/models/cycle.dart b/lib/src/features/period_planner/data/models/cycle.dart index 4fbf82f2..e7004596 100644 --- a/lib/src/features/period_planner/data/models/cycle.dart +++ b/lib/src/features/period_planner/data/models/cycle.dart @@ -1,53 +1,56 @@ -// import 'package:freezed_annotation/freezed_annotation.dart'; - -// part 'cycle.freezed.dart'; -// part 'cycle.g.dart'; - -// @Freezed() -// class Cycle with _$Cycle { -// const factory Cycle({ -// required String cycleId, -// required DateTime periodStart, -// required DateTime periodEnd, -// required DateTime fertileStart, -// required DateTime fertileEnd, -// required DateTime ovulation, -// required DateTime predictedPeriodStart, -// required DateTime predictedPeriodEnd, -// required int cycleLength, -// required int periodLength, -// }) = _Cycle; - -// factory Cycle.fromJson(Map json) -// => _$CycleFromJson(json); -// } +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'cycle.freezed.dart'; +part 'cycle.g.dart'; -class Cycle{ - String cycleId; - DateTime periodStart; - DateTime periodEnd; - DateTime fertileStart; - DateTime fertileEnd; - DateTime ovulation; - DateTime predictedPeriodStart; - DateTime predictedPeriodEnd; - int cycleLength; - int periodLength; - - Cycle({ - required this.cycleId, - required this.periodStart, - required this.periodEnd, - required this.fertileStart, - required this.fertileEnd, - required this.ovulation, - required this.predictedPeriodStart, - required this.predictedPeriodEnd, - required this.cycleLength, - required this.periodLength, - }); +@Freezed() +class Cycle with _$Cycle { + const factory Cycle({ + required DateTime period_start, + required DateTime period_end, + required DateTime fertile_start, + required DateTime fertile_end, + required DateTime ovulation, + required DateTime predicted_period_start, + required DateTime predicted_period_end, + required int cycle_length, + required int period_length, + }) = _Cycle; + + factory Cycle.fromJson(Map json) => _$CycleFromJson(json); } +//Helper methods for JsSON serialization of DateTime +// String _dateTimeToJson(DateTime date) => date.toIso8601String(); + +// DateTime _dateTimeFromJson(String date) => DateTime.parse(date); + +// class Cycle{ +// String cycleId; +// DateTime periodStart; +// DateTime periodEnd; +// DateTime fertileStart; +// DateTime fertileEnd; +// DateTime ovulation; +// DateTime predictedPeriodStart; +// DateTime predictedPeriodEnd; +// int cycleLength; +// int periodLength; + +// Cycle({ +// required this.cycleId, +// required this.periodStart, +// required this.periodEnd, +// required this.fertileStart, +// required this.fertileEnd, +// required this.ovulation, +// required this.predictedPeriodStart, +// required this.predictedPeriodEnd, +// required this.cycleLength, +// required this.periodLength, +// }); +// } + //Acting as database for now -List cycles = []; +// List cycles = []; diff --git a/lib/src/features/period_planner/data/models/cycle.freezed.dart b/lib/src/features/period_planner/data/models/cycle.freezed.dart new file mode 100644 index 00000000..e3c08837 --- /dev/null +++ b/lib/src/features/period_planner/data/models/cycle.freezed.dart @@ -0,0 +1,330 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'cycle.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Cycle _$CycleFromJson(Map json) { + return _Cycle.fromJson(json); +} + +/// @nodoc +mixin _$Cycle { + DateTime get period_start => throw _privateConstructorUsedError; + DateTime get period_end => throw _privateConstructorUsedError; + DateTime get fertile_start => throw _privateConstructorUsedError; + DateTime get fertile_end => throw _privateConstructorUsedError; + DateTime get ovulation => throw _privateConstructorUsedError; + DateTime get predicted_period_start => throw _privateConstructorUsedError; + DateTime get predicted_period_end => throw _privateConstructorUsedError; + int get cycle_length => throw _privateConstructorUsedError; + int get period_length => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $CycleCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CycleCopyWith<$Res> { + factory $CycleCopyWith(Cycle value, $Res Function(Cycle) then) = + _$CycleCopyWithImpl<$Res, Cycle>; + @useResult + $Res call( + {DateTime period_start, + DateTime period_end, + DateTime fertile_start, + DateTime fertile_end, + DateTime ovulation, + DateTime predicted_period_start, + DateTime predicted_period_end, + int cycle_length, + int period_length}); +} + +/// @nodoc +class _$CycleCopyWithImpl<$Res, $Val extends Cycle> + implements $CycleCopyWith<$Res> { + _$CycleCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? period_start = null, + Object? period_end = null, + Object? fertile_start = null, + Object? fertile_end = null, + Object? ovulation = null, + Object? predicted_period_start = null, + Object? predicted_period_end = null, + Object? cycle_length = null, + Object? period_length = null, + }) { + return _then(_value.copyWith( + period_start: null == period_start + ? _value.period_start + : period_start // ignore: cast_nullable_to_non_nullable + as DateTime, + period_end: null == period_end + ? _value.period_end + : period_end // ignore: cast_nullable_to_non_nullable + as DateTime, + fertile_start: null == fertile_start + ? _value.fertile_start + : fertile_start // ignore: cast_nullable_to_non_nullable + as DateTime, + fertile_end: null == fertile_end + ? _value.fertile_end + : fertile_end // ignore: cast_nullable_to_non_nullable + as DateTime, + ovulation: null == ovulation + ? _value.ovulation + : ovulation // ignore: cast_nullable_to_non_nullable + as DateTime, + predicted_period_start: null == predicted_period_start + ? _value.predicted_period_start + : predicted_period_start // ignore: cast_nullable_to_non_nullable + as DateTime, + predicted_period_end: null == predicted_period_end + ? _value.predicted_period_end + : predicted_period_end // ignore: cast_nullable_to_non_nullable + as DateTime, + cycle_length: null == cycle_length + ? _value.cycle_length + : cycle_length // ignore: cast_nullable_to_non_nullable + as int, + period_length: null == period_length + ? _value.period_length + : period_length // ignore: cast_nullable_to_non_nullable + as int, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$CycleImplCopyWith<$Res> implements $CycleCopyWith<$Res> { + factory _$$CycleImplCopyWith( + _$CycleImpl value, $Res Function(_$CycleImpl) then) = + __$$CycleImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {DateTime period_start, + DateTime period_end, + DateTime fertile_start, + DateTime fertile_end, + DateTime ovulation, + DateTime predicted_period_start, + DateTime predicted_period_end, + int cycle_length, + int period_length}); +} + +/// @nodoc +class __$$CycleImplCopyWithImpl<$Res> + extends _$CycleCopyWithImpl<$Res, _$CycleImpl> + implements _$$CycleImplCopyWith<$Res> { + __$$CycleImplCopyWithImpl( + _$CycleImpl _value, $Res Function(_$CycleImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? period_start = null, + Object? period_end = null, + Object? fertile_start = null, + Object? fertile_end = null, + Object? ovulation = null, + Object? predicted_period_start = null, + Object? predicted_period_end = null, + Object? cycle_length = null, + Object? period_length = null, + }) { + return _then(_$CycleImpl( + period_start: null == period_start + ? _value.period_start + : period_start // ignore: cast_nullable_to_non_nullable + as DateTime, + period_end: null == period_end + ? _value.period_end + : period_end // ignore: cast_nullable_to_non_nullable + as DateTime, + fertile_start: null == fertile_start + ? _value.fertile_start + : fertile_start // ignore: cast_nullable_to_non_nullable + as DateTime, + fertile_end: null == fertile_end + ? _value.fertile_end + : fertile_end // ignore: cast_nullable_to_non_nullable + as DateTime, + ovulation: null == ovulation + ? _value.ovulation + : ovulation // ignore: cast_nullable_to_non_nullable + as DateTime, + predicted_period_start: null == predicted_period_start + ? _value.predicted_period_start + : predicted_period_start // ignore: cast_nullable_to_non_nullable + as DateTime, + predicted_period_end: null == predicted_period_end + ? _value.predicted_period_end + : predicted_period_end // ignore: cast_nullable_to_non_nullable + as DateTime, + cycle_length: null == cycle_length + ? _value.cycle_length + : cycle_length // ignore: cast_nullable_to_non_nullable + as int, + period_length: null == period_length + ? _value.period_length + : period_length // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$CycleImpl implements _Cycle { + const _$CycleImpl( + {required this.period_start, + required this.period_end, + required this.fertile_start, + required this.fertile_end, + required this.ovulation, + required this.predicted_period_start, + required this.predicted_period_end, + required this.cycle_length, + required this.period_length}); + + factory _$CycleImpl.fromJson(Map json) => + _$$CycleImplFromJson(json); + + @override + final DateTime period_start; + @override + final DateTime period_end; + @override + final DateTime fertile_start; + @override + final DateTime fertile_end; + @override + final DateTime ovulation; + @override + final DateTime predicted_period_start; + @override + final DateTime predicted_period_end; + @override + final int cycle_length; + @override + final int period_length; + + @override + String toString() { + return 'Cycle(period_start: $period_start, period_end: $period_end, fertile_start: $fertile_start, fertile_end: $fertile_end, ovulation: $ovulation, predicted_period_start: $predicted_period_start, predicted_period_end: $predicted_period_end, cycle_length: $cycle_length, period_length: $period_length)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CycleImpl && + (identical(other.period_start, period_start) || + other.period_start == period_start) && + (identical(other.period_end, period_end) || + other.period_end == period_end) && + (identical(other.fertile_start, fertile_start) || + other.fertile_start == fertile_start) && + (identical(other.fertile_end, fertile_end) || + other.fertile_end == fertile_end) && + (identical(other.ovulation, ovulation) || + other.ovulation == ovulation) && + (identical(other.predicted_period_start, predicted_period_start) || + other.predicted_period_start == predicted_period_start) && + (identical(other.predicted_period_end, predicted_period_end) || + other.predicted_period_end == predicted_period_end) && + (identical(other.cycle_length, cycle_length) || + other.cycle_length == cycle_length) && + (identical(other.period_length, period_length) || + other.period_length == period_length)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash( + runtimeType, + period_start, + period_end, + fertile_start, + fertile_end, + ovulation, + predicted_period_start, + predicted_period_end, + cycle_length, + period_length); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$CycleImplCopyWith<_$CycleImpl> get copyWith => + __$$CycleImplCopyWithImpl<_$CycleImpl>(this, _$identity); + + @override + Map toJson() { + return _$$CycleImplToJson( + this, + ); + } +} + +abstract class _Cycle implements Cycle { + const factory _Cycle( + {required final DateTime period_start, + required final DateTime period_end, + required final DateTime fertile_start, + required final DateTime fertile_end, + required final DateTime ovulation, + required final DateTime predicted_period_start, + required final DateTime predicted_period_end, + required final int cycle_length, + required final int period_length}) = _$CycleImpl; + + factory _Cycle.fromJson(Map json) = _$CycleImpl.fromJson; + + @override + DateTime get period_start; + @override + DateTime get period_end; + @override + DateTime get fertile_start; + @override + DateTime get fertile_end; + @override + DateTime get ovulation; + @override + DateTime get predicted_period_start; + @override + DateTime get predicted_period_end; + @override + int get cycle_length; + @override + int get period_length; + @override + @JsonKey(ignore: true) + _$$CycleImplCopyWith<_$CycleImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/period_planner/data/models/cycle.g.dart b/lib/src/features/period_planner/data/models/cycle.g.dart new file mode 100644 index 00000000..a6e57965 --- /dev/null +++ b/lib/src/features/period_planner/data/models/cycle.g.dart @@ -0,0 +1,35 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'cycle.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$CycleImpl _$$CycleImplFromJson(Map json) => _$CycleImpl( + period_start: DateTime.parse(json['period_start'] as String), + period_end: DateTime.parse(json['period_end'] as String), + fertile_start: DateTime.parse(json['fertile_start'] as String), + fertile_end: DateTime.parse(json['fertile_end'] as String), + ovulation: DateTime.parse(json['ovulation'] as String), + predicted_period_start: + DateTime.parse(json['predicted_period_start'] as String), + predicted_period_end: + DateTime.parse(json['predicted_period_end'] as String), + cycle_length: (json['cycle_length'] as num).toInt(), + period_length: (json['period_length'] as num).toInt(), + ); + +Map _$$CycleImplToJson(_$CycleImpl instance) => + { + 'period_start': instance.period_start.toIso8601String(), + 'period_end': instance.period_end.toIso8601String(), + 'fertile_start': instance.fertile_start.toIso8601String(), + 'fertile_end': instance.fertile_end.toIso8601String(), + 'ovulation': instance.ovulation.toIso8601String(), + 'predicted_period_start': + instance.predicted_period_start.toIso8601String(), + 'predicted_period_end': instance.predicted_period_end.toIso8601String(), + 'cycle_length': instance.cycle_length, + 'period_length': instance.period_length, + }; diff --git a/lib/src/features/period_planner/data/providers/cycles_provider.dart b/lib/src/features/period_planner/data/providers/cycles_provider.dart index 97d31da2..859e9f87 100644 --- a/lib/src/features/period_planner/data/providers/cycles_provider.dart +++ b/lib/src/features/period_planner/data/providers/cycles_provider.dart @@ -1,25 +1,43 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/period_planner/data/repository/cycles_repository.dart'; +import 'package:nishauri/src/features/period_planner/data/services/cycles_service.dart'; +import 'package:nishauri/src/features/period_planner/presentation/controllers/cycles_controller.dart'; import '../models/cycle.dart'; -final cyclesProvider = StateNotifierProvider>((ref) { - return CyclesNotifier(); +final cyclesProvider = StateNotifierProvider>> ((ref) { + final service = CyclesService(); + final repository = CyclesRepository(service); + return CyclesController(repository); }); -class CyclesNotifier extends StateNotifier> { - CyclesNotifier():super(cycles); +// final cyclesRepositoryProvider = Provider((ref) { +// return CyclesRepository(CyclesService()); +// }); - void addCycle(Cycle newCycle) { - state = [...state, newCycle]; - } +// final cyclesListProvider = FutureProvider>((ref) async { +// final repository = ref.watch(cyclesRepositoryProvider); +// return await repository.fetchCycles(); +// }); - void updatedCycle(String cycleId, Cycle updatedCycle) { - state = [ - for (final cycle in state) - if (cycle.cycleId == cycleId) updatedCycle else cycle - ]; - } +// final cyclesProvider = StateNotifierProvider>((ref) { +// return CyclesNotifier(); +// }); - // void removeCycle(String cycleId) { - // state = state.where((cycle) => cycle.cycleId != cycleId).toList(); - // } -} \ No newline at end of file +// class CyclesNotifier extends StateNotifier> { +// CyclesNotifier():super(cycles); + +// void addCycle(Cycle newCycle) { +// state = [...state, newCycle]; +// } + +// void updatedCycle(String cycleId, Cycle updatedCycle) { +// state = [ +// for (final cycle in state) +// if (cycle.cycleId == cycleId) updatedCycle else cycle +// ]; +// } + +// // void removeCycle(String cycleId) { +// // state = state.where((cycle) => cycle.cycleId != cycleId).toList(); +// // } +// } \ No newline at end of file diff --git a/lib/src/features/period_planner/data/repository/cycles_repository.dart b/lib/src/features/period_planner/data/repository/cycles_repository.dart new file mode 100644 index 00000000..dfd69ad1 --- /dev/null +++ b/lib/src/features/period_planner/data/repository/cycles_repository.dart @@ -0,0 +1,24 @@ +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/services/cycles_service.dart'; + +class CyclesRepository { + final CyclesService _service; + + CyclesRepository(this._service); + + Future postCycles(Map data) async { + return await _service.postCycles(data); + } + + Future> fetchCycles() async { + return await _service.fetchCycles(); + } + + Future putCycles(int cycleId, Map data) async{ + return await _service.putCycles(cycleId, data); + } + + Future deleteCycle(int cycleId) async { + return await _service.deleteCycle(cycleId); + } +} \ No newline at end of file diff --git a/lib/src/features/period_planner/data/services/cycles_service.dart b/lib/src/features/period_planner/data/services/cycles_service.dart new file mode 100644 index 00000000..8496c082 --- /dev/null +++ b/lib/src/features/period_planner/data/services/cycles_service.dart @@ -0,0 +1,190 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; +import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class CyclesService extends HTTPService { + final AuthRepository _repository = AuthRepository(AuthApiService()); + + Future postCycles_(Map data) async { + final id = await _repository.getUserId(); + final tokenPair = await getCachedToken(); + final userId = {'user_id': id}; + var headers = { + 'Authorization': 'Bearer ${tokenPair.accessToken}', + 'Content-Type': 'application/json', + }; + var url = '${Constants.BASE_URL_NEW}/menstrual_cycle'; + final payload = {...data, ...userId}; + debugPrint("Data payload: $payload"); + + final response = request( + url: url, + token: tokenPair, + method: 'POST', + requestHeaders: headers, + userId: id, + data: payload, + ); + + return response; + } + + Future postCycles(Map data) async { + try { + final response = await call>(postCycles_, data); + debugPrint("Response status code: ${response.statusCode}"); + + if (response.statusCode == 200) { + final responseString = await response.stream.bytesToString(); + final responseData = jsonDecode(responseString); + if (responseData["success"] == true) { + return responseData["msg"]; + } else { + throw responseData["msg"]; + } + } else { + throw "Something Went Wrong Try Again Later ${response.statusCode}"; + } + } catch (e) { + debugPrint("Error posting Cycles: $e"); + throw "$e"; + } + } + + Future fetchCycles_(dynamic args) async { + final id = await _repository.getUserId(); + final tokenPair = await getCachedToken(); + var headers = {'Authorization': 'Bearer ${tokenPair.accessToken}'}; + var url = '${Constants.BASE_URL_NEW}get_menstrual_cycle?user_id=$id'; + final response = request( + url: url, + token: tokenPair, + method: 'GET', + requestHeaders: headers, + userId: id, + ); + return response; + } + + Future> fetchCycles() async { + final response = await call(fetchCycles_, null); + try { + if (response.statusCode == 200) { + final responseString = await response.stream.bytesToString(); + final Map responseData = json.decode(responseString); + final cyclesMap = { + for (var cycle in responseData["data"]["menstrual_cycle"]) + cycle['id'] as int: Cycle.fromJson(cycle) + }; + debugPrint("Cycles Map: $cyclesMap"); + return cyclesMap; + } else { + throw "Something went wrong. Status Code: ${response.statusCode}"; + } + } catch (e) { + throw "$e"; + } + } + + Future putCycles_( + int cycleId, Map data) async { + final id = await _repository.getUserId(); + final tokenPair = await getCachedToken(); + final userId = {'user_id': id}; + var headers = { + 'Authorization': 'Bearer ${tokenPair.accessToken}', + 'Content-Type': 'application/json', + }; + var url = '${Constants.BASE_URL_NEW}/update_menstrual_cycle/$cycleId'; + final payload = {...data, ...userId}; + debugPrint("Data payload: $payload"); + + final response = request( + url: url, + token: tokenPair, + method: 'PUT', + requestHeaders: headers, + userId: id, + data: payload, + ); + + return response; + } + + // Created a wrapper that only accepts the data and calls putCycles_ internally + Future editCycles_(Map data, + {required int cycleId}) { + return putCycles_(cycleId, data); + } + + Future putCycles(int cycleId, Map data) async { + try { + final response = await call>( + (data) => editCycles_(data, cycleId: cycleId), data); + debugPrint("PUT Response status code: ${response.statusCode}"); + + if (response.statusCode == 200) { + final responseString = await response.stream.bytesToString(); + final responseData = jsonDecode(responseString); + if (responseData["success"] == true) { + return responseData["msg"]; + } else { + throw responseData["msg"]; + } + } else { + throw 'Failed to update cycle. Status Code: ${response.statusCode}'; + } + } catch (e) { + debugPrint("Error updating Cycles: $e"); + throw "$e"; + } + } + + Future deleteCycle_(int cycleId) async { + final id = await _repository.getUserId(); + final tokenPair = await getCachedToken(); + var headers = { + 'Authorization': 'Bearer ${tokenPair.accessToken}', + 'Content-Type': 'application/json', + }; + var url = '${Constants.BASE_URL_NEW}/delete_menstrual_cycle/$cycleId'; + + final response = request( + url: url, + token: tokenPair, + method: 'DELETE', + requestHeaders: headers, + userId: id, + ); + + return response; + } + + Future deleteCycle(int cycleId) async { + try { + final response = await call(deleteCycle_, cycleId); + debugPrint("DELETE Response status code: ${response.statusCode}"); + + if (response.statusCode == 200) { + final responseString = await response.stream.bytesToString(); + final responseData = jsonDecode(responseString); + if (responseData["success"] == true) { + return responseData["msg"]; + } else { + throw responseData["msg"]; + } + } else { + throw "Failed to delete cycle. Status Code: ${response.statusCode}"; + } + } catch (e) { + debugPrint("Error deleting Cycle: $e"); + throw "$e"; + } + } +} diff --git a/lib/src/features/period_planner/presentation/controllers/cycles_controller.dart b/lib/src/features/period_planner/presentation/controllers/cycles_controller.dart new file mode 100644 index 00000000..ccd04c96 --- /dev/null +++ b/lib/src/features/period_planner/presentation/controllers/cycles_controller.dart @@ -0,0 +1,71 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/repository/cycles_repository.dart'; + +class CyclesController extends StateNotifier>> { + final CyclesRepository _repository; + + CyclesController(this._repository) : super(const AsyncValue.loading()); + + Future> fetchCycles() async { + state = const AsyncValue.loading(); + try { + final cycles = await _repository.fetchCycles(); + state = AsyncValue.data(cycles); + return cycles; + } catch (e, stackTrace) { + state = AsyncValue.error(e, stackTrace); + return {}; + } + } + + Future postCycles(Cycle cycle) async { + state = const AsyncValue.loading(); + try { + final response = await _repository.postCycles({ + 'period_start': cycle.period_start.toIso8601String(), + 'period_end': cycle.period_end.toIso8601String(), + 'fertile_start': cycle.fertile_start.toIso8601String(), + 'fertile_end': cycle.fertile_end.toIso8601String(), + 'ovulation': cycle.ovulation.toIso8601String(), + 'predicted_period_start': cycle.predicted_period_start.toIso8601String(), + 'predicted_period_end': cycle.predicted_period_end.toIso8601String(), + 'cycle_length': cycle.cycle_length, + 'period_length': cycle.period_length, + }); + await fetchCycles(); + } catch (e, stackTrace) { + state = AsyncValue.error(e, stackTrace); + } + } + + Future editCycle(int cycleId, Cycle updatedCycle) async { + state = const AsyncValue.loading(); + try { + final response = await _repository.putCycles(cycleId, { + 'period_start': updatedCycle.period_start.toIso8601String(), + 'period_end': updatedCycle.period_end.toIso8601String(), + 'fertile_start': updatedCycle.fertile_start.toIso8601String(), + 'fertile_end': updatedCycle.fertile_end.toIso8601String(), + 'ovulation': updatedCycle.ovulation.toIso8601String(), + 'predicted_period_start': updatedCycle.predicted_period_start.toIso8601String(), + 'predicted_period_end': updatedCycle.predicted_period_end.toIso8601String(), + 'cycle_length': updatedCycle.cycle_length, + 'period_length': updatedCycle.period_length, + }); + await fetchCycles(); + } catch (e, stackTrace) { + state = AsyncValue.error(e, stackTrace); + } + } + + Future deleteCycle(int cycleId) async { + state = const AsyncValue.loading(); + try { + final response = await _repository.deleteCycle(cycleId); + await fetchCycles(); + } catch (e, stackTrace) { + state = AsyncValue.error(e, stackTrace); + } + } +} diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 36bbb542..103680b0 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -1,3 +1,5 @@ +import 'dart:ffi'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; @@ -13,8 +15,9 @@ import 'package:table_calendar/table_calendar.dart'; class EditPeriods extends ConsumerStatefulWidget { final DateTime? initialStartDate; final DateTime? initialEndDate; - final String? cycleId; - const EditPeriods({super.key, this.initialStartDate, this.initialEndDate, this.cycleId}); + final int? cycleId; + const EditPeriods( + {super.key, this.initialStartDate, this.initialEndDate, this.cycleId}); @override ConsumerState createState() => _EditPeriodsState(); @@ -43,115 +46,123 @@ class _EditPeriodsState extends ConsumerState { }); } - //Function for updating the entries in the list database - void _updateCycle() { - if (_rangeStart != null && _rangeEnd != null) { - // Finding the current cycle using cycleId instead of periodStart and periodEnd - Cycle currentCycle = cycles.firstWhere( - (cycle) => - cycle.cycleId == widget.cycleId, // Use cycleId for identification - ); - - // Predict the new cycle based on the updated period start and end dates - Cycle updatedCycle = predictCycle(_rangeStart!, _rangeEnd!, cycleId: currentCycle.cycleId); - - ref.read(cyclesProvider.notifier).updatedCycle(currentCycle.cycleId, updatedCycle); - - // Replace the old cycle with the updated one using index - int index = cycles.indexOf(currentCycle); - setState(() { - cycles[index] = updatedCycle; - }); - - updateCycleLengths(cycles); - - debugPrint("Updated Cycle Length: ${updatedCycle.cycleLength}"); - printCycles(cycles); - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Periods updated successfully!')), - ); - Navigator.pop(context, true); - } - } - @override Widget build(BuildContext context) { final theme = Theme.of(context); - return Scaffold( - body: Column( - children: [ - const CustomAppBar( - title: "Edit Period 🌸", - color: Constants.periodPlanner, - ), - TableCalendar( - focusedDay: _focusedDay, - firstDay: DateTime(2021), - lastDay: DateTime(2100), - rangeStartDay: _rangeStart, - rangeEndDay: _rangeEnd, - rangeSelectionMode: RangeSelectionMode.toggledOn, - onRangeSelected: _onRangeSelected, - calendarStyle: const CalendarStyle( - todayDecoration: BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - rangeStartDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeEndDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeHighlightColor: Constants.periodPlanner, - selectedDecoration: BoxDecoration( + final cycleAsyncValue = ref.watch(cyclesProvider); + + return cycleAsyncValue.when( + data: (cycles) { + final cycleId = cycles.keys; + final cycleList = cycles.values; + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + title: "Edit Period 🌸", color: Constants.periodPlanner, - shape: BoxShape.circle, ), - ), - headerStyle: const HeaderStyle( - formatButtonVisible: false, - ), - ), - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, + TableCalendar( + focusedDay: _focusedDay, + firstDay: DateTime(2021), + lastDay: DateTime(2100), + rangeStartDay: _rangeStart, + rangeEndDay: _rangeEnd, + rangeSelectionMode: RangeSelectionMode.toggledOn, + onRangeSelected: _onRangeSelected, + calendarStyle: const CalendarStyle( + todayDecoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + rangeStartDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, ), - onPressed: () { - if (_rangeStart == null || _rangeEnd == null) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select your Period start and end dates.')), - ); - } - else if(_rangeStart!.isAfter(today) || _rangeEnd!.isAfter(today)) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('You cannot select dates in the future. Please select valid dates.')), - ); - } - else { - _updateCycle(); - context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); - } - }, - child: Text( - 'Apply', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, + rangeEndDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeHighlightColor: Constants.periodPlanner, + selectedDecoration: BoxDecoration( + color: Constants.periodPlanner, + shape: BoxShape.circle, + ), + ), + headerStyle: const HeaderStyle( + formatButtonVisible: false, + ), + ), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + if (_rangeStart == null || _rangeEnd == null) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'Please select your Period start and end dates.')), + ); + } else if (_rangeStart!.isAfter(today) || + _rangeEnd!.isAfter(today)) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'You cannot select dates in the future. Please select valid dates.')), + ); + } else { + final currentCycleId = widget.cycleId; + final currentCycle = cycles[widget.cycleId]; + + if (currentCycle != null && currentCycleId != null) { + final updatedCycle = predictCycle( + _rangeStart!, _rangeEnd!, + cycleId: currentCycleId, cycle: cycles); + + ref + .read(cyclesProvider.notifier) + .editCycle(currentCycleId, updatedCycle); + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: + Text('Periods updated successfully!')), + ); + Navigator.pop(context, true); + } else { + debugPrint('Cycle with id ${widget.cycleId} not found!'); + } + } + }, + child: Text( + 'Apply', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), ), ), ), ), - ), + ], ), - ], + ); + }, + error: (error, stackTrace) => Center( + child: Text( + 'Failed to load cycles: $error', + style: const TextStyle(color: Colors.red), + ), + ), + loading: () => const Center( + child: CircularProgressIndicator(), ), ); } diff --git a/lib/src/features/period_planner/presentation/pages/logPeriods.dart b/lib/src/features/period_planner/presentation/pages/logPeriods.dart index 6f7ba115..5b7e76f4 100644 --- a/lib/src/features/period_planner/presentation/pages/logPeriods.dart +++ b/lib/src/features/period_planner/presentation/pages/logPeriods.dart @@ -13,22 +13,22 @@ import 'package:nishauri/src/utils/routes.dart'; import 'package:table_calendar/table_calendar.dart'; //printing List which is acting as a Database -void printCycles(List cycles) { - debugPrint('----Cycle Printed----'); - for (var cycle in cycles) { - debugPrint('Cycle ID: ${cycle.cycleId}'); - debugPrint('Period Start: ${cycle.periodStart}'); - debugPrint('Period End: ${cycle.periodEnd}'); - debugPrint('Fertile Start: ${cycle.fertileStart}'); - debugPrint('Fertile End: ${cycle.fertileEnd}'); - debugPrint('Ovulation: ${cycle.ovulation}'); - debugPrint('Predicted Period Start: ${cycle.predictedPeriodStart}'); - debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); - debugPrint('Cycle Length: ${cycle.cycleLength}'); - debugPrint('Period Length: ${cycle.periodLength}'); - debugPrint('---'); - } -} +// void printCycles(Cycle cycles) { +// debugPrint('----Cycle Printed----'); +// for (var cycle in cycles) { +// // debugPrint('Cycle ID: ${cycle.cycleId}'); +// debugPrint('Period Start: ${cycle.period_start}'); +// debugPrint('Period End: ${cycle.periodEnd}'); +// debugPrint('Fertile Start: ${cycle.fertileStart}'); +// debugPrint('Fertile End: ${cycle.fertileEnd}'); +// debugPrint('Ovulation: ${cycle.ovulation}'); +// debugPrint('Predicted Period Start: ${cycle.predictedPeriodStart}'); +// debugPrint('Predicted Period End: ${cycle.predictedPeriodEnd}'); +// debugPrint('Cycle Length: ${cycle.cycleLength}'); +// debugPrint('Period Length: ${cycle.periodLength}'); +// debugPrint('---'); +// } +// } //This is the screen the user interacts when they are logging their Period Days @@ -41,21 +41,21 @@ class _LogPeriodScreenState extends ConsumerState { DateTime _focusedDay = DateTime.now(); DateTime? _startDate; DateTime? _endDate; - Map>> events = EventUtils.generateEvents(cycles); + //late Map> _filteredEvents; //final latestCycle = cycles.last; - bool _isNewUser = cycles.isEmpty; - int averagePeriods = calculateAveragePeriodLength(cycles); + // bool _isNewUser = cycles.isEmpty; + // int averagePeriods = calculateAveragePeriodLength(cycles); final today = DateTime.now(); @override void initState() { super.initState(); - final cycles = ref.read(cyclesProvider); - _isNewUser = cycles.isEmpty; + final cycles = ref.read(cyclesProvider).asData?.value ?? {}; + bool _isNewUser = cycles.isEmpty; if (!_isNewUser) { - _initializePredictedPeriodRange(); - _setFocusedDayForRegularUser(); + _initializePredictedPeriodRange(cycles); + _setFocusedDayForRegularUser(cycles); } } @@ -77,42 +77,42 @@ class _LogPeriodScreenState extends ConsumerState { // return filteredEvents; // } - void _initializePredictedPeriodRange() { - final cycles = ref.read(cyclesProvider); - final latestCycle = cycles.last; - _startDate = latestCycle.predictedPeriodStart; - _endDate = latestCycle.predictedPeriodEnd; + void _initializePredictedPeriodRange(Map cycles) { + if (cycles.isNotEmpty) { + final latestCycle = cycles.values.last; + setState(() { + _startDate = latestCycle.predicted_period_start; + _endDate = latestCycle.predicted_period_end; + }); + } + // final latestCycle = cycles.last; + // _startDate = latestCycle.predicted_period_start; + // _endDate = latestCycle.predicted_period_end; } - void _setFocusedDayForRegularUser() { - final cycles = ref.read(cyclesProvider); - final latestCycle = cycles.last; - _focusedDay = latestCycle.predictedPeriodStart; + void _setFocusedDayForRegularUser(Map cycles) { + if (cycles.isNotEmpty) { + final latestCycle = cycles.values.last; + setState(() { + _focusedDay = latestCycle.predicted_period_start; + }); + } + // final cycles = ref.read(cyclesProvider) as List; + // final latestCycle = cycles.last; + // _focusedDay = latestCycle.predicted_period_start; } //Function handling selection of period days for a regular user void _onDaySelected(DateTime selectedDay, DateTime focusedDay) { - // final today = DateTime.now(); - - // // Check if the selected day is in the future - // if (selectedDay.isAfter(today)) { - // ScaffoldMessenger.of(context).showSnackBar( - // const SnackBar( - // content: Text('You cannot select a date in the future. Please select a valid date.'), - // ), - // ); - // return; - // } - setState(() { _startDate = selectedDay; - _endDate = _startDate?.add(Duration(days: averagePeriods - 1)); // Only start date is used for regular users + // _endDate = _startDate?.add(Duration(days: averagePeriods - 1)); // Only start date is used for regular users + _endDate = _startDate?.add(const Duration(days: 4)); _focusedDay = focusedDay; - debugPrint("Average Period Length from Log Periods is $averagePeriods"); + // debugPrint("Average Period Length from Log Periods is $averagePeriods"); }); } - // Method to validate date range ensuring selection does not exceed 7 days bool _isDateRangeValid(DateTime start, DateTime end) { final difference = @@ -123,42 +123,45 @@ class _LogPeriodScreenState extends ConsumerState { //Function handling selection of period days for a new user void _onRangeSelected(DateTime? start, DateTime? end, DateTime? focusedDay) { // If either start or end date is after today, show an error - if (start != null && end != null && (start.isAfter(today) || end.isAfter(today))) { + if (start != null && + end != null && + (start.isAfter(today) || end.isAfter(today))) { showDialog( - context: context, + context: context, builder: (context) => AlertDialog( title: const Text('Invalid Selection'), - content: const Text('You cannot select dates in the future. Please select valid dates.'), + content: const Text( + 'You cannot select dates in the future. Please select valid dates.'), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); - }, + }, child: const Text('OK'), ), ], ), ); - } + } // Also check if date range is valid (max 7 days) else if (start != null && end != null && !_isDateRangeValid(start, end)) { showDialog( - context: context, + context: context, builder: (context) => AlertDialog( title: const Text('Invalid Selection'), - content: const Text('Please select a date range of 7 days or less. The average period typically lasts between 3 to 7 days.'), + content: const Text( + 'Please select a date range of 7 days or less. The average period typically lasts between 3 to 7 days.'), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); - }, + }, child: const Text('OK'), ), ], ), ); - } - else { + } else { setState(() { _startDate = start; _endDate = end; @@ -167,57 +170,6 @@ class _LogPeriodScreenState extends ConsumerState { } } - //Function to handle adding log entries in list Database - void addCycle(DateTime start, [DateTime? end]) { - // If end date is not provided, set it to the start date - end ??= start; - - // final DateTime now = DateTime.now(); - // if (isSameDay(start, now) || isSameDay(end, now)) { - // end = start.add( Duration(days: averagePeriods - 1)); - // } - - //Handling cases where a user might log an already logged date in their previous cycle, hence warning them using a snackbar - for (Cycle cycle in cycles) { - if (_datesOverlap(cycle.periodStart, cycle.periodEnd, start, end)) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text( - 'The selected period overlaps with an existing cycle. Please choose different dates.'), - ), - ); - return; // Exit the function without adding the cycle - } - } - - // If no overlap, add a new cycle - final Cycle newCycle = predictCycle(start, end); - - //using riverpod to add the cycle to the state - ref.read(cyclesProvider.notifier).addCycle(newCycle); - - cycles.add(newCycle); - - //update cycle lengths after adding the new cycle - updateCycleLengths(cycles); - //_updateEventsForCycle(newCycle); - } - - - // void _updateEventsForCycle(Cycle cycle) { - // // Remove old events for this cycle from the events map - // events.remove(cycle.cycleId); - - // // Generate and add new events for the updated cycle - // final newEvents = EventUtils.generateEvents([cycle]); - // events[cycle.cycleId] = newEvents[cycle.cycleId]!; - - // // Update the flattened events map for display - // setState(() { - // _flatEvents = _flattenEvents(events); - // }); - // } - // Function to check if two date ranges overlap bool _datesOverlap( DateTime start1, DateTime end1, DateTime start2, DateTime end2) { @@ -227,95 +179,138 @@ class _LogPeriodScreenState extends ConsumerState { @override Widget build(BuildContext context) { - //events = EventUtils.generateEvents(cycles); + final cycleAsyncValue = ref.watch(cyclesProvider); final theme = Theme.of(context); + return Scaffold( - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CustomAppBar( - title: "Enter Periods 📅", - color: Constants.periodPlanner.withOpacity(1.0), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - _isNewUser - ? "Please enter your previous period start and end date." - : "Please enter when your Periods have started", - style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold), - ), - ), - TableCalendar( - focusedDay: _focusedDay, - firstDay: DateTime(2021), - lastDay: DateTime(2100), - rangeStartDay: _startDate, - rangeEndDay: _endDate, - onRangeSelected: _isNewUser ? _onRangeSelected : null, - onDaySelected: _isNewUser ? null : _onDaySelected, - rangeSelectionMode: RangeSelectionMode.toggledOn, - calendarStyle: const CalendarStyle( - todayDecoration: BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, - ), - rangeStartDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, - ), - rangeEndDecoration: BoxDecoration( - color: Colors.pink, - shape: BoxShape.circle, + body: cycleAsyncValue.when( + data: (cycles) { + bool _isNewUser = cycles.isEmpty; + final cyclesId = cycles.keys.lastOrNull; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomAppBar( + title: "Enter Periods 📅", + color: Constants.periodPlanner.withOpacity(1.0), ), - rangeHighlightColor: Constants.periodPlanner, - selectedDecoration: BoxDecoration( - color: Constants.periodPlanner, - shape: BoxShape.circle, + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + _isNewUser + ? "Please enter your previous period start and end date." + : "Please enter when your Periods have started", + style: const TextStyle( + fontSize: 15, fontWeight: FontWeight.bold), + ), ), - ), - headerStyle: const HeaderStyle( - formatButtonVisible: false, - ), - ), - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, + TableCalendar( + focusedDay: _focusedDay, + firstDay: DateTime(2021), + lastDay: DateTime(2100), + rangeStartDay: _startDate, + rangeEndDay: _endDate, + onRangeSelected: _isNewUser ? _onRangeSelected : null, + onDaySelected: _isNewUser ? null : _onDaySelected, + rangeSelectionMode: RangeSelectionMode.toggledOn, + calendarStyle: const CalendarStyle( + todayDecoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + rangeStartDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, + ), + rangeEndDecoration: BoxDecoration( + color: Colors.pink, + shape: BoxShape.circle, ), - onPressed: () { - if (_startDate != null && !_startDate!.isAfter(today)) { - final endDate = _endDate ?? _startDate!.add(const Duration(days: 1)); // The else statement handles where a period only happens for a single day hence the end date will be same day as start date - addCycle(_startDate!, endDate); - printCycles(cycles); - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } - else if (_startDate!.isAfter(today)) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('You cannot select dates in the future. Please select valid dates.')), - ); - } - else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please select your Period start and end dates.')), - ); - } - }, - child: Text( - 'Apply', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, + rangeHighlightColor: Constants.periodPlanner, + selectedDecoration: BoxDecoration( + color: Constants.periodPlanner, + shape: BoxShape.circle, + ), + ), + headerStyle: const HeaderStyle( + formatButtonVisible: false, + ), + ), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + if (_startDate != null && !_startDate!.isAfter(today)) { + final endDate = _endDate ?? + _startDate!.add(const Duration( + days: + 1)); // The else statement handles where a period only happens for a single day hence the end date will be same day as start date + for (Cycle cycle in cycles.values) { + if (_datesOverlap(cycle.period_start, + cycle.period_end, _startDate!, endDate)) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'The selected period overlaps with an existing cycle. Please choose different dates.'), + ), + ); + return; // Exit the function without adding the cycle + } + } + + final newCycle = + predictCycle(_startDate!, endDate, cycle: cycles); + + //using riverpod to add the cycle to the server + ref + .read(cyclesProvider.notifier) + .postCycles(newCycle) + .then((_) { + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + }); + // printCycles(cycles); + } else if (_startDate!.isAfter(today)) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'You cannot select dates in the future. Please select valid dates.')), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'Please select your Period start and end dates.')), + ); + } + }, + child: Text( + 'Apply', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), ), ), ), ), - ), + ], + ); + }, + error: (error, stackTrace) => Center( + child: Text( + 'Failed to load cycles: $error', + style: const TextStyle(color: Colors.red), ), - ], + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), ), ); } diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index cb23cf5e..02e926f3 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -40,55 +40,55 @@ class _PeriodPlannerScreenState extends ConsumerState { late DateTime _ovulationDate; late DateTime _nextPeriodStart; late DateTime _nextPeriodEnd; - Map>> events = {}; + Map>> events = {}; @override void initState() { super.initState(); - // Initialize the state with data from the cycles provider - _updateFromCycles(); + // ref.read(cyclesProvider.notifier).fetchCycles(); _checkOverdueDialog(); } // Listen for state changes from cyclesProvider - void _updateFromCycles() { - final cycles = ref.read(cyclesProvider); + // void _updateFromCycles() { + // final cycles = ref.read(cyclesProvider) as Map; - if (cycles.isNotEmpty) { - Cycle latestCycle = cycles.last; - setState(() { - _periodStart = latestCycle.periodStart; - _periodEnd = latestCycle.periodEnd; - _ovulationDate = latestCycle.ovulation; - _nextPeriodStart = latestCycle.predictedPeriodStart; - _nextPeriodEnd = latestCycle.predictedPeriodEnd; - events = EventUtils.generateEvents(cycles); - }); - } - } + // if (cycles.isNotEmpty) { + // Cycle latestCycle = cycles.values.last; + // setState(() { + // _periodStart = latestCycle.period_start; + // _periodEnd = latestCycle.period_end; + // _ovulationDate = latestCycle.ovulation; + // _nextPeriodStart = latestCycle.predicted_period_start; + // _nextPeriodEnd = latestCycle.predicted_period_end; + // events = EventUtils.generateEvents(cycles); + // }); + // } + // } //Method for updating events - void _updateEvents() { - setState(() { - events = EventUtils.generateEvents(cycles); - // print("Updated Events: $events"); - // print("Updated Events"); - // events.forEach((cycleId, dateMap) { - // dateMap.forEach((date, events) { - // print("Cycle ID $cycleId ,Date: $date, Events: $events"); - // }); - // }); - //print("Updated Events: $events"); - //print("-------------"); - }); - } + // void _updateEvents() { + // final cycles = ref.read(cyclesProvider) as Map; + // setState(() { + // events = EventUtils.generateEvents(cycles); + // // print("Updated Events: $events"); + // // print("Updated Events"); + // // events.forEach((cycleId, dateMap) { + // // dateMap.forEach((date, events) { + // // print("Cycle ID $cycleId ,Date: $date, Events: $events"); + // // }); + // // }); + // //print("Updated Events: $events"); + // //print("-------------"); + // }); + // } Future _checkOverdueDialog() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); String? lastDialogDateStr = prefs.getString('lastDialogDate'); DateTime? lastDialogDate = lastDialogDateStr != null ? DateTime.parse(lastDialogDateStr) : null; - + if (lastDialogDate == null || !isSameDay(_currentDate, lastDialogDate)) { //If the dialog hasn't been shown today and the user's periods are overdue bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); @@ -233,110 +233,9 @@ class _PeriodPlannerScreenState extends ConsumerState { ); } - //Method for auto adding the latest predicted period day as the period start - // void _autoAddPeriodDay() { - // if (isSameDay(_currentDate, _nextPeriodStart) || _currentDate.isBefore(_nextPeriodEnd)) { - // setState(() { - // _periodStart = _nextPeriodStart; - // _periodEnd = _nextPeriodEnd; - // final Cycle newCycle = predictCycle(_periodStart, _periodEnd); - // cycles.add(newCycle); - // }); - // } - // } - @override Widget build(BuildContext context) { - final cycles = ref.watch(cyclesProvider); - - // If cycles are updated, recalculate the events and UI elements - if (cycles.isNotEmpty) { - _updateFromCycles(); - } - int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; - int daysToNextPeriod = _nextPeriodStart.difference(_currentDate).inDays; - int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; - //int predictedDays = _nextPeriodEnd.difference(_nextPeriodStart).inDays; - - bool isInPeriod = (isSameDay(_currentDate, _periodStart) || - _currentDate.isAfter(_periodStart)) && - _currentDate.isBefore(_periodEnd); - bool veryCloseToPeriod = - _currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod == 0; - bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && - !isInPeriod && - daysToOvulation >= 1; - bool veryCloseToOvulation = - _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; - bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || - (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); - bool afterOvulation = _currentDate.isAfter(_ovulationDate) && - (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod > 0); - bool duringPredictedPeriodRange = _currentDate.isAfter(_nextPeriodStart) && - _currentDate.isBefore(_nextPeriodEnd) || - isSameDay(_currentDate, _nextPeriodStart) || - isSameDay(_currentDate, _nextPeriodEnd); - bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); - - bool inPeriods = isInPeriod; - - // Determine progress value and messages based on the current date - double progressValue = 0.0; - String message = ''; - String buttonText = ''; - String title = ''; - String chances = ''; - - if (isInPeriod) { - progressValue = 0.2; - title = 'Period'; - message = 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; - buttonText = 'Period End'; - chances = 'Low'; - } else if (isCloseToOvulation) { - progressValue = 0.3; - title = 'Ovulation in'; - message = '$daysToOvulation day${daysToOvulation > 1 ? 's' : ''}'; - buttonText = 'Period Start'; - chances = 'High'; - } else if (veryCloseToOvulation) { - progressValue = 0.4; - title = 'Ovulation is'; - message = 'Tomorrow'; - buttonText = 'Period Start'; - chances = 'High'; - } else if (isOvulation) { - progressValue = 0.5; - title = 'Ovulation is'; - message = 'Today'; - buttonText = 'Period Start'; - chances = 'High'; - } else if (afterOvulation) { - progressValue = 0.7; - title = 'Next Period in'; - message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's' : ''}'; - buttonText = 'Period Start'; - chances = 'Low'; - } else if (veryCloseToPeriod) { - progressValue = 0.7; - title = 'Next Period is'; - message = 'Tomorrow'; - buttonText = 'Period Start'; - chances = 'Low'; - } else if (duringPredictedPeriodRange) { - progressValue = 1.0; - title = 'Periods May happen'; - message = 'Today'; - buttonText = 'Period Start'; - chances = 'Low'; - } else if (isDangerZone) { - progressValue = 1.0; - title = 'Periods Overdue by'; - message = '$overdueDays Day${overdueDays > 1 ? 's' : ''}'; - buttonText = 'Period Start'; - chances = 'High'; - } - + final cycleState = ref.watch(cyclesProvider); final theme = Theme.of(context); //Debug prints to trace the logic @@ -348,307 +247,438 @@ class _PeriodPlannerScreenState extends ConsumerState { // debugPrint('Is In Period: $isInPeriod'); // debugPrint('Is close to Ovulation: $isCloseToOvulation'); return Scaffold( - body: Column( - children: [ - const CustomAppBar( - title: "My Flow Tracker 🌺", - color: Constants.periodPlanner, - ), - //const SizedBox(height: Constants.SPACING), - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Card( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - const Text( - "Your Chances of Getting Pregnant are:", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - ), - // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), - ), - Text( - chances, - style: TextStyle( - fontSize: 34, - color: - chances == 'High' ? Colors.red : Colors.blue, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - )), - const SizedBox(height: Constants.SPACING), - SizedBox( - height: 150, - child: CustomCalendar( - key: ValueKey(events), - initialFormat: CalendarFormat.week, - events: events, - headerButton: true, - inPeriods: inPeriods, - ), - ), - const SizedBox(height: Constants.SPACING), - Stack( - alignment: Alignment.center, + body: cycleState.when( + data: (cycles) { + // If cycles are updated, recalculate the events and UI elements + if (cycles.isNotEmpty) { + Cycle latestCycle = cycles.values.last; + _periodStart = latestCycle.period_start; + _periodEnd = latestCycle.period_end; + _ovulationDate = latestCycle.ovulation; + _nextPeriodStart = latestCycle.predicted_period_start; + _nextPeriodEnd = latestCycle.predicted_period_end; + events = EventUtils.generateEvents(cycles); + } + int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; + int daysToNextPeriod = + _nextPeriodStart.difference(_currentDate).inDays; + int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; + //int predictedDays = _nextPeriodEnd.difference(_nextPeriodStart).inDays; + + bool isInPeriod = (isSameDay(_currentDate, _periodStart) || + _currentDate.isAfter(_periodStart)) && + _currentDate.isBefore(_periodEnd); + bool veryCloseToPeriod = + _currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod == 0; + bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && + !isInPeriod && + daysToOvulation >= 1; + bool veryCloseToOvulation = + _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; + bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || + (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); + bool afterOvulation = _currentDate.isAfter(_ovulationDate) && + (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod > 0); + bool duringPredictedPeriodRange = + _currentDate.isAfter(_nextPeriodStart) && + _currentDate.isBefore(_nextPeriodEnd) || + isSameDay(_currentDate, _nextPeriodStart) || + isSameDay(_currentDate, _nextPeriodEnd); + bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); + + bool inPeriods = isInPeriod; + + // Determine progress value and messages based on the current date + double progressValue = 0.0; + String message = ''; + String buttonText = ''; + String title = ''; + String chances = ''; + + if (isInPeriod) { + progressValue = 0.2; + title = 'Period'; + message = + 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; + buttonText = 'Period End'; + chances = 'Low'; + } else if (isCloseToOvulation) { + progressValue = 0.3; + title = 'Ovulation in'; + message = '$daysToOvulation day${daysToOvulation > 1 ? 's' : ''}'; + buttonText = 'Period Start'; + chances = 'High'; + } else if (veryCloseToOvulation) { + progressValue = 0.4; + title = 'Ovulation is'; + message = 'Tomorrow'; + buttonText = 'Period Start'; + chances = 'High'; + } else if (isOvulation) { + progressValue = 0.5; + title = 'Ovulation is'; + message = 'Today'; + buttonText = 'Period Start'; + chances = 'High'; + } else if (afterOvulation) { + progressValue = 0.7; + title = 'Next Period in'; + message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's' : ''}'; + buttonText = 'Period Start'; + chances = 'Low'; + } else if (veryCloseToPeriod) { + progressValue = 0.7; + title = 'Next Period is'; + message = 'Tomorrow'; + buttonText = 'Period Start'; + chances = 'Low'; + } else if (duringPredictedPeriodRange) { + progressValue = 1.0; + title = 'Periods May happen'; + message = 'Today'; + buttonText = 'Period Start'; + chances = 'Low'; + } else if (isDangerZone) { + progressValue = 1.0; + title = 'Periods Overdue by'; + message = '$overdueDays Day${overdueDays > 1 ? 's' : ''}'; + buttonText = 'Period Start'; + chances = 'High'; + } + return Column( + children: [ + const CustomAppBar( + title: "My Flow Tracker 🌺", + color: Constants.periodPlanner, + ), + //const SizedBox(height: Constants.SPACING), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( children: [ + Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const Text( + "Your Chances of Getting Pregnant are:", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + ), + Text( + chances, + style: TextStyle( + fontSize: 34, + color: chances == 'High' + ? Colors.red + : Colors.blue, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + )), + const SizedBox(height: Constants.SPACING), SizedBox( - width: 300, // Adjust the width as needed - height: 300, // Adjust the height as needed - child: CircularProgressIndicator( - value: progressValue, - strokeWidth: 20, - backgroundColor: Colors.grey, - valueColor: AlwaysStoppedAnimation( - isDangerZone - ? Colors.red - : Constants.periodPlanner, - ), + height: 150, + child: CustomCalendar( + key: ValueKey(events), + initialFormat: CalendarFormat.week, + events: events, + headerButton: true, + inPeriods: inPeriods, ), ), - Column( - mainAxisAlignment: MainAxisAlignment.center, + const SizedBox(height: Constants.SPACING), + Stack( + alignment: Alignment.center, children: [ - if (isDangerZone) - const SizedBox(height: Constants.SPACING + 20), - Text( - title, - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: Constants.SPACING), - Text( - message, - style: TextStyle( - fontSize: 38, - color: isDangerZone + SizedBox( + width: 300, // Adjust the width as needed + height: 300, // Adjust the height as needed + child: CircularProgressIndicator( + value: progressValue, + strokeWidth: 20, + backgroundColor: Colors.grey, + valueColor: AlwaysStoppedAnimation( + isDangerZone ? Colors.red : Constants.periodPlanner, - fontWeight: FontWeight.bold), + ), + ), ), - const SizedBox(height: Constants.SPACING + 10), - if (buttonText.isNotEmpty) - ElevatedButton( - onPressed: () { - //Logging Start of new period - if (buttonText == 'Period Start') { - context.goNamed( - RouteNames.PERIOD_PLANNER_LOG_PERIODS); - } - //Logging end of new period - else { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: const Text( - 'Confirming End of Period'), - content: const Text( - 'Are you sure you want to log the end of your period?'), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.of(context) - .pop(); // Close the dialog - }, - ), - TextButton( - child: const Text('Confirm'), - onPressed: () { - setState(() { - // Log the period start here - isCloseToOvulation = true; - isInPeriod = false; - _currentDate = DateTime.now(); - _periodEnd = _currentDate; + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (isDangerZone) + const SizedBox( + height: Constants.SPACING + 20), + Text( + title, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: Constants.SPACING), + Text( + message, + style: TextStyle( + fontSize: 38, + color: isDangerZone + ? Colors.red + : Constants.periodPlanner, + fontWeight: FontWeight.bold), + ), + const SizedBox(height: Constants.SPACING + 10), + if (buttonText.isNotEmpty) + ElevatedButton( + onPressed: () { + //Logging Start of new period + if (buttonText == 'Period Start') { + ref + .read(cyclesProvider.notifier) + .fetchCycles() + .then((_) { + context.goNamed(RouteNames + .PERIOD_PLANNER_LOG_PERIODS); + }); + } + //Logging end of new period + else { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text( + 'Confirming End of Period'), + content: const Text( + 'Are you sure you want to log the end of your period?'), + actions: [ + TextButton( + child: const Text('Cancel'), + onPressed: () { + Navigator.of(context) + .pop(); // Close the dialog + }, + ), + TextButton( + child: const Text('Confirm'), + onPressed: () { + setState(() { + // Log the period start here + isCloseToOvulation = true; + isInPeriod = false; + _currentDate = + DateTime.now(); + _periodEnd = _currentDate; + }); + //printCycles(cycles); + // Debug print to check the state update + // debugPrint("After User has logged end of Period"); + // debugPrint('Period Start after update: $_periodStart'); + // debugPrint('Period End after update: $_periodEnd'); + // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); + // debugPrint('Current Date after update: $_currentDate'); + // debugPrint('Is In Period after update: $isInPeriod'); + // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); + // debugPrint("--------"); + final cycleId = + cycles.keys.last; + + final updatedCycle = + predictCycle( + _periodStart, + _periodEnd, + cycleId: cycleId, + cycle: cycles, + ); + periodConfirmedMap[ + cycleId] = true; + + updateCycleLengths(cycles); - //updating period end in my List for now - for (var cycle in cycles) { - if (cycle.periodStart == - _periodStart) { - cycle.periodEnd = - _periodEnd; + final sortedCycleKeys = cycles + .keys + .toList() + ..sort((a, b) => cycles[ + a]! + .period_start + .compareTo(cycles[b]! + .period_start)); - // Setting the external period confirmation status to true - periodConfirmedMap[ - cycle.cycleId] = true; + final secondLastCycleId = + sortedCycleKeys[ + sortedCycleKeys + .length - + 2]; - //Recalculating period length - cycle.periodLength = - _periodEnd - .difference( - _periodStart) - .inDays + - 1; - } - } + // final secondLastCycle = + // cycles[ + // secondLastCycleId]!; - _updateEvents(); - printCycles(cycles); + final secondLastPeriodStart = + cycles[secondLastCycleId]! + .period_start; + final secondLastPeriodEnd = + cycles[secondLastCycleId]! + .period_end; - // Debug print to check the state update - // debugPrint("After User has logged end of Period"); - // debugPrint('Period Start after update: $_periodStart'); - // debugPrint('Period End after update: $_periodEnd'); - // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - // debugPrint('Current Date after update: $_currentDate'); - // debugPrint('Is In Period after update: $isInPeriod'); - // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); - // debugPrint("--------"); - }); - //printCycles(cycles); - Navigator.of(context).pop(); - }, - ), - ], + final updateSecondLastCycle = predictCycle( + secondLastPeriodStart, + secondLastPeriodEnd, + cycleId: secondLastCycleId, + cycle: cycles, + ); + + ref + .read(cyclesProvider + .notifier) + .editCycle(cycleId, + updatedCycle) + .then((_) { + // Navigator.of(context) + // .pop(); + ref + .read(cyclesProvider + .notifier) + .editCycle( + secondLastCycleId, + updateSecondLastCycle) + .then((_) { + Navigator.of(context) + .pop(); + }); + }); + }, + ), + ], + ); + }, ); - }, - ); - } - }, - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: isDangerZone - ? Colors.red - : Constants.periodPlanner, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), + } + }, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: isDangerZone + ? Colors.red + : Constants.periodPlanner, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), + ), + child: Text( + buttonText, + style: const TextStyle(fontSize: 18), + ), ), - padding: const EdgeInsets.symmetric( - horizontal: 20, vertical: 10), - ), - child: Text( - buttonText, - style: const TextStyle(fontSize: 18), - ), - ), - const SizedBox(height: 10), - //where to put the icon button - if (isDangerZone) - IconButton( - onPressed: () { - _overdueDialog(); - }, - icon: const Icon( - Icons.info_sharp, - color: Colors.blue, - size: 40, - ), - ), + const SizedBox(height: 10), + //where to put the icon button + if (isDangerZone) + IconButton( + onPressed: () { + _overdueDialog(); + }, + icon: const Icon( + Icons.info_sharp, + color: Colors.blue, + size: 40, + ), + ), + ], + ), ], ), + //const SizedBox(height: 20,), + // const Text( + // "Please give your Daily Insights:", + // style: TextStyle( + // fontWeight: FontWeight.bold, + // fontSize: 15.0, + // color: Constants.periodPlanner, + // ), + // ), + // CarouselSlider( + // options: CarouselOptions( + // height: 150, + // enlargeCenterPage: true, + // enableInfiniteScroll: false, + // initialPage: 0, + // autoPlay: false, + // ), + // items: [ + // CarouselCard( + // svgPath: "assets/images/symptoms.svg", + // title: "Symptoms", + // destination: LoggerWidget( + // heading: "Log Symptoms", + // items: LogItems.getSymptoms(), + // ) + // ), + // CarouselCard( + // svgPath: "assets/images/discharge1.svg", + // title: "Discharge", + // destination: LoggerWidget( + // heading: "Log Discharge", + // items: LogItems.getDischarge(), + // ) + // ), + // CarouselCard( + // svgPath: "assets/images/moods1.svg", + // title: "Mood", + // destination: LoggerWidget( + // heading: "How are you feeling?", + // items: LogItems.getMoods(), + // ), + // ), + // ], + // ), ], ), - // const SizedBox(height: Constants.SPACING), - // Card( - // child: Padding( - // padding: const EdgeInsets.all(16.0), - // child: Column( - // children: [ - // const Text( - // "Your Chances of Getting Pregnant are:", - // style: TextStyle( - // fontSize: 14, - // fontWeight: FontWeight.bold, - // ), - // // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), - // ), - // Text( - // chances, - // style: const TextStyle( - // fontSize: 34, - // color: Constants.periodPlanner, - // fontWeight: FontWeight.bold, - // ), - // ), - // ], - // ), - // ) - // ), - - //const SizedBox(height: 20,), - // const Text( - // "Please give your Daily Insights:", - // style: TextStyle( - // fontWeight: FontWeight.bold, - // fontSize: 15.0, - // color: Constants.periodPlanner, - // ), - // ), - // CarouselSlider( - // options: CarouselOptions( - // height: 150, - // enlargeCenterPage: true, - // enableInfiniteScroll: false, - // initialPage: 0, - // autoPlay: false, - // ), - // items: [ - // CarouselCard( - // svgPath: "assets/images/symptoms.svg", - // title: "Symptoms", - // destination: LoggerWidget( - // heading: "Log Symptoms", - // items: LogItems.getSymptoms(), - // ) - // ), - // CarouselCard( - // svgPath: "assets/images/discharge1.svg", - // title: "Discharge", - // destination: LoggerWidget( - // heading: "Log Discharge", - // items: LogItems.getDischarge(), - // ) - // ), - // CarouselCard( - // svgPath: "assets/images/moods1.svg", - // title: "Mood", - // destination: LoggerWidget( - // heading: "How are you feeling?", - // items: LogItems.getMoods(), - // ), - // ), - // ], - // ), - ], + ), ), ), - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, - ), - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); - }, - child: Text( - 'Periods History', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); + }, + child: Text( + 'Periods History', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), ), ), ), - ), + ], + ); + }, + error: (error, stackTrace) => Center( + child: Text( + 'Failed to load cycles: $error', + style: const TextStyle(color: Colors.red), ), - ], + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), ), ); } diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 55d87b31..4134261e 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -9,8 +9,8 @@ import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -//Map containing period cycles in which the user has confirmed period end date -Map periodConfirmedMap = {}; +// Map containing period cycles in which the user has confirmed period end date +Map periodConfirmedMap = {}; class PeriodsHistory extends ConsumerStatefulWidget { const PeriodsHistory({super.key}); @@ -26,233 +26,257 @@ class _PeriodsHistoryState extends ConsumerState { } // Function to group cycles by year - Map> groupCyclesByYear(List cycles) { - final Map> groupedCycles = {}; - for (var cycle in cycles) { - final year = cycle.periodStart.year; + Map>> groupCyclesByYear( + Map cycles) { + final Map>> groupedCycles = {}; + + for (var cycleEntry in cycles.entries) { + final year = cycleEntry.value.period_start.year; if (!groupedCycles.containsKey(year)) { groupedCycles[year] = []; } - groupedCycles[year]!.add(cycle); + groupedCycles[year]!.add(cycleEntry); } return groupedCycles; } @override Widget build(BuildContext context) { - final cycles = ref.watch(cyclesProvider); + final cyclesAsyncValue = ref.watch(cyclesProvider); - final averagePeriod = calculateAveragePeriodLength(cycles); - final averageCycles = calculateAverageCycleLength(cycles); - // Group cycles by year and reverse the list to show the latest first - final groupedCycles = groupCyclesByYear(cycles); - final sortedYears = groupedCycles.keys.toList() - ..sort((a, b) => b.compareTo(a)); + return cyclesAsyncValue.when( + data: (cycles) { + final averagePeriod = calculateAveragePeriodLength(cycles); + final averageCycles = calculateAverageCycleLength(cycles); + // Group cycles by year and reverse the list to show the latest first + final groupedCycles = groupCyclesByYear(cycles); + final sortedYears = groupedCycles.keys.toList() + ..sort((a, b) => b.compareTo(a)); - return Scaffold( - body: ListView( - children: [ - const CustomAppBar( - title: "My Period History 🌼", - color: Constants.periodPlanner, - ), - const SizedBox(height: 10), - SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - // The first Card showing both Average period and cycle lengths - Card( - elevation: 4.0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - "My Cycles", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + return Scaffold( + body: ListView( + children: [ + const CustomAppBar( + title: "My Period History 🌼", + color: Constants.periodPlanner, + ), + const SizedBox(height: 10), + SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + // The first Card showing both Average period and cycle lengths + Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - // Card showing Average Period days - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - const Text( - "Average Period", - style: TextStyle( - fontSize: 18.0, - fontWeight: FontWeight.w500, - ), - ), - const SizedBox(height: 8.0), - Text( - "$averagePeriod days", - style: const TextStyle( - fontSize: 30.0, - fontWeight: FontWeight.bold, - color: Colors.pink, - ), - ), - ], - ), - ), + const Text( + "My Cycles", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, ), ), - Expanded( - // Card Showing Average Cycle days - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - const Text( - 'Average Cycle', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.w500, - ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + // Card showing Average Period days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + "Average Period", + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 8.0), + Text( + "$averagePeriod days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.pink, + ), + ), + ], ), - const SizedBox(height: 8.0), - Text( - "$averageCycles days", - style: const TextStyle( - fontSize: 30.0, - fontWeight: FontWeight.bold, - color: Colors.blue, - ), + ), + ), + ), + Expanded( + // Card Showing Average Cycle days + child: Card( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + const Text( + 'Average Cycle', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 8.0), + Text( + "$averageCycles days", + style: const TextStyle( + fontSize: 30.0, + fontWeight: FontWeight.bold, + color: Colors.blue, + ), + ), + ], ), - ], + ), ), ), - ), + ], ), + const SizedBox(height: 10), ], ), - const SizedBox(height: 10), - ], + ), ), - ), - ), - const SizedBox(height: 20), - // Card Showing period history - const Text( - "History", - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: Colors.pink, - ), - ), - ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: sortedYears.length, - itemBuilder: (context, index) { - final year = sortedYears[index]; - final cyclesInYear = groupedCycles[year]!; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: - const EdgeInsets.symmetric(horizontal: 8.0), - child: Text( - "$year", - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, + const SizedBox(height: 20), + // Card Showing period history + const Text( + "History", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: Colors.pink, + ), + ), + ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: sortedYears.length, + itemBuilder: (context, index) { + final year = sortedYears[index]; + final cyclesInYear = groupedCycles[year]!; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + "$year", + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), ), - ), - ), - const SizedBox(height: 10), - ...cyclesInYear.reversed.map((cycle) { - // Only display cycles that are either confirmed or whose end date has passed - final bool isPeriodConfirmed = - periodConfirmedMap[cycle.cycleId] ?? false; - final bool hasPeriodEnded = - DateTime.now().isAfter(cycle.periodEnd); + const SizedBox(height: 10), + ...cyclesInYear.reversed.map((cycleEntry) { + final cycleId = cycleEntry.key; + final cycle = cycleEntry.value; - if (isPeriodConfirmed || hasPeriodEnded) { - final start = formatDate(cycle.periodStart); - final end = formatDate(cycle.periodEnd); - final cycleDays = cycle.cycleLength; + // Only display cycles that are either confirmed or whose end date has passed + final hasPeriodEnded = + DateTime.now().isAfter(cycle.period_end); + final isPeriodConfirmed = + periodConfirmedMap[cycleId] ?? false; - // Check if the current cycle is the last entry - bool isLastCycle = cycle == cyclesInYear.last; + if (isPeriodConfirmed || hasPeriodEnded) { + final start = formatDate(cycle.period_start); + final end = formatDate(cycle.period_end); + final cycleDays = cycle.cycle_length; - return Card( - elevation: 4.0, - margin: - const EdgeInsets.symmetric(vertical: 8.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0), - ), - child: ListTile( - title: Text( - "$start - $end", - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ), - subtitle: Text( - isLastCycle - ? "Estimated Cycle Length: $cycleDays days" - : "Length of cycle: $cycleDays days", - style: const TextStyle( - fontSize: 16.0, + // Check if the current cycle is the last entry + bool isLastCycle = + cycle == cyclesInYear.last.value; + + return Card( + elevation: 4.0, + margin: const EdgeInsets.symmetric( + vertical: 8.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), ), - ), - trailing: IconButton( - onPressed: () { - context.goNamed( - RouteNames.PERIOD_PLANNER_EDIT_PERIODS, - extra: { - 'startDate': cycle.periodStart, - 'endDate': cycle.periodEnd, - 'id': cycle.cycleId, + child: ListTile( + title: Text( + "$start - $end", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text( + isLastCycle + ? "Estimated Cycle Length: $cycleDays days" + : "Length of cycle: $cycleDays days", + style: const TextStyle( + fontSize: 16.0, + ), + ), + trailing: IconButton( + onPressed: () { + context.goNamed( + RouteNames + .PERIOD_PLANNER_EDIT_PERIODS, + extra: { + 'startDate': cycle.period_start, + 'endDate': cycle.period_end, + 'id': cycleId, + }, + ); }, - ); - }, - icon: const Icon(Icons.arrow_forward_ios), - ), - ), - ); - } else { - // Skip displaying cycles that haven't been confirmed or whose end date hasn't passed - return const SizedBox.shrink(); - } - }).toList(), - ], - ); - }, + icon: + const Icon(Icons.arrow_forward_ios), + ), + ), + ); + } else { + // Skip displaying cycles that haven't been confirmed or whose end date hasn't passed + return const SizedBox.shrink(); + } + }).toList(), + ], + ); + }, + ), + ], ), - ], + ), ), - ), + ], ), - ], + ); + }, + error: (error, stackTrace) => Center( + child: Text( + 'Failed to load cycles: $error', + style: const TextStyle(color: Colors.red), + ), + ), + loading: () => const Center( + child: CircularProgressIndicator(), ), ); } diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index f6e271b1..00fafac0 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -1,28 +1,41 @@ +import 'dart:ffi'; + import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/eventsMaker.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/modalContent.dart'; import 'package:table_calendar/table_calendar.dart'; -import 'package:uuid/uuid.dart'; //Function to update Cycle days -void updateCycleLengths(List cycles) { +void updateCycleLengths(Map cycleMap) { + final cycles = cycleMap.values.toList(); + + final updatedCycleMap = {}; + // Start from the second last cycle because the last one does not have a successor yet for (int i = 0; i < cycles.length - 1; i++) { - int cycleLength = cycles[i + 1].periodStart.difference(cycles[i].periodStart).inDays; - cycles[i].cycleLength = cycleLength; + int cycleLength = + cycles[i + 1].period_start.difference(cycles[i].period_start).inDays; + // cycles[i].cycle_length = cycleLength; + final updatedCycle = cycles[i].copyWith(cycle_length: cycleLength); + updatedCycleMap[i] = updatedCycle; } // The last cycle in the list should still use the average cycle length if (cycles.isNotEmpty) { - cycles.last.cycleLength = calculateAverageCycleLength(cycles); + // cycles.last.cycle_length = calculateAverageCycleLength(cycleMap); + final lastCycle = cycles.last + .copyWith(cycle_length: calculateAverageCycleLength(cycleMap)); + updatedCycleMap[cycles.length - 1] = lastCycle; } } - -// Function to calculate Average Cycle days -int calculateAverageCycleLength(List cycles) { +// // Function to calculate Average Cycle days +int calculateAverageCycleLength(Map cyclesMap) { + final cycles = cyclesMap.values.toList(); if (cycles.length < 2) { debugPrint( "Not enough cycles to calculate an average, defaulting to 28 days."); @@ -32,7 +45,7 @@ int calculateAverageCycleLength(List cycles) { int totalLength = 0; for (int i = 1; i < cycles.length; i++) { int cycleLength = - cycles[i].periodStart.difference(cycles[i - 1].periodStart).inDays; + cycles[i].period_start.difference(cycles[i - 1].period_start).inDays; debugPrint("Cycle Length for cycle $i: $cycleLength"); // Cap to a minimum cycle length of 21 days @@ -58,21 +71,22 @@ int calculateAverageCycleLength(List cycles) { return averageCycle; } -//Function for calculating Average Period days -int calculateAveragePeriodLength(List cycles) { - if (cycles.isEmpty) return 5; // Default to 5 days if there are no cycles +// //Function for calculating Average Period days +int calculateAveragePeriodLength(Map cycleMap) { + final cycleList = cycleMap.values.toList(); + if (cycleList.isEmpty) return 5; // Default to 5 days if there are no cycles int totalPeriodLength = 0; - for (Cycle cycle in cycles) { - debugPrint("Period Length : ${cycle.periodLength}"); - totalPeriodLength += cycle.periodLength; + for (Cycle cycle in cycleList) { + debugPrint("Period Length : ${cycle.period_length}"); + totalPeriodLength += cycle.period_length; } - int averagePeriodLength = (totalPeriodLength / cycles.length).round(); + int averagePeriodLength = (totalPeriodLength / cycleList.length).round(); if (averagePeriodLength < 3) { return 4; } debugPrint("Total Period Length: $totalPeriodLength"); - debugPrint("Number of Cycles: ${cycles.length}"); + debugPrint("Number of Cycles: ${cycleList.length}"); debugPrint("Average Period Length: $averagePeriodLength"); return averagePeriodLength; } @@ -80,18 +94,19 @@ int calculateAveragePeriodLength(List cycles) { // DateTime normalizeToMidnight(DateTime dateTime) { // return DateTime(dateTime.year, dateTime.month, dateTime.day); // } + //Algorithm for calculating Next Period Days, Ovulation and Fertile Days -Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {String? cycleId}) { - var uuid = const Uuid(); - // String cycleId = uuid.v4(); //Generating a unique id +Cycle predictCycle(DateTime periodStart, DateTime periodEnd, + {int? cycleId, required Map cycle}) { + final cycleList = cycle.values.toList(); - int index = cycles.indexWhere((cycle) => cycle.periodStart == periodStart); + int index = cycleId ?? cycleList.length; // Calculate average cycle length from previous cycles - int averageCycleLength = calculateAverageCycleLength(cycles); + int averageCycleLength = calculateAverageCycleLength(cycle); // Calculate average period length from the period Start to the Period End - int averagePeriodLength = calculateAveragePeriodLength(cycles); + int averagePeriodLength = calculateAveragePeriodLength(cycle); DateTime predictedPeriodStart = periodStart.add(Duration(days: averageCycleLength - 1)); @@ -105,42 +120,48 @@ Cycle predictCycle(DateTime periodStart, DateTime periodEnd, {String? cycleId}) DateTime fertileStart = ovulation.subtract(const Duration(days: 5)); DateTime fertileEnd = ovulation.subtract(const Duration(days: 1)); - //Calculating cycle Length + //Calculating cycle Length // int cycleLength = (index > 0) // ? periodStart.difference(cycles[index - 1].periodStart).inDays // : averageCycleLength; + int cycleLength; - if (index > 0 && index < cycles.length - 1) { - // If the current cycle has a succeeding cycle, calculate based on difference between two cycles - cycleLength = periodStart.difference(cycles[index - 1].periodStart).inDays; - } else if (index == cycles.length - 1) { - // If it's the last cycle (no succeeding cycle), use the average cycle length as a placeholder + if (cycleList.isEmpty) { cycleLength = averageCycleLength; } else { - // For the very first cycle or other fallback cases, use average cycle length - cycleLength = averageCycleLength; + if (index > 0 && index < cycleList.length - 1) { + // If the current cycle has a succeeding cycle, calculate based on difference between two cycles + cycleLength = + periodStart.difference(cycleList[index - 1].period_start).inDays; + } else if (index == cycleList.length - 1) { + // If it's the last cyclStringe (no succeeding cycle), use the average cycle length as a placeholder + cycleLength = averageCycleLength; + } else { + // For the very first cycle or other fallback cases, use average cycle length + cycleLength = averageCycleLength; + } } - + //Calculating period Length of each cycle int periodLength = periodEnd.difference(periodStart).inDays + 1; return Cycle( - cycleId: cycleId ?? uuid.v4(), - periodStart: periodStart, - periodEnd: periodEnd, - fertileStart: fertileStart, - fertileEnd: fertileEnd, + // cycleId: cycleId ?? uuid.v4(), + period_start: periodStart, + period_end: periodEnd, + fertile_start: fertileStart, + fertile_end: fertileEnd, ovulation: ovulation, - predictedPeriodStart: predictedPeriodStart, - predictedPeriodEnd: predictedPeriodEnd, - cycleLength: cycleLength, - periodLength: periodLength, + predicted_period_start: predictedPeriodStart, + predicted_period_end: predictedPeriodEnd, + cycle_length: cycleLength, + period_length: periodLength, ); } -class CustomCalendar extends StatefulWidget { +class CustomCalendar extends ConsumerStatefulWidget { final CalendarFormat initialFormat; - final Map>> events; + final Map>> events; final bool headerButton; final bool? inPeriods; @@ -156,7 +177,7 @@ class CustomCalendar extends StatefulWidget { _CustomCalendarState createState() => _CustomCalendarState(); } -class _CustomCalendarState extends State { +class _CustomCalendarState extends ConsumerState { late CalendarFormat _calendarFormat; late DateTime _focusedDay; late DateTime _firstDay; @@ -211,6 +232,7 @@ class _CustomCalendarState extends State { }); } + // debugPrint("Filtered Events: $filteredEvents"); return filteredEvents; } @@ -229,6 +251,7 @@ class _CustomCalendarState extends State { } } } + debugPrint("No matching events found."); return null; } @@ -237,7 +260,9 @@ class _CustomCalendarState extends State { */ DateTime _getFirstEventDate() { DateTime? firstEventDate = _getNextPredictedPeriodDate(); - return _calendarFormat == CalendarFormat.week ? firstEventDate ?? DateTime(2010): DateTime(2010); // Fallback to DateTime(2010) if null + return _calendarFormat == CalendarFormat.week + ? firstEventDate ?? DateTime(2010) + : DateTime(2010); // Fallback to DateTime(2010) if null } /*Getting the last date to be displayed on the calendar @@ -262,7 +287,9 @@ class _CustomCalendarState extends State { } } - return _calendarFormat == CalendarFormat.week ? lastEventDate ?? DateTime(2100): DateTime(2100); // Fallback to DateTime(2100) if null + return _calendarFormat == CalendarFormat.week + ? lastEventDate ?? DateTime(2100) + : DateTime(2100); // Fallback to DateTime(2100) if null } @override @@ -278,9 +305,14 @@ class _CustomCalendarState extends State { // }); // }, calendarFormat: _calendarFormat, + // eventLoader: (day) { + // return _filteredEvents[day] ?? []; + // }, eventLoader: (day) { - return _filteredEvents[day] ?? []; + DateTime normalizedDay = DateTime(day.year, day.month, day.day); + return _filteredEvents[normalizedDay] ?? []; }, + headerVisible: true, headerStyle: HeaderStyle( formatButtonVisible: widget.headerButton, @@ -290,7 +322,6 @@ class _CustomCalendarState extends State { headerPadding: const EdgeInsets.all(8.0), ), onFormatChanged: (format) { - // Show the modal when the format button is pressed showModalBottomSheet( context: context, builder: (context) => const ModalContent(), @@ -317,16 +348,17 @@ class _CustomCalendarState extends State { ), calendarBuilders: CalendarBuilders( markerBuilder: (context, date, events) { - //debugPrint("----From CustomCalendar-----"); - //print(events); + // debugPrint("----From CustomCalendar-----"); + print(events); if (events.isEmpty) { - //debugPrint('Error getting Events!! - List is empty for date: $date'); + // debugPrint('Error getting Events!! - List is empty for date: $date'); return null; } final eventList = events.cast(); // debugPrint("-----From CustomCalendar------"); - // debugPrint('Successfully cast events for date: $date, events: $eventList'); + // debugPrint( + // 'Successfully cast events for date: $date, events: $eventList'); return EventsMaker(date: date, events: eventList); }, diff --git a/lib/src/features/period_planner/presentation/widgets/modalContent.dart b/lib/src/features/period_planner/presentation/widgets/modalContent.dart index 0c1e2c9b..9b1ed891 100644 --- a/lib/src/features/period_planner/presentation/widgets/modalContent.dart +++ b/lib/src/features/period_planner/presentation/widgets/modalContent.dart @@ -1,61 +1,74 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/data/models/events.dart'; +import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/calendarKey.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; import 'package:nishauri/src/utils/constants.dart'; -class ModalContent extends StatefulWidget { +class ModalContent extends ConsumerStatefulWidget { const ModalContent({super.key}); @override - State createState() => _ModalContentState(); + ConsumerState createState() => _ModalContentState(); } -class _ModalContentState extends State { +class _ModalContentState extends ConsumerState { @override Widget build(BuildContext context) { final theme = Theme.of(context); - Map>> events = {}; - events = EventUtils.generateEvents(cycles); + final cycleAsyncValue = ref.watch(cyclesProvider); return SizedBox( //height: MediaQuery.of(context).size.height, height: 600, - child: SingleChildScrollView( - child: Column( - children: [ - CustomCalendar( - events: events - ), - const SizedBox(height: 20), - const Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.all(8.0), - child: Text( - "Key:", - style: TextStyle( - color: Constants.periodPlanner, - fontSize: 20, - fontWeight: FontWeight.bold, + child: cycleAsyncValue.when( + data: (cycles) { + Map>> events = EventUtils.generateEvents(cycles); + return SingleChildScrollView( + child: Column( + children: [ + CustomCalendar( + events: events, + ), + const SizedBox(height: 20), + const Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Text( + "Key:", + style: TextStyle( + color: Constants.periodPlanner, + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), ), - ), - ], - ), - const Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CalendarKey(color: Colors.red, label: 'Today'), - CalendarKey(color: Colors.pink, label: 'Period Days'), - CalendarKey(color: Colors.green, label: 'Fertile Days'), - CalendarKey(color: Colors.blue, label: 'Ovulation Day'), - CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), - ], - ), - ], + ], + ), + const Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CalendarKey(color: Colors.red, label: 'Today'), + CalendarKey(color: Colors.pink, label: 'Period Days'), + CalendarKey(color: Colors.green, label: 'Fertile Days'), + CalendarKey(color: Colors.blue, label: 'Ovulation Day'), + CalendarKey(color: Colors.orange, label: 'Predicted Next Period Days'), + ], + ), + ], + ), + ); + }, + loading: () => const Center(child: CircularProgressIndicator()), + error: (error, stackTrace) => Center( + child: Text( + 'Failed to load cycles: $error', + style: const TextStyle(color: Colors.red), + ), ), ), ); diff --git a/lib/src/features/period_planner/utils/event_utils.dart b/lib/src/features/period_planner/utils/event_utils.dart index 4fe5e40a..75e8e9fd 100644 --- a/lib/src/features/period_planner/utils/event_utils.dart +++ b/lib/src/features/period_planner/utils/event_utils.dart @@ -12,78 +12,81 @@ The Days that are within Period Days are give a title of Period Day and a color The rest happens for the other days. */ class EventUtils { - static Map>> generateEvents(List cycles) { - Map>> events= {}; - + static Map>> generateEvents( + Map cyclesMap) { + Map>> events = {}; + // debugPrint("-----Generating New Events From Event Utils-----"); - //debugPrint("-----Generating New Events From Event Utils-----"); + for (int cycleId in cyclesMap.keys) { + final cycle = cyclesMap[cycleId]; - for (Cycle cycle in cycles) { - String cycleId = cycle.cycleId; - if(!events.containsKey(cycleId)) { + if (cycle == null) continue; + + if (!events.containsKey(cycleId)) { events[cycleId] = {}; } Map> updatedEvents = events[cycleId]!; - + // Add period days - for (DateTime date = cycle.periodStart; - date.isBefore(cycle.periodEnd) || isSameDay(date, cycle.periodEnd); + + for (DateTime date = cycle.period_start; + date.isBefore(cycle.period_end) || + isSameDay(date, cycle.period_end); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, - (existingEvents) => existingEvents - ..add(Event( 'Period Day', Colors.pink)), - ifAbsent: () => [Event( 'Period Day', Colors.pink)], + (existingEvents) => + existingEvents..add(Event('Period Day', Colors.pink)), + ifAbsent: () => [Event('Period Day', Colors.pink)], ); } // Add fertile window days - for (DateTime date = cycle.fertileStart; - date.isBefore(cycle.fertileEnd) || isSameDay(date, cycle.fertileEnd); + for (DateTime date = cycle.fertile_start; + date.isBefore(cycle.fertile_end) || + isSameDay(date, cycle.fertile_end); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, - (existingEvents) => existingEvents - ..add(Event( 'Fertile Day', Colors.green)), - ifAbsent: () => [Event( 'Fertile Day', Colors.green)], + (existingEvents) => + existingEvents..add(Event('Fertile Day', Colors.green)), + ifAbsent: () => [Event('Fertile Day', Colors.green)], ); } // Add ovulation day updatedEvents.update( cycle.ovulation, - (existingEvents) => existingEvents - ..add(Event( 'Ovulation Day', Colors.blue)), - ifAbsent: () => [Event( 'Ovulation Day', Colors.blue)], + (existingEvents) => + existingEvents..add(Event('Ovulation Day', Colors.blue)), + ifAbsent: () => [Event('Ovulation Day', Colors.blue)], ); // Add predicted period start - for (DateTime date = cycle.predictedPeriodStart; - date.isBefore(cycle.predictedPeriodEnd) || isSameDay(date, cycle.predictedPeriodEnd); + for (DateTime date = cycle.predicted_period_start; + date.isBefore(cycle.predicted_period_end) || + isSameDay(date, cycle.predicted_period_end); date = date.add(const Duration(days: 1))) { updatedEvents.update( date, - (existingEvents) => existingEvents - ..add(Event( 'Predicted Period Day', Colors.orange)), - ifAbsent: () => [Event( 'Predicted Period Day', Colors.orange)], + (existingEvents) => + existingEvents..add(Event('Predicted Period Day', Colors.orange)), + ifAbsent: () => [Event('Predicted Period Day', Colors.orange)], ); } } - + // events.forEach((id, events) { // print("Cycle Id: $id"); // print("["); - // events.forEach((date, event) { + // events.forEach((date, event) { // print("Date: $date, Event: $event\n"); // }); // print("]"); // }); - + // print("--------------"); return events; } } - - - diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 22155fbd..17df4c14 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -6,12 +6,13 @@ import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; +import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -List _menuItems(BuildContext context) => [ +List _menuItems(BuildContext context, WidgetRef ref) => [ MenuItem( icon: const Icon(Icons.calculate), shortcutIcon: const Icon(Icons.calculate), @@ -42,12 +43,15 @@ List _menuItems(BuildContext context) => [ shortcutIcon: const Icon(Icons.calendar_month_outlined), title: MenuItemNames.PERIOD_PLANNER, onPressed: () { - if(cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); - } - else { - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } + ref.read(cyclesProvider.notifier).fetchCycles() + .then((cycles) { + if (cycles.isEmpty) { + context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + } + else { + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + } + }); }, color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), ), @@ -59,7 +63,7 @@ class SelfScreening extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); - final _items = _menuItems(context); + final _items = _menuItems(context, ref); final insightAsync = ref.watch(insightProvider); return Scaffold( From 4ab071b47093f29ebb2c9bb396f088030b69b187 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 27 Sep 2024 00:32:32 +0300 Subject: [PATCH 092/140] :construction: add app request confirmation dialog --- assets/data/appointments.json | 2 +- assets/data/previous.json | 65 --- assets/data/reschedule.json | 36 ++ lib/src/app/navigation/app_router.dart | 11 + lib/src/app/navigation/menu/menuItems.dart | 424 +++++++++--------- .../appointments/data/models/appointment.dart | 2 + .../data/models/appointment.freezed.dart | 58 ++- .../data/models/appointment.g.dart | 4 + .../presentation/pages/Appointments.dart | 2 +- .../common/presentation/pages/HomeScreen.dart | 17 +- .../presentation/pages/MainMenuScreen.dart | 6 +- .../presentation/widgets/ShortcutsUi.dart | 22 +- .../pages/program_appointments.dart | 2 +- .../presentation/pages/LabResultsScreen.dart | 8 - .../appointment_management_provider.dart | 10 + .../appointment_management_repository.dart | 12 + .../appointment_management_service.dart | 18 + .../pages/reschedule_request_list.dart | 72 +++ .../presentation/widget/current_request.dart | 64 +++ .../presentation/widget/previous_request.dart | 0 .../pages/provider_main_Screen.dart | 199 ++++---- .../user/data/services/UserService.dart | 2 +- lib/src/shared/dialog/dialog.dart | 28 +- .../list_view_builder/list_view_builder.dart | 42 ++ lib/src/utils/routes.dart | 4 +- 25 files changed, 699 insertions(+), 411 deletions(-) delete mode 100644 assets/data/previous.json create mode 100644 assets/data/reschedule.json create mode 100644 lib/src/features/provider/appointment_management/data/providers/appointment_management_provider.dart create mode 100644 lib/src/features/provider/appointment_management/data/repositories/appointment_management_repository.dart create mode 100644 lib/src/features/provider/appointment_management/data/services/appointment_management_service.dart create mode 100644 lib/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart create mode 100644 lib/src/features/provider/appointment_management/presentation/widget/current_request.dart create mode 100644 lib/src/features/provider/appointment_management/presentation/widget/previous_request.dart create mode 100644 lib/src/shared/list_view_builder/list_view_builder.dart diff --git a/assets/data/appointments.json b/assets/data/appointments.json index 587d3d50..090c19d9 100644 --- a/assets/data/appointments.json +++ b/assets/data/appointments.json @@ -7,7 +7,7 @@ "appointment_date": "Tuesday, April 30 2024", "date_attended": null, "appt_status": "Reschedule Pending Approval", - "r_status": "0", + "": "0", "appointment": "05-04-2024" } ] diff --git a/assets/data/previous.json b/assets/data/previous.json deleted file mode 100644 index c8f65e3a..00000000 --- a/assets/data/previous.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "success": true, - "data": [ - { - "appointment_type": "Clinical Review", - "appointment_date": "Tuesday, January 9 2024", - "visit_date": null, - "appt_status": "Missed" - }, - { - "appointment_type": "Clinical Review", - "appointment_date": "Wednesday, October 4 2023", - "visit_date": null, - "appt_status": "Missed" - }, - { - "appointment_type": "Clinical Review", - "appointment_date": "Friday, September 22 2023", - "visit_date": null, - "appt_status": "Missed" - }, - { - "appointment_type": "Clinical Review", - "appointment_date": "Thursday, August 10 2023", - "visit_date": null, - "appt_status": "Missed" - }, - { - "appointment_type": "Re-Fill", - "appointment_date": "Thursday, August 10 2023", - "visit_date": "Tuesday, August 15 2023", - "appt_status": "Missed" - }, - { - "appointment_type": "Re-Fill", - "appointment_date": "Tuesday, August 8 2023", - "visit_date": "Tuesday, August 8 2023", - "appt_status": "Kept" - }, - { - "appointment_type": "Clinical Review", - "appointment_date": "Friday, August 4 2023", - "visit_date": "Tuesday, August 8 2023", - "appt_status": "Missed" - }, - { - "appointment_type": "Clinical Review", - "appointment_date": "Monday, April 10 2023", - "visit_date": "Wednesday, March 15 2023", - "appt_status": "Kept" - }, - { - "appointment_type": "Clinical Review", - "appointment_date": "Thursday, March 9 2023", - "visit_date": "Tuesday, August 8 2023", - "appt_status": "Missed" - }, - { - "appointment_type": "Clinical Review", - "appointment_date": "Friday, February 10 2023", - "visit_date": "Wednesday, March 15 2023", - "appt_status": "Missed" - } - ] -} \ No newline at end of file diff --git a/assets/data/reschedule.json b/assets/data/reschedule.json new file mode 100644 index 00000000..e7213aa8 --- /dev/null +++ b/assets/data/reschedule.json @@ -0,0 +1,36 @@ +[ + { + "id": "3123045", + "ccc_no": "1234500002", + "appointment_type": "Re-Fill", + "appointment_date": "Thursday, August 10 2023", + "reschedule_date": "Tuesday, January 9 2024", + "facility_name": "Milimani Dispensary", + "appt_status": "Reschedule Pending Approval", + "reschedule_reason": "I will be a way this week", + "reschedule_status": "0" + }, + { + "id": "3123046", + "ccc_no": "12345000023", + "appointment_type": "Re-Fill", + "appointment_date": "Tuesday, August 8 2023", + "reschedule_date": "Tuesday, January 9 2024", + "facility_name": "Milimani Dispensary", + "appt_status": "Reschedule Pending Approval", + "reschedule_reason": "I will be a way this week", + "reschedule_status": "0" + } +, + { + "id": "3123047", + "ccc_no": "1234500001", + "appointment_type": "Re-Fill", + "appointment_date": "Tuesday, August 8 2023", + "reschedule_date": "Tuesday, January 9 2024", + "facility_name": "Milimani Dispensary", + "appt_status": "Reschedule Pending Approval", + "reschedule_reason": "I will be a way this week", + "reschedule_status": "0" + } +] \ No newline at end of file diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 3d172fd6..f844da55 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -68,6 +68,7 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/periodPl import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlanner.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; +import 'package:nishauri/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart'; import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; @@ -403,6 +404,7 @@ final List secureRoutes = [ builder: (BuildContext context, GoRouterState state) { return const ProviderMainScreen(); }, + routes: providerRoutes, ), ]; @@ -536,6 +538,15 @@ final List selfScreeningRoutes = [ ]; +final List providerRoutes = [ + GoRoute( + name: RouteNames.REQUEST_APP_RESCHEDULE, + path: 'request-app-reschedule', + builder: (BuildContext context, GoRouterState state) { + return const RescheduleRequestListScreen(); + }, + ), +]; final List hivProgramRoutes = [ GoRoute( name: RouteNames.HIV_ART_SITES, diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 52aa5d10..c4537000 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -24,105 +24,135 @@ class MenuItem { }); } -MenuItem getProgramMenuItemByProgramCode( - BuildContext context, String programCode) { +MenuItem getProgramMenuItemByProgramCode(BuildContext context, String programCode) { final theme = Theme.of(context); - if (programCode == ProgramCodeNameIds.HIV) { - return MenuItem( - icon: const Icon( - Icons.vaccines, - size: Constants.iconSize, - ), - shortcutIcon: const Icon( - Icons.vaccines, - ), + switch (programCode) { + case ProgramCodeNameIds.HIV: + return MenuItem( + icon: const Icon(Icons.vaccines, size: Constants.iconSize), + shortcutIcon: const Icon(Icons.vaccines), title: MenuItemNames.HIV_PROGRAM_MENU, onPressed: () => context.goNamed(RouteNames.HIV_PROGRAM), - color: Constants.appointmentsColor); - } else if (programCode == ProgramCodeNameIds.TB) { - return MenuItem( - icon: const Icon( - Icons.sick, - size: Constants.iconSize, - ), - shortcutIcon: const Icon( - Icons.sick, - ), - title: MenuItemNames.TB_PROGRAM_MENU, - onPressed: () => "", - ); - } else if (programCode == ProgramCodeNameIds.ASTHMA) { - return MenuItem( - icon: const Icon( - Icons.ac_unit, - size: Constants.iconSize, - ), - shortcutIcon: const Icon( - Icons.ac_unit, - ), - title: MenuItemNames.ASTHMA_PROGRAM_MENU, - onPressed: () => "", - ); - } else if (programCode == ProgramCodeNameIds.DIABETES) { - return MenuItem( - icon: const Icon( - Icons.monitor_weight_outlined, - size: Constants.iconSize, - ), - shortcutIcon: const Icon( - Icons.monitor_weight_outlined, - ), - title: MenuItemNames.DIABETES_PROGRAM_MENU, - onPressed: () => "", - ); - } else if (programCode == ProgramCodeNameIds.CANCER) { - return MenuItem( - icon: const Icon( - Icons.group_work, - size: Constants.iconSize, - ), - shortcutIcon: const Icon( - Icons.group_work, - ), - title: MenuItemNames.CANCER_PROGRAM_MENU, - onPressed: () => "", - ); - } else if (programCode == ProgramCodeNameIds.HYPERTENSION) { - return MenuItem( - icon: const Icon( - Icons.speed, - size: Constants.iconSize, + color: Constants.appointmentsColor, + ); + case ProgramCodeNameIds.TB: + return MenuItem( + icon: const Icon(Icons.sick, size: Constants.iconSize), + shortcutIcon: const Icon(Icons.sick), + title: MenuItemNames.TB_PROGRAM_MENU, + onPressed: () => "", + ); + case ProgramCodeNameIds.ASTHMA: + return MenuItem( + icon: const Icon(Icons.ac_unit, size: Constants.iconSize), + shortcutIcon: const Icon(Icons.ac_unit), + title: MenuItemNames.ASTHMA_PROGRAM_MENU, + onPressed: () => "", + ); + case ProgramCodeNameIds.DIABETES: + return MenuItem( + icon: const Icon(Icons.monitor_weight_outlined, size: Constants.iconSize), + shortcutIcon: const Icon(Icons.monitor_weight_outlined), + title: MenuItemNames.DIABETES_PROGRAM_MENU, + onPressed: () => "", + ); + case ProgramCodeNameIds.CANCER: + return MenuItem( + icon: const Icon(Icons.group_work, size: Constants.iconSize), + shortcutIcon: const Icon(Icons.group_work), + title: MenuItemNames.CANCER_PROGRAM_MENU, + onPressed: () => "", + ); + case ProgramCodeNameIds.HYPERTENSION: + return MenuItem( + icon: const Icon(Icons.speed, size: Constants.iconSize), + shortcutIcon: const Icon(Icons.speed), + title: MenuItemNames.HYPERTENSION_PROGRAM_MENU, + onPressed: () => "", + ); + default: + return MenuItem( + icon: const Icon(Icons.more_horiz, size: Constants.iconSize), + shortcutIcon: const Icon(Icons.more_horiz), + ); + } +} + +List getProviderModules(BuildContext context) { + return [ + MenuItem( + shortcutBackgroundColor: Constants.providerBgColor.withOpacity(0.5), + icon: SvgPicture.asset( + "assets/images/patient.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: 80, + height: 80, ), - shortcutIcon: const Icon( - Icons.speed, + shortcutIcon: SvgPicture.asset( + "assets/images/patient.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, ), - title: MenuItemNames.HYPERTENSION_PROGRAM_MENU, - onPressed: () {}, - ); - } - return MenuItem( - icon: const Icon( - Icons.more_horiz, - size: Constants.iconSize, - ), - shortcutIcon: const Icon( - Icons.more_horiz, + title: MenuItemNames.PROVIDER_MAIN_SCREEN, + onPressed: () => context.goNamed(RouteNames.PROVIDER_MAIN_SCREEN), + color: Constants.providerBgColor, ), - ); + ]; } -List getGenericMenuItems(BuildContext context, bool admin) { +List getPartnerModules(BuildContext context) { return [ // MenuItem( - // icon: Icons.calendar_month_rounded, - // title: MenuItemNames.MY_CALENDAR, - // onPressed: () => context.goNamed(RouteNames.EVENTS_CALENDAR), + // color: Constants.programsColor, + // icon: FaIcon( + // Icons.file_copy_outlined, + // size: Constants.iconSize, + // color: Theme.of(context).colorScheme.inversePrimary, + // ), + // shortcutIcon: const FaIcon(Icons.file_copy_outlined), + // title: MenuItemNames.PARTNER, + // onPressed: () => context.goNamed(RouteNames.PARTNER), // ), + ]; +} + +List getAdminModules(BuildContext context) { + return [ // MenuItem( - // icon: Icons.dashboard_customize_outlined, - // title: MenuItemNames.DASHBOARD, - // onPressed: () => context.goNamed(RouteNames.DASHBOARD), + // color: Constants.programsColor, + // icon: FaIcon( + // Icons.file_copy_outlined, + // size: Constants.iconSize, + // color: Theme.of(context).colorScheme.inversePrimary, + // ), + // shortcutIcon: const FaIcon(Icons.file_copy_outlined), + // title: MenuItemNames.ADMIN, + // onPressed: () => context.goNamed(RouteNames.ADMIN), // ), + ]; +} + +List getFacilityAdminModules(BuildContext context) { + return [ + // MenuItem( + // color: Constants.programsColor, + // icon: FaIcon( + // Icons.file_copy_outlined, + // size: Constants.iconSize, + // color: Theme.of(context).colorScheme.inversePrimary, + // ), + // shortcutIcon: const FaIcon(Icons.file_copy_outlined), + // title: MenuItemNames.FACILITY_ADMIN, + // onPressed: () => context.goNamed(RouteNames.FACILITY_ADMIN), + // ), + ]; +} + +List getPatientModules(BuildContext context) { + return [ MenuItem( color: Constants.programsColor, icon: FaIcon( @@ -130,160 +160,150 @@ List getGenericMenuItems(BuildContext context, bool admin) { size: Constants.iconSize, color: Theme.of(context).colorScheme.inversePrimary, ), - shortcutIcon: const FaIcon( - Icons.file_copy_outlined, - ), + shortcutIcon: const FaIcon(Icons.file_copy_outlined), title: MenuItemNames.PROGRAM_MENU, onPressed: () => context.goNamed(RouteNames.PROGRAM_MENU), ), - MenuItem( - icon: SvgPicture.asset( - "assets/images/calendar.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 80, - width: 80, - ), - shortcutIcon: SvgPicture.asset( - "assets/images/calendar.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize, - ), - title: MenuItemNames.APPOINTMENTS, - onPressed: () => context.goNamed(RouteNames.APPOINTMENTS), - color: Constants.appointmentsColor), - MenuItem( - shortcutBackgroundColor: Constants.labResultsShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/syringe.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 80, - width: 80, - ), - shortcutIcon: SvgPicture.asset( - "assets/images/syringe.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize, - ), - title: MenuItemNames.LAB_RESULTS, - onPressed: () => context.goNamed(RouteNames.LAB_RESULTS), - color: Constants.labResultsColor), - MenuItem( - icon: FaIcon( - FontAwesomeIcons.addressCard, - size: 50.0, - color: Colors.blue[400], - ), - shortcutIcon: FaIcon( - FontAwesomeIcons.addressCard, - color: Colors.blue[400], - ), - title: MenuItemNames.MY_CLINIC_CARD, - onPressed: () => context.goNamed(RouteNames.MY_CLINIC_CARD), - color: Colors.blue[900]), + icon: SvgPicture.asset( + "assets/images/calendar.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 80, + width: 80, + ), + shortcutIcon: SvgPicture.asset( + "assets/images/calendar.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, + ), + title: MenuItemNames.APPOINTMENTS, + onPressed: () => context.goNamed(RouteNames.APPOINTMENTS), + color: Constants.appointmentsColor, + ), MenuItem( - icon: SvgPicture.asset( - "assets/images/house.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 80, - width: 80, - ), - shortcutIcon: SvgPicture.asset( - "assets/images/house.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize, - ), - title: MenuItemNames.FACILITY_DIRECTORY, - onPressed: () => context.goNamed(RouteNames.Facility_Directory), - color: Constants.facilityDirectoryColor), - // MenuItem( - // icon: Icons.group, - // title: MenuItemNames.TREATMENT_SUPPORT, - // onPressed: () => context.goNamed(RouteNames.TREATMENT_SUPPORT), - // ), + shortcutBackgroundColor: Constants.labResultsShortcutBgColor, + icon: SvgPicture.asset( + "assets/images/syringe.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 80, + width: 80, + ), + shortcutIcon: SvgPicture.asset( + "assets/images/syringe.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, + ), + title: MenuItemNames.LAB_RESULTS, + onPressed: () => context.goNamed(RouteNames.LAB_RESULTS), + color: Constants.labResultsColor, + ), MenuItem( - shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, - icon: SvgPicture.asset( - "assets/images/healthcare-medical.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 80, - width: 80, - ), - shortcutIcon: SvgPicture.asset( - "assets/images/healthcare-medical.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize, - ), - title: MenuItemNames.SELF_SCREENING, - onPressed: () => context.goNamed(RouteNames.SELF_SCREENING), - color: Constants.bmiCalculatorColor), - + icon: FaIcon( + FontAwesomeIcons.addressCard, + size: 50.0, + color: Colors.blue[400], + ), + shortcutIcon: FaIcon( + FontAwesomeIcons.addressCard, + color: Colors.blue[400], + ), + title: MenuItemNames.MY_CLINIC_CARD, + onPressed: () => context.goNamed(RouteNames.MY_CLINIC_CARD), + color: Colors.blue[900], + ), MenuItem( - // icon: FaIcon(FontAwesomeIcons.capsules, size: Constants.iconSize, color: Colors.teal[200],), - shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, icon: SvgPicture.asset( - "assets/images/pills.svg", + "assets/images/house.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, + height: 80, width: 80, + ), + shortcutIcon: SvgPicture.asset( + "assets/images/house.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, + ), + title: MenuItemNames.FACILITY_DIRECTORY, + onPressed: () => context.goNamed(RouteNames.Facility_Directory), + color: Constants.facilityDirectoryColor, + ), + MenuItem( + shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, + icon: SvgPicture.asset( + "assets/images/healthcare-medical.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, height: 80, + width: 80, ), shortcutIcon: SvgPicture.asset( - "assets/images/pills.svg", + "assets/images/healthcare-medical.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, width: Constants.shortcutIconSize, height: Constants.shortcutIconSize, ), - title: MenuItemNames.DAWA_DROP, - onPressed: () => context.goNamed(RouteNames.DAWA_DROP), - color: Constants.dawaDropColor.withOpacity(0.5), + title: MenuItemNames.SELF_SCREENING, + onPressed: () => context.goNamed(RouteNames.SELF_SCREENING), + color: Constants.bmiCalculatorColor, ), - if (admin) MenuItem( - // icon: FaIcon(FontAwesomeIcons.capsules, size: Constants.iconSize, color: Colors.teal[200],), - shortcutBackgroundColor: Constants.providerBgColor.withOpacity(0.5), + shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, icon: SvgPicture.asset( - "assets/images/patient.svg", + "assets/images/pills.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, width: 80, height: 80, ), shortcutIcon: SvgPicture.asset( - "assets/images/patient.svg", + "assets/images/pills.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, width: Constants.shortcutIconSize, height: Constants.shortcutIconSize, ), - title: MenuItemNames.PROVIDER_MAIN_SCREEN, - onPressed: () => context.goNamed(RouteNames.PROVIDER_MAIN_SCREEN), - color: Constants.providerBgColor, + title: MenuItemNames.DAWA_DROP, + onPressed: () => context.goNamed(RouteNames.DAWA_DROP), + color: Constants.dawaDropColor.withOpacity(0.5), ), ]; } -List getMenuItemByNames(BuildContext context, List names) { +List getGenericMenuItems(BuildContext context, List roles) { + List menuItems = List.from(getPatientModules(context)); + + if (roles.contains("Provider")) { + menuItems.addAll(getProviderModules(context)); + } + + if (roles.contains("Admin")) { + menuItems.addAll(getAdminModules(context)); + // Remove patient and provider modules if admin + menuItems.removeWhere((item) => + item.title == MenuItemNames.PROGRAM_MENU || + item.title == MenuItemNames.PROVIDER_MAIN_SCREEN + ); + } + + return menuItems; +} + +List getMenuItemByNames(BuildContext context, List names, List roles) { const programNames = ProgramCodeNameIds.SUPPOTED_PROGRAM_CODES; return [ - ...getGenericMenuItems(context, true), + ...getGenericMenuItems(context, roles), ...programNames.map((e) => getProgramMenuItemByProgramCode(context, e)), - ] - .where( - (menuItem) => names.any((name) => name == menuItem.title), - ) - .toList(); + ].where( + (menuItem) => names.contains(menuItem.title), + ).toList(); } diff --git a/lib/src/features/appointments/data/models/appointment.dart b/lib/src/features/appointments/data/models/appointment.dart index b3045bd3..d75863ec 100644 --- a/lib/src/features/appointments/data/models/appointment.dart +++ b/lib/src/features/appointments/data/models/appointment.dart @@ -20,6 +20,8 @@ class Appointment with _$Appointment { String? appt_status, int? appointment_status, String? date_attended, + String? reschedule_date, + String? reschedule_reason, }) = _Appointment; factory Appointment.fromJson(Map json)=> _$AppointmentFromJson(json); diff --git a/lib/src/features/appointments/data/models/appointment.freezed.dart b/lib/src/features/appointments/data/models/appointment.freezed.dart index 2547c087..e910f7e1 100644 --- a/lib/src/features/appointments/data/models/appointment.freezed.dart +++ b/lib/src/features/appointments/data/models/appointment.freezed.dart @@ -34,6 +34,8 @@ mixin _$Appointment { String? get appt_status => throw _privateConstructorUsedError; int? get appointment_status => throw _privateConstructorUsedError; String? get date_attended => throw _privateConstructorUsedError; + String? get reschedule_date => throw _privateConstructorUsedError; + String? get reschedule_reason => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -61,7 +63,9 @@ abstract class $AppointmentCopyWith<$Res> { String? nextAppointmentDate, String? appt_status, int? appointment_status, - String? date_attended}); + String? date_attended, + String? reschedule_date, + String? reschedule_reason}); } /// @nodoc @@ -91,6 +95,8 @@ class _$AppointmentCopyWithImpl<$Res, $Val extends Appointment> Object? appt_status = freezed, Object? appointment_status = freezed, Object? date_attended = freezed, + Object? reschedule_date = freezed, + Object? reschedule_reason = freezed, }) { return _then(_value.copyWith( id: freezed == id @@ -149,6 +155,14 @@ class _$AppointmentCopyWithImpl<$Res, $Val extends Appointment> ? _value.date_attended : date_attended // ignore: cast_nullable_to_non_nullable as String?, + reschedule_date: freezed == reschedule_date + ? _value.reschedule_date + : reschedule_date // ignore: cast_nullable_to_non_nullable + as String?, + reschedule_reason: freezed == reschedule_reason + ? _value.reschedule_reason + : reschedule_reason // ignore: cast_nullable_to_non_nullable + as String?, ) as $Val); } } @@ -175,7 +189,9 @@ abstract class _$$AppointmentImplCopyWith<$Res> String? nextAppointmentDate, String? appt_status, int? appointment_status, - String? date_attended}); + String? date_attended, + String? reschedule_date, + String? reschedule_reason}); } /// @nodoc @@ -203,6 +219,8 @@ class __$$AppointmentImplCopyWithImpl<$Res> Object? appt_status = freezed, Object? appointment_status = freezed, Object? date_attended = freezed, + Object? reschedule_date = freezed, + Object? reschedule_reason = freezed, }) { return _then(_$AppointmentImpl( id: freezed == id @@ -261,6 +279,14 @@ class __$$AppointmentImplCopyWithImpl<$Res> ? _value.date_attended : date_attended // ignore: cast_nullable_to_non_nullable as String?, + reschedule_date: freezed == reschedule_date + ? _value.reschedule_date + : reschedule_date // ignore: cast_nullable_to_non_nullable + as String?, + reschedule_reason: freezed == reschedule_reason + ? _value.reschedule_reason + : reschedule_reason // ignore: cast_nullable_to_non_nullable + as String?, )); } } @@ -282,7 +308,9 @@ class _$AppointmentImpl implements _Appointment { this.nextAppointmentDate, this.appt_status, this.appointment_status, - this.date_attended}); + this.date_attended, + this.reschedule_date, + this.reschedule_reason}); factory _$AppointmentImpl.fromJson(Map json) => _$$AppointmentImplFromJson(json); @@ -315,10 +343,14 @@ class _$AppointmentImpl implements _Appointment { final int? appointment_status; @override final String? date_attended; + @override + final String? reschedule_date; + @override + final String? reschedule_reason; @override String toString() { - return 'Appointment(id: $id, ccc_no: $ccc_no, facility_name: $facility_name, program_name: $program_name, program_code: $program_code, program_status: $program_status, reschedule_status: $reschedule_status, appointment_type: $appointment_type, appointment_date: $appointment_date, appointment: $appointment, nextAppointmentDate: $nextAppointmentDate, appt_status: $appt_status, appointment_status: $appointment_status, date_attended: $date_attended)'; + return 'Appointment(id: $id, ccc_no: $ccc_no, facility_name: $facility_name, program_name: $program_name, program_code: $program_code, program_status: $program_status, reschedule_status: $reschedule_status, appointment_type: $appointment_type, appointment_date: $appointment_date, appointment: $appointment, nextAppointmentDate: $nextAppointmentDate, appt_status: $appt_status, appointment_status: $appointment_status, date_attended: $date_attended, reschedule_date: $reschedule_date, reschedule_reason: $reschedule_reason)'; } @override @@ -351,7 +383,11 @@ class _$AppointmentImpl implements _Appointment { (identical(other.appointment_status, appointment_status) || other.appointment_status == appointment_status) && (identical(other.date_attended, date_attended) || - other.date_attended == date_attended)); + other.date_attended == date_attended) && + (identical(other.reschedule_date, reschedule_date) || + other.reschedule_date == reschedule_date) && + (identical(other.reschedule_reason, reschedule_reason) || + other.reschedule_reason == reschedule_reason)); } @JsonKey(ignore: true) @@ -371,7 +407,9 @@ class _$AppointmentImpl implements _Appointment { nextAppointmentDate, appt_status, appointment_status, - date_attended); + date_attended, + reschedule_date, + reschedule_reason); @JsonKey(ignore: true) @override @@ -402,7 +440,9 @@ abstract class _Appointment implements Appointment { final String? nextAppointmentDate, final String? appt_status, final int? appointment_status, - final String? date_attended}) = _$AppointmentImpl; + final String? date_attended, + final String? reschedule_date, + final String? reschedule_reason}) = _$AppointmentImpl; factory _Appointment.fromJson(Map json) = _$AppointmentImpl.fromJson; @@ -436,6 +476,10 @@ abstract class _Appointment implements Appointment { @override String? get date_attended; @override + String? get reschedule_date; + @override + String? get reschedule_reason; + @override @JsonKey(ignore: true) _$$AppointmentImplCopyWith<_$AppointmentImpl> get copyWith => throw _privateConstructorUsedError; diff --git a/lib/src/features/appointments/data/models/appointment.g.dart b/lib/src/features/appointments/data/models/appointment.g.dart index e6ef6cce..d3fd6e71 100644 --- a/lib/src/features/appointments/data/models/appointment.g.dart +++ b/lib/src/features/appointments/data/models/appointment.g.dart @@ -22,6 +22,8 @@ _$AppointmentImpl _$$AppointmentImplFromJson(Map json) => appt_status: json['appt_status'] as String?, appointment_status: (json['appointment_status'] as num?)?.toInt(), date_attended: json['date_attended'] as String?, + reschedule_date: json['reschedule_date'] as String?, + reschedule_reason: json['reschedule_reason'] as String?, ); Map _$$AppointmentImplToJson(_$AppointmentImpl instance) => @@ -40,4 +42,6 @@ Map _$$AppointmentImplToJson(_$AppointmentImpl instance) => 'appt_status': instance.appt_status, 'appointment_status': instance.appointment_status, 'date_attended': instance.date_attended, + 'reschedule_date': instance.reschedule_date, + 'reschedule_reason': instance.reschedule_reason, }; diff --git a/lib/src/features/appointments/presentation/pages/Appointments.dart b/lib/src/features/appointments/presentation/pages/Appointments.dart index 91cf4cce..8220d1b9 100644 --- a/lib/src/features/appointments/presentation/pages/Appointments.dart +++ b/lib/src/features/appointments/presentation/pages/Appointments.dart @@ -24,7 +24,7 @@ class _AppointmentsState extends State { void initState() { super.initState(); _upcomingAppointmentsFuture = _loadAppointments('assets/data/appointments.json'); - _previousAppointmentsFuture = _loadAppointments('assets/data/previous.json'); + _previousAppointmentsFuture = _loadAppointments('assets/data/reschedule.json'); } Future> _loadAppointments(String jsonPath) async { diff --git a/lib/src/features/common/presentation/pages/HomeScreen.dart b/lib/src/features/common/presentation/pages/HomeScreen.dart index 0d3dbacc..564fefc8 100644 --- a/lib/src/features/common/presentation/pages/HomeScreen.dart +++ b/lib/src/features/common/presentation/pages/HomeScreen.dart @@ -85,7 +85,22 @@ class _HomeScreenState extends ConsumerState { ); if (showUpdateProgram && settings.firstTimeNoProgram) { - HealthProgramDialog(context).show(); + HealthProgramDialog( + context, + "Tap to Choose and Enrol in a Program", + "Take Control of Your Health – Join A Program and Start Your Journey Today!", + Constants.labResultsShortcutBgColor, + "Opt-In", + Constants.labResultsColor, + "Not now", + Constants.labResultsShortcutBgColor, + (){ + context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); + }, + (){ + Navigator.of(context).pop(); + }, + ).show(); updateSettings.updateSettings(firstTimeNoProgram: false); } }); diff --git a/lib/src/features/common/presentation/pages/MainMenuScreen.dart b/lib/src/features/common/presentation/pages/MainMenuScreen.dart index 9d4fd2d0..107cc565 100644 --- a/lib/src/features/common/presentation/pages/MainMenuScreen.dart +++ b/lib/src/features/common/presentation/pages/MainMenuScreen.dart @@ -40,8 +40,8 @@ class MainMenuScreen extends ConsumerWidget { final userAdminAsync = ref.watch(userProvider); return userAdminAsync.when( - data: (admin){ - final isAdmin = admin.roles.contains("provider"); + data: (userRoles){ + List roles = List.from(userRoles.roles); return Scaffold( key: _scaffoldKey, drawer: CustomDrawer(), @@ -140,7 +140,7 @@ class MainMenuScreen extends ConsumerWidget { ), ), items: [ - ...getGenericMenuItems(context, isAdmin), + ...getGenericMenuItems(context, roles), ], ); }, diff --git a/lib/src/features/common/presentation/widgets/ShortcutsUi.dart b/lib/src/features/common/presentation/widgets/ShortcutsUi.dart index 4e7243e9..b626f4c8 100644 --- a/lib/src/features/common/presentation/widgets/ShortcutsUi.dart +++ b/lib/src/features/common/presentation/widgets/ShortcutsUi.dart @@ -18,10 +18,10 @@ class ShortcutsWidget extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final shortcuts = ref.watch(shortcutProvider); final adminAsync = ref.watch(userProvider); - final isAdmin = adminAsync.when( - data: (data) => data.roles.contains("provider"), - error: (_, __) => false, // Handle error by assuming non-admin - loading: () => false, + final List roles = adminAsync.when( + data: (data) => data.roles, + error: (_, __) => [], + loading: () => [], ); final theme = Theme.of(context); @@ -45,7 +45,7 @@ class ShortcutsWidget extends HookConsumerWidget { ), ), onTap: () { - _showDialog(context, isAdmin); + _showDialog(context, roles); }, ), ], @@ -57,11 +57,11 @@ class ShortcutsWidget extends HookConsumerWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ...getMenuItemByNames(context, shortcuts).map((item) { + ...getMenuItemByNames(context, shortcuts, roles).map((item) { return GestureDetector( onTap: item.onPressed, onLongPress: () { - _showDialog(context, isAdmin); + _showDialog(context, roles); }, child: MenuOption( title: item.title ?? "", @@ -72,13 +72,13 @@ class ShortcutsWidget extends HookConsumerWidget { ), ); }).toList(), - if (getMenuItemByNames(context, shortcuts).length < 3) + if (getMenuItemByNames(context, shortcuts, roles).length < 3) MenuOption( title: "", icon: const Icon(Icons.add), bgColor: theme.colorScheme.secondary, onPress: () { - _showDialog(context, isAdmin); + _showDialog(context, roles); }, ), ], @@ -88,7 +88,7 @@ class ShortcutsWidget extends HookConsumerWidget { ); } - void _showDialog(BuildContext context, bool isAdmin) { + void _showDialog(BuildContext context, List roles) { final theme = Theme.of(context); showDialog( context: context, @@ -135,7 +135,7 @@ class ShortcutsWidget extends HookConsumerWidget { ), items: [ // get generic menu items - ...getGenericMenuItems(context, isAdmin), + ...getGenericMenuItems(context, roles), // get program menu items ...data.where((element) => element.isActive).map((e) { final programCode = e.id; diff --git a/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart b/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart index c90d37cb..04b4d37b 100644 --- a/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart +++ b/lib/src/features/dawa_drop/presentation/pages/program_appointments.dart @@ -95,7 +95,7 @@ class ProgramAppointmentsScreen extends ConsumerWidget { filteredAppointments[index] .program_name ?? '', - style: theme.textTheme.headline6, + style: theme.textTheme.titleSmall, overflow: TextOverflow.ellipsis, maxLines: 1, ), diff --git a/lib/src/features/lab/presentation/pages/LabResultsScreen.dart b/lib/src/features/lab/presentation/pages/LabResultsScreen.dart index 7715c66d..768b683b 100644 --- a/lib/src/features/lab/presentation/pages/LabResultsScreen.dart +++ b/lib/src/features/lab/presentation/pages/LabResultsScreen.dart @@ -1,16 +1,8 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/hiv/presentation/pages/lab_results/art_lab_results.dart'; -import 'package:nishauri/src/features/lab/data/providers/VirolLoadprovider.dart'; -import 'package:nishauri/src/features/lab/presentation/pages/LabResults.dart'; -import 'package:nishauri/src/features/lab/presentation/widget/ViralLoadResult.dart'; -import 'package:nishauri/src/features/lab/presentation/widget/ViralLoadTrend.dart'; import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; import 'package:nishauri/src/shared/display/CustomTabBar.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; diff --git a/lib/src/features/provider/appointment_management/data/providers/appointment_management_provider.dart b/lib/src/features/provider/appointment_management/data/providers/appointment_management_provider.dart new file mode 100644 index 00000000..d57ef1fc --- /dev/null +++ b/lib/src/features/provider/appointment_management/data/providers/appointment_management_provider.dart @@ -0,0 +1,10 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/appointments/data/models/appointment.dart'; +import 'package:nishauri/src/features/provider/appointment_management/data/repositories/appointment_management_repository.dart'; +import 'package:nishauri/src/features/provider/appointment_management/data/services/appointment_management_service.dart'; + +final appointmentRescheduleProvider = FutureProvider>((ref) async { + final service = AppointmentManagementService(); + final repo = AppointmentManagementRepository(service); + return await repo.getAppointmentReschedule(); +}); \ No newline at end of file diff --git a/lib/src/features/provider/appointment_management/data/repositories/appointment_management_repository.dart b/lib/src/features/provider/appointment_management/data/repositories/appointment_management_repository.dart new file mode 100644 index 00000000..355a6a4b --- /dev/null +++ b/lib/src/features/provider/appointment_management/data/repositories/appointment_management_repository.dart @@ -0,0 +1,12 @@ +import 'package:nishauri/src/features/appointments/data/models/appointment.dart'; +import 'package:nishauri/src/features/provider/appointment_management/data/services/appointment_management_service.dart'; + +class AppointmentManagementRepository { + final AppointmentManagementService _service; + + AppointmentManagementRepository(this._service); + + Future> getAppointmentReschedule() async { + return await _service.getRescheduleRequests(); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/appointment_management/data/services/appointment_management_service.dart b/lib/src/features/provider/appointment_management/data/services/appointment_management_service.dart new file mode 100644 index 00000000..e75186d5 --- /dev/null +++ b/lib/src/features/provider/appointment_management/data/services/appointment_management_service.dart @@ -0,0 +1,18 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:nishauri/src/features/appointments/data/models/appointment.dart'; +import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; +import 'package:nishauri/src/utils/helpers.dart'; + +class AppointmentManagementService extends HTTPService { + Future> getRescheduleRequests() async { + final data = await loadJsonData("assets/data/reschedule.json"); + final json = jsonDecode(data); + final appointments = json + .map((an) => Appointment.fromJson(Map.from(an))).toList(); + + log("$appointments"); + return [...appointments]; + } +} \ No newline at end of file diff --git a/lib/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart b/lib/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart new file mode 100644 index 00000000..c9cbf72c --- /dev/null +++ b/lib/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/provider/appointment_management/data/providers/appointment_management_provider.dart'; +import 'package:nishauri/src/features/provider/appointment_management/presentation/widget/current_request.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomTabBar.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class RescheduleRequestListScreen extends HookConsumerWidget{ + const RescheduleRequestListScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final appointmentRescheduleAsync = ref.watch(appointmentRescheduleProvider); + final currIndex = useState(0); + + return appointmentRescheduleAsync.when(data: (data) { + if (data.isEmpty) { + return const BackgroundImageWidget( + customAppBar: CustomAppBar( + title: "Reschedule Requests 📆", + color: Constants.providerBgColor, + ), + svgImage: "assets/images/appointments-empty.svg", + notFoundText: "No Content", + ); + } + + final screen = [ + RescheduleRequestList(appointments: data), + const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No Past reschedule request"), + ), + ]; + + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const CustomAppBar( + title: "Reschedule Requests 📆", + color: Constants.providerBgColor, + ), + CustomTabBar( + onTap: (item, index) { + currIndex.value = index; + }, + activeColor: Constants.providerBgColor.withOpacity(0.5), + activeIndex: currIndex.value, + items: [ + const CustomTabBarItem(title: "Appointment Reschedule Request"), + const CustomTabBarItem(title: "History"), + ], + ), + Expanded( + child: screen[currIndex.value] + ), + ], + ), + ); + }, + error: (error,_) => Center(child: Text(error.toString()),), + loading: ()=>CircularProgressIndicator()); + + } +} \ No newline at end of file diff --git a/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart b/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart new file mode 100644 index 00000000..1a03305e --- /dev/null +++ b/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/appointments/data/models/appointment.dart'; +import 'package:nishauri/src/features/provider/appointment_management/data/providers/appointment_management_provider.dart'; +import 'package:nishauri/src/shared/dialog/dialog.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +class RescheduleRequestList extends HookConsumerWidget { + final List appointments; + + const RescheduleRequestList({Key? key, required this.appointments}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: appointments.length, + itemBuilder: (context, index) { + final app = appointments[index]; + return RowViewList( + details: [ + {"icon": Icons.account_circle_outlined, 'text': "Patient No: ${app.ccc_no ?? ''}"}, + {'icon': Icons.date_range, 'text': "App Type: ${app.appointment_type ?? ''}"}, + {'icon': Icons.calendar_month, 'text': "App Date: ${app.appointment_date ?? ''}"}, + {'icon': Icons.date_range, 'text': "Reschedule Date: ${app.reschedule_date ?? ''}"}, + {'icon': Icons.date_range, 'text': "Reason for reschedule: ${app.reschedule_reason ?? ''}"}, + {'icon': Icons.build_circle_outlined, 'text': "Status: ${app.appt_status ?? ''}"}, + ], + onRowTap: (index) { + HealthProgramDialog( + context, + "${app.ccc_no} from ${app.appointment_date} to ${app.reschedule_date}", + "Reschedule the Appointment for patient", + Constants.providerBgColor.withOpacity(0.5), + "Approve", + Constants.providerBgColor.withOpacity(0.2), + "Reject", + Constants.providerBgColor, + (){ + print("Approving appointment reschedule"); + ref.refresh(appointmentRescheduleProvider); + }, + (){ + print("Rejecting appointment reschedule"); + ref.refresh(appointmentRescheduleProvider); + }, + ).show(); + }, + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/features/provider/appointment_management/presentation/widget/previous_request.dart b/lib/src/features/provider/appointment_management/presentation/widget/previous_request.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart index c8bf5b13..863a41d5 100644 --- a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart +++ b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart @@ -7,62 +7,62 @@ import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -// _menuItems(BuildContext context) => [ -// MenuItem( -// shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, -// icon: SvgPicture.asset( -// "assets/images/pills.svg", -// semanticsLabel: "Dawa", -// fit: BoxFit.contain, -// width: 80, -// height: 80, -// ), -// shortcutIcon: SvgPicture.asset("assets/images/shopping-meds.svg", -// semanticsLabel: "Dawa", -// fit: BoxFit.contain, -// width: Constants.shortcutIconSize, -// height: Constants.shortcutIconSize), -// title: "Request Drugs", -// onPressed: () => context.goNamed(RouteNames.REQUEST_DRUGS), -// color: Constants.dawaDropColor.withOpacity(0.5), -// ), -// MenuItem( -// shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, -// icon: SvgPicture.asset( -// "assets/images/shopping.svg", -// semanticsLabel: "Dawa", -// fit: BoxFit.contain, -// width: 80, -// height: 80, -// ), -// shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", -// semanticsLabel: "Dawa", -// fit: BoxFit.contain, -// width: Constants.shortcutIconSize, -// height: Constants.shortcutIconSize), -// title: "Drug Orders", -// onPressed: () => context.goNamed(RouteNames.HIV_DRUG_ORDERS), -// color: Constants.dawaDropColor.withOpacity(0.5), -// ), -// MenuItem( -// shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, -// icon: SvgPicture.asset( -// "assets/images/review.svg", -// semanticsLabel: "Dawa", -// fit: BoxFit.contain, -// width: 80, -// height: 80, -// ), -// shortcutIcon: SvgPicture.asset("assets/images/review.svg", -// semanticsLabel: "Dawa", -// fit: BoxFit.contain, -// width: Constants.shortcutIconSize, -// height: Constants.shortcutIconSize), -// title: "Confirm Delivery", -// onPressed: () => context.goNamed(RouteNames.DISPATCHED_DRUGS), -// color: theme.primaryColorDark.withOpacity(0.5), -// ), -// ]; +_menuItems(BuildContext context) => [ + MenuItem( + shortcutBackgroundColor: Constants.providerBgColor, + icon: SvgPicture.asset( + "assets/images/Calendar-Splash.svg", + semanticsLabel: "Reschedule", + fit: BoxFit.contain, + width: 100, + height: 100, + ), + shortcutIcon: SvgPicture.asset("assets/images/Calendar-Splash.svg", + semanticsLabel: "Reschedule", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Appointment Reschedule Request", + onPressed: () => context.goNamed(RouteNames.REQUEST_APP_RESCHEDULE), + color: Constants.providerBgColor.withOpacity(0.5), + ), + // MenuItem( + // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, + // icon: SvgPicture.asset( + // "assets/images/shopping.svg", + // semanticsLabel: "Dawa", + // fit: BoxFit.contain, + // width: 80, + // height: 80, + // ), + // shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", + // semanticsLabel: "Dawa", + // fit: BoxFit.contain, + // width: Constants.shortcutIconSize, + // height: Constants.shortcutIconSize), + // title: "Drug Orders", + // onPressed: () => context.goNamed(RouteNames.HIV_DRUG_ORDERS), + // color: Constants.dawaDropColor.withOpacity(0.5), + // ), + // MenuItem( + // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, + // icon: SvgPicture.asset( + // "assets/images/review.svg", + // semanticsLabel: "Dawa", + // fit: BoxFit.contain, + // width: 80, + // height: 80, + // ), + // shortcutIcon: SvgPicture.asset("assets/images/review.svg", + // semanticsLabel: "Dawa", + // fit: BoxFit.contain, + // width: Constants.shortcutIconSize, + // height: Constants.shortcutIconSize), + // title: "Confirm Delivery", + // onPressed: () => context.goNamed(RouteNames.DISPATCHED_DRUGS), + // color: theme.primaryColorDark.withOpacity(0.5), + // ), +]; class ProviderMainScreen extends StatelessWidget { const ProviderMainScreen({super.key}); @@ -70,7 +70,7 @@ class ProviderMainScreen extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); - // final _items = _menuItems(context); + final _items = _menuItems(context); return Scaffold( body: Column( children: [ @@ -80,49 +80,48 @@ class ProviderMainScreen extends StatelessWidget { color: Constants.providerBgColor, ), Expanded( - child: Text("Provider modules"), - // child: MenuItemsBuilder( - // crossAxisCount: 2, - // itemBuilder: (item) => Card( - // margin: const EdgeInsets.all(Constants.SPACING), - // clipBehavior: Clip.antiAlias, - // child: InkWell( - // splashColor: theme.primaryColorDark.withOpacity(0.5), - // onTap: item.onPressed, - // child: Container( - // padding: const EdgeInsets.all(Constants.SPACING), - // decoration: BoxDecoration( - // color: item.color ?? theme.colorScheme.primary, - // image: const DecorationImage( - // image: AssetImage("assets/images/contours.png"), - // opacity: 0.2, - // fit: BoxFit.cover, - // ), - // ), - // child: Center( - // child: Column( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, - // children: [ - // item.icon, - // const SizedBox(height: Constants.SPACING), - // Text( - // item.title ?? '', - // style: theme.textTheme.titleMedium?.copyWith( - // color: Colors.white, - // fontWeight: FontWeight.normal, - // overflow: TextOverflow.ellipsis, - // ), - // textAlign: TextAlign.center, - // ), - // ], - // ), - // ), - // ), - // ), - // ), - // items: _items, - // ), + child: MenuItemsBuilder( + crossAxisCount: 2, + itemBuilder: (item) => Card( + margin: const EdgeInsets.all(Constants.SPACING), + clipBehavior: Clip.antiAlias, + child: InkWell( + splashColor: theme.primaryColorDark.withOpacity(0.5), + onTap: item.onPressed, + child: Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: item.color ?? theme.colorScheme.primary, + image: const DecorationImage( + image: AssetImage("assets/images/contours.png"), + opacity: 0.2, + fit: BoxFit.cover, + ), + ), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + item.icon, + const SizedBox(height: Constants.SPACING), + Text( + item.title ?? '', + style: theme.textTheme.titleMedium?.copyWith( + color: Colors.white, + fontWeight: FontWeight.normal, + overflow: TextOverflow.ellipsis, + ), + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + ), + ), + items: _items, + ), ) ], )); diff --git a/lib/src/features/user/data/services/UserService.dart b/lib/src/features/user/data/services/UserService.dart index f6b77550..0e42641b 100644 --- a/lib/src/features/user/data/services/UserService.dart +++ b/lib/src/features/user/data/services/UserService.dart @@ -102,7 +102,7 @@ class UserService extends HTTPService { "disabilities": person["profile"]["disabilities"], "chronics": person["profile"]["chronics"], "gender": person["profile"]["gender"], - "roles": ["user", "provider"], + "roles": ["Patient", "Provider", "admin", "Facility Admin", "Partner"], "facility": person["profile"]["facility"], }); } diff --git a/lib/src/shared/dialog/dialog.dart b/lib/src/shared/dialog/dialog.dart index 9e00fa5a..7a80c19b 100644 --- a/lib/src/shared/dialog/dialog.dart +++ b/lib/src/shared/dialog/dialog.dart @@ -8,36 +8,46 @@ import 'package:nishauri/src/utils/routes.dart'; class HealthProgramDialog { final BuildContext context; + final msg; + final tittle; + final color; + final okBtnTxt; + final okBtnColor; + final xBtnTxt; + final xBtnColor; + final Function()? okOnTap; + final Function()? xOnTap; - HealthProgramDialog(this.context); + HealthProgramDialog(this.context, this.msg, this.tittle, this.color, this.okBtnTxt,this.okBtnColor, this.xBtnTxt, this.xBtnColor, this.okOnTap, this.xOnTap); void show() { Dialogs.bottomMaterialDialog( - msg: 'Tap to Choose and Enrol in a Program', + msg: msg, msgStyle: const TextStyle(color: Constants.labResultsColor), context: context, - color: Constants.labResultsShortcutBgColor, - title: 'Take Control of Your Health – Join A Program and Start Your Journey Today!', + color: color, + title: tittle, titleStyle: const TextStyle(color: Constants.labResultsColor, fontWeight: FontWeight.w600), actions: [ IconsOutlineButton( onPressed: () { + if (okOnTap != null) okOnTap!(); Navigator.of(context).pop(); - context.goNamed(RouteNames.PROGRAME_REGISTRATION_SCREEN); }, - text: 'Opt-In', + text: okBtnTxt, iconData: Icons.add, textStyle: const TextStyle(color: Colors.white), - color: Constants.labResultsColor, + color: xBtnColor, iconColor: Colors.white, ), IconsButton( onPressed: () { + if (xOnTap != null) xOnTap!(); Navigator.of(context).pop(); }, - text: 'Not now', + text: xBtnTxt, iconData: Icons.cancel_outlined, - color: Constants.labResultsShortcutBgColor, + color: xBtnColor, textStyle: const TextStyle(color: Colors.white), iconColor: Colors.white, ), diff --git a/lib/src/shared/list_view_builder/list_view_builder.dart b/lib/src/shared/list_view_builder/list_view_builder.dart new file mode 100644 index 00000000..664cf3e9 --- /dev/null +++ b/lib/src/shared/list_view_builder/list_view_builder.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class RowViewList extends StatelessWidget { + final List> details; + final Function(int index)? onRowTap; + + const RowViewList({ + Key? key, + required this.details, this.onRowTap + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: details.asMap().entries.map((entry) { + int index = entry.key; + var detail = entry.value; + return GestureDetector( + onTap: () => onRowTap?.call(index), + child: _buildDetailRow(detail['icon'], detail['text']), + ); + }).toList(), + ), + ), + ); + } + + Row _buildDetailRow(IconData? icon, String? text, {int maxLines = 1}) { + return Row( + children: [ + Icon(icon, color: Constants.providerBgColor.withOpacity(0.5)), + const SizedBox(width: Constants.SPACING), + Expanded(child: Text(text??'', maxLines: maxLines)), + ], + ); + } +} diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index e5c222e6..7dbaf687 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -74,6 +74,7 @@ class RouteNames { static const INSIGHT = "insight"; static const BP_INSIGHT = "bp-insight"; static const PROVIDER_MAIN_SCREEN = "provider-main-screen"; + static const REQUEST_APP_RESCHEDULE = "request-app-reschedule"; } class MenuItemNames { @@ -109,7 +110,8 @@ class MenuItemNames { static const CHAT_HCW = "Chat with HCW"; static const CHAT_DETAIL = "Chat Detail"; static const INSIGHT = "Insight"; - static const PROVIDER_MAIN_SCREEN = "Provider Main Screen"; + static const PROVIDER_MAIN_SCREEN = "Provider Modules"; + static const REQUEST_APP_RESCHEDULE = "Request Appointment Reschedule"; } From 4848b6c0f2e37402329714e30a7fef1eaf211811 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 30 Sep 2024 12:48:03 +0300 Subject: [PATCH 093/140] Added a new user screen to handle new users using application and scenarios whereby the user may delete entire cycle history. Looking to remove it later though. --- lib/src/app/navigation/app_router.dart | 57 +++--- .../presentation/pages/new_user_screen.dart | 168 ++++++++++++++++++ .../pages/periodPlannerScreen.dart | 150 ++++++++-------- .../presentation/pages/periods_history.dart | 43 +++++ .../pages/self_screening_menu.dart | 3 +- lib/src/utils/routes.dart | 1 + 6 files changed, 317 insertions(+), 105 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/pages/new_user_screen.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index f8b112d2..0c819657 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -63,6 +63,7 @@ import 'package:nishauri/src/features/nishauri_chat/chat/presentation/pages/Conv import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsScreen.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/logPeriods.dart'; +import 'package:nishauri/src/features/period_planner/presentation/pages/new_user_screen.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodCalendar.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; @@ -480,6 +481,13 @@ final List selfScreeningRoutes = [ return const PeriodPlannerScreen(); }, routes: [ + GoRoute( + name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, + path: 'period-planner-log-period-calendar', + builder: (BuildContext context, GoRouterState state) { + return LogPeriodScreen(); + }, + ), GoRoute( name: RouteNames.PERIOD_PLANNER_PERIOD_HISTORY, path: 'period-planner-period-history', @@ -495,7 +503,11 @@ final List selfScreeningRoutes = [ final startDate = extra['startDate'] as DateTime; final endDate = extra['endDate'] as DateTime; final id = extra['id'] as int; - return EditPeriods(initialStartDate: startDate, initialEndDate: endDate, cycleId: id,); + return EditPeriods( + initialStartDate: startDate, + initialEndDate: endDate, + cycleId: id, + ); }, ), ], @@ -503,30 +515,27 @@ final List selfScreeningRoutes = [ ], ), GoRoute( - name: RouteNames.PERIOD_PLANNER_LOG_PERIODS, - path: 'period-planner-log-period-calendar', + name: RouteNames.NEW_USER_SCREEN, + path: 'new-user-screen', builder: (BuildContext context, GoRouterState state) { - return LogPeriodScreen(); + return const NewUserScreen(); }, ), GoRoute( - name: RouteNames.INSIGHT, - path: 'insight', - builder: (BuildContext context, GoRouterState state) { - return const InsightScreen(); - }, - routes: [ - GoRoute( - name: RouteNames.BP_INSIGHT, - path: 'bp-insight', + name: RouteNames.INSIGHT, + path: 'insight', builder: (BuildContext context, GoRouterState state) { - return const BpInsightScreen(); + return const InsightScreen(); }, - ), - ] - ), - - + routes: [ + GoRoute( + name: RouteNames.BP_INSIGHT, + path: 'bp-insight', + builder: (BuildContext context, GoRouterState state) { + return const BpInsightScreen(); + }, + ), + ]), ]; final List hivProgramRoutes = [ @@ -667,11 +676,11 @@ final List dawaDropRoutes = [ final List chatRoutes = [ GoRoute( - name: RouteNames.CHAT_DETAIL, - path: 'chat-detail', - builder: (BuildContext context, GoRouterState state) { - return ChatDetailScreen(); - }, + name: RouteNames.CHAT_DETAIL, + path: 'chat-detail', + builder: (BuildContext context, GoRouterState state) { + return ChatDetailScreen(); + }, ), GoRoute( name: RouteNames.CHAT_USER, diff --git a/lib/src/features/period_planner/presentation/pages/new_user_screen.dart b/lib/src/features/period_planner/presentation/pages/new_user_screen.dart new file mode 100644 index 00000000..2d917e0e --- /dev/null +++ b/lib/src/features/period_planner/presentation/pages/new_user_screen.dart @@ -0,0 +1,168 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; +import 'package:table_calendar/table_calendar.dart'; + +import '../../data/models/events.dart'; + +class NewUserScreen extends ConsumerStatefulWidget { + const NewUserScreen({super.key}); + + @override + ConsumerState createState() => _NewUserScreenState(); +} + +class _NewUserScreenState extends ConsumerState { + Map>> events = {}; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + title: "My Flow Tracker 🌺", + color: Constants.periodPlanner, + ), + Expanded( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Welcome, we are so please to have you.", + style: TextStyle( + color: Constants.periodPlanner, + fontWeight: FontWeight.bold, + fontSize: 18), + ), + ], + ), + const SizedBox( + height: 20, + ), + Stack( + alignment: Alignment.center, + children: [ + const SizedBox( + width: 300, // Adjust the width as needed + height: 300, // Adjust the height as needed + child: CircularProgressIndicator( + value: 0.5, + strokeWidth: 20, + backgroundColor: Colors.grey, + valueColor: AlwaysStoppedAnimation( + Constants.periodPlanner, + ), + ), + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + "Welcome", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: Constants.SPACING), + const Text( + "Click below to get Started", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: Constants.SPACING), + ElevatedButton( + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_LOG_PERIODS); + }, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Constants.periodPlanner, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), + ), + child: const Text("Get Started"), + ), + ], + ), + ], + ), + const SizedBox( + height: 20), // Added spacing to avoid overlap + const Padding( + padding: EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Features', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 10.0), + FeatureTile( + title: 'Track Your Period', + description: + 'Keep an accurate record of your menstrual cycles to better understand your health.', + icon: Icons.track_changes, + ), + FeatureTile( + title: 'Period Calendar', + description: + 'View and manage your menstrual cycles with a detailed calendar.', + icon: Icons.calendar_today, + ), + ], + ), + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} + +class FeatureTile extends StatelessWidget { + final String title; + final String description; + final IconData icon; + + const FeatureTile({ + required this.title, + required this.description, + required this.icon, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: Icon(icon), + title: Text(title), + subtitle: Text(description), + ); + } +} diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index 02e926f3..c2ba1147 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -35,54 +35,19 @@ class PeriodPlannerScreen extends ConsumerStatefulWidget { class _PeriodPlannerScreenState extends ConsumerState { DateTime _currentDate = DateTime.now(); - late DateTime _periodStart; - late DateTime _periodEnd; - late DateTime _ovulationDate; - late DateTime _nextPeriodStart; - late DateTime _nextPeriodEnd; + DateTime? _periodStart; + DateTime? _periodEnd; + DateTime? _ovulationDate; + DateTime? _nextPeriodStart; + DateTime? _nextPeriodEnd; Map>> events = {}; @override void initState() { super.initState(); - // ref.read(cyclesProvider.notifier).fetchCycles(); _checkOverdueDialog(); } - // Listen for state changes from cyclesProvider - // void _updateFromCycles() { - // final cycles = ref.read(cyclesProvider) as Map; - - // if (cycles.isNotEmpty) { - // Cycle latestCycle = cycles.values.last; - // setState(() { - // _periodStart = latestCycle.period_start; - // _periodEnd = latestCycle.period_end; - // _ovulationDate = latestCycle.ovulation; - // _nextPeriodStart = latestCycle.predicted_period_start; - // _nextPeriodEnd = latestCycle.predicted_period_end; - // events = EventUtils.generateEvents(cycles); - // }); - // } - // } - - //Method for updating events - // void _updateEvents() { - // final cycles = ref.read(cyclesProvider) as Map; - // setState(() { - // events = EventUtils.generateEvents(cycles); - // // print("Updated Events: $events"); - // // print("Updated Events"); - // // events.forEach((cycleId, dateMap) { - // // dateMap.forEach((date, events) { - // // print("Cycle ID $cycleId ,Date: $date, Events: $events"); - // // }); - // // }); - // //print("Updated Events: $events"); - // //print("-------------"); - // }); - // } - Future _checkOverdueDialog() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); String? lastDialogDateStr = prefs.getString('lastDialogDate'); @@ -91,8 +56,7 @@ class _PeriodPlannerScreenState extends ConsumerState { if (lastDialogDate == null || !isSameDay(_currentDate, lastDialogDate)) { //If the dialog hasn't been shown today and the user's periods are overdue - bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); - if (isDangerZone) { + if (_nextPeriodEnd != null && _currentDate.isAfter(_nextPeriodEnd!)) { _overdueDialog(); //storing the current date as the last dialog shown date prefs.setString('lastDialogDate', _currentDate.toIso8601String()); @@ -249,8 +213,8 @@ class _PeriodPlannerScreenState extends ConsumerState { return Scaffold( body: cycleState.when( data: (cycles) { - // If cycles are updated, recalculate the events and UI elements - if (cycles.isNotEmpty) { + bool isNewUser = cycles.isEmpty; + if (!isNewUser) { Cycle latestCycle = cycles.values.last; _periodStart = latestCycle.period_start; _periodEnd = latestCycle.period_end; @@ -259,32 +223,48 @@ class _PeriodPlannerScreenState extends ConsumerState { _nextPeriodEnd = latestCycle.predicted_period_end; events = EventUtils.generateEvents(cycles); } - int daysToOvulation = _ovulationDate.difference(_currentDate).inDays; - int daysToNextPeriod = - _nextPeriodStart.difference(_currentDate).inDays; - int overdueDays = _currentDate.difference(_nextPeriodEnd).inDays; + // If cycles are updated, recalculate the events and UI elements + int daysToOvulation = _ovulationDate != null + ? _ovulationDate!.difference(_currentDate).inDays + : 0; + int daysToNextPeriod = _nextPeriodStart != null + ? _nextPeriodStart!.difference(_currentDate).inDays + : 0; + int overdueDays = _nextPeriodEnd != null + ? _currentDate.difference(_nextPeriodEnd!).inDays + : 0; //int predictedDays = _nextPeriodEnd.difference(_nextPeriodStart).inDays; - bool isInPeriod = (isSameDay(_currentDate, _periodStart) || - _currentDate.isAfter(_periodStart)) && - _currentDate.isBefore(_periodEnd); - bool veryCloseToPeriod = - _currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod == 0; - bool isCloseToOvulation = _currentDate.isBefore(_ovulationDate) && + bool isInPeriod = (_periodStart != null && + (_currentDate.isAfter(_periodStart!) || + isSameDay(_currentDate, _periodStart!))) && + (_periodEnd != null && _currentDate.isBefore(_periodEnd!)); + + bool veryCloseToPeriod = _nextPeriodStart != null && + _currentDate.isBefore(_nextPeriodStart!) && + daysToNextPeriod == 0; + bool isCloseToOvulation = _ovulationDate != null && + _currentDate.isBefore(_ovulationDate!) && !isInPeriod && daysToOvulation >= 1; - bool veryCloseToOvulation = - _currentDate.isBefore(_ovulationDate) && daysToOvulation == 0; - bool isOvulation = (isSameDay(_currentDate, _ovulationDate)) || - (_currentDate.isAfter(_ovulationDate) && daysToOvulation == 0); - bool afterOvulation = _currentDate.isAfter(_ovulationDate) && - (_currentDate.isBefore(_nextPeriodStart) && daysToNextPeriod > 0); + bool veryCloseToOvulation = _ovulationDate != null && + _currentDate.isBefore(_ovulationDate!) && + daysToOvulation == 0; + bool isOvulation = _ovulationDate != null && + (isSameDay(_currentDate, _ovulationDate!)) || + (_currentDate.isAfter(_ovulationDate!) && daysToOvulation == 0); + bool afterOvulation = + (_ovulationDate != null && _nextPeriodStart != null) && + _currentDate.isAfter(_ovulationDate!) && + (_currentDate.isBefore(_nextPeriodStart!) && + daysToNextPeriod > 0); bool duringPredictedPeriodRange = - _currentDate.isAfter(_nextPeriodStart) && - _currentDate.isBefore(_nextPeriodEnd) || - isSameDay(_currentDate, _nextPeriodStart) || - isSameDay(_currentDate, _nextPeriodEnd); - bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd); + (_nextPeriodStart != null && _nextPeriodEnd != null) && + (_currentDate.isAfter(_nextPeriodStart!) && + _currentDate.isBefore(_nextPeriodEnd!)) || + (isSameDay(_currentDate, _nextPeriodStart!) || + isSameDay(_currentDate, _nextPeriodEnd!)); + bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd!); bool inPeriods = isInPeriod; @@ -299,7 +279,7 @@ class _PeriodPlannerScreenState extends ConsumerState { progressValue = 0.2; title = 'Period'; message = - 'Day ${DateTime.now().difference(_periodStart).inDays + 1}'; + 'Day ${DateTime.now().difference(_periodStart!).inDays + 1}'; buttonText = 'Period End'; chances = 'Low'; } else if (isCloseToOvulation) { @@ -344,6 +324,12 @@ class _PeriodPlannerScreenState extends ConsumerState { message = '$overdueDays Day${overdueDays > 1 ? 's' : ''}'; buttonText = 'Period Start'; chances = 'High'; + } else if (isNewUser) { + progressValue = 1.0; + title = "Welcome"; + message = "Let's kickstart your predictions."; + buttonText = 'Get Started'; + chances = ""; } return Column( children: [ @@ -364,14 +350,15 @@ class _PeriodPlannerScreenState extends ConsumerState { padding: const EdgeInsets.all(16.0), child: Column( children: [ - const Text( - "Your Chances of Getting Pregnant are:", - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, + if (!isNewUser) + const Text( + "Your Chances of Getting Pregnant are:", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), ), - // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), - ), Text( chances, style: TextStyle( @@ -442,7 +429,8 @@ class _PeriodPlannerScreenState extends ConsumerState { ElevatedButton( onPressed: () { //Logging Start of new period - if (buttonText == 'Period Start') { + if (buttonText == 'Period Start' || + buttonText == 'Get Started') { ref .read(cyclesProvider.notifier) .fetchCycles() @@ -495,8 +483,8 @@ class _PeriodPlannerScreenState extends ConsumerState { final updatedCycle = predictCycle( - _periodStart, - _periodEnd, + _periodStart!, + _periodEnd!, cycleId: cycleId, cycle: cycles, ); @@ -531,10 +519,12 @@ class _PeriodPlannerScreenState extends ConsumerState { cycles[secondLastCycleId]! .period_end; - final updateSecondLastCycle = predictCycle( - secondLastPeriodStart, - secondLastPeriodEnd, - cycleId: secondLastCycleId, + final updateSecondLastCycle = + predictCycle( + secondLastPeriodStart, + secondLastPeriodEnd, + cycleId: + secondLastCycleId, cycle: cycles, ); diff --git a/lib/src/features/period_planner/presentation/pages/periods_history.dart b/lib/src/features/period_planner/presentation/pages/periods_history.dart index 4134261e..58e265e5 100644 --- a/lib/src/features/period_planner/presentation/pages/periods_history.dart +++ b/lib/src/features/period_planner/presentation/pages/periods_history.dart @@ -220,6 +220,49 @@ class _PeriodsHistoryState extends ConsumerState { borderRadius: BorderRadius.circular(12.0), ), child: ListTile( + leading: IconButton( + onPressed: () { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text( + "Confirm Delete"), + content: const Text( + "Are you sure you want to delete the current Cycle?"), + actions: [ + TextButton( + onPressed: () { + try { + ref + .read(cyclesProvider + .notifier) + .deleteCycle( + cycleId) + .then((_) { + Navigator.pop( + context); + }); + } catch (e) { + debugPrint( + 'Error deleting cycle: $e'); + } + }, + child: const Text("Yes"), + ), + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text("No"), + ), + ], + ); + }, + ); + }, + icon: const Icon(Icons.delete_outline), + ), title: Text( "$start - $end", style: const TextStyle( diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 17df4c14..50e37876 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -46,11 +46,12 @@ List _menuItems(BuildContext context, WidgetRef ref) => [ ref.read(cyclesProvider.notifier).fetchCycles() .then((cycles) { if (cycles.isEmpty) { - context.goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + context.goNamed(RouteNames.NEW_USER_SCREEN); } else { context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); } + // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); }); }, color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 295063dc..6f44ff42 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -68,6 +68,7 @@ class RouteNames { static const PERIOD_PLANNER_LOG_PERIODS = "period-planner-log-periods"; static const PERIOD_PLANNER_EDIT_PERIODS = "period-planner-edit-periods"; static const PERIOD_PLANNER_PERIOD_HISTORY = "period-planner-period-history"; + static const NEW_USER_SCREEN = "new-user-screen"; static const CHAT_HCW = "chat-hcw"; static const CHAT_DETAIL = "chat-detail"; static const CHAT_USER = "chat-user"; From 3308206185c19963c0844fbf8347d02ba542e9f8 Mon Sep 17 00:00:00 2001 From: Eugene600 Date: Mon, 30 Sep 2024 15:34:29 +0300 Subject: [PATCH 094/140] Removed new user screen and instaed added a condition for displaying a separate screen for a new user in periodPlannerScreen. --- lib/src/app/navigation/app_router.dart | 7 - .../presentation/pages/editPeriodsScreen.dart | 3 - .../presentation/pages/new_user_screen.dart | 304 +++--- .../pages/periodPlannerScreen.dart | 977 ++++++++++-------- .../presentation/widgets/customCalendar.dart | 1 - .../presentation/widgets/feature_tile.dart | 22 + .../pages/self_screening_menu.dart | 14 +- lib/src/utils/routes.dart | 1 - 8 files changed, 729 insertions(+), 600 deletions(-) create mode 100644 lib/src/features/period_planner/presentation/widgets/feature_tile.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 0c819657..01c4d7d6 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -514,13 +514,6 @@ final List selfScreeningRoutes = [ ), ], ), - GoRoute( - name: RouteNames.NEW_USER_SCREEN, - path: 'new-user-screen', - builder: (BuildContext context, GoRouterState state) { - return const NewUserScreen(); - }, - ), GoRoute( name: RouteNames.INSIGHT, path: 'insight', diff --git a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart index 103680b0..76b44166 100644 --- a/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/editPeriodsScreen.dart @@ -53,9 +53,6 @@ class _EditPeriodsState extends ConsumerState { return cycleAsyncValue.when( data: (cycles) { - final cycleId = cycles.keys; - final cycleList = cycles.values; - return Scaffold( body: Column( children: [ diff --git a/lib/src/features/period_planner/presentation/pages/new_user_screen.dart b/lib/src/features/period_planner/presentation/pages/new_user_screen.dart index 2d917e0e..f29c1a4b 100644 --- a/lib/src/features/period_planner/presentation/pages/new_user_screen.dart +++ b/lib/src/features/period_planner/presentation/pages/new_user_screen.dart @@ -1,168 +1,150 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; -import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; -import 'package:table_calendar/table_calendar.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_riverpod/flutter_riverpod.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +// import 'package:nishauri/src/features/period_planner/presentation/widgets/feature_tile.dart'; +// import 'package:nishauri/src/shared/display/CustomeAppBar.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// import 'package:nishauri/src/utils/routes.dart'; +// import 'package:table_calendar/table_calendar.dart'; -import '../../data/models/events.dart'; +// import '../../data/models/events.dart'; -class NewUserScreen extends ConsumerStatefulWidget { - const NewUserScreen({super.key}); +// class NewUserScreen extends ConsumerStatefulWidget { +// const NewUserScreen({super.key}); - @override - ConsumerState createState() => _NewUserScreenState(); -} +// @override +// ConsumerState createState() => _NewUserScreenState(); +// } -class _NewUserScreenState extends ConsumerState { - Map>> events = {}; +// class _NewUserScreenState extends ConsumerState { +// Map>> events = {}; - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Scaffold( - body: Column( - children: [ - const CustomAppBar( - title: "My Flow Tracker 🌺", - color: Constants.periodPlanner, - ), - Expanded( - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Welcome, we are so please to have you.", - style: TextStyle( - color: Constants.periodPlanner, - fontWeight: FontWeight.bold, - fontSize: 18), - ), - ], - ), - const SizedBox( - height: 20, - ), - Stack( - alignment: Alignment.center, - children: [ - const SizedBox( - width: 300, // Adjust the width as needed - height: 300, // Adjust the height as needed - child: CircularProgressIndicator( - value: 0.5, - strokeWidth: 20, - backgroundColor: Colors.grey, - valueColor: AlwaysStoppedAnimation( - Constants.periodPlanner, - ), - ), - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - "Welcome", - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: Constants.SPACING), - const Text( - "Click below to get Started", - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: Constants.SPACING), - ElevatedButton( - onPressed: () { - context.goNamed( - RouteNames.PERIOD_PLANNER_LOG_PERIODS); - }, - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: Constants.periodPlanner, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - padding: const EdgeInsets.symmetric( - horizontal: 20, vertical: 10), - ), - child: const Text("Get Started"), - ), - ], - ), - ], - ), - const SizedBox( - height: 20), // Added spacing to avoid overlap - const Padding( - padding: EdgeInsets.all(20.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Features', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - ), - SizedBox(height: 10.0), - FeatureTile( - title: 'Track Your Period', - description: - 'Keep an accurate record of your menstrual cycles to better understand your health.', - icon: Icons.track_changes, - ), - FeatureTile( - title: 'Period Calendar', - description: - 'View and manage your menstrual cycles with a detailed calendar.', - icon: Icons.calendar_today, - ), - ], - ), - ), - ], - ), - ), - ), - ), - ], - ), - ); - } -} +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return Scaffold( +// body: Column( +// children: [ +// const CustomAppBar( +// title: "My Flow Tracker 🌺", +// color: Constants.periodPlanner, +// ), +// Expanded( +// child: SingleChildScrollView( +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: Column( +// // crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// const Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Text( +// "Welcome, we are so please to have you.", +// style: TextStyle( +// color: Constants.periodPlanner, +// fontWeight: FontWeight.bold, +// fontSize: 18), +// ), +// ], +// ), +// const SizedBox( +// height: 20, +// ), +// Stack( +// alignment: Alignment.center, +// children: [ +// const SizedBox( +// width: 300, // Adjust the width as needed +// height: 300, // Adjust the height as needed +// child: CircularProgressIndicator( +// value: 0.5, +// strokeWidth: 20, +// backgroundColor: Colors.grey, +// valueColor: AlwaysStoppedAnimation( +// Constants.periodPlanner, +// ), +// ), +// ), +// Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// const Text( +// "Welcome", +// style: TextStyle( +// fontSize: 18, +// fontWeight: FontWeight.bold, +// ), +// ), +// const SizedBox(height: Constants.SPACING), +// const Text( +// "Click below to get Started", +// style: TextStyle( +// fontSize: 18, +// fontWeight: FontWeight.bold, +// ), +// ), +// const SizedBox(height: Constants.SPACING), +// ElevatedButton( +// onPressed: () { +// context.goNamed( +// RouteNames.PERIOD_PLANNER_LOG_PERIODS); +// }, +// style: ElevatedButton.styleFrom( +// foregroundColor: Colors.black, +// backgroundColor: Constants.periodPlanner, +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(20), +// ), +// padding: const EdgeInsets.symmetric( +// horizontal: 20, vertical: 10), +// ), +// child: const Text("Get Started"), +// ), +// ], +// ), +// ], +// ), +// const SizedBox( +// height: 20), // Added spacing to avoid overlap +// const Padding( +// padding: EdgeInsets.all(20.0), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Text( +// 'Features', +// style: TextStyle( +// fontSize: 20.0, +// fontWeight: FontWeight.bold, +// ), +// ), +// SizedBox(height: 10.0), +// FeatureTile( +// title: 'Track Your Period', +// description: +// 'Keep an accurate record of your menstrual cycles to better understand your health.', +// icon: Icons.track_changes, +// ), +// FeatureTile( +// title: 'Period Calendar', +// description: +// 'View and manage your menstrual cycles with a detailed calendar.', +// icon: Icons.calendar_today, +// ), +// ], +// ), +// ), +// ], +// ), +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } -class FeatureTile extends StatelessWidget { - final String title; - final String description; - final IconData icon; - const FeatureTile({ - required this.title, - required this.description, - required this.icon, - }); - - @override - Widget build(BuildContext context) { - return ListTile( - leading: Icon(icon), - title: Text(title), - subtitle: Text(description), - ); - } -} diff --git a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart index c2ba1147..2db1de60 100644 --- a/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart +++ b/lib/src/features/period_planner/presentation/pages/periodPlannerScreen.dart @@ -9,6 +9,7 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/logPerio import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/carouselCard.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/customCalendar.dart'; +import 'package:nishauri/src/features/period_planner/presentation/widgets/feature_tile.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/logItems.dart'; import 'package:nishauri/src/features/period_planner/presentation/widgets/loggerWidget.dart'; import 'package:nishauri/src/features/period_planner/utils/event_utils.dart'; @@ -202,14 +203,6 @@ class _PeriodPlannerScreenState extends ConsumerState { final cycleState = ref.watch(cyclesProvider); final theme = Theme.of(context); - //Debug prints to trace the logic - // debugPrint('Current Date: $_currentDate'); - // debugPrint('Period Start: $_periodStart'); - // debugPrint('Period End: $_periodEnd'); - // debugPrint('Is In Period: $isInPeriod'); - // debugPrint('-----Widget Rebuild-----'); - // debugPrint('Is In Period: $isInPeriod'); - // debugPrint('Is close to Ovulation: $isCloseToOvulation'); return Scaffold( body: cycleState.when( data: (cycles) { @@ -222,443 +215,587 @@ class _PeriodPlannerScreenState extends ConsumerState { _nextPeriodStart = latestCycle.predicted_period_start; _nextPeriodEnd = latestCycle.predicted_period_end; events = EventUtils.generateEvents(cycles); - } - // If cycles are updated, recalculate the events and UI elements - int daysToOvulation = _ovulationDate != null - ? _ovulationDate!.difference(_currentDate).inDays - : 0; - int daysToNextPeriod = _nextPeriodStart != null - ? _nextPeriodStart!.difference(_currentDate).inDays - : 0; - int overdueDays = _nextPeriodEnd != null - ? _currentDate.difference(_nextPeriodEnd!).inDays - : 0; - //int predictedDays = _nextPeriodEnd.difference(_nextPeriodStart).inDays; - - bool isInPeriod = (_periodStart != null && - (_currentDate.isAfter(_periodStart!) || - isSameDay(_currentDate, _periodStart!))) && - (_periodEnd != null && _currentDate.isBefore(_periodEnd!)); - - bool veryCloseToPeriod = _nextPeriodStart != null && - _currentDate.isBefore(_nextPeriodStart!) && - daysToNextPeriod == 0; - bool isCloseToOvulation = _ovulationDate != null && - _currentDate.isBefore(_ovulationDate!) && - !isInPeriod && - daysToOvulation >= 1; - bool veryCloseToOvulation = _ovulationDate != null && - _currentDate.isBefore(_ovulationDate!) && - daysToOvulation == 0; - bool isOvulation = _ovulationDate != null && - (isSameDay(_currentDate, _ovulationDate!)) || - (_currentDate.isAfter(_ovulationDate!) && daysToOvulation == 0); - bool afterOvulation = - (_ovulationDate != null && _nextPeriodStart != null) && - _currentDate.isAfter(_ovulationDate!) && - (_currentDate.isBefore(_nextPeriodStart!) && - daysToNextPeriod > 0); - bool duringPredictedPeriodRange = - (_nextPeriodStart != null && _nextPeriodEnd != null) && - (_currentDate.isAfter(_nextPeriodStart!) && - _currentDate.isBefore(_nextPeriodEnd!)) || - (isSameDay(_currentDate, _nextPeriodStart!) || - isSameDay(_currentDate, _nextPeriodEnd!)); - bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd!); - - bool inPeriods = isInPeriod; - - // Determine progress value and messages based on the current date - double progressValue = 0.0; - String message = ''; - String buttonText = ''; - String title = ''; - String chances = ''; - - if (isInPeriod) { - progressValue = 0.2; - title = 'Period'; - message = - 'Day ${DateTime.now().difference(_periodStart!).inDays + 1}'; - buttonText = 'Period End'; - chances = 'Low'; - } else if (isCloseToOvulation) { - progressValue = 0.3; - title = 'Ovulation in'; - message = '$daysToOvulation day${daysToOvulation > 1 ? 's' : ''}'; - buttonText = 'Period Start'; - chances = 'High'; - } else if (veryCloseToOvulation) { - progressValue = 0.4; - title = 'Ovulation is'; - message = 'Tomorrow'; - buttonText = 'Period Start'; - chances = 'High'; - } else if (isOvulation) { - progressValue = 0.5; - title = 'Ovulation is'; - message = 'Today'; - buttonText = 'Period Start'; - chances = 'High'; - } else if (afterOvulation) { - progressValue = 0.7; - title = 'Next Period in'; - message = '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's' : ''}'; - buttonText = 'Period Start'; - chances = 'Low'; - } else if (veryCloseToPeriod) { - progressValue = 0.7; - title = 'Next Period is'; - message = 'Tomorrow'; - buttonText = 'Period Start'; - chances = 'Low'; - } else if (duringPredictedPeriodRange) { - progressValue = 1.0; - title = 'Periods May happen'; - message = 'Today'; - buttonText = 'Period Start'; - chances = 'Low'; - } else if (isDangerZone) { - progressValue = 1.0; - title = 'Periods Overdue by'; - message = '$overdueDays Day${overdueDays > 1 ? 's' : ''}'; - buttonText = 'Period Start'; - chances = 'High'; - } else if (isNewUser) { - progressValue = 1.0; - title = "Welcome"; - message = "Let's kickstart your predictions."; - buttonText = 'Get Started'; - chances = ""; - } - return Column( - children: [ - const CustomAppBar( - title: "My Flow Tracker 🌺", - color: Constants.periodPlanner, - ), - //const SizedBox(height: Constants.SPACING), - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Card( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - if (!isNewUser) - const Text( - "Your Chances of Getting Pregnant are:", + + // If cycles are updated, recalculate the events and UI elements + int daysToOvulation = _ovulationDate != null + ? _ovulationDate!.difference(_currentDate).inDays + : 0; + + int daysToNextPeriod = _nextPeriodStart != null + ? _nextPeriodStart!.difference(_currentDate).inDays + : 0; + + int overdueDays = _nextPeriodEnd != null + ? _currentDate.difference(_nextPeriodEnd!).inDays + : 0; + //int predictedDays = _nextPeriodEnd.difference(_nextPeriodStart).inDays; + + bool isInPeriod = (_periodStart != null && + (_currentDate.isAfter(_periodStart!) || + isSameDay(_currentDate, _periodStart!))) && + (_periodEnd != null && _currentDate.isBefore(_periodEnd!)); + + bool veryCloseToPeriod = _nextPeriodStart != null && + _currentDate.isBefore(_nextPeriodStart!) && + daysToNextPeriod == 0; + + bool isCloseToOvulation = _ovulationDate != null && + _currentDate.isBefore(_ovulationDate!) && + !isInPeriod && + daysToOvulation >= 1; + + bool veryCloseToOvulation = _ovulationDate != null && + _currentDate.isBefore(_ovulationDate!) && + daysToOvulation == 0; + + bool isOvulation = _ovulationDate != null && + (isSameDay(_currentDate, _ovulationDate!)) || + (_currentDate.isAfter(_ovulationDate!) && daysToOvulation == 0); + + bool afterOvulation = + (_ovulationDate != null && _nextPeriodStart != null) && + _currentDate.isAfter(_ovulationDate!) && + (_currentDate.isBefore(_nextPeriodStart!) && + daysToNextPeriod > 0); + + bool duringPredictedPeriodRange = + (_nextPeriodStart != null && _nextPeriodEnd != null) && + (_currentDate.isAfter(_nextPeriodStart!) && + _currentDate.isBefore(_nextPeriodEnd!)) || + (isSameDay(_currentDate, _nextPeriodStart!) || + isSameDay(_currentDate, _nextPeriodEnd!)); + + bool isDangerZone = _currentDate.isAfter(_nextPeriodEnd!); + + bool inPeriods = isInPeriod; + + // Determine progress value and messages based on the current date + double progressValue = 0.0; + String message = ''; + String buttonText = ''; + String title = ''; + String chances = ''; + + if (isInPeriod) { + progressValue = 0.2; + title = 'Period'; + message = + 'Day ${DateTime.now().difference(_periodStart!).inDays + 1}'; + buttonText = 'Period End'; + chances = 'Low'; + } else if (isCloseToOvulation) { + progressValue = 0.3; + title = 'Ovulation in'; + message = '$daysToOvulation day${daysToOvulation > 1 ? 's' : ''}'; + buttonText = 'Period Start'; + chances = 'High'; + } else if (veryCloseToOvulation) { + progressValue = 0.4; + title = 'Ovulation is'; + message = 'Tomorrow'; + buttonText = 'Period Start'; + chances = 'High'; + } else if (isOvulation) { + progressValue = 0.5; + title = 'Ovulation is'; + message = 'Today'; + buttonText = 'Period Start'; + chances = 'High'; + } else if (afterOvulation) { + progressValue = 0.7; + title = 'Next Period in'; + message = + '$daysToNextPeriod day${daysToNextPeriod > 1 ? 's' : ''}'; + buttonText = 'Period Start'; + chances = 'Low'; + } else if (veryCloseToPeriod) { + progressValue = 0.7; + title = 'Next Period is'; + message = 'Tomorrow'; + buttonText = 'Period Start'; + chances = 'Low'; + } else if (duringPredictedPeriodRange) { + progressValue = 1.0; + title = 'Periods May happen'; + message = 'Today'; + buttonText = 'Period Start'; + chances = 'Low'; + } else if (isDangerZone) { + progressValue = 1.0; + title = 'Periods Overdue by'; + message = '$overdueDays Day${overdueDays > 1 ? 's' : ''}'; + buttonText = 'Period Start'; + chances = 'High'; + } + // else if (isNewUser) { + // progressValue = 1.0; + // title = "Welcome"; + // message = "Let's kickstart your predictions."; + // buttonText = 'Get Started'; + // chances = ""; + // } + return Column( + children: [ + const CustomAppBar( + title: "My Flow Tracker 🌺", + color: Constants.periodPlanner, + ), + //const SizedBox(height: Constants.SPACING), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Card( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + if (!isNewUser) + const Text( + "Your Chances of Getting Pregnant are:", + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), + ), + Text( + chances, style: TextStyle( - fontSize: 14, + fontSize: 34, + color: chances == 'High' + ? Colors.red + : Colors.blue, fontWeight: FontWeight.bold, ), - // style: theme.textTheme.titleLarge?.copyWith(color: Colors.black), ), - Text( - chances, - style: TextStyle( - fontSize: 34, - color: chances == 'High' - ? Colors.red - : Colors.blue, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - )), - const SizedBox(height: Constants.SPACING), - SizedBox( - height: 150, - child: CustomCalendar( - key: ValueKey(events), - initialFormat: CalendarFormat.week, - events: events, - headerButton: true, - inPeriods: inPeriods, + ], + ), + )), + const SizedBox(height: Constants.SPACING), + SizedBox( + height: 150, + child: CustomCalendar( + key: ValueKey(events), + initialFormat: CalendarFormat.week, + events: events, + headerButton: true, + inPeriods: inPeriods, + ), ), - ), - const SizedBox(height: Constants.SPACING), - Stack( - alignment: Alignment.center, - children: [ - SizedBox( - width: 300, // Adjust the width as needed - height: 300, // Adjust the height as needed - child: CircularProgressIndicator( - value: progressValue, - strokeWidth: 20, - backgroundColor: Colors.grey, - valueColor: AlwaysStoppedAnimation( - isDangerZone - ? Colors.red - : Constants.periodPlanner, + const SizedBox(height: Constants.SPACING), + Stack( + alignment: Alignment.center, + children: [ + SizedBox( + width: 300, // Adjust the width as needed + height: 300, // Adjust the height as needed + child: CircularProgressIndicator( + value: progressValue, + strokeWidth: 20, + backgroundColor: Colors.grey, + valueColor: AlwaysStoppedAnimation( + isDangerZone + ? Colors.red + : Constants.periodPlanner, + ), ), ), - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (isDangerZone) - const SizedBox( - height: Constants.SPACING + 20), - Text( - title, - style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (isDangerZone) + const SizedBox( + height: Constants.SPACING + 20), + Text( + title, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), - ), - const SizedBox(height: Constants.SPACING), - Text( - message, - style: TextStyle( - fontSize: 38, - color: isDangerZone - ? Colors.red - : Constants.periodPlanner, - fontWeight: FontWeight.bold), - ), - const SizedBox(height: Constants.SPACING + 10), - if (buttonText.isNotEmpty) - ElevatedButton( - onPressed: () { - //Logging Start of new period - if (buttonText == 'Period Start' || - buttonText == 'Get Started') { - ref - .read(cyclesProvider.notifier) - .fetchCycles() - .then((_) { - context.goNamed(RouteNames - .PERIOD_PLANNER_LOG_PERIODS); - }); - } - //Logging end of new period - else { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: const Text( - 'Confirming End of Period'), - content: const Text( - 'Are you sure you want to log the end of your period?'), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.of(context) - .pop(); // Close the dialog - }, - ), - TextButton( - child: const Text('Confirm'), - onPressed: () { - setState(() { - // Log the period start here - isCloseToOvulation = true; - isInPeriod = false; - _currentDate = - DateTime.now(); - _periodEnd = _currentDate; - }); - //printCycles(cycles); - // Debug print to check the state update - // debugPrint("After User has logged end of Period"); - // debugPrint('Period Start after update: $_periodStart'); - // debugPrint('Period End after update: $_periodEnd'); - // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); - // debugPrint('Current Date after update: $_currentDate'); - // debugPrint('Is In Period after update: $isInPeriod'); - // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); - // debugPrint("--------"); - final cycleId = - cycles.keys.last; - - final updatedCycle = - predictCycle( - _periodStart!, - _periodEnd!, - cycleId: cycleId, - cycle: cycles, - ); - periodConfirmedMap[ - cycleId] = true; - - updateCycleLengths(cycles); - - final sortedCycleKeys = cycles - .keys - .toList() - ..sort((a, b) => cycles[ - a]! - .period_start - .compareTo(cycles[b]! - .period_start)); - - final secondLastCycleId = - sortedCycleKeys[ - sortedCycleKeys - .length - - 2]; - - // final secondLastCycle = - // cycles[ - // secondLastCycleId]!; - - final secondLastPeriodStart = - cycles[secondLastCycleId]! - .period_start; - final secondLastPeriodEnd = - cycles[secondLastCycleId]! - .period_end; - - final updateSecondLastCycle = - predictCycle( - secondLastPeriodStart, - secondLastPeriodEnd, - cycleId: - secondLastCycleId, - cycle: cycles, - ); - - ref - .read(cyclesProvider - .notifier) - .editCycle(cycleId, - updatedCycle) - .then((_) { - // Navigator.of(context) - // .pop(); + const SizedBox(height: Constants.SPACING), + Text( + message, + style: TextStyle( + fontSize: 38, + color: isDangerZone + ? Colors.red + : Constants.periodPlanner, + fontWeight: FontWeight.bold), + ), + const SizedBox( + height: Constants.SPACING + 10), + if (buttonText.isNotEmpty) + ElevatedButton( + onPressed: () { + //Logging Start of new period + if (buttonText == 'Period Start' || + buttonText == 'Get Started') { + ref + .read(cyclesProvider.notifier) + .fetchCycles() + .then((_) { + context.goNamed(RouteNames + .PERIOD_PLANNER_LOG_PERIODS); + }); + } + //Logging end of new period + else { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text( + 'Confirming End of Period'), + content: const Text( + 'Are you sure you want to log the end of your period?'), + actions: [ + TextButton( + child: const Text('Cancel'), + onPressed: () { + Navigator.of(context) + .pop(); // Close the dialog + }, + ), + TextButton( + child: + const Text('Confirm'), + onPressed: () { + setState(() { + // Log the period start here + isCloseToOvulation = + true; + isInPeriod = false; + _currentDate = + DateTime.now(); + _periodEnd = + _currentDate; + }); + //printCycles(cycles); + // Debug print to check the state update + // debugPrint("After User has logged end of Period"); + // debugPrint('Period Start after update: $_periodStart'); + // debugPrint('Period End after update: $_periodEnd'); + // debugPrint('Predicted Next Period Date after update: $_nextPeriodStart'); + // debugPrint('Current Date after update: $_currentDate'); + // debugPrint('Is In Period after update: $isInPeriod'); + // debugPrint('Is Close to Ovulation after update: $isCloseToOvulation'); + // debugPrint("--------"); + final cycleId = + cycles.keys.last; + + final updatedCycle = + predictCycle( + _periodStart!, + _periodEnd!, + cycleId: cycleId, + cycle: cycles, + ); + periodConfirmedMap[ + cycleId] = true; + + updateCycleLengths( + cycles); + + final sortedCycleKeys = cycles + .keys + .toList() + ..sort((a, b) => cycles[ + a]! + .period_start + .compareTo(cycles[ + b]! + .period_start)); + + final secondLastCycleId = + sortedCycleKeys[ + sortedCycleKeys + .length - + 2]; + + // final secondLastCycle = + // cycles[ + // secondLastCycleId]!; + + final secondLastPeriodStart = + cycles[secondLastCycleId]! + .period_start; + final secondLastPeriodEnd = + cycles[secondLastCycleId]! + .period_end; + + final updateSecondLastCycle = + predictCycle( + secondLastPeriodStart, + secondLastPeriodEnd, + cycleId: + secondLastCycleId, + cycle: cycles, + ); + ref .read(cyclesProvider .notifier) - .editCycle( - secondLastCycleId, - updateSecondLastCycle) + .editCycle(cycleId, + updatedCycle) .then((_) { - Navigator.of(context) - .pop(); + // Navigator.of(context) + // .pop(); + ref + .read(cyclesProvider + .notifier) + .editCycle( + secondLastCycleId, + updateSecondLastCycle) + .then((_) { + Navigator.of(context) + .pop(); + }); }); - }); - }, - ), - ], - ); - }, - ); - } - }, - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, - backgroundColor: isDangerZone - ? Colors.red - : Constants.periodPlanner, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), + }, + ), + ], + ); + }, + ); + } + }, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: isDangerZone + ? Colors.red + : Constants.periodPlanner, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), + ), + child: Text( + buttonText, + style: const TextStyle(fontSize: 18), ), - padding: const EdgeInsets.symmetric( - horizontal: 20, vertical: 10), - ), - child: Text( - buttonText, - style: const TextStyle(fontSize: 18), ), - ), - const SizedBox(height: 10), - //where to put the icon button - if (isDangerZone) - IconButton( - onPressed: () { - _overdueDialog(); - }, - icon: const Icon( - Icons.info_sharp, - color: Colors.blue, - size: 40, + const SizedBox(height: 10), + //where to put the icon button + if (isDangerZone) + IconButton( + onPressed: () { + _overdueDialog(); + }, + icon: const Icon( + Icons.info_sharp, + color: Colors.blue, + size: 40, + ), ), - ), - ], - ), - ], + ], + ), + ], + ), + //const SizedBox(height: 20,), + // const Text( + // "Please give your Daily Insights:", + // style: TextStyle( + // fontWeight: FontWeight.bold, + // fontSize: 15.0, + // color: Constants.periodPlanner, + // ), + // ), + // CarouselSlider( + // options: CarouselOptions( + // height: 150, + // enlargeCenterPage: true, + // enableInfiniteScroll: false, + // initialPage: 0, + // autoPlay: false, + // ), + // items: [ + // CarouselCard( + // svgPath: "assets/images/symptoms.svg", + // title: "Symptoms", + // destination: LoggerWidget( + // heading: "Log Symptoms", + // items: LogItems.getSymptoms(), + // ) + // ), + // CarouselCard( + // svgPath: "assets/images/discharge1.svg", + // title: "Discharge", + // destination: LoggerWidget( + // heading: "Log Discharge", + // items: LogItems.getDischarge(), + // ) + // ), + // CarouselCard( + // svgPath: "assets/images/moods1.svg", + // title: "Mood", + // destination: LoggerWidget( + // heading: "How are you feeling?", + // items: LogItems.getMoods(), + // ), + // ), + // ], + // ), + ], + ), + ), + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + context + .goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); + }, + child: Text( + 'Periods History', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, ), - //const SizedBox(height: 20,), - // const Text( - // "Please give your Daily Insights:", - // style: TextStyle( - // fontWeight: FontWeight.bold, - // fontSize: 15.0, - // color: Constants.periodPlanner, - // ), - // ), - // CarouselSlider( - // options: CarouselOptions( - // height: 150, - // enlargeCenterPage: true, - // enableInfiniteScroll: false, - // initialPage: 0, - // autoPlay: false, - // ), - // items: [ - // CarouselCard( - // svgPath: "assets/images/symptoms.svg", - // title: "Symptoms", - // destination: LoggerWidget( - // heading: "Log Symptoms", - // items: LogItems.getSymptoms(), - // ) - // ), - // CarouselCard( - // svgPath: "assets/images/discharge1.svg", - // title: "Discharge", - // destination: LoggerWidget( - // heading: "Log Discharge", - // items: LogItems.getDischarge(), - // ) - // ), - // CarouselCard( - // svgPath: "assets/images/moods1.svg", - // title: "Mood", - // destination: LoggerWidget( - // heading: "How are you feeling?", - // items: LogItems.getMoods(), - // ), - // ), - // ], - // ), - ], + ), ), ), ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Constants.periodPlanner, + ], + ); + } else { + /* + This is a scenario whereby either the user is a first time user + or the user has deleted all their cycles from their history + */ + _periodStart = null; + _periodEnd = null; + _nextPeriodStart = null; + _nextPeriodEnd = null; + events = EventUtils.generateEvents(cycles); + + return Column( + children: [ + const CustomAppBar( + title: "My Flow Tracker 🌺", + color: Constants.periodPlanner, + ), + const Padding( + padding: EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + "Let's kickstart your predictions.", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ), + ], + ), + ), + const SizedBox(height: Constants.SPACING + 30), + Stack( + alignment: Alignment.center, + children: [ + const SizedBox( + width: 300, // Adjust the width as needed + height: 300, // Adjust the height as needed + child: CircularProgressIndicator( + value: 0.5, + strokeWidth: 20, + backgroundColor: Colors.grey, + valueColor: AlwaysStoppedAnimation( + Constants.periodPlanner, + ), + ), ), - onPressed: () { - context.goNamed(RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); - }, - child: Text( - 'Periods History', - style: theme.textTheme.titleSmall?.copyWith( - color: Colors.white, + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + "Welcome", + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: Constants.SPACING), + const Text( + "Click below to Get Started", + style: TextStyle( + fontSize: 19, + color: Constants.periodPlanner, + fontWeight: FontWeight.bold), + ), + const SizedBox(height: Constants.SPACING + 10), + ElevatedButton( + onPressed: () { + context + .goNamed(RouteNames.PERIOD_PLANNER_LOG_PERIODS); + }, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, + backgroundColor: Constants.periodPlanner, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), + ), + child: const Text("Get Started"), + ), + ], + ), + ], + ), + const SizedBox(height: 20), + const FeatureTile( + title: 'Track Your Period', + description: + 'Keep an accurate record of your menstrual cycles to better understand your health.', + icon: Icons.track_changes, + ), + const FeatureTile( + title: 'Period Calendar', + description: + 'View and manage your menstrual cycles with a detailed calendar.', + icon: Icons.calendar_today, + ), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Constants.periodPlanner, + ), + onPressed: () { + context.goNamed( + RouteNames.PERIOD_PLANNER_PERIOD_HISTORY); + }, + child: Text( + 'Periods History', + style: theme.textTheme.titleSmall?.copyWith( + color: Colors.white, + ), + ), ), ), ), ), - ), - ], - ); + ], + ); + } }, error: (error, stackTrace) => Center( child: Text( diff --git a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart index 00fafac0..61987f7b 100644 --- a/lib/src/features/period_planner/presentation/widgets/customCalendar.dart +++ b/lib/src/features/period_planner/presentation/widgets/customCalendar.dart @@ -1,5 +1,4 @@ import 'dart:ffi'; - import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; diff --git a/lib/src/features/period_planner/presentation/widgets/feature_tile.dart b/lib/src/features/period_planner/presentation/widgets/feature_tile.dart new file mode 100644 index 00000000..144afc51 --- /dev/null +++ b/lib/src/features/period_planner/presentation/widgets/feature_tile.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class FeatureTile extends StatelessWidget { + final String title; + final String description; + final IconData icon; + + const FeatureTile({ + required this.title, + required this.description, + required this.icon, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: Icon(icon), + title: Text(title), + subtitle: Text(description), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 50e37876..27080735 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -45,13 +45,13 @@ List _menuItems(BuildContext context, WidgetRef ref) => [ onPressed: () { ref.read(cyclesProvider.notifier).fetchCycles() .then((cycles) { - if (cycles.isEmpty) { - context.goNamed(RouteNames.NEW_USER_SCREEN); - } - else { - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - } - // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + // if (cycles.isEmpty) { + // context.goNamed(RouteNames.NEW_USER_SCREEN); + // } + // else { + // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); + // } + context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); }); }, color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 6f44ff42..295063dc 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -68,7 +68,6 @@ class RouteNames { static const PERIOD_PLANNER_LOG_PERIODS = "period-planner-log-periods"; static const PERIOD_PLANNER_EDIT_PERIODS = "period-planner-edit-periods"; static const PERIOD_PLANNER_PERIOD_HISTORY = "period-planner-period-history"; - static const NEW_USER_SCREEN = "new-user-screen"; static const CHAT_HCW = "chat-hcw"; static const CHAT_DETAIL = "chat-detail"; static const CHAT_USER = "chat-user"; From 4191b77bf2a5369170ba7c9d3c5ecd166e06e20e Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 30 Sep 2024 21:12:24 +0300 Subject: [PATCH 095/140] :construction: add dawa drop request management --- lib/src/app/navigation/app_router.dart | 8 ++ .../presentation/widget/current_request.dart | 4 - .../pages/dawa_drop_manager_screen.dart | 101 ++++++++++++++++++ .../widgets/drug_approved_list.dart | 65 +++++++++++ .../widgets/drug_dispatched_list.dart | 62 +++++++++++ .../widgets/drug_fulfilled_list.dart | 62 +++++++++++ .../widgets/drug_request_list.dart | 65 +++++++++++ .../pages/provider_main_Screen.dart | 36 +++---- lib/src/utils/routes.dart | 1 + 9 files changed, 382 insertions(+), 22 deletions(-) create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index f844da55..c2adf434 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -69,6 +69,7 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/periodPl import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; import 'package:nishauri/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart'; import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; @@ -546,6 +547,13 @@ final List providerRoutes = [ return const RescheduleRequestListScreen(); }, ), + GoRoute( + name: RouteNames.DAWA_DROP_MANAGER, + path: 'dawa-drop-manager', + builder: (BuildContext context, GoRouterState state) { + return const DawaDropManagemerScreen(); + }, + ), ]; final List hivProgramRoutes = [ GoRoute( diff --git a/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart b/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart index 1a03305e..0bfb2e70 100644 --- a/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart +++ b/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/appointments/data/models/appointment.dart'; import 'package:nishauri/src/features/provider/appointment_management/data/providers/appointment_management_provider.dart'; import 'package:nishauri/src/shared/dialog/dialog.dart'; import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; class RescheduleRequestList extends HookConsumerWidget { final List appointments; @@ -44,11 +42,9 @@ class RescheduleRequestList extends HookConsumerWidget { "Reject", Constants.providerBgColor, (){ - print("Approving appointment reschedule"); ref.refresh(appointmentRescheduleProvider); }, (){ - print("Rejecting appointment reschedule"); ref.refresh(appointmentRescheduleProvider); }, ).show(); diff --git a/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart b/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart new file mode 100644 index 00000000..2cddfa9a --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomTabBar.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class DawaDropManagemerScreen extends HookConsumerWidget { + const DawaDropManagemerScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final dawaDropRequestsAsync = ref.watch(drugOrderProvider); + final currentIndex = useState(0); + + return dawaDropRequestsAsync.when(data: (data) { + if (data.isEmpty) { + return const BackgroundImageWidget( + customAppBar: CustomAppBar( + title: "Dawa Drop Requests", + color: Constants.providerBgColor, + ), + svgImage: "assets/images/appointments-empty.svg", + notFoundText: "No Requests found", + ); + } + + List pending = data.where((order) => order.status == 'Pending').toList(); + List approved = data.where((order) => order.status == 'Approved').toList(); + List dispatched = data.where((order) => order.status == 'Dispatched').toList(); + List fulfilled = data.where((order) => order.status == 'Fullfilled').toList(); + + final screen = [ + pending.isEmpty ? + const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No current drug requests to approve"), + ) : + + DrugRequestList(orders: pending), + + approved.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No current drug request to dispatch"), + ): + DrugApprovedRequestList(orders: approved), + dispatched.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No current drug dispatched"), + ): + DrugDispatchedList(orders: dispatched), + fulfilled.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No Fulfilled orders."), + ): + DrugFulfilledList(orders: fulfilled), + ]; + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const CustomAppBar( + title: "Dawa Drop Requests 📋", + color: Constants.providerBgColor, + ), + CustomTabBar( + onTap: (item, index) { + currentIndex.value = index; + }, + activeColor: Constants.providerBgColor.withOpacity(0.5), + activeIndex: currentIndex.value, + items: const [ + CustomTabBarItem(title: "Drug Requests"), + CustomTabBarItem(title: "Approved Requests"), + CustomTabBarItem(title: "Dispatched Requests"), + CustomTabBarItem(title: "Fulfilled Requests"), + ], + ), + Expanded(child: screen[currentIndex.value]), + ], + ), + ); + }, + error: (error, _) => Center(child: Text(error.toString()),), + loading: () => CircularProgressIndicator() + ); + + } +} \ No newline at end of file diff --git a/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart new file mode 100644 index 00000000..b9076065 --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; +import 'package:nishauri/src/shared/dialog/dialog.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class DrugApprovedRequestList extends HookConsumerWidget { + + final List orders; + + const DrugApprovedRequestList({Key? key, required this.orders}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: orders.length, + itemBuilder: (context, index) { + final order = orders[index]; + return RowViewList( + details: [ + {"icon": Icons.ac_unit_outlined, 'text': "Delivery Method: ${order.delivery_method ?? ''}"}, + if (order.courierService?.name != null && order.courierService?.name != '') + {"icon": Icons.bike_scooter_sharp, 'text': "Courier Service: ${order.courierService?.name ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.person, 'text': "Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.phone_android, 'text': "Delivery Person: ${order.deliveryPerson?.phoneNumber ?? ''}"}, + {"icon": Icons.today, 'text': "Date order approved: ${DateFormat('dd-MM-yyyy').format(DateTime.parse(order.approved_date ?? ''))}"}, + {"icon": Icons.rotate_left_outlined, 'text': "Delivery Status: ${order.status ?? ''}"}, + ], + onRowTap: (index) { + HealthProgramDialog( + context, + "Order id : ${order.order_id}", + "Dispatch the Drug order request bellow", + Constants.providerBgColor.withOpacity(0.5), + "Approve", + Constants.providerBgColor.withOpacity(0.2), + "Reject", + Constants.providerBgColor, + (){ + ref.refresh(drugOrderProvider); + }, + (){ + ref.refresh(drugOrderProvider); + }, + ).show(); + }, + ); + }, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart new file mode 100644 index 00000000..a81a3f78 --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; + +class DrugDispatchedList extends HookConsumerWidget { + + final List orders; + + const DrugDispatchedList({Key? key, required this.orders}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: orders.length, + itemBuilder: (context, index) { + final order = orders[index]; + return RowViewList( + details: [ + {"icon": Icons.ac_unit_outlined, 'text': "Delivery Method: ${order.delivery_method ?? ''}"}, + if (order.courierService?.name != null && order.courierService?.name != '') + {"icon": Icons.bike_scooter_sharp, 'text': "Courier Service: ${order.courierService?.name ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.person, 'text': "Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.phone_android, 'text': "Delivery Person: ${order.deliveryPerson?.phoneNumber ?? ''}"}, + {"icon": Icons.today, 'text': "Date order dispatched: ${DateFormat('dd-MM-yyyy').format(DateTime.parse(order.dispatched_date ?? ''))}"}, + {"icon": Icons.rotate_left_outlined, 'text': "Delivery Status: ${order.status ?? ''}"}, + ], + // onRowTap: (index) { + // HealthProgramDialog( + // context, + // "Order id : ${order.order_id}", + // "Approve Drug order request bellow", + // Constants.providerBgColor.withOpacity(0.5), + // "Approve", + // Constants.providerBgColor.withOpacity(0.2), + // "Reject", + // Constants.providerBgColor, + // (){ + // ref.refresh(drugOrderProvider); + // }, + // (){ + // ref.refresh(drugOrderProvider); + // }, + // ).show(); + // }, + ); + }, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart new file mode 100644 index 00000000..8a11b249 --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; + +class DrugFulfilledList extends HookConsumerWidget { + + final List orders; + + const DrugFulfilledList({Key? key, required this.orders}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: orders.length, + itemBuilder: (context, index) { + final order = orders[index]; + return RowViewList( + details: [ + {"icon": Icons.ac_unit_outlined, 'text': "Delivery Method: ${order.delivery_method ?? ''}"}, + if (order.courierService?.name != null && order.courierService?.name != '') + {"icon": Icons.bike_scooter_sharp, 'text': "Courier Service: ${order.courierService?.name ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.person, 'text': "Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.phone_android, 'text': "Delivery Person: ${order.deliveryPerson?.phoneNumber ?? ''}"}, + {"icon": Icons.today, 'text': "Date order FulFilled: ${DateFormat('dd-MM-yyyy').format(DateTime.parse(order.fullfilled_date ?? ''))}"}, + {"icon": Icons.rotate_left_outlined, 'text': "Delivery Status: ${order.status ?? ''}"}, + ], + // onRowTap: (index) { + // HealthProgramDialog( + // context, + // "Order id : ${order.order_id}", + // "Approve Drug order request bellow", + // Constants.providerBgColor.withOpacity(0.5), + // "Approve", + // Constants.providerBgColor.withOpacity(0.2), + // "Reject", + // Constants.providerBgColor, + // (){ + // ref.refresh(drugOrderProvider); + // }, + // (){ + // ref.refresh(drugOrderProvider); + // }, + // ).show(); + // }, + ); + }, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart new file mode 100644 index 00000000..653c50b3 --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; +import 'package:nishauri/src/shared/dialog/dialog.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class DrugRequestList extends HookConsumerWidget { + + final List orders; + + const DrugRequestList({Key? key, required this.orders}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: orders.length, + itemBuilder: (context, index) { + final order = orders[index]; + return RowViewList( + details: [ + {"icon": Icons.ac_unit_outlined, 'text': "Delivery Method: ${order.delivery_method ?? ''}"}, + if (order.courierService?.name != null && order.courierService?.name != '') + {"icon": Icons.bike_scooter_sharp, 'text': "Courier Service: ${order.courierService?.name ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.person, 'text': "Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.phone_android, 'text': "Delivery Person: ${order.deliveryPerson?.phoneNumber ?? ''}"}, + {"icon": Icons.today, 'text': "Date order posted: ${DateFormat('dd-MM-yyyy').format(DateTime.parse(order.date_order_posted ?? ''))}"}, + {"icon": Icons.rotate_left_outlined, 'text': "Delivery Status: ${order.status ?? ''}"}, + ], + onRowTap: (index) { + HealthProgramDialog( + context, + "Order id : ${order.order_id}", + "Approve Drug order request bellow", + Constants.providerBgColor.withOpacity(0.5), + "Approve", + Constants.providerBgColor.withOpacity(0.2), + "Reject", + Constants.providerBgColor, + (){ + ref.refresh(drugOrderProvider); + }, + (){ + ref.refresh(drugOrderProvider); + }, + ).show(); + }, + ); + }, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart index 863a41d5..309cce9e 100644 --- a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart +++ b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart @@ -26,24 +26,24 @@ _menuItems(BuildContext context) => [ onPressed: () => context.goNamed(RouteNames.REQUEST_APP_RESCHEDULE), color: Constants.providerBgColor.withOpacity(0.5), ), - // MenuItem( - // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/shopping.svg", - // semanticsLabel: "Dawa", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", - // semanticsLabel: "Dawa", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize), - // title: "Drug Orders", - // onPressed: () => context.goNamed(RouteNames.HIV_DRUG_ORDERS), - // color: Constants.dawaDropColor.withOpacity(0.5), - // ), + MenuItem( + shortcutBackgroundColor: Constants.providerBgColor, + icon: SvgPicture.asset( + "assets/images/shopping.svg", + semanticsLabel: "Dawa Drop Manager", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", + semanticsLabel: "Dawa Drop Manager", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Drug Order Manager", + onPressed: () => context.goNamed(RouteNames.DAWA_DROP_MANAGER), + color: Constants.providerBgColor.withOpacity(0.5), + ), // MenuItem( // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, // icon: SvgPicture.asset( diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 7dbaf687..aedd252a 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -75,6 +75,7 @@ class RouteNames { static const BP_INSIGHT = "bp-insight"; static const PROVIDER_MAIN_SCREEN = "provider-main-screen"; static const REQUEST_APP_RESCHEDULE = "request-app-reschedule"; + static const DAWA_DROP_MANAGER = "dawa-drop-manager"; } class MenuItemNames { From bbbb01d6d0a35f5c1562a7fa42276ed3d14829b4 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 30 Sep 2024 21:12:24 +0300 Subject: [PATCH 096/140] :construction: add dawa drop request management --- lib/src/app/navigation/app_router.dart | 8 ++ .../presentation/widget/current_request.dart | 4 - .../pages/dawa_drop_manager_screen.dart | 101 ++++++++++++++++++ .../widgets/drug_approved_list.dart | 65 +++++++++++ .../widgets/drug_dispatched_list.dart | 62 +++++++++++ .../widgets/drug_fulfilled_list.dart | 62 +++++++++++ .../widgets/drug_request_list.dart | 65 +++++++++++ .../pages/provider_main_Screen.dart | 36 +++---- lib/src/utils/routes.dart | 1 + 9 files changed, 382 insertions(+), 22 deletions(-) create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart create mode 100644 lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index ba389565..7019cbbc 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -71,6 +71,7 @@ import 'package:nishauri/src/features/period_planner/presentation/pages/periodPl import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; import 'package:nishauri/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart'; import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; @@ -550,6 +551,13 @@ final List providerRoutes = [ return const RescheduleRequestListScreen(); }, ), + GoRoute( + name: RouteNames.DAWA_DROP_MANAGER, + path: 'dawa-drop-manager', + builder: (BuildContext context, GoRouterState state) { + return const DawaDropManagemerScreen(); + }, + ), ]; final List hivProgramRoutes = [ GoRoute( diff --git a/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart b/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart index 1a03305e..0bfb2e70 100644 --- a/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart +++ b/lib/src/features/provider/appointment_management/presentation/widget/current_request.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/appointments/data/models/appointment.dart'; import 'package:nishauri/src/features/provider/appointment_management/data/providers/appointment_management_provider.dart'; import 'package:nishauri/src/shared/dialog/dialog.dart'; import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; class RescheduleRequestList extends HookConsumerWidget { final List appointments; @@ -44,11 +42,9 @@ class RescheduleRequestList extends HookConsumerWidget { "Reject", Constants.providerBgColor, (){ - print("Approving appointment reschedule"); ref.refresh(appointmentRescheduleProvider); }, (){ - print("Rejecting appointment reschedule"); ref.refresh(appointmentRescheduleProvider); }, ).show(); diff --git a/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart b/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart new file mode 100644 index 00000000..2cddfa9a --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart'; +import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomTabBar.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class DawaDropManagemerScreen extends HookConsumerWidget { + const DawaDropManagemerScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final dawaDropRequestsAsync = ref.watch(drugOrderProvider); + final currentIndex = useState(0); + + return dawaDropRequestsAsync.when(data: (data) { + if (data.isEmpty) { + return const BackgroundImageWidget( + customAppBar: CustomAppBar( + title: "Dawa Drop Requests", + color: Constants.providerBgColor, + ), + svgImage: "assets/images/appointments-empty.svg", + notFoundText: "No Requests found", + ); + } + + List pending = data.where((order) => order.status == 'Pending').toList(); + List approved = data.where((order) => order.status == 'Approved').toList(); + List dispatched = data.where((order) => order.status == 'Dispatched').toList(); + List fulfilled = data.where((order) => order.status == 'Fullfilled').toList(); + + final screen = [ + pending.isEmpty ? + const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No current drug requests to approve"), + ) : + + DrugRequestList(orders: pending), + + approved.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No current drug request to dispatch"), + ): + DrugApprovedRequestList(orders: approved), + dispatched.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No current drug dispatched"), + ): + DrugDispatchedList(orders: dispatched), + fulfilled.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No Fulfilled orders."), + ): + DrugFulfilledList(orders: fulfilled), + ]; + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const CustomAppBar( + title: "Dawa Drop Requests 📋", + color: Constants.providerBgColor, + ), + CustomTabBar( + onTap: (item, index) { + currentIndex.value = index; + }, + activeColor: Constants.providerBgColor.withOpacity(0.5), + activeIndex: currentIndex.value, + items: const [ + CustomTabBarItem(title: "Drug Requests"), + CustomTabBarItem(title: "Approved Requests"), + CustomTabBarItem(title: "Dispatched Requests"), + CustomTabBarItem(title: "Fulfilled Requests"), + ], + ), + Expanded(child: screen[currentIndex.value]), + ], + ), + ); + }, + error: (error, _) => Center(child: Text(error.toString()),), + loading: () => CircularProgressIndicator() + ); + + } +} \ No newline at end of file diff --git a/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart new file mode 100644 index 00000000..b9076065 --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_approved_list.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; +import 'package:nishauri/src/shared/dialog/dialog.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class DrugApprovedRequestList extends HookConsumerWidget { + + final List orders; + + const DrugApprovedRequestList({Key? key, required this.orders}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: orders.length, + itemBuilder: (context, index) { + final order = orders[index]; + return RowViewList( + details: [ + {"icon": Icons.ac_unit_outlined, 'text': "Delivery Method: ${order.delivery_method ?? ''}"}, + if (order.courierService?.name != null && order.courierService?.name != '') + {"icon": Icons.bike_scooter_sharp, 'text': "Courier Service: ${order.courierService?.name ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.person, 'text': "Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.phone_android, 'text': "Delivery Person: ${order.deliveryPerson?.phoneNumber ?? ''}"}, + {"icon": Icons.today, 'text': "Date order approved: ${DateFormat('dd-MM-yyyy').format(DateTime.parse(order.approved_date ?? ''))}"}, + {"icon": Icons.rotate_left_outlined, 'text': "Delivery Status: ${order.status ?? ''}"}, + ], + onRowTap: (index) { + HealthProgramDialog( + context, + "Order id : ${order.order_id}", + "Dispatch the Drug order request bellow", + Constants.providerBgColor.withOpacity(0.5), + "Approve", + Constants.providerBgColor.withOpacity(0.2), + "Reject", + Constants.providerBgColor, + (){ + ref.refresh(drugOrderProvider); + }, + (){ + ref.refresh(drugOrderProvider); + }, + ).show(); + }, + ); + }, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart new file mode 100644 index 00000000..a81a3f78 --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_dispatched_list.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; + +class DrugDispatchedList extends HookConsumerWidget { + + final List orders; + + const DrugDispatchedList({Key? key, required this.orders}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: orders.length, + itemBuilder: (context, index) { + final order = orders[index]; + return RowViewList( + details: [ + {"icon": Icons.ac_unit_outlined, 'text': "Delivery Method: ${order.delivery_method ?? ''}"}, + if (order.courierService?.name != null && order.courierService?.name != '') + {"icon": Icons.bike_scooter_sharp, 'text': "Courier Service: ${order.courierService?.name ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.person, 'text': "Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.phone_android, 'text': "Delivery Person: ${order.deliveryPerson?.phoneNumber ?? ''}"}, + {"icon": Icons.today, 'text': "Date order dispatched: ${DateFormat('dd-MM-yyyy').format(DateTime.parse(order.dispatched_date ?? ''))}"}, + {"icon": Icons.rotate_left_outlined, 'text': "Delivery Status: ${order.status ?? ''}"}, + ], + // onRowTap: (index) { + // HealthProgramDialog( + // context, + // "Order id : ${order.order_id}", + // "Approve Drug order request bellow", + // Constants.providerBgColor.withOpacity(0.5), + // "Approve", + // Constants.providerBgColor.withOpacity(0.2), + // "Reject", + // Constants.providerBgColor, + // (){ + // ref.refresh(drugOrderProvider); + // }, + // (){ + // ref.refresh(drugOrderProvider); + // }, + // ).show(); + // }, + ); + }, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart new file mode 100644 index 00000000..8a11b249 --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_fulfilled_list.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; + +class DrugFulfilledList extends HookConsumerWidget { + + final List orders; + + const DrugFulfilledList({Key? key, required this.orders}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: orders.length, + itemBuilder: (context, index) { + final order = orders[index]; + return RowViewList( + details: [ + {"icon": Icons.ac_unit_outlined, 'text': "Delivery Method: ${order.delivery_method ?? ''}"}, + if (order.courierService?.name != null && order.courierService?.name != '') + {"icon": Icons.bike_scooter_sharp, 'text': "Courier Service: ${order.courierService?.name ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.person, 'text': "Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.phone_android, 'text': "Delivery Person: ${order.deliveryPerson?.phoneNumber ?? ''}"}, + {"icon": Icons.today, 'text': "Date order FulFilled: ${DateFormat('dd-MM-yyyy').format(DateTime.parse(order.fullfilled_date ?? ''))}"}, + {"icon": Icons.rotate_left_outlined, 'text': "Delivery Status: ${order.status ?? ''}"}, + ], + // onRowTap: (index) { + // HealthProgramDialog( + // context, + // "Order id : ${order.order_id}", + // "Approve Drug order request bellow", + // Constants.providerBgColor.withOpacity(0.5), + // "Approve", + // Constants.providerBgColor.withOpacity(0.2), + // "Reject", + // Constants.providerBgColor, + // (){ + // ref.refresh(drugOrderProvider); + // }, + // (){ + // ref.refresh(drugOrderProvider); + // }, + // ).show(); + // }, + ); + }, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart new file mode 100644 index 00000000..653c50b3 --- /dev/null +++ b/lib/src/features/provider/dawa_drop_management/presentation/widgets/drug_request_list.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; +import 'package:nishauri/src/features/dawa_drop/data/providers/drug_order_provider.dart'; +import 'package:nishauri/src/shared/dialog/dialog.dart'; +import 'package:nishauri/src/shared/list_view_builder/list_view_builder.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class DrugRequestList extends HookConsumerWidget { + + final List orders; + + const DrugRequestList({Key? key, required this.orders}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: ListView.builder( + itemCount: orders.length, + itemBuilder: (context, index) { + final order = orders[index]; + return RowViewList( + details: [ + {"icon": Icons.ac_unit_outlined, 'text': "Delivery Method: ${order.delivery_method ?? ''}"}, + if (order.courierService?.name != null && order.courierService?.name != '') + {"icon": Icons.bike_scooter_sharp, 'text': "Courier Service: ${order.courierService?.name ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.person, 'text': "Delivery Person: ${order.deliveryPerson?.fullName ?? ''}"}, + if (order.deliveryPerson?.fullName != null && order.deliveryPerson?.fullName != '') + {"icon": Icons.phone_android, 'text': "Delivery Person: ${order.deliveryPerson?.phoneNumber ?? ''}"}, + {"icon": Icons.today, 'text': "Date order posted: ${DateFormat('dd-MM-yyyy').format(DateTime.parse(order.date_order_posted ?? ''))}"}, + {"icon": Icons.rotate_left_outlined, 'text': "Delivery Status: ${order.status ?? ''}"}, + ], + onRowTap: (index) { + HealthProgramDialog( + context, + "Order id : ${order.order_id}", + "Approve Drug order request bellow", + Constants.providerBgColor.withOpacity(0.5), + "Approve", + Constants.providerBgColor.withOpacity(0.2), + "Reject", + Constants.providerBgColor, + (){ + ref.refresh(drugOrderProvider); + }, + (){ + ref.refresh(drugOrderProvider); + }, + ).show(); + }, + ); + }, + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart index 863a41d5..309cce9e 100644 --- a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart +++ b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart @@ -26,24 +26,24 @@ _menuItems(BuildContext context) => [ onPressed: () => context.goNamed(RouteNames.REQUEST_APP_RESCHEDULE), color: Constants.providerBgColor.withOpacity(0.5), ), - // MenuItem( - // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/shopping.svg", - // semanticsLabel: "Dawa", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", - // semanticsLabel: "Dawa", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize), - // title: "Drug Orders", - // onPressed: () => context.goNamed(RouteNames.HIV_DRUG_ORDERS), - // color: Constants.dawaDropColor.withOpacity(0.5), - // ), + MenuItem( + shortcutBackgroundColor: Constants.providerBgColor, + icon: SvgPicture.asset( + "assets/images/shopping.svg", + semanticsLabel: "Dawa Drop Manager", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", + semanticsLabel: "Dawa Drop Manager", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Drug Order Manager", + onPressed: () => context.goNamed(RouteNames.DAWA_DROP_MANAGER), + color: Constants.providerBgColor.withOpacity(0.5), + ), // MenuItem( // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, // icon: SvgPicture.asset( diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 7dbaf687..aedd252a 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -75,6 +75,7 @@ class RouteNames { static const BP_INSIGHT = "bp-insight"; static const PROVIDER_MAIN_SCREEN = "provider-main-screen"; static const REQUEST_APP_RESCHEDULE = "request-app-reschedule"; + static const DAWA_DROP_MANAGER = "dawa-drop-manager"; } class MenuItemNames { From 1a458491adeb4705862269563d41e314d5cf40e5 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 30 Sep 2024 23:38:27 +0300 Subject: [PATCH 097/140] custom count budge --- assets/images/shopping-cart-dawa.svg | 14 +++ .../pages/reschedule_request_list.dart | 22 ++-- .../pages/dawa_drop_manager_screen.dart | 11 +- .../pages/provider_main_Screen.dart | 4 +- lib/src/shared/display/CustomTabBar.dart | 101 +++++++++--------- lib/src/shared/notifications/count_budge.dart | 34 ++++++ 6 files changed, 121 insertions(+), 65 deletions(-) create mode 100644 assets/images/shopping-cart-dawa.svg create mode 100644 lib/src/shared/notifications/count_budge.dart diff --git a/assets/images/shopping-cart-dawa.svg b/assets/images/shopping-cart-dawa.svg new file mode 100644 index 00000000..0ae42f53 --- /dev/null +++ b/assets/images/shopping-cart-dawa.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart b/lib/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart index c9cbf72c..ab086367 100644 --- a/lib/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart +++ b/lib/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart @@ -7,9 +7,10 @@ import 'package:nishauri/src/features/provider/appointment_management/presentati import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/CustomTabBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/shared/notifications/count_budge.dart'; import 'package:nishauri/src/utils/constants.dart'; -class RescheduleRequestListScreen extends HookConsumerWidget{ +class RescheduleRequestListScreen extends HookConsumerWidget { const RescheduleRequestListScreen({Key? key}) : super(key: key); @override @@ -34,8 +35,9 @@ class RescheduleRequestListScreen extends HookConsumerWidget{ RescheduleRequestList(appointments: data), const Center( child: BackgroundImageWidget( - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No Past reschedule request"), + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No Past reschedule request", + ), ), ]; @@ -54,19 +56,21 @@ class RescheduleRequestListScreen extends HookConsumerWidget{ activeColor: Constants.providerBgColor.withOpacity(0.5), activeIndex: currIndex.value, items: [ - const CustomTabBarItem(title: "Appointment Reschedule Request"), + CustomTabBarItem( + title: "Appointments Reschedule Request", + trailing: CountBadge(count: data.length), + ), const CustomTabBarItem(title: "History"), ], ), Expanded( - child: screen[currIndex.value] + child: screen[currIndex.value], ), ], ), ); }, - error: (error,_) => Center(child: Text(error.toString()),), - loading: ()=>CircularProgressIndicator()); - + error: (error, _) => Center(child: Text(error.toString())), + loading: () => const CircularProgressIndicator()); } -} \ No newline at end of file +} diff --git a/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart b/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart index 2cddfa9a..4cf9b398 100644 --- a/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart +++ b/lib/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart @@ -10,6 +10,7 @@ import 'package:nishauri/src/features/provider/dawa_drop_management/presentation import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/CustomTabBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/shared/notifications/count_budge.dart'; import 'package:nishauri/src/utils/constants.dart'; class DawaDropManagemerScreen extends HookConsumerWidget { @@ -81,11 +82,11 @@ class DawaDropManagemerScreen extends HookConsumerWidget { }, activeColor: Constants.providerBgColor.withOpacity(0.5), activeIndex: currentIndex.value, - items: const [ - CustomTabBarItem(title: "Drug Requests"), - CustomTabBarItem(title: "Approved Requests"), - CustomTabBarItem(title: "Dispatched Requests"), - CustomTabBarItem(title: "Fulfilled Requests"), + items: [ + CustomTabBarItem(title: "Drug Requests", trailing: CountBadge(count: pending.length,)), + CustomTabBarItem(title: "Approved Requests", trailing: CountBadge(count: approved.length,)), + const CustomTabBarItem(title: "Dispatched Requests"), + const CustomTabBarItem(title: "Fulfilled Requests"), ], ), Expanded(child: screen[currentIndex.value]), diff --git a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart index 309cce9e..b980d52a 100644 --- a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart +++ b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart @@ -29,13 +29,13 @@ _menuItems(BuildContext context) => [ MenuItem( shortcutBackgroundColor: Constants.providerBgColor, icon: SvgPicture.asset( - "assets/images/shopping.svg", + "assets/images/shopping-cart-dawa.svg", semanticsLabel: "Dawa Drop Manager", fit: BoxFit.contain, width: 80, height: 80, ), - shortcutIcon: SvgPicture.asset("assets/images/shopping.svg", + shortcutIcon: SvgPicture.asset("assets/images/shopping-cart-dawa.svg", semanticsLabel: "Dawa Drop Manager", fit: BoxFit.contain, width: Constants.shortcutIconSize, diff --git a/lib/src/shared/display/CustomTabBar.dart b/lib/src/shared/display/CustomTabBar.dart index 16ae9426..a8ce1eff 100644 --- a/lib/src/shared/display/CustomTabBar.dart +++ b/lib/src/shared/display/CustomTabBar.dart @@ -4,8 +4,9 @@ import 'package:nishauri/src/utils/constants.dart'; class CustomTabBarItem { final String title; final IconData? icon; + final Widget? trailing; - const CustomTabBarItem({required this.title, this.icon}); + const CustomTabBarItem({required this.title, this.icon, this.trailing}); } class CustomTabBar extends StatelessWidget { @@ -14,12 +15,13 @@ class CustomTabBar extends StatelessWidget { final Color activeColor; final int? activeIndex; - const CustomTabBar( - {super.key, - this.items = const [], - required this.onTap, - this.activeColor = Constants.activeSelectionColor, - this.activeIndex}); + const CustomTabBar({ + super.key, + this.items = const [], + required this.onTap, + this.activeColor = Constants.activeSelectionColor, + this.activeIndex, + }); @override Widget build(BuildContext context) { @@ -32,52 +34,53 @@ class CustomTabBar extends StatelessWidget { mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, - children: items - .asMap() - .entries - .map( - (e) => Card( - clipBehavior: Clip.antiAlias, - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(Constants.ROUNDNESS * 10), - ), - child: InkWell( - onTap: () { - onTap( - e.value, - e.key, - ); - }, - child: Container( - padding: const EdgeInsets.symmetric(horizontal:Constants.SPACING ,vertical: Constants.SPACING* 0.5), - decoration: BoxDecoration( - color: e.key == activeIndex - ? activeColor ?? theme.colorScheme.primary - : null), - child: Row( - children: [ - if (e.value.icon != null) - Icon( - e.value.icon, - color: activeIndex == e.key ? Colors.white : null, - ), - if (e.value.icon != null) - const SizedBox(width: Constants.SPACING), - Text( - e.value.title, - style: theme.textTheme.labelLarge?.copyWith( - color: activeIndex == e.key ? Colors.white : null, - ), + children: items.asMap().entries.map( + (e) { + return Card( + clipBehavior: Clip.antiAlias, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(Constants.ROUNDNESS * 10), + ), + child: InkWell( + onTap: () { + onTap(e.value, e.key); + }, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: Constants.SPACING, + vertical: Constants.SPACING * 0.5, + ), + decoration: BoxDecoration( + color: e.key == activeIndex + ? activeColor ?? theme.colorScheme.primary + : null, + ), + child: Row( + children: [ + if (e.value.icon != null) + Icon( + e.value.icon, + color: activeIndex == e.key ? Colors.white : null, + ), + if (e.value.icon != null) + const SizedBox(width: Constants.SPACING), + Text( + e.value.title, + style: theme.textTheme.labelLarge?.copyWith( + color: activeIndex == e.key ? Colors.white : null, ), - ], - ), + ), + if (e.value.trailing != null) + const SizedBox(width: Constants.SPACING), + if (e.value.trailing != null) e.value.trailing!, + ], ), ), ), - ) - .toList(), + ); + }, + ).toList(), ), ), ); diff --git a/lib/src/shared/notifications/count_budge.dart b/lib/src/shared/notifications/count_budge.dart new file mode 100644 index 00000000..7cd88bdd --- /dev/null +++ b/lib/src/shared/notifications/count_budge.dart @@ -0,0 +1,34 @@ + +import 'package:flutter/material.dart'; + +class CountBadge extends StatelessWidget { + final int count; + + const CountBadge({Key? key, required this.count}) : super(key: key); + + @override + Widget build(BuildContext context) { + if (count <= 0) return const SizedBox.shrink(); + + return Container( + padding: const EdgeInsets.all(2), + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(10), + ), + constraints: const BoxConstraints( + minWidth: 16, + minHeight: 16, + ), + child: Text( + count.toString(), + style: const TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + ); + } +} From 0608bb26fd91c499bce906ecc12c20d62acece8c Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 11 Oct 2024 10:19:30 +0300 Subject: [PATCH 098/140] :construction: shr --- lib/src/app/navigation/app_router.dart | 27 +- lib/src/app/navigation/menu/menuItems.dart | 41 +++ .../location/data/models/location.dart | 18 ++ .../data/models/location.freezed.dart | 261 ++++++++++++++++++ .../location/data/models/location.g.dart | 27 ++ .../admin_location_selection_screen.dart | 91 ++++++ .../pages/FacilityVisitDetailScreen.dart | 104 +++++-- .../pages/FacilityVisitsScreen.dart | 250 +++++++++++++---- lib/src/utils/routes.dart | 1 + 9 files changed, 728 insertions(+), 92 deletions(-) create mode 100644 lib/src/features/provider/location/data/models/location.dart create mode 100644 lib/src/features/provider/location/data/models/location.freezed.dart create mode 100644 lib/src/features/provider/location/data/models/location.g.dart create mode 100644 lib/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 7019cbbc..b8bf2538 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -73,6 +73,7 @@ import 'package:nishauri/src/features/programs/presentation/pages/programs.dart' import 'package:nishauri/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart'; import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart'; import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; +import 'package:nishauri/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/self_screening_menu.dart'; @@ -390,17 +391,16 @@ final List secureRoutes = [ builder: (BuildContext context, GoRouterState state) { return const FacilityVisitsScreen(); }, - routes: [ - GoRoute( - name: RouteNames.FACILITY_VISIT_DETAIL, - path: ':visitId', - builder: (BuildContext context, GoRouterState state) { - return FacilityVisitDetailScreen( - visitId: state.pathParameters["visitId"]!); - }, - ) - ]), + ), + GoRoute( + name: RouteNames.FACILITY_VISIT_DETAIL, + path: ':visitId', + builder: (BuildContext context, GoRouterState state) { + return FacilityVisitDetailScreen( + visitId: state.pathParameters["visitId"]!); + }, + ), GoRoute( name: RouteNames.PROVIDER_MAIN_SCREEN, path: 'provider-main-screen', @@ -409,6 +409,13 @@ final List secureRoutes = [ }, routes: providerRoutes, ), + GoRoute( + name: RouteNames.LOCATION_SELECTION, + path: 'location-selection', + builder: (BuildContext context, GoRouterState state) { + return LocationSelectionScreen(); + }, + ), ]; final List openRoutes = [ diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index c4537000..530a25dc 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -217,6 +217,27 @@ List getPatientModules(BuildContext context) { onPressed: () => context.goNamed(RouteNames.MY_CLINIC_CARD), color: Colors.blue[900], ), + + MenuItem( + icon: SvgPicture.asset( + "assets/images/Hospital building-bro.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 80, + width: 80, + ), + shortcutIcon: SvgPicture.asset( + "assets/images/Hospital building-bro.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, + ), + title: "FACILITY VISITS", + onPressed: () => context.goNamed(RouteNames.FACILITY_VISITS), + color: Colors.blueGrey, + ), + MenuItem( icon: SvgPicture.asset( "assets/images/house.svg", @@ -276,6 +297,26 @@ List getPatientModules(BuildContext context) { onPressed: () => context.goNamed(RouteNames.DAWA_DROP), color: Constants.dawaDropColor.withOpacity(0.5), ), + + MenuItem( + icon: SvgPicture.asset( + "assets/images/calendar.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 80, + width: 80, + ), + shortcutIcon: SvgPicture.asset( + "assets/images/calendar.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, + ), + title: "Location selection", + onPressed: () => context.goNamed(RouteNames.LOCATION_SELECTION), + color: Constants.appointmentsColor, + ), ]; } diff --git a/lib/src/features/provider/location/data/models/location.dart b/lib/src/features/provider/location/data/models/location.dart new file mode 100644 index 00000000..57e461d6 --- /dev/null +++ b/lib/src/features/provider/location/data/models/location.dart @@ -0,0 +1,18 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'location.freezed.dart'; +part 'location.g.dart'; + +@Freezed() +class Location with _$Location { + const factory Location({ + int? county_id, + int? sub_county_id, + String? sub_county_name, + String? county_name, + String? facility_name, + int? mfl_code, + }) = _Location; + + factory Location.fromJson(Map json)=> _$LocationFromJson(json); +} \ No newline at end of file diff --git a/lib/src/features/provider/location/data/models/location.freezed.dart b/lib/src/features/provider/location/data/models/location.freezed.dart new file mode 100644 index 00000000..478c53d1 --- /dev/null +++ b/lib/src/features/provider/location/data/models/location.freezed.dart @@ -0,0 +1,261 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'location.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Location _$LocationFromJson(Map json) { + return _Location.fromJson(json); +} + +/// @nodoc +mixin _$Location { + int? get county_id => throw _privateConstructorUsedError; + int? get sub_county_id => throw _privateConstructorUsedError; + String? get sub_county_name => throw _privateConstructorUsedError; + String? get county_name => throw _privateConstructorUsedError; + String? get facility_name => throw _privateConstructorUsedError; + int? get mfl_code => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $LocationCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LocationCopyWith<$Res> { + factory $LocationCopyWith(Location value, $Res Function(Location) then) = + _$LocationCopyWithImpl<$Res, Location>; + @useResult + $Res call( + {int? county_id, + int? sub_county_id, + String? sub_county_name, + String? county_name, + String? facility_name, + int? mfl_code}); +} + +/// @nodoc +class _$LocationCopyWithImpl<$Res, $Val extends Location> + implements $LocationCopyWith<$Res> { + _$LocationCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? county_id = freezed, + Object? sub_county_id = freezed, + Object? sub_county_name = freezed, + Object? county_name = freezed, + Object? facility_name = freezed, + Object? mfl_code = freezed, + }) { + return _then(_value.copyWith( + county_id: freezed == county_id + ? _value.county_id + : county_id // ignore: cast_nullable_to_non_nullable + as int?, + sub_county_id: freezed == sub_county_id + ? _value.sub_county_id + : sub_county_id // ignore: cast_nullable_to_non_nullable + as int?, + sub_county_name: freezed == sub_county_name + ? _value.sub_county_name + : sub_county_name // ignore: cast_nullable_to_non_nullable + as String?, + county_name: freezed == county_name + ? _value.county_name + : county_name // ignore: cast_nullable_to_non_nullable + as String?, + facility_name: freezed == facility_name + ? _value.facility_name + : facility_name // ignore: cast_nullable_to_non_nullable + as String?, + mfl_code: freezed == mfl_code + ? _value.mfl_code + : mfl_code // ignore: cast_nullable_to_non_nullable + as int?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$LocationImplCopyWith<$Res> + implements $LocationCopyWith<$Res> { + factory _$$LocationImplCopyWith( + _$LocationImpl value, $Res Function(_$LocationImpl) then) = + __$$LocationImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int? county_id, + int? sub_county_id, + String? sub_county_name, + String? county_name, + String? facility_name, + int? mfl_code}); +} + +/// @nodoc +class __$$LocationImplCopyWithImpl<$Res> + extends _$LocationCopyWithImpl<$Res, _$LocationImpl> + implements _$$LocationImplCopyWith<$Res> { + __$$LocationImplCopyWithImpl( + _$LocationImpl _value, $Res Function(_$LocationImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? county_id = freezed, + Object? sub_county_id = freezed, + Object? sub_county_name = freezed, + Object? county_name = freezed, + Object? facility_name = freezed, + Object? mfl_code = freezed, + }) { + return _then(_$LocationImpl( + county_id: freezed == county_id + ? _value.county_id + : county_id // ignore: cast_nullable_to_non_nullable + as int?, + sub_county_id: freezed == sub_county_id + ? _value.sub_county_id + : sub_county_id // ignore: cast_nullable_to_non_nullable + as int?, + sub_county_name: freezed == sub_county_name + ? _value.sub_county_name + : sub_county_name // ignore: cast_nullable_to_non_nullable + as String?, + county_name: freezed == county_name + ? _value.county_name + : county_name // ignore: cast_nullable_to_non_nullable + as String?, + facility_name: freezed == facility_name + ? _value.facility_name + : facility_name // ignore: cast_nullable_to_non_nullable + as String?, + mfl_code: freezed == mfl_code + ? _value.mfl_code + : mfl_code // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$LocationImpl implements _Location { + const _$LocationImpl( + {this.county_id, + this.sub_county_id, + this.sub_county_name, + this.county_name, + this.facility_name, + this.mfl_code}); + + factory _$LocationImpl.fromJson(Map json) => + _$$LocationImplFromJson(json); + + @override + final int? county_id; + @override + final int? sub_county_id; + @override + final String? sub_county_name; + @override + final String? county_name; + @override + final String? facility_name; + @override + final int? mfl_code; + + @override + String toString() { + return 'Location(county_id: $county_id, sub_county_id: $sub_county_id, sub_county_name: $sub_county_name, county_name: $county_name, facility_name: $facility_name, mfl_code: $mfl_code)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LocationImpl && + (identical(other.county_id, county_id) || + other.county_id == county_id) && + (identical(other.sub_county_id, sub_county_id) || + other.sub_county_id == sub_county_id) && + (identical(other.sub_county_name, sub_county_name) || + other.sub_county_name == sub_county_name) && + (identical(other.county_name, county_name) || + other.county_name == county_name) && + (identical(other.facility_name, facility_name) || + other.facility_name == facility_name) && + (identical(other.mfl_code, mfl_code) || + other.mfl_code == mfl_code)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, county_id, sub_county_id, + sub_county_name, county_name, facility_name, mfl_code); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$LocationImplCopyWith<_$LocationImpl> get copyWith => + __$$LocationImplCopyWithImpl<_$LocationImpl>(this, _$identity); + + @override + Map toJson() { + return _$$LocationImplToJson( + this, + ); + } +} + +abstract class _Location implements Location { + const factory _Location( + {final int? county_id, + final int? sub_county_id, + final String? sub_county_name, + final String? county_name, + final String? facility_name, + final int? mfl_code}) = _$LocationImpl; + + factory _Location.fromJson(Map json) = + _$LocationImpl.fromJson; + + @override + int? get county_id; + @override + int? get sub_county_id; + @override + String? get sub_county_name; + @override + String? get county_name; + @override + String? get facility_name; + @override + int? get mfl_code; + @override + @JsonKey(ignore: true) + _$$LocationImplCopyWith<_$LocationImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/provider/location/data/models/location.g.dart b/lib/src/features/provider/location/data/models/location.g.dart new file mode 100644 index 00000000..4f277c29 --- /dev/null +++ b/lib/src/features/provider/location/data/models/location.g.dart @@ -0,0 +1,27 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'location.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$LocationImpl _$$LocationImplFromJson(Map json) => + _$LocationImpl( + county_id: (json['county_id'] as num?)?.toInt(), + sub_county_id: (json['sub_county_id'] as num?)?.toInt(), + sub_county_name: json['sub_county_name'] as String?, + county_name: json['county_name'] as String?, + facility_name: json['facility_name'] as String?, + mfl_code: (json['mfl_code'] as num?)?.toInt(), + ); + +Map _$$LocationImplToJson(_$LocationImpl instance) => + { + 'county_id': instance.county_id, + 'sub_county_id': instance.sub_county_id, + 'sub_county_name': instance.sub_county_name, + 'county_name': instance.county_name, + 'facility_name': instance.facility_name, + 'mfl_code': instance.mfl_code, + }; diff --git a/lib/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart b/lib/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart new file mode 100644 index 00000000..e890c2b6 --- /dev/null +++ b/lib/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class LocationSelectionScreen extends StatefulWidget { + @override + _LocationSelectionScreenState createState() => _LocationSelectionScreenState(); +} + +class _LocationSelectionScreenState extends State { + String? selectedCounty; + String? subCounty; + final List counties = [ + 'County A', + 'County B', + 'County C', + 'County D', + ]; + + void submit() { + if (selectedCounty != null && subCounty != null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Selected County: $selectedCounty, Sub-County: $subCounty')), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Please select a county and enter a sub-county')), + ); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + // appBar: AppBar( + // title: Text('Select Location'), + // ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const CustomAppBar( + title: "Dawa Drop Requests 📋", + color: Constants.providerBgColor, + ), + SizedBox(height: 10,), + Text("Welcome admin", style: theme.textTheme.titleMedium,), + SizedBox(height: 20), + Text("Select your location from the list below.", style: theme.textTheme.bodyLarge,), + SizedBox(height: 20), + Text('Select a County:', style: TextStyle(fontSize: 18)), + DropdownButton( + isExpanded: true, + value: selectedCounty, + hint: Text('Choose a county'), + items: counties.map((String county) { + return DropdownMenuItem( + value: county, + child: Text(county), + ); + }).toList(), + onChanged: (String? newValue) { + setState(() { + selectedCounty = newValue; + subCounty = null; // Reset sub-county when county changes + }); + }, + ), + SizedBox(height: 20), + if (selectedCounty != null) ...[ + Text('Enter Sub-County:', style: TextStyle(fontSize: 18)), + TextField( + onChanged: (value) { + subCounty = value; + }, + decoration: InputDecoration( + border: OutlineInputBorder(), + hintText: 'Sub-county name', + ), + ), + ], + SizedBox(height: 20), + ElevatedButton( + onPressed: submit, + child: Text('Submit'), + ), + ], + ), + ); + } +} diff --git a/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart b/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart index 26b0a121..2dd8db10 100644 --- a/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart +++ b/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart @@ -1,6 +1,9 @@ +import 'dart:ffi'; + import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/visits/data/providers/visits_provider.dart'; import 'package:nishauri/src/features/visits/presentations/widgets/AllergiesTab.dart'; import 'package:nishauri/src/features/visits/presentations/widgets/ComplaintsTab.dart'; @@ -8,8 +11,11 @@ import 'package:nishauri/src/features/visits/presentations/widgets/ConditionsTab import 'package:nishauri/src/features/visits/presentations/widgets/Diagnosis.dart'; import 'package:nishauri/src/features/visits/presentations/widgets/LabResultsTab.dart'; import 'package:nishauri/src/features/visits/presentations/widgets/VitalsTab.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/CustomTabBar.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; -class FacilityVisitDetailScreen extends ConsumerWidget { +class FacilityVisitDetailScreen extends HookConsumerWidget { final String visitId; const FacilityVisitDetailScreen({super.key, required this.visitId}); @@ -18,40 +24,82 @@ class FacilityVisitDetailScreen extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final visitsAsync = ref.watch(visitProvider); final theme = Theme.of(context); + final currentIndex = useState(0); + + final tabItems = [ + CustomTabBarItem(title: "Vitals"), + CustomTabBarItem(title: "Allergies"), + CustomTabBarItem(title: "Complaints"), + CustomTabBarItem(title: "Conditions"), + CustomTabBarItem(title: "Lab Results"), + CustomTabBarItem(title: "Diagnosis"), + ]; return visitsAsync.when( data: (data) { final visitDetail = data.where((element) => element.uuid == visitId).first; - return DefaultTabController( - length: 6, - child: Scaffold( - appBar: AppBar( - leading: IconButton( - onPressed: () => context.pop(), - icon: const Icon(Icons.chevron_left), - ), - title: const Text("Facility visit"), - bottom: const TabBar(tabs: [ - Tab(text: "Vitals"), - Tab(text: "Allergies"), - Tab(text: "Complaints"), - Tab(text: "Conditions"), - Tab(text: "Lab Results"), - Tab(text: "Diagnosis"), - ]), - ), - body: TabBarView( + + final screen = [ + visitDetail.allergies.isEmpty ? + const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No vital records"), + ) : + + VitalsTab(vitals: visitDetail.vitals), + + visitDetail.allergies.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No Allergies records"), + ): + AllergiesTab(allergies: visitDetail.allergies), + visitDetail.complaints.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No complaints records"), + ): + ComplaintsTab(complaints: visitDetail.complaints), + visitDetail.conditions.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No condition records."), + ): + ConditionsTab(conditions: visitDetail.conditions), + visitDetail.labResults.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No Lab result records."), + ): + LabResultsTab(labResult: visitDetail.labResults), + visitDetail.diagnosis.isEmpty ? const Center( + child: BackgroundImageWidget( + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No Diagnosis records."), + ): + DiagnosisTab(diagnosis: visitDetail.diagnosis), + ]; + + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, children: [ - VitalsTab(vitals: visitDetail.vitals), - AllergiesTab(allergies: visitDetail.allergies), - ComplaintsTab(complaints: visitDetail.complaints), - ConditionsTab(conditions: visitDetail.conditions), - LabResultsTab(labResult: visitDetail.labResults), - DiagnosisTab(diagnosis: visitDetail.diagnosis), + CustomAppBar( + title: "Shared Health Records", + color: theme.primaryColor, + ), + CustomTabBar(onTap: (item, index){ + currentIndex.value = index; + }, + activeColor: theme.primaryColor, + activeIndex: currentIndex.value, + items: tabItems, + ), + Expanded(child: screen[currentIndex.value]), ], ), - ), ); }, error: (error, _) => Center(child: Text(error.toString())), diff --git a/lib/src/features/visits/presentations/pages/FacilityVisitsScreen.dart b/lib/src/features/visits/presentations/pages/FacilityVisitsScreen.dart index 8ef90ecf..e6851407 100644 --- a/lib/src/features/visits/presentations/pages/FacilityVisitsScreen.dart +++ b/lib/src/features/visits/presentations/pages/FacilityVisitsScreen.dart @@ -1,79 +1,221 @@ import 'package:flutter/material.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; +import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; +import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/features/visits/data/providers/visits_provider.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; +import 'package:nishauri/src/hooks/uset_timer.dart'; import 'package:nishauri/src/shared/display/AppSearch.dart'; +import 'package:nishauri/src/shared/display/LinkedRichText.dart'; +import 'package:nishauri/src/shared/display/Logo.dart'; +import 'package:nishauri/src/shared/display/label_input_container.dart'; +import 'package:nishauri/src/shared/display/scafold_stack_body.dart'; +import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/helpers.dart'; import 'package:nishauri/src/utils/routes.dart'; +import 'package:pinput/pinput.dart'; -class FacilityVisitsScreen extends StatelessWidget { +class FacilityVisitsScreen extends HookConsumerWidget { const FacilityVisitsScreen({super.key}); @override - Widget build(BuildContext context) { - final theme = Theme.of(context); + Widget build(BuildContext context, WidgetRef ref) { + final AuthRepository _repository; + final formKey = useMemoized(() => GlobalKey()); + final requestVerificationStateNotifier = ref.read(userProvider.notifier); + final authStateNotifier = ref.read(authStateProvider.notifier); + final userAsync = ref.watch(userProvider); + final timer = useTime(const Duration(seconds: 60)); + final loading = useState(false); + + final user = userAsync.when(data: (data) => data.phoneNumber, error: (error, _) => "", loading: () => null); + + final otpController = useTextEditingController(); + + // Call the getOTPCode method when the form opens + useEffect(() { + requestVerificationStateNotifier.getOTPCode("sms"); + return null; + }, []); + + void handleSubmit() { + context.goNamed( + RouteNames.FACILITY_VISIT_DETAIL, + pathParameters: {"visitId": "1"}); + // if (formKey.currentState!.saveAndValidate()) { + // loading.value = true; + // final userStateNotifier = ref.read(userProvider.notifier); + // userStateNotifier.verify({ + // "otp": otpController.text, + // "mode": "sms" + // }).then((value) { + // context.goNamed( + // RouteNames.FACILITY_VISIT_DETAIL, + // pathParameters: {"visitId": "1"}); + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar(content: Text(value)), + // ); + // }) .whenComplete(() { + // loading.value = false; + // }); + // .catchError((err) { + // handleResponseError(context, formKey.currentState!.fields, err, + // authStateNotifier.logout); + // }).whenComplete(() { + // loading.value = false; + // }); + // } + } + + var theme = Theme.of(context); + return Scaffold( - appBar: AppBar( - leading: IconButton( - onPressed: () => context.pop(), - icon: const Icon(Icons.chevron_left), - ), - title: const Text("Facility visits"), - ), - body: Consumer( - builder: (context, ref, child) { - final visitsAsync = ref.watch(visitProvider); - return visitsAsync.when( - data: (data) => Column( - children: [ - const Padding( - padding: EdgeInsets.all(Constants.SPACING), - child: AppSearch(), + body: ScaffoldStackedBody( + body: Column( + children: [ + AppBar( + backgroundColor: Colors.transparent, + leading: IconButton( + onPressed: () => context.pop(), + icon: SvgPicture.asset( + "assets/images/reply-dark.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: 40, + height: 40, ), - Expanded( - child: ListView.builder( - itemCount: data.length, - itemBuilder: (BuildContext context, int index) => Column( + ), + ), + Expanded( + child: FormBuilder( + key: formKey, + child: SingleChildScrollView( + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Divider(), - ListTile( - onTap: () => context.goNamed( - RouteNames.FACILITY_VISIT_DETAIL, - pathParameters: {"visitId": data[index].uuid}, + const SizedBox(height: Constants.SMALL_SPACING), + const DecoratedBox( + decoration: BoxDecoration(), + child: Logo( + size: 100, + ), + ), + const SizedBox(height: Constants.SMALL_SPACING), + const Text( + "SHR Pull ✅", + style: TextStyle(fontSize: 40), + ), + const SizedBox(height: Constants.SPACING), + RichText( + text: TextSpan( + text: "Code has been sent to ", + style: TextStyle(color: theme.colorScheme.onSurface), + children: [ + TextSpan( + text: user, + style: TextStyle( + color: theme.colorScheme.primary, ), - leading: const Icon( - Icons.move_down, + ), + const TextSpan( + text: "\n\nEnter the code to pull Your Facility visit", + ), + ], + ), + ), + const SizedBox(height: Constants.SPACING * 3), + LabelInputContainer( + label: "Enter Code", + child: Pinput( + length: 5, + controller: otpController, + defaultPinTheme: PinTheme( + width: 56, + height: 56, + textStyle: const TextStyle( + fontSize: 22, + color: Color.fromRGBO(30, 60, 87, 1), + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(19), + border: Border.all(color: Constants.programsColor), + ), ), - title: const Text("Mbagathi Referal Hospital"), - subtitle: Text( - "Visit Date: ${DateFormat("yyyy MMM dd").format(DateTime.parse(data[index].visitDate))}"), - trailing: const Icon(Icons.chevron_right)), + androidSmsAutofillMethod: AndroidSmsAutofillMethod.smsUserConsentApi, + cursor: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + margin: const EdgeInsets.only(bottom: 9), + width: 22, + height: 1, + color: Constants.programsColor, + ) + ], + ), + validator: (value) { + if (value == null || value.length != 5) { + return 'Check the code should be 5 digits'; + } + return null; + }, + pinputAutovalidateMode: PinputAutovalidateMode.onSubmit, + ), + ), + const SizedBox(height: Constants.SPACING * 6), + Button( + title: "Verify OTP", + backgroundColor: theme.colorScheme.primary, + textColor: Colors.white, + onPress: handleSubmit, + loading: loading.value, + ), + const SizedBox(height: Constants.SPACING * 2), + if (timer.remainingTime == 0) + LinkedRichText( + linked: "Don't receive code?", + unlinked: "Resend code", + mainAxisAlignment: MainAxisAlignment.start, + onPress: () { + timer.reset(); + loading.value = true; + requestVerificationStateNotifier + .getOTPCode("sms") + .then((value) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(value)), + ); + }).whenComplete(() { + loading.value = false; + }); + }, + ), + const SizedBox(height: Constants.SPACING), + LinkedRichText( + linked: "Send code in ", + unlinked: "00:${timer.remainingTime}", + mainAxisAlignment: MainAxisAlignment.start, + ), + const SizedBox(height: Constants.SPACING), ], ), ), ), - ], - ), - error: (error, _) => Center(child: Text(error.toString())), - loading: () => Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - "Loading your visits", - style: theme.textTheme.headlineSmall, - ), - const SizedBox(height: Constants.SPACING * 2), - const CircularProgressIndicator(), - ], ), - ), - ); - }, + ) + ], + ), ), ); } -} +} \ No newline at end of file diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index aedd252a..00cf4725 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -76,6 +76,7 @@ class RouteNames { static const PROVIDER_MAIN_SCREEN = "provider-main-screen"; static const REQUEST_APP_RESCHEDULE = "request-app-reschedule"; static const DAWA_DROP_MANAGER = "dawa-drop-manager"; + static const LOCATION_SELECTION = "location-selection"; } class MenuItemNames { From 2589211a9077a63886da593eb5376c4fc9a37e2d Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 14 Oct 2024 22:49:41 +0300 Subject: [PATCH 099/140] :construction: Add provider location selectoin --- assets/data/provider.json | 20 + lib/src/app/navigation/app_router.dart | 22 +- .../pages/provider_main_Screen.dart | 59 +-- .../admin_location_selection_screen.dart | 91 ----- .../data/models/provider_registry.dart | 24 ++ .../models/provider_registry.freezed.dart | 375 ++++++++++++++++++ .../data/models/provider_registry.g.dart | 39 ++ .../providers/provider_registry_provider.dart | 14 + .../provider_registry_repository.dart | 17 + .../services/provider_registry_service.dart | 89 +++++ .../presentaion/forms/forms.dart | 3 + .../presentaion/forms/location.dart | 110 +++++ .../presentaion/forms/provider_registry.dart | 73 ++++ .../presentaion/forms/review_submit.dart | 35 ++ .../pages/location_selection_screen.dart | 229 +++++++++++ lib/src/features/user/data/models/user.dart | 3 + .../user/data/models/user.freezed.dart | 84 +++- lib/src/features/user/data/models/user.g.dart | 6 + .../user/data/services/UserService.dart | 3 + .../presentation/forms/Identifications.dart | 68 ++++ .../user/presentation/forms/forms.dart | 3 +- .../presentation/pages/ProfileScreen.dart | 17 +- .../pages/ProfileWizardFormScreen.dart | 24 +- 23 files changed, 1258 insertions(+), 150 deletions(-) create mode 100644 assets/data/provider.json delete mode 100644 lib/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart create mode 100644 lib/src/features/provider/provider_registry/data/models/provider_registry.dart create mode 100644 lib/src/features/provider/provider_registry/data/models/provider_registry.freezed.dart create mode 100644 lib/src/features/provider/provider_registry/data/models/provider_registry.g.dart create mode 100644 lib/src/features/provider/provider_registry/data/providers/provider_registry_provider.dart create mode 100644 lib/src/features/provider/provider_registry/data/repositories/provider_registry_repository.dart create mode 100644 lib/src/features/provider/provider_registry/data/services/provider_registry_service.dart create mode 100644 lib/src/features/provider/provider_registry/presentaion/forms/forms.dart create mode 100644 lib/src/features/provider/provider_registry/presentaion/forms/location.dart create mode 100644 lib/src/features/provider/provider_registry/presentaion/forms/provider_registry.dart create mode 100644 lib/src/features/provider/provider_registry/presentaion/forms/review_submit.dart create mode 100644 lib/src/features/provider/provider_registry/presentaion/pages/location_selection_screen.dart create mode 100644 lib/src/features/user/presentation/forms/Identifications.dart diff --git a/assets/data/provider.json b/assets/data/provider.json new file mode 100644 index 00000000..a37a72c3 --- /dev/null +++ b/assets/data/provider.json @@ -0,0 +1,20 @@ +{ + "success": false, + "message": "Provider already exist locally", + "provider": { + "id": 1, + "family_name": "MAKORI", + "given_name": "DENNIS ONDENYO", + "salutation": "Dr.", + "national_id": 32923183, + "license_number": "K-ANN-2024-002180", + "board_number": "PUID-002179", + "cadre": "Optometrist", + "gender": "UNSPECIFIED", + "facility_code": null, + "user_id": 53, + "createdAt": "2024-10-09T07:10:06.000Z", + "updatedAt": "2024-10-09T07:10:06.000Z", + "deletedAt": null + } +} \ No newline at end of file diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index b8bf2538..c78d92a9 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -73,7 +73,7 @@ import 'package:nishauri/src/features/programs/presentation/pages/programs.dart' import 'package:nishauri/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart'; import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart'; import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; -import 'package:nishauri/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart'; +import 'package:nishauri/src/features/provider/provider_registry/presentaion/pages/location_selection_screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/self_screening_menu.dart'; @@ -391,16 +391,16 @@ final List secureRoutes = [ builder: (BuildContext context, GoRouterState state) { return const FacilityVisitsScreen(); }, - ), - - GoRoute( - name: RouteNames.FACILITY_VISIT_DETAIL, - path: ':visitId', - builder: (BuildContext context, GoRouterState state) { - return FacilityVisitDetailScreen( - visitId: state.pathParameters["visitId"]!); - }, - ), + routes: [ + GoRoute( + name: RouteNames.FACILITY_VISIT_DETAIL, + path: ':visitId', + builder: (BuildContext context, GoRouterState state) { + return FacilityVisitDetailScreen( + visitId: state.pathParameters["visitId"]!); + }, + ) + ]), GoRoute( name: RouteNames.PROVIDER_MAIN_SCREEN, path: 'provider-main-screen', diff --git a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart index b980d52a..edc4c0bf 100644 --- a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart +++ b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart @@ -1,14 +1,36 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; +import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -_menuItems(BuildContext context) => [ - MenuItem( +_menuItems(BuildContext context, bool isProvider) => [ + if (!isProvider) ...[ + MenuItem( + shortcutBackgroundColor: Constants.providerBgColor, + icon: SvgPicture.asset( + "assets/images/review.svg", + semanticsLabel: "Provider", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/review.svg", + semanticsLabel: "provider", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Update Provider Registration", + onPressed: () => context.goNamed(RouteNames.LOCATION_SELECTION), + color: Constants.providerBgColor.withOpacity(0.5), + ), + ], + if (isProvider) ...[MenuItem( shortcutBackgroundColor: Constants.providerBgColor, icon: SvgPicture.asset( "assets/images/Calendar-Splash.svg", @@ -44,33 +66,24 @@ _menuItems(BuildContext context) => [ onPressed: () => context.goNamed(RouteNames.DAWA_DROP_MANAGER), color: Constants.providerBgColor.withOpacity(0.5), ), - // MenuItem( - // shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - // icon: SvgPicture.asset( - // "assets/images/review.svg", - // semanticsLabel: "Dawa", - // fit: BoxFit.contain, - // width: 80, - // height: 80, - // ), - // shortcutIcon: SvgPicture.asset("assets/images/review.svg", - // semanticsLabel: "Dawa", - // fit: BoxFit.contain, - // width: Constants.shortcutIconSize, - // height: Constants.shortcutIconSize), - // title: "Confirm Delivery", - // onPressed: () => context.goNamed(RouteNames.DISPATCHED_DRUGS), - // color: theme.primaryColorDark.withOpacity(0.5), - // ), +] ]; -class ProviderMainScreen extends StatelessWidget { + +class ProviderMainScreen extends HookConsumerWidget { const ProviderMainScreen({super.key}); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); - final _items = _menuItems(context); + final user = ref.watch(userProvider); + + final isProvider = user.when( + data: (provider) => provider.provider_id == "yes", + error: (error, stack) => false, + loading: () => false, + ); + final _items = _menuItems(context, isProvider); return Scaffold( body: Column( children: [ diff --git a/lib/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart b/lib/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart deleted file mode 100644 index e890c2b6..00000000 --- a/lib/src/features/provider/provider_admin/presentation/pages/admin_location_selection_screen.dart +++ /dev/null @@ -1,91 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:nishauri/src/shared/display/CustomAppBar.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class LocationSelectionScreen extends StatefulWidget { - @override - _LocationSelectionScreenState createState() => _LocationSelectionScreenState(); -} - -class _LocationSelectionScreenState extends State { - String? selectedCounty; - String? subCounty; - final List counties = [ - 'County A', - 'County B', - 'County C', - 'County D', - ]; - - void submit() { - if (selectedCounty != null && subCounty != null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Selected County: $selectedCounty, Sub-County: $subCounty')), - ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Please select a county and enter a sub-county')), - ); - } - } - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Scaffold( - // appBar: AppBar( - // title: Text('Select Location'), - // ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const CustomAppBar( - title: "Dawa Drop Requests 📋", - color: Constants.providerBgColor, - ), - SizedBox(height: 10,), - Text("Welcome admin", style: theme.textTheme.titleMedium,), - SizedBox(height: 20), - Text("Select your location from the list below.", style: theme.textTheme.bodyLarge,), - SizedBox(height: 20), - Text('Select a County:', style: TextStyle(fontSize: 18)), - DropdownButton( - isExpanded: true, - value: selectedCounty, - hint: Text('Choose a county'), - items: counties.map((String county) { - return DropdownMenuItem( - value: county, - child: Text(county), - ); - }).toList(), - onChanged: (String? newValue) { - setState(() { - selectedCounty = newValue; - subCounty = null; // Reset sub-county when county changes - }); - }, - ), - SizedBox(height: 20), - if (selectedCounty != null) ...[ - Text('Enter Sub-County:', style: TextStyle(fontSize: 18)), - TextField( - onChanged: (value) { - subCounty = value; - }, - decoration: InputDecoration( - border: OutlineInputBorder(), - hintText: 'Sub-county name', - ), - ), - ], - SizedBox(height: 20), - ElevatedButton( - onPressed: submit, - child: Text('Submit'), - ), - ], - ), - ); - } -} diff --git a/lib/src/features/provider/provider_registry/data/models/provider_registry.dart b/lib/src/features/provider/provider_registry/data/models/provider_registry.dart new file mode 100644 index 00000000..cd3fef08 --- /dev/null +++ b/lib/src/features/provider/provider_registry/data/models/provider_registry.dart @@ -0,0 +1,24 @@ +import 'dart:core'; + +import 'package:freezed_annotation/freezed_annotation.dart'; +part 'provider_registry.freezed.dart'; +part 'provider_registry.g.dart'; + +@Freezed() +class ProviderRegistry with _$ProviderRegistry { + const factory ProviderRegistry({ + int? id, + String? family_name, + String? given_name, + int? national_id, + String? licence_number, + String? board_number, + String? cadre, + String? gender, + String? facility_code, + int? user_id, + String? salutation, + + }) = _ProviderRegistry; + factory ProviderRegistry.fromJson(Map json)=> _$ProviderRegistryFromJson(json); +} \ No newline at end of file diff --git a/lib/src/features/provider/provider_registry/data/models/provider_registry.freezed.dart b/lib/src/features/provider/provider_registry/data/models/provider_registry.freezed.dart new file mode 100644 index 00000000..3b650801 --- /dev/null +++ b/lib/src/features/provider/provider_registry/data/models/provider_registry.freezed.dart @@ -0,0 +1,375 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'provider_registry.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +ProviderRegistry _$ProviderRegistryFromJson(Map json) { + return _ProviderRegistry.fromJson(json); +} + +/// @nodoc +mixin _$ProviderRegistry { + int? get id => throw _privateConstructorUsedError; + String? get family_name => throw _privateConstructorUsedError; + String? get given_name => throw _privateConstructorUsedError; + int? get national_id => throw _privateConstructorUsedError; + String? get licence_number => throw _privateConstructorUsedError; + String? get board_number => throw _privateConstructorUsedError; + String? get cadre => throw _privateConstructorUsedError; + String? get gender => throw _privateConstructorUsedError; + String? get facility_code => throw _privateConstructorUsedError; + int? get user_id => throw _privateConstructorUsedError; + String? get salutation => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $ProviderRegistryCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ProviderRegistryCopyWith<$Res> { + factory $ProviderRegistryCopyWith( + ProviderRegistry value, $Res Function(ProviderRegistry) then) = + _$ProviderRegistryCopyWithImpl<$Res, ProviderRegistry>; + @useResult + $Res call( + {int? id, + String? family_name, + String? given_name, + int? national_id, + String? licence_number, + String? board_number, + String? cadre, + String? gender, + String? facility_code, + int? user_id, + String? salutation}); +} + +/// @nodoc +class _$ProviderRegistryCopyWithImpl<$Res, $Val extends ProviderRegistry> + implements $ProviderRegistryCopyWith<$Res> { + _$ProviderRegistryCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + Object? family_name = freezed, + Object? given_name = freezed, + Object? national_id = freezed, + Object? licence_number = freezed, + Object? board_number = freezed, + Object? cadre = freezed, + Object? gender = freezed, + Object? facility_code = freezed, + Object? user_id = freezed, + Object? salutation = freezed, + }) { + return _then(_value.copyWith( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + family_name: freezed == family_name + ? _value.family_name + : family_name // ignore: cast_nullable_to_non_nullable + as String?, + given_name: freezed == given_name + ? _value.given_name + : given_name // ignore: cast_nullable_to_non_nullable + as String?, + national_id: freezed == national_id + ? _value.national_id + : national_id // ignore: cast_nullable_to_non_nullable + as int?, + licence_number: freezed == licence_number + ? _value.licence_number + : licence_number // ignore: cast_nullable_to_non_nullable + as String?, + board_number: freezed == board_number + ? _value.board_number + : board_number // ignore: cast_nullable_to_non_nullable + as String?, + cadre: freezed == cadre + ? _value.cadre + : cadre // ignore: cast_nullable_to_non_nullable + as String?, + gender: freezed == gender + ? _value.gender + : gender // ignore: cast_nullable_to_non_nullable + as String?, + facility_code: freezed == facility_code + ? _value.facility_code + : facility_code // ignore: cast_nullable_to_non_nullable + as String?, + user_id: freezed == user_id + ? _value.user_id + : user_id // ignore: cast_nullable_to_non_nullable + as int?, + salutation: freezed == salutation + ? _value.salutation + : salutation // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ProviderRegistryImplCopyWith<$Res> + implements $ProviderRegistryCopyWith<$Res> { + factory _$$ProviderRegistryImplCopyWith(_$ProviderRegistryImpl value, + $Res Function(_$ProviderRegistryImpl) then) = + __$$ProviderRegistryImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int? id, + String? family_name, + String? given_name, + int? national_id, + String? licence_number, + String? board_number, + String? cadre, + String? gender, + String? facility_code, + int? user_id, + String? salutation}); +} + +/// @nodoc +class __$$ProviderRegistryImplCopyWithImpl<$Res> + extends _$ProviderRegistryCopyWithImpl<$Res, _$ProviderRegistryImpl> + implements _$$ProviderRegistryImplCopyWith<$Res> { + __$$ProviderRegistryImplCopyWithImpl(_$ProviderRegistryImpl _value, + $Res Function(_$ProviderRegistryImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + Object? family_name = freezed, + Object? given_name = freezed, + Object? national_id = freezed, + Object? licence_number = freezed, + Object? board_number = freezed, + Object? cadre = freezed, + Object? gender = freezed, + Object? facility_code = freezed, + Object? user_id = freezed, + Object? salutation = freezed, + }) { + return _then(_$ProviderRegistryImpl( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + family_name: freezed == family_name + ? _value.family_name + : family_name // ignore: cast_nullable_to_non_nullable + as String?, + given_name: freezed == given_name + ? _value.given_name + : given_name // ignore: cast_nullable_to_non_nullable + as String?, + national_id: freezed == national_id + ? _value.national_id + : national_id // ignore: cast_nullable_to_non_nullable + as int?, + licence_number: freezed == licence_number + ? _value.licence_number + : licence_number // ignore: cast_nullable_to_non_nullable + as String?, + board_number: freezed == board_number + ? _value.board_number + : board_number // ignore: cast_nullable_to_non_nullable + as String?, + cadre: freezed == cadre + ? _value.cadre + : cadre // ignore: cast_nullable_to_non_nullable + as String?, + gender: freezed == gender + ? _value.gender + : gender // ignore: cast_nullable_to_non_nullable + as String?, + facility_code: freezed == facility_code + ? _value.facility_code + : facility_code // ignore: cast_nullable_to_non_nullable + as String?, + user_id: freezed == user_id + ? _value.user_id + : user_id // ignore: cast_nullable_to_non_nullable + as int?, + salutation: freezed == salutation + ? _value.salutation + : salutation // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ProviderRegistryImpl implements _ProviderRegistry { + const _$ProviderRegistryImpl( + {this.id, + this.family_name, + this.given_name, + this.national_id, + this.licence_number, + this.board_number, + this.cadre, + this.gender, + this.facility_code, + this.user_id, + this.salutation}); + + factory _$ProviderRegistryImpl.fromJson(Map json) => + _$$ProviderRegistryImplFromJson(json); + + @override + final int? id; + @override + final String? family_name; + @override + final String? given_name; + @override + final int? national_id; + @override + final String? licence_number; + @override + final String? board_number; + @override + final String? cadre; + @override + final String? gender; + @override + final String? facility_code; + @override + final int? user_id; + @override + final String? salutation; + + @override + String toString() { + return 'ProviderRegistry(id: $id, family_name: $family_name, given_name: $given_name, national_id: $national_id, licence_number: $licence_number, board_number: $board_number, cadre: $cadre, gender: $gender, facility_code: $facility_code, user_id: $user_id, salutation: $salutation)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ProviderRegistryImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.family_name, family_name) || + other.family_name == family_name) && + (identical(other.given_name, given_name) || + other.given_name == given_name) && + (identical(other.national_id, national_id) || + other.national_id == national_id) && + (identical(other.licence_number, licence_number) || + other.licence_number == licence_number) && + (identical(other.board_number, board_number) || + other.board_number == board_number) && + (identical(other.cadre, cadre) || other.cadre == cadre) && + (identical(other.gender, gender) || other.gender == gender) && + (identical(other.facility_code, facility_code) || + other.facility_code == facility_code) && + (identical(other.user_id, user_id) || other.user_id == user_id) && + (identical(other.salutation, salutation) || + other.salutation == salutation)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash( + runtimeType, + id, + family_name, + given_name, + national_id, + licence_number, + board_number, + cadre, + gender, + facility_code, + user_id, + salutation); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ProviderRegistryImplCopyWith<_$ProviderRegistryImpl> get copyWith => + __$$ProviderRegistryImplCopyWithImpl<_$ProviderRegistryImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$ProviderRegistryImplToJson( + this, + ); + } +} + +abstract class _ProviderRegistry implements ProviderRegistry { + const factory _ProviderRegistry( + {final int? id, + final String? family_name, + final String? given_name, + final int? national_id, + final String? licence_number, + final String? board_number, + final String? cadre, + final String? gender, + final String? facility_code, + final int? user_id, + final String? salutation}) = _$ProviderRegistryImpl; + + factory _ProviderRegistry.fromJson(Map json) = + _$ProviderRegistryImpl.fromJson; + + @override + int? get id; + @override + String? get family_name; + @override + String? get given_name; + @override + int? get national_id; + @override + String? get licence_number; + @override + String? get board_number; + @override + String? get cadre; + @override + String? get gender; + @override + String? get facility_code; + @override + int? get user_id; + @override + String? get salutation; + @override + @JsonKey(ignore: true) + _$$ProviderRegistryImplCopyWith<_$ProviderRegistryImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/provider/provider_registry/data/models/provider_registry.g.dart b/lib/src/features/provider/provider_registry/data/models/provider_registry.g.dart new file mode 100644 index 00000000..e86c7f69 --- /dev/null +++ b/lib/src/features/provider/provider_registry/data/models/provider_registry.g.dart @@ -0,0 +1,39 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'provider_registry.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ProviderRegistryImpl _$$ProviderRegistryImplFromJson( + Map json) => + _$ProviderRegistryImpl( + id: (json['id'] as num?)?.toInt(), + family_name: json['family_name'] as String?, + given_name: json['given_name'] as String?, + national_id: (json['national_id'] as num?)?.toInt(), + licence_number: json['licence_number'] as String?, + board_number: json['board_number'] as String?, + cadre: json['cadre'] as String?, + gender: json['gender'] as String?, + facility_code: json['facility_code'] as String?, + user_id: (json['user_id'] as num?)?.toInt(), + salutation: json['salutation'] as String?, + ); + +Map _$$ProviderRegistryImplToJson( + _$ProviderRegistryImpl instance) => + { + 'id': instance.id, + 'family_name': instance.family_name, + 'given_name': instance.given_name, + 'national_id': instance.national_id, + 'licence_number': instance.licence_number, + 'board_number': instance.board_number, + 'cadre': instance.cadre, + 'gender': instance.gender, + 'facility_code': instance.facility_code, + 'user_id': instance.user_id, + 'salutation': instance.salutation, + }; diff --git a/lib/src/features/provider/provider_registry/data/providers/provider_registry_provider.dart b/lib/src/features/provider/provider_registry/data/providers/provider_registry_provider.dart new file mode 100644 index 00000000..c9cb1f98 --- /dev/null +++ b/lib/src/features/provider/provider_registry/data/providers/provider_registry_provider.dart @@ -0,0 +1,14 @@ + +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/models/provider_registry.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/repositories/provider_registry_repository.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/services/provider_registry_service.dart'; + +final providerRegistryRepositoryProvider = Provider((ref) { + return ProviderRegistryRepository(ProviderRegistryService()); +}); + +final getProviderDetailsProvider = FutureProvider((ref) async { + final repository = ref.watch(providerRegistryRepositoryProvider); + return await repository.getProviderDetails(); +}); \ No newline at end of file diff --git a/lib/src/features/provider/provider_registry/data/repositories/provider_registry_repository.dart b/lib/src/features/provider/provider_registry/data/repositories/provider_registry_repository.dart new file mode 100644 index 00000000..dd4ea5a7 --- /dev/null +++ b/lib/src/features/provider/provider_registry/data/repositories/provider_registry_repository.dart @@ -0,0 +1,17 @@ + +import 'package:nishauri/src/features/provider/provider_registry/data/models/provider_registry.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/services/provider_registry_service.dart'; + +class ProviderRegistryRepository { + final ProviderRegistryService _service; + + ProviderRegistryRepository(this._service); + + Future searchProviderRegistry (Map data) async { + return await _service.searchProviderRegistry(data); + } + + Future getProviderDetails() async { + return await _service.getProviderDetails(); + } +} diff --git a/lib/src/features/provider/provider_registry/data/services/provider_registry_service.dart b/lib/src/features/provider/provider_registry/data/services/provider_registry_service.dart new file mode 100644 index 00000000..0f1933fa --- /dev/null +++ b/lib/src/features/provider/provider_registry/data/services/provider_registry_service.dart @@ -0,0 +1,89 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:http/http.dart'; +import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; +import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/models/provider_registry.dart'; +import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/helpers.dart'; + +class ProviderRegistryService extends HTTPService { + + final AuthRepository _repository = AuthRepository(AuthApiService()); + + Future searchProviderRegistry(Map data) async { + final response = await call (searchProviderRegistry_, data); + + if (response.statusCode == 200) { + final responseString = await response.stream.bytesToString(); + final Map responseData = json.decode(responseString); + + if (responseData["success"] == true) { + final Map provider = responseData["data"]["provider"]; + return ProviderRegistry.fromJson(provider); + } + else { + throw responseData["message"]; + } + } + else { + throw "Something went wrong contact Admin"; + } + } + + Future searchProviderRegistry_( + Map data) async { + final id = await _repository.getUserId(); + var user = {'user_id': id}; + var mergedData = {...data, ...user}; + final tokenPair = await getCachedToken(); + var headers = { + 'Authorization': "Bearer ${tokenPair.accessToken}", + 'Content-Type': 'application/json', + }; + var url = '${Constants.BASE_URL_NEW}practitioner'; + final response = await request(url: url, token: tokenPair, method: 'POST', requestHeaders: headers, data: mergedData, userId: id); + return response; + } + + Future getProviderDetails() async { + final data = await loadJsonData("assets/data/provider.json"); + final json = jsonDecode(data); + + final Map providerJson = json["provider"]; + final provider = ProviderRegistry.fromJson(providerJson); + log("$provider"); + return provider; + // final response = await call (getProviderDetails_, null); + // + // if (response.statusCode == 200) { + // final responseString = await response.stream.bytesToString(); + // final Map responseData = json.decode(responseString); + // + // if (responseData["success"] == true) { + // final Map provider = responseData["data"]["provider"]; + // return ProviderRegistry.fromJson(provider); + // } + // else { + // throw responseData["message"]; + // } + // } + // else { + // throw "Something went wrong contact Admin"; + // } + } + + // Future getProviderDetails_(dynamic args) async { + // final id = await _repository.getUserId(); + // final tokenPair = await getCachedToken(); + // var headers = { + // 'Authorization': "Bearer ${tokenPair.accessToken}", + // 'Content-Type': 'application/json', + // }; + // var url = '${Constants.BASE_URL_NEW}practitioner/user_id'; + // final response = await request(url: url, token: tokenPair, method: 'GET', requestHeaders: headers, userId: id); + // return response; + // } +} \ No newline at end of file diff --git a/lib/src/features/provider/provider_registry/presentaion/forms/forms.dart b/lib/src/features/provider/provider_registry/presentaion/forms/forms.dart new file mode 100644 index 00000000..da5dccdb --- /dev/null +++ b/lib/src/features/provider/provider_registry/presentaion/forms/forms.dart @@ -0,0 +1,3 @@ +export 'provider_registry.dart'; +export 'location.dart'; +export 'review_submit.dart'; \ No newline at end of file diff --git a/lib/src/features/provider/provider_registry/presentaion/forms/location.dart b/lib/src/features/provider/provider_registry/presentaion/forms/location.dart new file mode 100644 index 00000000..525f1589 --- /dev/null +++ b/lib/src/features/provider/provider_registry/presentaion/forms/location.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; +import 'package:nishauri/src/shared/styles/input_styles.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class LocationInformation extends StatefulWidget { + const LocationInformation({super.key}); + + @override + _LocationInformationState createState() => _LocationInformationState(); +} + +class _LocationInformationState extends State { + String? selectedCounty; + String? selectedSubCounty; + String? facility; + + @override + Widget build(BuildContext context) { + final counties = [ + const DropdownMenuItem(value: "NAI", child: Text("Nairobi")), + const DropdownMenuItem(value: "MSA", child: Text("Mombasa")), + const DropdownMenuItem(value: "NAK", child: Text("Nakuru")), + const DropdownMenuItem(value: "KIS", child: Text("Kisumu")), + ]; + + final subCounties = [ + const DropdownMenuItem(value: "RUA", child: Text("Ruaraka")), + const DropdownMenuItem(value: "ROY", child: Text("Roysambu")), + const DropdownMenuItem(value: "KAS", child: Text("Kasarani")), + const DropdownMenuItem(value: "LAN", child: Text("Langata")), + ]; + + final facilities = [ + const DropdownMenuItem(value: "23855", child: Text("Huruma Hospital - Mathare North Annex")), + const DropdownMenuItem(value: "29146", child: Text("Seaton Park Medical Centre")), + const DropdownMenuItem(value: "29283", child: Text("Provide Medical Centre")), + const DropdownMenuItem(value: "13246", child: Text("St. Scholastica Uzima Hospital")), + ]; + + return Consumer( + builder: (context, ref, child) { + final asyncUser = ref.watch(userProvider); + return asyncUser.when( + data: (user) => Column( + children: [ + const SizedBox(height: Constants.SPACING), + FormBuilderDropdown( + initialValue: selectedCounty, + name: "county", + items: counties, + onChanged: (String? newValue) { + setState(() { + selectedCounty = newValue; + selectedSubCounty = null; // Reset sub-county and facility + facility = null; + }); + }, + decoration: inputDecoration( + prefixIcon: Icons.map_sharp, + label: "County", + ), + ), + const SizedBox(height: Constants.SPACING), + if (selectedCounty != null) ...[ + FormBuilderDropdown( + initialValue: selectedSubCounty, + name: "sub_county", + items: subCounties, + onChanged: (String? newValue) { + setState(() { + selectedSubCounty = newValue; + facility = null; // Reset facility + }); + }, + decoration: inputDecoration( + prefixIcon: Icons.map_sharp, + label: "Sub County", + ), + ), + ], + if (selectedSubCounty != null) ...[ + FormBuilderDropdown( + initialValue: facility, + name: "facility_mfl", + items: facilities, + onChanged: (String? newValue) { + setState(() { + facility = newValue; + }); + }, + decoration: inputDecoration( + prefixIcon: Icons.local_hospital_outlined, + label: "Facility", + ), + ), + ], + ], + ), + error: (error, _) => Center(child: Text(error.toString())), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + ); + }, + ); + } +} diff --git a/lib/src/features/provider/provider_registry/presentaion/forms/provider_registry.dart b/lib/src/features/provider/provider_registry/presentaion/forms/provider_registry.dart new file mode 100644 index 00000000..44915902 --- /dev/null +++ b/lib/src/features/provider/provider_registry/presentaion/forms/provider_registry.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/providers/provider_registry_provider.dart'; +import 'package:nishauri/src/hooks/use_local_avatar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class ProviderRegistry extends HookConsumerWidget { + const ProviderRegistry({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final avatar = useLocalAvatar("images/avatar.jpg"); + return Consumer( + builder: (context, ref, child) { + final asyncProvider = ref.watch(getProviderDetailsProvider); + return asyncProvider.when( + data: (provider) => Container( + child: Wrap ( children: [ + const Divider(), + ListTile( + leading: const Icon(Icons.perm_identity, color: Constants.providerBgColor,), + title: const Text("Name"), + subtitle: Text('${provider.salutation} ${provider.family_name} ${provider.given_name}'), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.perm_identity, color: Constants.providerBgColor), + title: const Text("Gender"), + subtitle: Text(provider.gender??''), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.card_membership, color: Constants.providerBgColor), + title: const Text("National Id"), + subtitle: Text(provider.national_id.toString()), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.card_membership, color: Constants.providerBgColor), + title: const Text("Licence Number"), + subtitle: Text(provider.licence_number??''), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.card_membership, color: Constants.providerBgColor), + title: const Text("Board Number"), + subtitle: Text(provider.board_number??''), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.card_membership, color: Constants.providerBgColor), + title: const Text("Cadre"), + subtitle: Text(provider.cadre??''), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.local_hospital_outlined, color: Constants.providerBgColor), + title: const Text("Facility"), + subtitle: Text(provider.facility_code??''), + ), + const Divider(), + ], + ), + ), + error: (error, _) => Center(child: Text(error.toString())), + loading: () => const Center( + child: CircularProgressIndicator(),), + ); + }, + ); +} +} \ No newline at end of file diff --git a/lib/src/features/provider/provider_registry/presentaion/forms/review_submit.dart b/lib/src/features/provider/provider_registry/presentaion/forms/review_submit.dart new file mode 100644 index 00000000..f36bbad8 --- /dev/null +++ b/lib/src/features/provider/provider_registry/presentaion/forms/review_submit.dart @@ -0,0 +1,35 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/shared/display/AppAvatar.dart'; + +class ReviewAndSubmitLocation extends StatelessWidget { + final Map formState; + + const ReviewAndSubmitLocation({Key? key, required this.formState}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Container( + child: Wrap(children: [ + const Divider(), + + ListTile( + leading: AppAvatar(alt: Icon(Icons.person), image: formState["image"]), + title: const Text("Full Name"), + subtitle: Text("${formState['salutation'] ?? "None"} ${formState['family_name'] ?? "None"} ${formState['given_name'] ?? "None"}"), + ), + const Divider(), + + ListTile( + title: const Text("Facility"), + subtitle: Text("${formState['facility_mfl'] ?? "None"}"), + ), + const Divider(), + ]), + ); + } +} diff --git a/lib/src/features/provider/provider_registry/presentaion/pages/location_selection_screen.dart b/lib/src/features/provider/provider_registry/presentaion/pages/location_selection_screen.dart new file mode 100644 index 00000000..3ddecd83 --- /dev/null +++ b/lib/src/features/provider/provider_registry/presentaion/pages/location_selection_screen.dart @@ -0,0 +1,229 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/providers/provider_registry_provider.dart'; +import 'package:nishauri/src/features/provider/provider_registry/presentaion/forms/forms.dart'; +import 'package:nishauri/src/shared/display/AppCard.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/input/Button.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class LocationSelectionScreen extends HookConsumerWidget { + + @override + Widget build(BuildContext context, WidgetRef ref) { + final formKey = useMemoized(() => GlobalKey()); + final theme = Theme.of(context); + final currentStep = useState(0); + final loading = useState(false); + final usrProvider = ref.watch(getProviderDetailsProvider); + + final providerName = usrProvider.when(data: (data) => data.family_name, error: (error, stack) => false, + loading: () => false); + final salutation = usrProvider.when(data: (data) => data.salutation, error: (error, stack) => false, + loading: () => false); + + List steps = [ + Step( + title: const Text("Provider Information"), + subtitle: const Text("Confirm your Registration details"), + content: const ProviderRegistry(), + isActive: currentStep.value == 0, + ), + Step( + title: const Text("Provider Information"), + subtitle: const Text("Confirm your Registration details"), + content: const LocationInformation(), + isActive: currentStep.value == 1, + ), + Step( + title: const Text("Review and Submit"), + content: AppCard( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + SvgPicture.asset( + "assets/images/review.svg", + semanticsLabel: "Security", + fit: BoxFit.contain, + height: 150, + ), + const SizedBox(height: Constants.SPACING), + const Text( + "Thank you for selecting your service facility!", + ), + const SizedBox(height: Constants.SPACING), + const Text( + "Review your information for accuracy before submission.") + ], + ), + ), + ), + isActive: currentStep.value == 2, + ), + ]; + + final stepFieldsToValidate = [ + ["family_name"], + ["facility_mfl"], + ]; + + void handleSubmit() { + // Implement form submission logic here + } + + return WillPopScope( + onWillPop: () async { + return false; + }, + child: Scaffold( + body: SingleChildScrollView( // Wrap in SingleChildScrollView + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const CustomAppBar( + title: "Provider Profile Update 📋", + color: Constants.providerBgColor, + ), + const SizedBox(height: 10), + Text("Welcome ${salutation} ${providerName}", style: theme.textTheme.titleMedium), + const SizedBox(height: 20), + Text("Confirm your details and update your current location/facility.", style: theme.textTheme.bodyLarge), + const SizedBox(height: 20), + FormBuilder( + key: formKey, + child: Stepper( + connectorColor: MaterialStateProperty.resolveWith((states) { + // Return a color based on the states, or null for default + if (states.contains(MaterialState.selected)) { + return Constants.providerBgColor; // Color when selected + } + return Colors.grey; // Default color + }), + // connectorColor: MaterialStateProperty.all(Constants.providerBgColor), + currentStep: currentStep.value, + onStepCancel: () { + if (currentStep.value > 0) { + currentStep.value -= 1; + } + }, + onStepContinue: () { + bool isLastStep = (currentStep.value == steps.length - 1); + + // Validate fields + if (!isLastStep) { + final currentStepFields = stepFieldsToValidate[currentStep.value]; + if (currentStepFields.any((field) => !formKey.currentState!.fields[field]!.validate())) { + return; + } + } + + if (isLastStep) { + // Submit form + handleSubmit(); + } else { + currentStep.value += 1; + } + }, + onStepTapped: (step) { + currentStep.value = step; + }, + steps: steps, + controlsBuilder: (context, details) { + return Row( + children: [ + Expanded( + child: Builder(builder: (context) { + bool isLastStep = (currentStep.value == steps.length - 1); + if (isLastStep) { + return Button( + onPress: () async { + final results = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text("Confirm Location Details Entered"), + content: SizedBox( + width: double.maxFinite, + height: MediaQuery.of(context).size.height * 0.5, + child: SingleChildScrollView( + child: ReviewAndSubmitLocation( + formState: formKey.currentState!.instantValue, + ), + ), + ), + actions: [ + Row( + children: [ + Expanded( + child: Button( + title: "Submit", + onPress: () { + context.pop(1); + }, + ), + ), + const SizedBox(width: 8), + Expanded( + child: Button( + title: "Cancel", + onPress: context.pop, + titleStyle: theme.textTheme.titleLarge?.copyWith( + color: Constants.providerBgColor, + ), + ), + ), + ], + ), + ], + ), + ); + if (results == 1) { + details.onStepContinue!(); + } + }, + title: 'Review', + loading: loading.value, + titleStyle: theme.textTheme.titleSmall?.copyWith( + color: Constants.providerBgColor, + fontWeight: FontWeight.bold, + ), + ); + } + return Button( + onPress: details.onStepContinue, + title: 'Next', + disabled: loading.value, + titleStyle: theme.textTheme.titleSmall?.copyWith( + color: Constants.providerBgColor, + fontWeight: FontWeight.bold, + ), + ); + }), + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child: Button( + onPress: details.onStepCancel, + title: 'Cancel', + disabled: loading.value, + titleStyle: theme.textTheme.titleSmall?.copyWith(fontWeight: FontWeight.bold), + ), + ), + const SizedBox(width: Constants.SPACING), + const Expanded(child: SizedBox()), // Placeholder for alignment + ], + ); + }, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/src/features/user/data/models/user.dart b/lib/src/features/user/data/models/user.dart index 37ddd4b0..8e10fe8d 100644 --- a/lib/src/features/user/data/models/user.dart +++ b/lib/src/features/user/data/models/user.dart @@ -35,6 +35,9 @@ class User with _$User { @Default(false) bool accountVerified, @Default([]) List roles, String? facility, + String? national_id, + String? sha_id, + String? provider_id }) = _User; diff --git a/lib/src/features/user/data/models/user.freezed.dart b/lib/src/features/user/data/models/user.freezed.dart index 6f5fd06c..b1871577 100644 --- a/lib/src/features/user/data/models/user.freezed.dart +++ b/lib/src/features/user/data/models/user.freezed.dart @@ -49,6 +49,9 @@ mixin _$User { bool get accountVerified => throw _privateConstructorUsedError; List get roles => throw _privateConstructorUsedError; String? get facility => throw _privateConstructorUsedError; + String? get national_id => throw _privateConstructorUsedError; + String? get sha_id => throw _privateConstructorUsedError; + String? get provider_id => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -86,7 +89,10 @@ abstract class $UserCopyWith<$Res> { bool profileUpdated, bool accountVerified, List roles, - String? facility}); + String? facility, + String? national_id, + String? sha_id, + String? provider_id}); } /// @nodoc @@ -128,6 +134,9 @@ class _$UserCopyWithImpl<$Res, $Val extends User> Object? accountVerified = null, Object? roles = null, Object? facility = freezed, + Object? national_id = freezed, + Object? sha_id = freezed, + Object? provider_id = freezed, }) { return _then(_value.copyWith( id: freezed == id @@ -234,6 +243,18 @@ class _$UserCopyWithImpl<$Res, $Val extends User> ? _value.facility : facility // ignore: cast_nullable_to_non_nullable as String?, + national_id: freezed == national_id + ? _value.national_id + : national_id // ignore: cast_nullable_to_non_nullable + as String?, + sha_id: freezed == sha_id + ? _value.sha_id + : sha_id // ignore: cast_nullable_to_non_nullable + as String?, + provider_id: freezed == provider_id + ? _value.provider_id + : provider_id // ignore: cast_nullable_to_non_nullable + as String?, ) as $Val); } } @@ -271,7 +292,10 @@ abstract class _$$UserImplCopyWith<$Res> implements $UserCopyWith<$Res> { bool profileUpdated, bool accountVerified, List roles, - String? facility}); + String? facility, + String? national_id, + String? sha_id, + String? provider_id}); } /// @nodoc @@ -310,6 +334,9 @@ class __$$UserImplCopyWithImpl<$Res> Object? accountVerified = null, Object? roles = null, Object? facility = freezed, + Object? national_id = freezed, + Object? sha_id = freezed, + Object? provider_id = freezed, }) { return _then(_$UserImpl( id: freezed == id @@ -416,6 +443,18 @@ class __$$UserImplCopyWithImpl<$Res> ? _value.facility : facility // ignore: cast_nullable_to_non_nullable as String?, + national_id: freezed == national_id + ? _value.national_id + : national_id // ignore: cast_nullable_to_non_nullable + as String?, + sha_id: freezed == sha_id + ? _value.sha_id + : sha_id // ignore: cast_nullable_to_non_nullable + as String?, + provider_id: freezed == provider_id + ? _value.provider_id + : provider_id // ignore: cast_nullable_to_non_nullable + as String?, )); } } @@ -449,7 +488,10 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { this.profileUpdated = false, this.accountVerified = false, final List roles = const [], - this.facility}) + this.facility, + this.national_id, + this.sha_id, + this.provider_id}) : _roles = roles; factory _$UserImpl.fromJson(Map json) => @@ -519,10 +561,16 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { @override final String? facility; + @override + final String? national_id; + @override + final String? sha_id; + @override + final String? provider_id; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'User(id: $id, image: $image, username: $username, firstName: $firstName, lastName: $lastName, name: $name, dateOfBirth: $dateOfBirth, gender: $gender, email: $email, phoneNumber: $phoneNumber, county: $county, constituency: $constituency, bloodGroup: $bloodGroup, allergies: $allergies, disabilities: $disabilities, chronics: $chronics, weight: $weight, height: $height, maritalStatus: $maritalStatus, educationLevel: $educationLevel, primaryLanguage: $primaryLanguage, occupation: $occupation, profileUpdated: $profileUpdated, accountVerified: $accountVerified, roles: $roles, facility: $facility)'; + return 'User(id: $id, image: $image, username: $username, firstName: $firstName, lastName: $lastName, name: $name, dateOfBirth: $dateOfBirth, gender: $gender, email: $email, phoneNumber: $phoneNumber, county: $county, constituency: $constituency, bloodGroup: $bloodGroup, allergies: $allergies, disabilities: $disabilities, chronics: $chronics, weight: $weight, height: $height, maritalStatus: $maritalStatus, educationLevel: $educationLevel, primaryLanguage: $primaryLanguage, occupation: $occupation, profileUpdated: $profileUpdated, accountVerified: $accountVerified, roles: $roles, facility: $facility, national_id: $national_id, sha_id: $sha_id, provider_id: $provider_id)'; } @override @@ -555,7 +603,10 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { ..add(DiagnosticsProperty('profileUpdated', profileUpdated)) ..add(DiagnosticsProperty('accountVerified', accountVerified)) ..add(DiagnosticsProperty('roles', roles)) - ..add(DiagnosticsProperty('facility', facility)); + ..add(DiagnosticsProperty('facility', facility)) + ..add(DiagnosticsProperty('national_id', national_id)) + ..add(DiagnosticsProperty('sha_id', sha_id)) + ..add(DiagnosticsProperty('provider_id', provider_id)); } @override @@ -605,7 +656,12 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { other.accountVerified == accountVerified) && const DeepCollectionEquality().equals(other._roles, _roles) && (identical(other.facility, facility) || - other.facility == facility)); + other.facility == facility) && + (identical(other.national_id, national_id) || + other.national_id == national_id) && + (identical(other.sha_id, sha_id) || other.sha_id == sha_id) && + (identical(other.provider_id, provider_id) || + other.provider_id == provider_id)); } @JsonKey(ignore: true) @@ -637,7 +693,10 @@ class _$UserImpl with DiagnosticableTreeMixin implements _User { profileUpdated, accountVerified, const DeepCollectionEquality().hash(_roles), - facility + facility, + national_id, + sha_id, + provider_id ]); @JsonKey(ignore: true) @@ -681,7 +740,10 @@ abstract class _User implements User { final bool profileUpdated, final bool accountVerified, final List roles, - final String? facility}) = _$UserImpl; + final String? facility, + final String? national_id, + final String? sha_id, + final String? provider_id}) = _$UserImpl; factory _User.fromJson(Map json) = _$UserImpl.fromJson; @@ -740,6 +802,12 @@ abstract class _User implements User { @override String? get facility; @override + String? get national_id; + @override + String? get sha_id; + @override + String? get provider_id; + @override @JsonKey(ignore: true) _$$UserImplCopyWith<_$UserImpl> get copyWith => throw _privateConstructorUsedError; diff --git a/lib/src/features/user/data/models/user.g.dart b/lib/src/features/user/data/models/user.g.dart index bee4b612..ff6f59ad 100644 --- a/lib/src/features/user/data/models/user.g.dart +++ b/lib/src/features/user/data/models/user.g.dart @@ -35,6 +35,9 @@ _$UserImpl _$$UserImplFromJson(Map json) => _$UserImpl( (json['roles'] as List?)?.map((e) => e as String).toList() ?? const [], facility: json['facility'] as String?, + national_id: json['national_id'] as String?, + sha_id: json['sha_id'] as String?, + provider_id: json['provider_id'] as String?, ); Map _$$UserImplToJson(_$UserImpl instance) => @@ -65,4 +68,7 @@ Map _$$UserImplToJson(_$UserImpl instance) => 'accountVerified': instance.accountVerified, 'roles': instance.roles, 'facility': instance.facility, + 'national_id': instance.national_id, + 'sha_id': instance.sha_id, + 'provider_id': instance.provider_id, }; diff --git a/lib/src/features/user/data/services/UserService.dart b/lib/src/features/user/data/services/UserService.dart index 0e42641b..caed9857 100644 --- a/lib/src/features/user/data/services/UserService.dart +++ b/lib/src/features/user/data/services/UserService.dart @@ -104,6 +104,9 @@ class UserService extends HTTPService { "gender": person["profile"]["gender"], "roles": ["Patient", "Provider", "admin", "Facility Admin", "Partner"], "facility": person["profile"]["facility"], + "sha_id": "26263348-001-P-4", + "national_id": person["profile"]["national_id"], + "provider_id": "no", }); } diff --git a/lib/src/features/user/presentation/forms/Identifications.dart b/lib/src/features/user/presentation/forms/Identifications.dart new file mode 100644 index 00000000..fae5e13b --- /dev/null +++ b/lib/src/features/user/presentation/forms/Identifications.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; +import 'package:nishauri/src/shared/styles/input_styles.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class Identifications extends StatelessWidget { + const Identifications({super.key}); + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, ref, child) { + final asyncUser = ref.watch(userProvider); + + return asyncUser.when( + data: (user) => Column( + children: [ + const SizedBox(height: Constants.SPACING), + FormBuilderTextField( + initialValue: user.national_id, + name: "national_id", + keyboardType: TextInputType.text, + decoration: inputDecoration( + placeholder: "Enter your National Identification Number", + prefixIcon: Icons.card_membership, + label: "National ID", + ), + validator: FormBuilderValidators.compose([ + // FormBuilderValidators.required(), + FormBuilderValidators.email(), + ]), + ), + const SizedBox(height: Constants.SPACING), + FormBuilderTextField( + name: "sha_id", + initialValue: user.sha_id, + keyboardType: TextInputType.text, + maxLength: 10, + decoration: inputDecoration( + placeholder: "Enter your Social Health Authority ID Number", + prefixIcon: Icons.card_membership, + label: "SHA Number", + ), + validator: FormBuilderValidators.compose([ + (value) { + if (value != null && + value.isNotEmpty && + !value.startsWith('0')) { + return 'SHA Number must have not less than 10 values'; + } + return null; + }, + ]), + ), + ], + ), + error: (error, _) => Center(child: Text(error.toString())), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + ); + }, + ); + } +} diff --git a/lib/src/features/user/presentation/forms/forms.dart b/lib/src/features/user/presentation/forms/forms.dart index d9fc13c9..f700f9e3 100644 --- a/lib/src/features/user/presentation/forms/forms.dart +++ b/lib/src/features/user/presentation/forms/forms.dart @@ -4,4 +4,5 @@ export 'HealthInformation.dart'; export 'LifeStyleInformation.dart'; export 'PersonalInformation.dart'; export 'PhysicalCharacteristicInformation.dart'; -export 'ReviewAndSubmit.dart'; \ No newline at end of file +export 'ReviewAndSubmit.dart'; +export 'Identifications.dart'; \ No newline at end of file diff --git a/lib/src/features/user/presentation/pages/ProfileScreen.dart b/lib/src/features/user/presentation/pages/ProfileScreen.dart index 3068b22d..27e38b8a 100644 --- a/lib/src/features/user/presentation/pages/ProfileScreen.dart +++ b/lib/src/features/user/presentation/pages/ProfileScreen.dart @@ -113,17 +113,12 @@ class ProfileScreen extends HookWidget { : "None", ), ), - // const Divider(), - // ListTile( - // leading: const Icon(Icons.calendar_month), - // title: const Text("Date of birth"), - // subtitle: Text( - // DateTime.tryParse(user.dateOfBirth ?? "") != null - // ? DateFormat("dd MM yyyy") - // .format(DateTime.parse(user.dateOfBirth!)) - // : "None", - // ), - // ), + const Divider(), + ListTile( + leading: const Icon(Icons.person_pin_outlined), + title: const Text("Social Health Authority Id Number"), + subtitle: Text(user.sha_id??''), + ), const Divider(), ], ), diff --git a/lib/src/features/user/presentation/pages/ProfileWizardFormScreen.dart b/lib/src/features/user/presentation/pages/ProfileWizardFormScreen.dart index 95b66fb7..4ad1bd22 100644 --- a/lib/src/features/user/presentation/pages/ProfileWizardFormScreen.dart +++ b/lib/src/features/user/presentation/pages/ProfileWizardFormScreen.dart @@ -5,7 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; -import 'package:nishauri/src/features/user/data/models/user.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/providers/provider_registry_provider.dart'; import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/features/user/presentation/forms/forms.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; @@ -36,6 +36,7 @@ class ProfileWizardFormScreen extends HookConsumerWidget { // "county", "landmark" ], + ["national_id", "sha_id"], ["blood_group", "allergies", "disabilities", "chronics"], ["weight", "height"], ["maritalStatus", "educationLevel", "primaryLanguage", "occupation"], @@ -65,26 +66,34 @@ class ProfileWizardFormScreen extends HookConsumerWidget { content: const ContactInformation(), isActive: currentStep.value == 2, ), + Step( + title: const Text("Personal Identification Information"), + subtitle: const Text( + "Provide your identifications for comprehensive medical information", + ), + content: const Identifications(), + isActive: currentStep.value == 3, + ), Step( title: const Text("Health Information"), subtitle: const Text( " Share important health details for better healthcare assistance."), content: const HealthInformation(), - isActive: currentStep.value == 3, + isActive: currentStep.value == 4, ), Step( title: const Text("Physical Characteristics"), subtitle: const Text( "Provide information about your physical attributes for a more comprehensive"), content: const PhysicalCharacteristicInformation(), - isActive: currentStep.value == 4, + isActive: currentStep.value == 5, ), Step( title: const Text("Social Information"), subtitle: const Text( "Share aspects of your lifestyle that may influence your health."), content: const LifeStyleInformation(), - isActive: currentStep.value == 5, + isActive: currentStep.value == 6, ), Step( title: const Text("Review and Submit"), @@ -110,7 +119,7 @@ class ProfileWizardFormScreen extends HookConsumerWidget { ), ), ), - isActive: currentStep.value == 6, + isActive: currentStep.value == 7, ), ]; @@ -127,6 +136,11 @@ class ProfileWizardFormScreen extends HookConsumerWidget { // Update auth state and redirect to home return ref.read(authStateProvider.notifier).markProfileAsUpdated(); }).then((value) { + final idNumber = formKey.currentState!.instantValue["national_id"]; + if (idNumber != null) { + final data = {"national_id" : idNumber}; + ref.watch(providerRegistryRepositoryProvider).searchProviderRegistry(data); + }; ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Profile updated successfully!"))); }).catchError((e) { From c1881a05a887ffc31c01f336dcc6bd643db74b5d Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 15 Oct 2024 15:42:31 +0300 Subject: [PATCH 100/140] Add provider details --- assets/images/doctor-coat.svg | 7 ++ lib/src/app/navigation/app_router.dart | 21 ++--- .../pages/events/ARTEventDetail.dart | 1 + .../pages/groups/ARTGroupDetail.dart | 1 + .../pages/provider_main_Screen.dart | 23 ++++- .../presentaion/forms/location.dart | 5 +- .../presentaion/pages/provider_details.dart | 94 +++++++++++++++++++ .../presentation/pages/ProfileScreen.dart | 1 + lib/src/shared/display/ProfileCard.dart | 4 +- lib/src/utils/routes.dart | 2 + 10 files changed, 141 insertions(+), 18 deletions(-) create mode 100644 assets/images/doctor-coat.svg create mode 100644 lib/src/features/provider/provider_registry/presentaion/pages/provider_details.dart diff --git a/assets/images/doctor-coat.svg b/assets/images/doctor-coat.svg new file mode 100644 index 00000000..c15692b1 --- /dev/null +++ b/assets/images/doctor-coat.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index c78d92a9..f59dd843 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -1,11 +1,9 @@ import 'dart:async'; -import 'dart:ffi'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/appointments/data/models/appointment.dart'; import 'package:nishauri/src/features/appointments/presentation/pages/AppointmentRescheduleScreen.dart'; -import 'package:nishauri/src/features/appointments/presentation/pages/Appointments.dart'; import 'package:nishauri/src/features/appointments/presentation/pages/AppointmentsScreen.dart'; import 'package:nishauri/src/features/art/presentation/FacilityDirectory.dart'; import 'package:nishauri/src/features/auth/data/models/auth_state.dart'; @@ -21,7 +19,6 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerificationScreen import 'package:nishauri/src/features/auth/presentation/pages/VerifiedResetPassword.dart'; import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswordScreen.dart'; import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; -import 'package:nishauri/src/features/blood_sugar/presentation/pages/AddBloodSugarScreen.dart'; import 'package:nishauri/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorScreen.dart'; @@ -40,7 +37,6 @@ import 'package:nishauri/src/features/dawa_drop/presentation/pages/dawa_drop_scr import 'package:nishauri/src/features/dawa_drop/presentation/pages/dispatched_drugs.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/program_appointments.dart'; import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_drug.dart'; -import 'package:nishauri/src/features/dawa_drop/presentation/pages/request_order/forms/GettingStated.dart'; import 'package:nishauri/src/features/events_calendar/presentation/pages/EventsCalendar.dart'; import 'package:nishauri/src/features/hiv/data/models/event/art_event.dart'; import 'package:nishauri/src/features/hiv/data/models/group/art_group.dart'; @@ -60,30 +56,24 @@ import 'package:nishauri/src/features/lab/presentation/pages/LabResultsScreen.da import 'package:nishauri/src/features/nishauri_chat/chat/presentation/pages/ChatDetailScreen.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/presentation/pages/ChatUserList.dart'; import 'package:nishauri/src/features/nishauri_chat/chat/presentation/pages/ConversationList.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/editPeriodsScreen.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/logPeriods.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/new_user_screen.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodCalendar.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerMenu.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlannerScreen.dart'; -import 'package:nishauri/src/features/period_planner/presentation/pages/periodPlanner.dart'; import 'package:nishauri/src/features/period_planner/presentation/pages/periods_history.dart'; import 'package:nishauri/src/features/programs/presentation/pages/programs.dart'; import 'package:nishauri/src/features/provider/appointment_management/presentation/pages/reschedule_request_list.dart'; import 'package:nishauri/src/features/provider/dawa_drop_management/presentation/pages/dawa_drop_manager_screen.dart'; import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; import 'package:nishauri/src/features/provider/provider_registry/presentaion/pages/location_selection_screen.dart'; +import 'package:nishauri/src/features/provider/provider_registry/presentaion/pages/provider_details.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/self_screening_menu.dart'; import 'package:nishauri/src/features/treatment_support/presentation/pages/TreatmentSupport.dart'; -import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/features/user/presentation/pages/ProfileScreen.dart'; import 'package:nishauri/src/features/user/presentation/pages/ProfileWizardFormScreen.dart'; import 'package:nishauri/src/features/user_preference/presentation/pages/PinAuthScreen.dart'; import 'package:nishauri/src/features/user_preference/presentation/pages/PrivacySettingsScreen.dart'; -import 'package:nishauri/src/features/user_programs/data/models/program_verification_detail.dart'; import 'package:nishauri/src/features/user_programs/presentation/pages/ProgramRegistrationScreen.dart'; import 'package:nishauri/src/features/user_programs/presentation/pages/ProgramUpdateScreen.dart'; import 'package:nishauri/src/features/user_programs/presentation/pages/ProgramVerificationScreen.dart'; @@ -91,8 +81,6 @@ import 'package:nishauri/src/features/visits/presentations/pages/FacilityVisitDe import 'package:nishauri/src/features/visits/presentations/pages/FacilityVisitsScreen.dart'; import 'package:nishauri/src/utils/routes.dart'; -import '../../features/lab/presentation/pages/LabResults.dart'; - final routesProvider = Provider((ref) { final router = RouterNotifier(ref); return GoRouter( @@ -565,6 +553,13 @@ final List providerRoutes = [ return const DawaDropManagemerScreen(); }, ), + GoRoute( + name: RouteNames.PROVIDER_DETAILS, + path: 'provider-details', + builder: (BuildContext context, GoRouterState state) { + return const ProviderDetails(); + }, + ), ]; final List hivProgramRoutes = [ GoRoute( diff --git a/lib/src/features/hiv/presentation/pages/events/ARTEventDetail.dart b/lib/src/features/hiv/presentation/pages/events/ARTEventDetail.dart index bef13cbb..62a2dff3 100644 --- a/lib/src/features/hiv/presentation/pages/events/ARTEventDetail.dart +++ b/lib/src/features/hiv/presentation/pages/events/ARTEventDetail.dart @@ -94,6 +94,7 @@ class ARTEventDetailScreen extends HookConsumerWidget { final artEvent = artEvents.where((element) => element.id == eventId).first; return ProfileCard( + color: Colors.black54, icon: Icons.event, coverPhoto: "https://picsum.photos/seed/picsum/757/300", buildItem: (context, item) => item, diff --git a/lib/src/features/hiv/presentation/pages/groups/ARTGroupDetail.dart b/lib/src/features/hiv/presentation/pages/groups/ARTGroupDetail.dart index cde0f348..b7b61530 100644 --- a/lib/src/features/hiv/presentation/pages/groups/ARTGroupDetail.dart +++ b/lib/src/features/hiv/presentation/pages/groups/ARTGroupDetail.dart @@ -30,6 +30,7 @@ class ARTGroupDetailScreen extends StatelessWidget { final artGroup = artGroups.where((element) => element.id == groupId).first; return ProfileCard( + color: Colors.black54, icon: Icons.group, coverPhoto: "https://picsum.photos/seed/picsum/200/300", buildItem: (context, item) => item, diff --git a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart index edc4c0bf..4d6774fa 100644 --- a/lib/src/features/provider/presentation/pages/provider_main_Screen.dart +++ b/lib/src/features/provider/presentation/pages/provider_main_Screen.dart @@ -30,7 +30,26 @@ _menuItems(BuildContext context, bool isProvider) => [ color: Constants.providerBgColor.withOpacity(0.5), ), ], - if (isProvider) ...[MenuItem( + if (isProvider) ...[ + MenuItem( + shortcutBackgroundColor: Constants.providerBgColor, + icon: SvgPicture.asset( + "assets/images/doctor-coat.svg", + semanticsLabel: "Provider Details", + fit: BoxFit.contain, + width: 80, + height: 80, + ), + shortcutIcon: SvgPicture.asset("assets/images/doctor-coat.svg", + semanticsLabel: "Provider Details", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize), + title: "Provider Details", + onPressed: () => context.goNamed(RouteNames.PROVIDER_DETAILS), + color: Constants.providerBgColor.withOpacity(0.5), + ), + MenuItem( shortcutBackgroundColor: Constants.providerBgColor, icon: SvgPicture.asset( "assets/images/Calendar-Splash.svg", @@ -79,7 +98,7 @@ class ProviderMainScreen extends HookConsumerWidget { final user = ref.watch(userProvider); final isProvider = user.when( - data: (provider) => provider.provider_id == "yes", + data: (provider) => provider.provider_id == "no", error: (error, stack) => false, loading: () => false, ); diff --git a/lib/src/features/provider/provider_registry/presentaion/forms/location.dart b/lib/src/features/provider/provider_registry/presentaion/forms/location.dart index 525f1589..69c11c93 100644 --- a/lib/src/features/provider/provider_registry/presentaion/forms/location.dart +++ b/lib/src/features/provider/provider_registry/presentaion/forms/location.dart @@ -46,7 +46,7 @@ class _LocationInformationState extends State { return asyncUser.when( data: (user) => Column( children: [ - const SizedBox(height: Constants.SPACING), + const SizedBox(height: Constants.BUTTON_FONT_SIZE), FormBuilderDropdown( initialValue: selectedCounty, name: "county", @@ -63,7 +63,7 @@ class _LocationInformationState extends State { label: "County", ), ), - const SizedBox(height: Constants.SPACING), + const SizedBox(height: Constants.BUTTON_FONT_SIZE), if (selectedCounty != null) ...[ FormBuilderDropdown( initialValue: selectedSubCounty, @@ -81,6 +81,7 @@ class _LocationInformationState extends State { ), ), ], + const SizedBox(height: Constants.BUTTON_FONT_SIZE), if (selectedSubCounty != null) ...[ FormBuilderDropdown( initialValue: facility, diff --git a/lib/src/features/provider/provider_registry/presentaion/pages/provider_details.dart b/lib/src/features/provider/provider_registry/presentaion/pages/provider_details.dart new file mode 100644 index 00000000..ad2a1c32 --- /dev/null +++ b/lib/src/features/provider/provider_registry/presentaion/pages/provider_details.dart @@ -0,0 +1,94 @@ +import 'dart:developer'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/provider/provider_registry/data/providers/provider_registry_provider.dart'; +import 'package:nishauri/src/hooks/use_local_avatar.dart'; +import 'package:nishauri/src/shared/display/ProfileCard.dart'; +import 'package:nishauri/src/shared/extensions/extensions.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class ProviderDetails extends HookWidget { + const ProviderDetails({super.key}); + + @override + Widget build(BuildContext context) { + final avatar = useLocalAvatar("images/avatar.jpg"); + log("*****************${avatar.toString()}*********************"); + final cardColor = Theme.of(context).colorScheme.onPrimary; + return Scaffold( + appBar: AppBar( + leading: IconButton( + onPressed: () => context.pop(), + icon: const Icon(Icons.chevron_left), + ), + title: const Text('Provider Details'), + ), + body: Consumer( + builder: (context, ref, child) { + final userAsync = ref.watch(getProviderDetailsProvider); + return userAsync.when( + data: (provider) => ProfileCard( + height: MediaQuery.of(context).size.height, + color: Constants.providerBgColor, + header: Text(("${provider.salutation ?? " "} ${provider.family_name ?? " "} ${provider.given_name ?? " "}").titleCase), + image: avatar, + // user.image, + icon: Icons.person, + buildItem: (context, item) => item, + items: [ + ListTile( + leading: const Icon(Icons.perm_identity, color: Constants.providerBgColor,), + title: const Text("Name"), + subtitle: Text('${provider.salutation} ${provider.family_name} ${provider.given_name}'), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.perm_identity, color: Constants.providerBgColor), + title: const Text("Gender"), + subtitle: Text(provider.gender??''), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.card_membership, color: Constants.providerBgColor), + title: const Text("National Id"), + subtitle: Text(provider.national_id.toString()), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.card_membership, color: Constants.providerBgColor), + title: const Text("Licence Number"), + subtitle: Text(provider.licence_number??''), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.card_membership, color: Constants.providerBgColor), + title: const Text("Board Number"), + subtitle: Text(provider.board_number??''), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.card_membership, color: Constants.providerBgColor), + title: const Text("Cadre"), + subtitle: Text(provider.cadre??''), + ), + const Divider(), + ListTile( + leading: const Icon(Icons.local_hospital_outlined, color: Constants.providerBgColor), + title: const Text("Facility"), + subtitle: Text(provider.facility_code??''), + ), + const Divider(), + ], + ), + error: (error, _) => Center(child: Text(error.toString())), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + ); + }, + ), + ); + } +} diff --git a/lib/src/features/user/presentation/pages/ProfileScreen.dart b/lib/src/features/user/presentation/pages/ProfileScreen.dart index 27e38b8a..355bb15b 100644 --- a/lib/src/features/user/presentation/pages/ProfileScreen.dart +++ b/lib/src/features/user/presentation/pages/ProfileScreen.dart @@ -43,6 +43,7 @@ class ProfileScreen extends HookWidget { return userAsync.when( data: (user) => ProfileCard( height: MediaQuery.of(context).size.height, + color: Colors.black54, header: user.username == 'null null' || user.username == "" ? GestureDetector( onTap: () { diff --git a/lib/src/shared/display/ProfileCard.dart b/lib/src/shared/display/ProfileCard.dart index ea5ec4af..d02f3262 100644 --- a/lib/src/shared/display/ProfileCard.dart +++ b/lib/src/shared/display/ProfileCard.dart @@ -13,6 +13,7 @@ class ProfileCard extends StatelessWidget { final double headerFactor; final String? image; final IconData icon; + final Color color; const ProfileCard({super.key, this.height = 600, @@ -26,6 +27,7 @@ class ProfileCard extends StatelessWidget { this.headerFactor = 0.2, this.image, this.icon=Icons.person, + required this.color, }); @override @@ -46,7 +48,7 @@ class ProfileCard extends StatelessWidget { flex: 3, child: Container( decoration: BoxDecoration( - color: Colors.black54, + color: color, backgroundBlendMode: BlendMode.darken, image: coverPhoto != null ? DecorationImage( fit: BoxFit.cover, diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 00cf4725..3704b760 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -77,6 +77,7 @@ class RouteNames { static const REQUEST_APP_RESCHEDULE = "request-app-reschedule"; static const DAWA_DROP_MANAGER = "dawa-drop-manager"; static const LOCATION_SELECTION = "location-selection"; + static const PROVIDER_DETAILS = "provider-details"; } class MenuItemNames { @@ -114,6 +115,7 @@ class MenuItemNames { static const INSIGHT = "Insight"; static const PROVIDER_MAIN_SCREEN = "Provider Modules"; static const REQUEST_APP_RESCHEDULE = "Request Appointment Reschedule"; + static const PROVIDER_DETAILS = "Provider Details"; } From 0d3594085ac9c1f2097662e3542eb7deaed14df6 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 18 Oct 2024 08:32:32 +0300 Subject: [PATCH 101/140] :construction: Design screening main menu --- assets/images/boldDuotoneLikeHearts.svg | 4 + assets/images/boldDuotoneMedicinePulse.svg | 4 + .../presentation/pages/LabResultsScreen.dart | 2 +- .../pages/self_screening_menu.dart | 330 +++++++++++++----- .../presentation/widgets/health_card.dart | 112 ++++++ .../presentation/widgets/health_list.dart | 44 +++ .../presentation/widgets/image_card.dart | 35 ++ lib/src/utils/constants.dart | 2 + 8 files changed, 438 insertions(+), 95 deletions(-) create mode 100644 assets/images/boldDuotoneLikeHearts.svg create mode 100644 assets/images/boldDuotoneMedicinePulse.svg create mode 100644 lib/src/features/self_screening/presentation/widgets/health_card.dart create mode 100644 lib/src/features/self_screening/presentation/widgets/health_list.dart create mode 100644 lib/src/features/self_screening/presentation/widgets/image_card.dart diff --git a/assets/images/boldDuotoneLikeHearts.svg b/assets/images/boldDuotoneLikeHearts.svg new file mode 100644 index 00000000..45e3de07 --- /dev/null +++ b/assets/images/boldDuotoneLikeHearts.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/boldDuotoneMedicinePulse.svg b/assets/images/boldDuotoneMedicinePulse.svg new file mode 100644 index 00000000..eef4df13 --- /dev/null +++ b/assets/images/boldDuotoneMedicinePulse.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/src/features/lab/presentation/pages/LabResultsScreen.dart b/lib/src/features/lab/presentation/pages/LabResultsScreen.dart index 768b683b..be54d10f 100644 --- a/lib/src/features/lab/presentation/pages/LabResultsScreen.dart +++ b/lib/src/features/lab/presentation/pages/LabResultsScreen.dart @@ -44,7 +44,7 @@ class LabResultsScreen extends HookConsumerWidget { body: Column( children: [ const CustomAppBar( - title: "Lab Results 🧪", + title: "Lab Results 🌡️", // icon: FontAwesomeIcons.vial, subTitle: "Unlock you health insights with lab results", color: Constants.labResultsColor, diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 0710ffff..0b0eb3b1 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -1,62 +1,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:nishauri/src/app/navigation/menu/MenuItemsBuilder.dart'; -import 'package:nishauri/src/app/navigation/menu/MenuOption.dart'; -import 'package:nishauri/src/app/navigation/menu/menuItems.dart'; -import 'package:nishauri/src/features/period_planner/data/models/cycle.dart'; -import 'package:nishauri/src/features/period_planner/data/providers/cycles_provider.dart'; -import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; +import 'package:nishauri/src/features/common/presentation/pages/chat_feeback_form.dart'; +import 'package:nishauri/src/features/self_screening/presentation/widgets/health_card.dart'; +import 'package:nishauri/src/features/self_screening/presentation/widgets/health_list.dart'; +import 'package:nishauri/src/features/self_screening/presentation/widgets/image_card.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/routes.dart'; - -List _menuItems(BuildContext context, WidgetRef ref) => [ - MenuItem( - icon: const Icon(Icons.calculate), - shortcutIcon: const Icon(Icons.calculate), - color: Constants.bmiCalculatorShortcutBgColor, - shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, - title: "BMI Calculator", - onPressed: () => context.goNamed(RouteNames.BMI_CALCULATOR), - ), - MenuItem( - icon: const Icon(Icons.trending_up), - shortcutIcon: const Icon(Icons.trending_up), - color: Constants.bpShortCutBgColor, - shortcutBackgroundColor: Constants.bpShortCutBgColor, - title: "B P Monitor", - onPressed: () => context.goNamed(RouteNames.BLOOD_PRESSURE), - ), - MenuItem( - shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, - icon: const Icon(Icons.sanitizer), - shortcutIcon: const Icon(Icons.sanitizer), - title: MenuItemNames.BLOOD_SUGAR, - onPressed: () => context.goNamed(MenuItemNames.BLOOD_SUGAR), - color: Constants.bloodSugarColor.withOpacity(0.5), - ), - MenuItem( - shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, - icon: const Icon(Icons.calendar_month_outlined), - shortcutIcon: const Icon(Icons.calendar_month_outlined), - title: MenuItemNames.PERIOD_PLANNER, - onPressed: () { - ref.read(cyclesProvider.notifier).fetchCycles() - .then((cycles) { - // if (cycles.isEmpty) { - // context.goNamed(RouteNames.NEW_USER_SCREEN); - // } - // else { - // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - // } - context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); - }); - }, - color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), - ), -]; class SelfScreening extends HookConsumerWidget { const SelfScreening({super.key}); @@ -64,55 +17,244 @@ class SelfScreening extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); - final _items = _menuItems(context, ref); - final insightAsync = ref.watch(insightProvider); + int _currIndex = 0; // Define your current index + int _messagesCount = 0; // Define your messages count return Scaffold( body: Column( - children: [ - CustomAppBar( - title: "Self Screening🌡️📈", - color: Constants.bmiCalculatorColor, - ), - Expanded( - child: MenuItemsBuilder( - crossAxisCount: 3, - itemBuilder: (item) => MenuOption( - title: item.title ?? "", - icon: item.shortcutIcon, - bgColor: item.color ?? Constants.bmiCalculatorShortcutBgColor, - onPress: item.onPressed, - ), - items: _items, + children: [ + const CustomAppBar( + title: "Self Screening🌡", + subTitle: "Easily track your health. Stay informed and take control of well-being.", + color: Constants.selfScreeningBgColor, ), + Expanded( + child: SingleChildScrollView( + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Cards showing health data + Wrap( + spacing: 5, + runSpacing: 16, + children: [ + HealthCard( + svgAsset: "assets/images/boldDuotoneLikeHearts.svg", + title: "Blood Pressure", + value1: "120", + text1: "mmHG", + vName1: "Systolic", + value2: "80", + text2: "mmHG", + vName2: "Diastolic", + value3: "73", + text3: "Pulse/Min", + vName3: "Pulse Rate", + ), + HealthCard( + svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", + title: "Blood Sugar", + value1: "120", + text1: "mmHG", + value3: "73/Min", + vName3: "Pulse Rate", + ), + ], + ), + const SizedBox(height: 10), + ItemList(items: ["Blood Sugar", "Blood Pressure", "BMI", "Period Calendar"]), + const SizedBox(height: 20), + // Title for the next section + Text( + "About Self Screening", + style: theme.textTheme.headline6, + ), + const SizedBox(height: 10), + Wrap( + alignment: WrapAlignment.center, + spacing: 1, + runSpacing: 16, + children: [ + ImageCard(imagePath: 'assets/images/hospital_building.svg'), + ImageCard(imagePath: 'assets/images/hospital_building.svg'), + ], + ), + const SizedBox(height: 20), + // Title for the understanding health section + Text( + "Understanding Your Health", + style: theme.textTheme.headline6, + ), + const SizedBox(height: 10), + Text( + "Understanding your health metrics is crucial for maintaining a healthy lifestyle. " + "Stay informed about your numbers and consult your healthcare provider when needed.", + style: theme.textTheme.bodyText2, + ), + ], + ), + ), + ], + ), + ) + ), + ], + ), + bottomNavigationBar: BottomNavigationBar( + elevation: 0, + selectedItemColor: theme.colorScheme.primary, + unselectedItemColor: theme.disabledColor, + items: [ + BottomNavigationBarItem( + icon: SvgPicture.asset("assets/images/Home.svg"), + label: "Home", + activeIcon: SvgPicture.asset("assets/images/Home-Active.svg"), ), - ], - ), - floatingActionButton: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - // FloatingActionButton( - // tooltip: "Insight", - // hoverColor: Constants.bmiCalculatorShortcutBgColor, - // onPressed: () { - // context.goNamed(RouteNames.SETTINGS); - // - // }, - // backgroundColor: Constants.bmiCalculatorShortcutBgColor, - // child: const Icon(Icons.settings), - // ), - // SizedBox(height: 10), - FloatingActionButton( - tooltip: "Module insight", - hoverColor: Constants.bmiCalculatorShortcutBgColor, - onPressed: () { - context.goNamed(RouteNames.INSIGHT); - }, - backgroundColor: Constants.bmiCalculatorShortcutBgColor, - child: const Icon(Icons.insights), + BottomNavigationBarItem( + icon: SvgPicture.asset("assets/images/Modules.svg"), + label: "Apps", + activeIcon: SvgPicture.asset("assets/images/Modules-active.svg"), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset("assets/images/Chatbot.svg"), + label: "Ask Nuru", + activeIcon: SvgPicture.asset("assets/images/Chatbot-Active.svg"), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset("assets/images/Settings.svg"), + label: "Settings", + activeIcon: SvgPicture.asset("assets/images/Settings-Active.svg"), ), ], + currentIndex: _currIndex, + onTap: (index) async { + if (_currIndex == 2 && index != 2 && _messagesCount > 2) { + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) => AlertDialog( + content: Stack( + children: [ + const ChatFeedbackForm(), + Positioned( + right: 0, + top: 0, + child: IconButton( + onPressed: () => Navigator.of(context).pop(), + icon: const FaIcon(FontAwesomeIcons.xmark), + ), + ), + ], + ), + ), + ); + } + // Update current index and messages count + _currIndex = index; + _messagesCount = 0; + }, ), ); } } + + +// List _menuItems(BuildContext context, WidgetRef ref) => [ +// MenuItem( +// icon: const Icon(Icons.calculate), +// shortcutIcon: const Icon(Icons.calculate), +// color: Constants.bmiCalculatorShortcutBgColor, +// shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, +// title: "BMI Calculator", +// onPressed: () => context.goNamed(RouteNames.BMI_CALCULATOR), +// ), +// MenuItem( +// icon: const Icon(Icons.trending_up), +// shortcutIcon: const Icon(Icons.trending_up), +// color: Constants.bpShortCutBgColor, +// shortcutBackgroundColor: Constants.bpShortCutBgColor, +// title: "B P Monitor", +// onPressed: () => context.goNamed(RouteNames.BLOOD_PRESSURE), +// ), +// MenuItem( +// shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, +// icon: const Icon(Icons.sanitizer), +// shortcutIcon: const Icon(Icons.sanitizer), +// title: MenuItemNames.BLOOD_SUGAR, +// onPressed: () => context.goNamed(MenuItemNames.BLOOD_SUGAR), +// color: Constants.bloodSugarColor.withOpacity(0.5), +// ), +// MenuItem( +// shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, +// icon: const Icon(Icons.calendar_month_outlined), +// shortcutIcon: const Icon(Icons.calendar_month_outlined), +// title: MenuItemNames.PERIOD_PLANNER, +// onPressed: () { +// ref.read(cyclesProvider.notifier).fetchCycles() +// .then((cycles) { +// // if (cycles.isEmpty) { +// // context.goNamed(RouteNames.NEW_USER_SCREEN); +// // } +// // else { +// // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); +// // } +// context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); +// }); +// }, +// color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), +// ), +// ]; + +// class SelfScreening extends HookConsumerWidget { +// const SelfScreening({super.key}); +// +// @override +// Widget build(BuildContext context, WidgetRef ref) { +// final theme = Theme.of(context); +// final _items = _menuItems(context, ref); +// final insightAsync = ref.watch(insightProvider); +// +// return Scaffold( +// body: Column( +// children: [ +// const CustomAppBar( +// title: "Self Screening🌡", +// subTitle: "Easily track your health. Stay informed and take control of well-being.", +// color: Constants.selfScreeningBgColor, +// ), +// Expanded( +// child: MenuItemsBuilder( +// crossAxisCount: 3, +// itemBuilder: (item) => MenuOption( +// title: item.title ?? "", +// icon: item.shortcutIcon, +// bgColor: item.color ?? Constants.bmiCalculatorShortcutBgColor, +// onPress: item.onPressed, +// ), +// items: _items, +// ), +// ), +// ], +// ), +// floatingActionButton: Column( +// mainAxisAlignment: MainAxisAlignment.end, +// children: [ +// FloatingActionButton( +// tooltip: "Module insight", +// hoverColor: Constants.bmiCalculatorShortcutBgColor, +// onPressed: () { +// context.goNamed(RouteNames.INSIGHT); +// }, +// backgroundColor: Constants.bmiCalculatorShortcutBgColor, +// child: const Icon(Icons.insights), +// ), +// ], +// ), +// ); +// } +// } diff --git a/lib/src/features/self_screening/presentation/widgets/health_card.dart b/lib/src/features/self_screening/presentation/widgets/health_card.dart new file mode 100644 index 00000000..a2a111c4 --- /dev/null +++ b/lib/src/features/self_screening/presentation/widgets/health_card.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class HealthCard extends StatelessWidget { + final String? svgAsset; + final String title; + final String? text1; + final String? text2; + final String? text3; + final String? value1; + final String? value2; + final String? value3; + final String? vName1; + final String? vName2; + final String? vName3; + final VoidCallback? onPressed; // Callback for button action + + const HealthCard({ + this.svgAsset, + required this.title, + this.value1, + this.value2, + this.value3, + this.text1, + this.text2, + this.text3, + this.vName1, + this.vName2, + this.vName3, + this.onPressed, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + color: Constants.bgColor, + elevation: 4, + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (svgAsset != null) ...[ + SvgPicture.asset( + svgAsset!, + width: 20, + height: 20, + ), + const SizedBox(width: 10), + ], + Expanded( + child: Text( + title, + style: Theme.of(context).textTheme.titleSmall?.copyWith(color: Constants.selfScreeningBgColor), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: onPressed, + child: const Icon(Icons.chevron_right), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: _buildColumn(value1, text1, vName1, context)), + const VerticalDivider(thickness: 3, color: Colors.grey), + Expanded(child: _buildColumn(value2, text2, vName2, context)), + const VerticalDivider(thickness: 3, color: Colors.grey), + Expanded(child: _buildColumn(value3, text3, vName3, context)), + ], + ), + ], + ), + ), + ); + } + + Widget _buildColumn(String? value, String? text, String? name, BuildContext context) { + final theme = Theme.of(context); + if (value == null || text == null) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), // Adjust padding as needed + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, // Align items to the start + children: [ + Text(name ?? '', style: theme.textTheme.bodyMedium), + Row( + children: [ + Text(value, style: theme.textTheme.titleLarge), + const SizedBox(width: 4), + Text(text, style: theme.textTheme.bodyMedium), + ], + ), + ], + ), + ); + } +} diff --git a/lib/src/features/self_screening/presentation/widgets/health_list.dart b/lib/src/features/self_screening/presentation/widgets/health_list.dart new file mode 100644 index 00000000..011e1faa --- /dev/null +++ b/lib/src/features/self_screening/presentation/widgets/health_list.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class ItemList extends StatelessWidget { + final List items; + final Color backgroundColor; + const ItemList({ + Key? key, + required this.items, + this.backgroundColor = Constants.bgColor, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final height = 100 + (items.length - 1) * 70 + 5; + + return Container( + color: backgroundColor, + child: SizedBox( + height: height.toDouble(), + child: ListView.separated( + itemCount: items.length + 1, + separatorBuilder: (context, index) { + return const Divider(color: Colors.grey); + }, + itemBuilder: (context, index) { + if (index < items.length) { + return ListTile( + title: Text(items[index]), + onTap: () { + // Handle item tap + }, + trailing: const Icon(Icons.chevron_right), + ); + } else { + // This is the separator item + return const SizedBox.shrink(); // No content for the separator item + } + }, + ), + ), + ); + } +} diff --git a/lib/src/features/self_screening/presentation/widgets/image_card.dart b/lib/src/features/self_screening/presentation/widgets/image_card.dart new file mode 100644 index 00000000..52f355ce --- /dev/null +++ b/lib/src/features/self_screening/presentation/widgets/image_card.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class ImageCard extends StatelessWidget { + final String imagePath; + + const ImageCard({Key? key, required this.imagePath}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width * 0.45, // 45% of screen width + height: 200, // Set a fixed height + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.3), + spreadRadius: 2, + blurRadius: 5, + offset: Offset(0, 3), + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(12), + child: SvgPicture.asset( + imagePath, + fit: BoxFit.cover, // Ensures the image covers the entire card + ), + ), + ); + } +} diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index 2f23c51a..a0d5222a 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -46,4 +46,6 @@ class Constants { static const bpBgColor = Color.fromARGB(255, 255, 83, 80); static const bloodSugarColor = Color.fromARGB(255, 180, 216, 20); static const providerBgColor = Color.fromARGB(255, 37, 102, 92); + static const selfScreeningBgColor = Color.fromARGB(255, 151, 57, 54); + static const bgColor = Color.fromARGB(255, 245, 245, 245); } From 3d9cd434ac60cc8f10609108b015531404ec5cdf Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 18 Oct 2024 11:44:19 +0300 Subject: [PATCH 102/140] move blood sugar to screen --- lib/src/app/navigation/app_router.dart | 2 +- .../dashboard/presentation/widgets/GeneralDashboard.dart | 4 ++-- .../blood_sugar/data/models/blood_sugar.dart | 0 .../blood_sugar/data/models/blood_sugar.freezed.dart | 0 .../blood_sugar/data/models/blood_sugar.g.dart | 0 .../blood_sugar/data/providers/blood_sugar_provider.dart | 6 +++--- .../data/repository/blood_sugar_repository.dart | 4 ++-- .../blood_sugar/data/services/blood_sugar_service.dart | 2 +- .../presentation/pages/AddBloodSugarScreen.dart | 8 ++++---- .../blood_sugar/presentation/pages/BloodSugarScreen.dart | 6 +++--- .../presentation/widgets/blood_level_picker.dart | 2 +- .../presentation/widgets/blood_level_units_picker.dart | 0 .../presentation/widgets/blood_sugar_entry_card.dart | 2 +- .../presentation/widgets/blood_suger_trend_chart.dart | 2 +- .../presentation/pages/self_screening_menu.dart | 8 ++++++-- .../self_screening/presentation/widgets/health_card.dart | 6 +++--- 16 files changed, 28 insertions(+), 24 deletions(-) rename lib/src/features/{ => self_screening}/blood_sugar/data/models/blood_sugar.dart (100%) rename lib/src/features/{ => self_screening}/blood_sugar/data/models/blood_sugar.freezed.dart (100%) rename lib/src/features/{ => self_screening}/blood_sugar/data/models/blood_sugar.g.dart (100%) rename lib/src/features/{ => self_screening}/blood_sugar/data/providers/blood_sugar_provider.dart (53%) rename lib/src/features/{ => self_screening}/blood_sugar/data/repository/blood_sugar_repository.dart (61%) rename lib/src/features/{ => self_screening}/blood_sugar/data/services/blood_sugar_service.dart (97%) rename lib/src/features/{ => self_screening}/blood_sugar/presentation/pages/AddBloodSugarScreen.dart (90%) rename lib/src/features/{ => self_screening}/blood_sugar/presentation/pages/BloodSugarScreen.dart (95%) rename lib/src/features/{ => self_screening}/blood_sugar/presentation/widgets/blood_level_picker.dart (93%) rename lib/src/features/{ => self_screening}/blood_sugar/presentation/widgets/blood_level_units_picker.dart (100%) rename lib/src/features/{ => self_screening}/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart (85%) rename lib/src/features/{ => self_screening}/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart (93%) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index f59dd843..e5b0838b 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -19,7 +19,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerificationScreen import 'package:nishauri/src/features/auth/presentation/pages/VerifiedResetPassword.dart'; import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswordScreen.dart'; import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; -import 'package:nishauri/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMIHistoryScreen.dart'; diff --git a/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart b/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart index 3febd973..736eb88e 100644 --- a/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart +++ b/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/blood_sugar/data/providers/blood_sugar_provider.dart'; -import 'package:nishauri/src/features/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart'; import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/bmi/presentation/widgets/BMILineGraph.dart'; import 'package:nishauri/src/features/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/features/bp/presentation/pages/trend_chart_screen.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart'; class GeneralDashboard extends ConsumerWidget { const GeneralDashboard({super.key}); diff --git a/lib/src/features/blood_sugar/data/models/blood_sugar.dart b/lib/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart similarity index 100% rename from lib/src/features/blood_sugar/data/models/blood_sugar.dart rename to lib/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart diff --git a/lib/src/features/blood_sugar/data/models/blood_sugar.freezed.dart b/lib/src/features/self_screening/blood_sugar/data/models/blood_sugar.freezed.dart similarity index 100% rename from lib/src/features/blood_sugar/data/models/blood_sugar.freezed.dart rename to lib/src/features/self_screening/blood_sugar/data/models/blood_sugar.freezed.dart diff --git a/lib/src/features/blood_sugar/data/models/blood_sugar.g.dart b/lib/src/features/self_screening/blood_sugar/data/models/blood_sugar.g.dart similarity index 100% rename from lib/src/features/blood_sugar/data/models/blood_sugar.g.dart rename to lib/src/features/self_screening/blood_sugar/data/models/blood_sugar.g.dart diff --git a/lib/src/features/blood_sugar/data/providers/blood_sugar_provider.dart b/lib/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart similarity index 53% rename from lib/src/features/blood_sugar/data/providers/blood_sugar_provider.dart rename to lib/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart index 3b287fd8..6a88aa63 100644 --- a/lib/src/features/blood_sugar/data/providers/blood_sugar_provider.dart +++ b/lib/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/blood_sugar/data/models/blood_sugar.dart'; -import 'package:nishauri/src/features/blood_sugar/data/repository/blood_sugar_repository.dart'; -import 'package:nishauri/src/features/blood_sugar/data/services/blood_sugar_service.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/repository/blood_sugar_repository.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/services/blood_sugar_service.dart'; final bloodSugarProvider = Provider((ref) { return BloodSugarRepository(BloodSugarService()); diff --git a/lib/src/features/blood_sugar/data/repository/blood_sugar_repository.dart b/lib/src/features/self_screening/blood_sugar/data/repository/blood_sugar_repository.dart similarity index 61% rename from lib/src/features/blood_sugar/data/repository/blood_sugar_repository.dart rename to lib/src/features/self_screening/blood_sugar/data/repository/blood_sugar_repository.dart index e2e20392..6deb2f77 100644 --- a/lib/src/features/blood_sugar/data/repository/blood_sugar_repository.dart +++ b/lib/src/features/self_screening/blood_sugar/data/repository/blood_sugar_repository.dart @@ -1,5 +1,5 @@ -import 'package:nishauri/src/features/blood_sugar/data/models/blood_sugar.dart'; -import 'package:nishauri/src/features/blood_sugar/data/services/blood_sugar_service.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/services/blood_sugar_service.dart'; class BloodSugarRepository { final BloodSugarService _service; diff --git a/lib/src/features/blood_sugar/data/services/blood_sugar_service.dart b/lib/src/features/self_screening/blood_sugar/data/services/blood_sugar_service.dart similarity index 97% rename from lib/src/features/blood_sugar/data/services/blood_sugar_service.dart rename to lib/src/features/self_screening/blood_sugar/data/services/blood_sugar_service.dart index 266ef6f4..db881282 100644 --- a/lib/src/features/blood_sugar/data/services/blood_sugar_service.dart +++ b/lib/src/features/self_screening/blood_sugar/data/services/blood_sugar_service.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; -import 'package:nishauri/src/features/blood_sugar/data/models/blood_sugar.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/blood_sugar/presentation/pages/AddBloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/AddBloodSugarScreen.dart similarity index 90% rename from lib/src/features/blood_sugar/presentation/pages/AddBloodSugarScreen.dart rename to lib/src/features/self_screening/blood_sugar/presentation/pages/AddBloodSugarScreen.dart index b8bc3e16..6aa6445f 100644 --- a/lib/src/features/blood_sugar/presentation/pages/AddBloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/AddBloodSugarScreen.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:nishauri/src/features/blood_sugar/data/models/blood_sugar.dart'; -import 'package:nishauri/src/features/blood_sugar/data/providers/blood_sugar_provider.dart'; -import 'package:nishauri/src/features/blood_sugar/presentation/widgets/blood_level_picker.dart'; -import 'package:nishauri/src/features/blood_sugar/presentation/widgets/blood_level_units_picker.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_level_picker.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_level_units_picker.dart'; import 'package:nishauri/src/utils/constants.dart'; class AddBloodSugarScreen extends HookConsumerWidget { diff --git a/lib/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart similarity index 95% rename from lib/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart rename to lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart index 3c313537..dedf845e 100644 --- a/lib/src/features/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -3,9 +3,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/blood_sugar/data/providers/blood_sugar_provider.dart'; -import 'package:nishauri/src/features/blood_sugar/presentation/pages/AddBloodSugarScreen.dart'; -import 'package:nishauri/src/features/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/AddBloodSugarScreen.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart'; import 'package:nishauri/src/shared/charts/CustomLineChart.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; diff --git a/lib/src/features/blood_sugar/presentation/widgets/blood_level_picker.dart b/lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_level_picker.dart similarity index 93% rename from lib/src/features/blood_sugar/presentation/widgets/blood_level_picker.dart rename to lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_level_picker.dart index 3e16224a..590e3de6 100644 --- a/lib/src/features/blood_sugar/presentation/widgets/blood_level_picker.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_level_picker.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/blood_sugar/presentation/widgets/blood_level_units_picker.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_level_units_picker.dart'; import 'package:nishauri/src/utils/constants.dart'; class BloodLevelPicker extends StatelessWidget { diff --git a/lib/src/features/blood_sugar/presentation/widgets/blood_level_units_picker.dart b/lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_level_units_picker.dart similarity index 100% rename from lib/src/features/blood_sugar/presentation/widgets/blood_level_units_picker.dart rename to lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_level_units_picker.dart diff --git a/lib/src/features/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart b/lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart similarity index 85% rename from lib/src/features/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart rename to lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart index 42c6d7dd..7b2221f4 100644 --- a/lib/src/features/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/blood_sugar/data/models/blood_sugar.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; class BloodSugarEntryCard extends StatelessWidget { final BloodSugar entry; diff --git a/lib/src/features/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart b/lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart similarity index 93% rename from lib/src/features/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart rename to lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart index b94dfa02..3100f314 100644 --- a/lib/src/features/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart @@ -1,6 +1,6 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/blood_sugar/data/models/blood_sugar.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; import 'package:nishauri/src/shared/charts/CustomLineChart.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 0b0eb3b1..073ce796 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -10,6 +10,7 @@ import 'package:nishauri/src/features/self_screening/presentation/widgets/health import 'package:nishauri/src/features/self_screening/presentation/widgets/image_card.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class SelfScreening extends HookConsumerWidget { const SelfScreening({super.key}); @@ -17,8 +18,8 @@ class SelfScreening extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); - int _currIndex = 0; // Define your current index - int _messagesCount = 0; // Define your messages count + int _currIndex = 0; + int _messagesCount = 0; return Scaffold( body: Column( @@ -55,6 +56,9 @@ class SelfScreening extends HookConsumerWidget { value3: "73", text3: "Pulse/Min", vName3: "Pulse Rate", + onPressed: (){ + context.goNamed(RouteNames.BLOOD_PRESSURE); + }, ), HealthCard( svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", diff --git a/lib/src/features/self_screening/presentation/widgets/health_card.dart b/lib/src/features/self_screening/presentation/widgets/health_card.dart index a2a111c4..6b1f9462 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_card.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_card.dart @@ -14,7 +14,7 @@ class HealthCard extends StatelessWidget { final String? vName1; final String? vName2; final String? vName3; - final VoidCallback? onPressed; // Callback for button action + final VoidCallback? onPressed; const HealthCard({ this.svgAsset, @@ -93,9 +93,9 @@ class HealthCard extends StatelessWidget { return const SizedBox.shrink(); } return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), // Adjust padding as needed + padding: const EdgeInsets.symmetric(vertical: 8.0), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, // Align items to the start + crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(name ?? '', style: theme.textTheme.bodyMedium), Row( From 87ff1930d663f51aafaac5bfd87d3eaf86b2af09 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 22 Oct 2024 17:56:01 +0300 Subject: [PATCH 103/140] refactor bs --- lib/src/app/navigation/app_router.dart | 43 ++- .../common/presentation/pages/blog.dart | 42 +-- .../presentation/pages/BloodSugarScreen.dart | 315 +++++++++--------- .../presentation/common/insight_common.dart | 4 +- .../pages/blood_pressure_posts.dart | 35 ++ .../presentation/pages/blood_sugar_posts.dart | 35 ++ .../presentation/pages/bpInsightScreen.dart | 4 +- .../presentation/pages/bsInsightScreen.dart | 4 +- .../pages/self_screening_menu.dart | 3 + .../presentation/widgets/image_card.dart | 6 +- lib/src/shared/charts/CustomLineChart.dart | 177 +++++----- lib/src/shared/display/blog_post_widget.dart | 39 +++ .../shared/display/custome_filter_chart.dart | 140 ++++++++ lib/src/shared/display/daily_card.dart | 66 ++++ lib/src/utils/constants.dart | 1 + lib/src/utils/routes.dart | 5 + 16 files changed, 643 insertions(+), 276 deletions(-) create mode 100644 lib/src/features/self_screening/presentation/pages/blood_pressure_posts.dart create mode 100644 lib/src/features/self_screening/presentation/pages/blood_sugar_posts.dart create mode 100644 lib/src/shared/display/blog_post_widget.dart create mode 100644 lib/src/shared/display/custome_filter_chart.dart create mode 100644 lib/src/shared/display/daily_card.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index e5b0838b..4deeb43e 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -66,7 +66,10 @@ import 'package:nishauri/src/features/provider/dawa_drop_management/presentation import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; import 'package:nishauri/src/features/provider/provider_registry/presentaion/pages/location_selection_screen.dart'; import 'package:nishauri/src/features/provider/provider_registry/presentaion/pages/provider_details.dart'; +import 'package:nishauri/src/features/self_screening/presentation/pages/blood_pressure_posts.dart'; +import 'package:nishauri/src/features/self_screening/presentation/pages/blood_sugar_posts.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; +import 'package:nishauri/src/features/self_screening/presentation/pages/bsInsightScreen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/insight_screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/self_screening_menu.dart'; import 'package:nishauri/src/features/treatment_support/presentation/pages/TreatmentSupport.dart'; @@ -472,13 +475,51 @@ final List selfScreeningRoutes = [ builder: (BuildContext context, GoRouterState state) { return BPMonitorScreen(); }, + routes: [ + GoRoute( + name: RouteNames.BLOOD_PRESSURE_INSIGHT, + path: 'blood-pressure-insight', + builder: (BuildContext context, GoRouterState state) { + return BsInsightScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.BLOOD_PRESSURE_POSTS, + path: 'blood-pressure-posts', + builder: (BuildContext context, GoRouterState state) { + dynamic ann = state.extra; + return BloodPressurePostScreen(announcement: ann,); + }, + ) + ] + ), + ] ), GoRoute( - name: MenuItemNames.BLOOD_SUGAR, + name: RouteNames.BLOOD_SUGAR, path: 'blood-sugar', builder: (BuildContext context, GoRouterState state) { return BloodSugarScreen(); }, + routes: [ + GoRoute( + name: RouteNames.BLOOD_SUGAR_INSIGHT, + path: 'blood-sugar-insight', + builder: (BuildContext context, GoRouterState state) { + return BsInsightScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.BLOOD_SUGAR_POSTS, + path: 'blood-sugar-posts', + builder: (BuildContext context, GoRouterState state) { + dynamic ann = state.extra; + return BloodSugarPostScreen(announcement: ann,); + }, + ) + ] + ), + ] ), //Routes for the Period Planner GoRoute( diff --git a/lib/src/features/common/presentation/pages/blog.dart b/lib/src/features/common/presentation/pages/blog.dart index f04e8b83..d8ac1927 100644 --- a/lib/src/features/common/presentation/pages/blog.dart +++ b/lib/src/features/common/presentation/pages/blog.dart @@ -1,11 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:flutter_markdown/flutter_markdown.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:nishauri/src/features/common/data/models/announcement.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/blog_post_widget.dart'; import 'package:nishauri/src/shared/display/scafold_stack_body.dart'; import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/helpers.dart'; class BlogPostScreen extends StatelessWidget { final Announcement announcement; @@ -14,42 +12,24 @@ class BlogPostScreen extends StatelessWidget { @override Widget build(BuildContext context) { - final theme = Theme.of(context); return Scaffold( body: Column( children: [ CustomAppBar( - title: announcement.header?? "Did you know 💡", - color: Constants.labResultsColor.withOpacity(0.5),), - + title: announcement.header ?? "Did you know 💡", + color: Constants.labResultsColor.withOpacity(0.5), + ), Expanded( - child: ScaffoldStackedBody( - body: Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(announcement.title, style: theme.textTheme.headlineMedium), - SvgPicture.asset( - announcement.image, - width: double.infinity, - height: getOrientationAwareScreenSize(context).height * 0.30, - fit: BoxFit.cover, - ), - // Image.network( - // announcement.image, - // width: double.infinity, - // height: getOrientationAwareScreenSize(context).height * 0.30, - // fit: BoxFit.cover, - // ), - Expanded(child: Markdown(data: announcement.description!)) - ], - ), + child: ScaffoldStackedBody( + body: BlogPostWidget( + title: announcement.title, + imageUrl: announcement.image, + description: announcement.description!, ), ), - ) + ), ], - ) + ), ); } } diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart index dedf845e..fda5fa9b 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -1,183 +1,194 @@ + import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:intl/intl.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/AddBloodSugarScreen.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart'; +import 'package:nishauri/src/features/self_screening/presentation/widgets/image_card.dart'; import 'package:nishauri/src/shared/charts/CustomLineChart.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/shared/display/custome_filter_chart.dart'; +import 'package:nishauri/src/shared/display/daily_card.dart'; +import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; -class BloodSugarScreen extends ConsumerWidget { +class BloodSugarScreen extends ConsumerStatefulWidget { const BloodSugarScreen({super.key}); @override - Widget build(BuildContext context, WidgetRef ref) { + _BloodSugarScreenState createState() => _BloodSugarScreenState(); +} + +class _BloodSugarScreenState extends ConsumerState { + Color buttonColor = Colors.blue; + + void _changeColor() { + setState(() { + buttonColor = buttonColor == Colors.blue ? Colors.red : Colors.blue; + }); + } + + @override + Widget build(BuildContext context) { final bloodSugarListProvider = ref.watch(bloodSugarEntriesProvider); final theme = Theme.of(context); - return bloodSugarListProvider.when( - data: (data) { - List dataPoints = data - .asMap() - .entries - .map((entry) => FlSpot( - entry.key.toDouble(), - entry.value.level, - )) - .toList(); + final data = bloodSugarListProvider.when( + data: (data) { + return data ?? []; + }, + error: (error, _) { + return []; + }, + loading: () { + return []; + }, + ); - final dateTimeList = data.asMap().entries.map((e) { - return e.value.created_at.toString(); - }).toList(); + final dataPoints = data.asMap().entries.map((entry) { + final index = entry.key.toDouble(); + final systolic = entry.value.level; + return FlSpot(index, systolic); + }).toList(); - // List dateTimeList = data - // .map((entry) => - // entry.date.toString() - // .toList(); + final dateTimeList = data.asMap().entries.map((e) { + return e.value.created_at.toString(); + }).toList(); - const minChartValue = 40.0; - const maxChartValue = 400.0; - return Scaffold( - body: Column( - children: [ - const CustomAppBar( - title: "Blood Sugar level 🍚", - subTitle: "Keep a record of your blood sugar levels", - color: Constants.bmiCalculatorColor, - ), - const SizedBox(height: Constants.SPACING), - Expanded( - child: Column( - children: [ - Expanded( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: CustomLineChart( - dataPoints: dataPoints, - dateTimes: dateTimeList, - gradientColors: [ - Constants.bloodSugarColor, - Constants.bloodSugarColor.withOpacity(0.3), - ], - minX: 0, - maxX: data.length.toDouble() - 1, - minY: minChartValue, - maxY: maxChartValue, - leftTile: true, - bottomTile: true, - interval: 80, - dateFormat: "HH:mm-dd/MM", + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + title: "Blood Sugar", + color: Constants.selfScreeningBgColor, + ), + Expanded( + child: SingleChildScrollView( + child: Stack( + children: [ + Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + spacing: 16, + runSpacing: 16, + children: [ + FilterCard( + onPressed: _changeColor, + ), + ], + ), + SizedBox(height: Constants.SPACING,), + Text("18 Oct 2024", style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), + + SizedBox(height: Constants.SPACING,), + Row( + children: [ + Text("4.1", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), + const SizedBox(width: 4), + Text("mmol/L", style: theme.textTheme.bodyMedium), + ], + ), + SizedBox(height: Constants.SPACING,), + Wrap( + spacing: 1, + runSpacing: 16, + children: [ + CustomFilterLineChart( + dataPoints: dataPoints, + dateTimes: dateTimeList, + gradientColors: [ + Constants.bloodSugarColor, + Constants.bloodSugarColor.withOpacity(0.3), + ], + minX: 0, + maxX: data.length.toDouble() - 1, + minY: 40.0, + maxY: 400.0, + leftTile: false, + bottomTile: true, + interval: 80, + // dateFormat: "HH:mm-dd", + filter: "Daily", + barColor: Constants.barColor, + ), + ], + ), + SizedBox(height: Constants.SPACING,), + Card( + color: Constants.bgColor, + child: ListTile( + title: Text("Show All Data", style: theme.textTheme.titleSmall!.copyWith(fontWeight: FontWeight.bold),), + trailing: const Icon(Icons.arrow_forward_ios_outlined), + onTap: (){ + // implementing on tap method + }, + ), + ), + SizedBox(height: Constants.SPACING,), + Container( + color: Constants.bgColor, + height: 250, + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + title: Text( + 'What is Blood Sugar', + style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), + ), + subtitle: Text( + "Blood sugar, or glucose, is the main type of sugar found in your blood. It’s your body’s primary source of energy, coming from the food you eat, especially carbohydrates. When you eat, your body breaks down the food into glucose, which then enters your bloodstream. Your pancreas releases a hormone called insulin to help move this glucose into your cells, where it’s used for energy. Maintaining balanced blood sugar levels is crucial because too much or too little can lead to health issues like diabetes or hypoglycemia. Think of it as the fuel that keeps your body running smoothly!", + style: theme.textTheme.bodyMedium, + ), + ), + ], + ), + ), ), ), - ), - Expanded( - child: ListView.builder( - itemCount: data.length, - itemBuilder: (context, index) { - return BloodSugarEntryCard(entry: data[index]); + SizedBox(height: Constants.SPACING), + Button( + title: "More Insight", + onPress: (){ + context.goNamed(RouteNames.BLOOD_SUGAR_INSIGHT); }, + textColor: Constants.selfScreeningBgColor, + // onPressed: () { + // // implement on Pressed + // }, + // child: Text('More Insight', style: theme.textTheme.bodyLarge!.copyWith(color: Constants.selfScreeningBgColor)), + // style: TextButton.styleFrom( + // backgroundColor: Constants.bgColor, + // padding: EdgeInsets.all(10), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(8), // Rounded corners + // ), + // ), ), - ), - ], - ), - ), - ], - ), - floatingActionButton: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - FloatingActionButton( - onPressed: () async { - // Show add blood sugar screen as dialog - await showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: const Text("Enter Blood Sugar data"), - content: AddBloodSugarScreen(), - scrollable: true, - ); - }, - ); - ref.refresh(bloodSugarEntriesProvider); - }, - child: const Icon(Icons.add), - ), - const SizedBox(height: Constants.SPACING), - FloatingActionButton( - onPressed: () async { - ref.refresh(bloodSugarEntriesProvider); - }, - child: const Icon(Icons.refresh), - ), - ], - ), - ); - }, - loading: () => Center( - child: Column( - children: [ - Text( - "Loading Blood sugar", - style: theme.textTheme.bodySmall, + + ], + ), ), - const SizedBox(height: Constants.SPACING * 2), - const CircularProgressIndicator(), ], ), ), - error: (error, _) { - debugPrint("Blood sugar fetch: ${error.toString()}"); - return Scaffold( - body: const Column( - children: [ - const CustomAppBar( - title: "Blood Sugar level 🍚", - // subTitle: "Keep a record of your blood sugar levels", - color: Constants.bmiCalculatorColor, - ), - Expanded( - child: BackgroundImageWidget( - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No Blood sugar Data Available to display"), - ) - ], - ), - floatingActionButton: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - FloatingActionButton( - heroTag: "refreshButton", - onPressed: () async { - ref.refresh(bloodSugarEntriesProvider); - }, - child: const Icon(Icons.refresh), - ), - const SizedBox(height: 10), - FloatingActionButton( - heroTag: "addButton", - onPressed: () async { - // Show add blood sugar screen as dialog - await showDialog( - context: context, - builder: (context) { - return AlertDialog( - content: AddBloodSugarScreen(), - scrollable: true, - ); - }, - ); - ref.refresh(bloodSugarEntriesProvider); - }, - child: const Icon(Icons.add), - ), - ], - ), - ); - }); + ), + ], + ), + ); } } diff --git a/lib/src/features/self_screening/presentation/common/insight_common.dart b/lib/src/features/self_screening/presentation/common/insight_common.dart index 7583f9fd..2bdc6df9 100644 --- a/lib/src/features/self_screening/presentation/common/insight_common.dart +++ b/lib/src/features/self_screening/presentation/common/insight_common.dart @@ -12,6 +12,7 @@ import 'package:nishauri/src/utils/routes.dart'; class InsightCommon extends HookConsumerWidget { final String appBarTitle; final Color appBarColor; + final String pathName; final AsyncValue> insightAsync; const InsightCommon({ @@ -19,6 +20,7 @@ class InsightCommon extends HookConsumerWidget { required this.appBarTitle, required this.appBarColor, required this.insightAsync, + required this.pathName }) : super(key: key); @override @@ -53,7 +55,7 @@ class InsightCommon extends HookConsumerWidget { InkWell( onTap: () { context.goNamed( - RouteNames.BLOG_POST, + pathName, extra: insight, ); }, diff --git a/lib/src/features/self_screening/presentation/pages/blood_pressure_posts.dart b/lib/src/features/self_screening/presentation/pages/blood_pressure_posts.dart new file mode 100644 index 00000000..e4bb0cc0 --- /dev/null +++ b/lib/src/features/self_screening/presentation/pages/blood_pressure_posts.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/common/data/models/announcement.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/blog_post_widget.dart'; +import 'package:nishauri/src/shared/display/scafold_stack_body.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class BloodPressurePostScreen extends StatelessWidget { + final Announcement announcement; + + const BloodPressurePostScreen({super.key, required this.announcement}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + CustomAppBar( + title: announcement.header ?? "Did you know 💡", + color: Constants.selfScreeningBgColor, + ), + Expanded( + child: ScaffoldStackedBody( + body: BlogPostWidget( + title: announcement.title, + imageUrl: announcement.image, + description: announcement.description!, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/features/self_screening/presentation/pages/blood_sugar_posts.dart b/lib/src/features/self_screening/presentation/pages/blood_sugar_posts.dart new file mode 100644 index 00000000..5e51f8c8 --- /dev/null +++ b/lib/src/features/self_screening/presentation/pages/blood_sugar_posts.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/common/data/models/announcement.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/blog_post_widget.dart'; +import 'package:nishauri/src/shared/display/scafold_stack_body.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class BloodSugarPostScreen extends StatelessWidget { + final Announcement announcement; + + const BloodSugarPostScreen({super.key, required this.announcement}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + CustomAppBar( + title: announcement.header ?? "Did you know 💡", + color: Constants.selfScreeningBgColor, + ), + Expanded( + child: ScaffoldStackedBody( + body: BlogPostWidget( + title: announcement.title, + imageUrl: announcement.image, + description: announcement.description!, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart b/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart index 9590b379..b6878f08 100644 --- a/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart +++ b/lib/src/features/self_screening/presentation/pages/bpInsightScreen.dart @@ -3,6 +3,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; import 'package:nishauri/src/features/self_screening/presentation/common/insight_common.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class BpInsightScreen extends HookConsumerWidget { const BpInsightScreen({Key? key}) : super(key: key); @@ -10,13 +11,14 @@ class BpInsightScreen extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { const title = "Blood Pressure Awareness 🌡"; - const color = Constants.bmiCalculatorColor; + const color = Constants.selfScreeningBgColor; final insightAsync = ref.watch(insightProvider); return InsightCommon( appBarTitle: title, appBarColor: color, insightAsync: insightAsync, + pathName: RouteNames.BLOOD_PRESSURE_POSTS, ); } } diff --git a/lib/src/features/self_screening/presentation/pages/bsInsightScreen.dart b/lib/src/features/self_screening/presentation/pages/bsInsightScreen.dart index cf355696..26604a1f 100644 --- a/lib/src/features/self_screening/presentation/pages/bsInsightScreen.dart +++ b/lib/src/features/self_screening/presentation/pages/bsInsightScreen.dart @@ -3,6 +3,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/self_screening/presentation/common/insight_common.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/features/self_screening/data/providers/insight_provider.dart'; +import 'package:nishauri/src/utils/routes.dart'; class BsInsightScreen extends HookConsumerWidget { const BsInsightScreen({Key? key}) : super(key: key); @@ -10,13 +11,14 @@ class BsInsightScreen extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { const title = "Blood Sugar Awareness 🌡"; - const color = Constants.bmiCalculatorColor; + const color = Constants.selfScreeningBgColor; final insightAsync = ref.watch(bsInsightProvider); return InsightCommon( appBarTitle: title, appBarColor: color, insightAsync: insightAsync, + pathName: RouteNames.BLOOD_SUGAR_POSTS, ); } } diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 073ce796..fa2032e6 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -67,6 +67,9 @@ class SelfScreening extends HookConsumerWidget { text1: "mmHG", value3: "73/Min", vName3: "Pulse Rate", + onPressed: (){ + context.goNamed(RouteNames.BLOOD_SUGAR); + }, ), ], ), diff --git a/lib/src/features/self_screening/presentation/widgets/image_card.dart b/lib/src/features/self_screening/presentation/widgets/image_card.dart index 52f355ce..428844fd 100644 --- a/lib/src/features/self_screening/presentation/widgets/image_card.dart +++ b/lib/src/features/self_screening/presentation/widgets/image_card.dart @@ -9,8 +9,8 @@ class ImageCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - width: MediaQuery.of(context).size.width * 0.45, // 45% of screen width - height: 200, // Set a fixed height + width: MediaQuery.of(context).size.width * 0.45, + height: 200, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), color: Colors.white, @@ -27,7 +27,7 @@ class ImageCard extends StatelessWidget { borderRadius: BorderRadius.circular(12), child: SvgPicture.asset( imagePath, - fit: BoxFit.cover, // Ensures the image covers the entire card + fit: BoxFit.cover, ), ), ); diff --git a/lib/src/shared/charts/CustomLineChart.dart b/lib/src/shared/charts/CustomLineChart.dart index d11052b7..5e102131 100644 --- a/lib/src/shared/charts/CustomLineChart.dart +++ b/lib/src/shared/charts/CustomLineChart.dart @@ -18,6 +18,7 @@ class CustomLineChart extends StatelessWidget { final List gradientColors; final double? interval; final String dateFormat; + final String? filter; const CustomLineChart({ Key? key, @@ -35,106 +36,110 @@ class CustomLineChart extends StatelessWidget { required this.bottomTile, this.interval, required this.dateFormat, + this.filter }) : super(key: key); @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: LineChart( - LineChartData( - lineBarsData: [ - LineChartBarData( - spots: dataPoints, - isCurved: true, - color: barColor, - barWidth: 6, - belowBarData: BarAreaData( - show: true, - gradient: LinearGradient( - colors: gradientColors - .map((color) => color.withOpacity(0.3)) - .toList(), + return Container( + height: 300, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: LineChart( + LineChartData( + lineBarsData: [ + LineChartBarData( + spots: dataPoints, + isCurved: true, + color: barColor, + barWidth: 6, + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient( + colors: gradientColors + .map((color) => color.withOpacity(0.3)) + .toList(), + ), ), + dotData: const FlDotData(show: true), ), - dotData: const FlDotData(show: true), - ), - ], - titlesData: FlTitlesData( - bottomTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: bottomTile, - getTitlesWidget: (value, meta) { - int index = value.toInt(); - if (index >= 0 && index < dateTimes.length) { - DateTime date = DateTime.parse(dateTimes[index]); - return Padding( - padding: const EdgeInsets.all(4.0), - child: Transform.rotate( - angle: -45 * - (3.14 / - 180), // Rotate the text by -45 degrees - child: Text(DateFormat(dateFormat).format(date)), - ), + ], + titlesData: FlTitlesData( + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: bottomTile, + getTitlesWidget: (value, meta) { + int index = value.toInt(); + if (index >= 0 && index < dateTimes.length) { + DateTime date = DateTime.parse(dateTimes[index]); + return Padding( + padding: const EdgeInsets.all(4.0), + child: Transform.rotate( + angle: -45 * + (3.14 / + 180), + child: Text(DateFormat(dateFormat).format(date)), + ), + ); + } + return const Text(''); + }, + reservedSize: 30, + interval: 1, + ), + axisNameWidget: Text(xAxisLabel ?? ''), + ), + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: leftTile, + getTitlesWidget: (value, meta) { + return Text( + value.toString(), + style: const TextStyle(fontSize: 10), ); - } - return const Text(''); - }, - reservedSize: 30, - interval: 1, // Show labels at an interval of 1 unit + }, + reservedSize: 30, + interval: + interval ?? 1, // Show labels at an interval of 1 unit + ), + axisNameWidget: Text(yAxisLabel ?? ''), ), - axisNameWidget: Text(xAxisLabel ?? ''), - ), - leftTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: leftTile, - getTitlesWidget: (value, meta) { - return Text( - value.toString(), - style: const TextStyle(fontSize: 10), - ); - }, - reservedSize: 30, - interval: - interval ?? 1, // Show labels at an interval of 1 unit + topTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + rightTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), ), - axisNameWidget: Text(yAxisLabel ?? ''), - ), - topTitles: const AxisTitles( - sideTitles: SideTitles(showTitles: false), - ), - rightTitles: const AxisTitles( - sideTitles: SideTitles(showTitles: false), ), - ), - minX: minX, - maxX: maxX, - minY: minY, - maxY: maxY, - borderData: FlBorderData(show: true), - gridData: FlGridData( - show: true, - drawVerticalLine: true, - drawHorizontalLine: true, - getDrawingHorizontalLine: (value) { - return const FlLine(strokeWidth: 1, color: Colors.grey); - }, - getDrawingVerticalLine: (value) { - if (value.toInt() % 1 == 0) { + minX: minX, + maxX: maxX, + minY: minY, + maxY: maxY, + borderData: FlBorderData(show: true), + gridData: FlGridData( + show: true, + drawVerticalLine: true, + drawHorizontalLine: true, + getDrawingHorizontalLine: (value) { return const FlLine(strokeWidth: 1, color: Colors.grey); - } - return const FlLine( - strokeWidth: 0); // Hide lines for non-integer values - }, + }, + getDrawingVerticalLine: (value) { + if (value.toInt() % 1 == 0) { + return const FlLine(strokeWidth: 1, color: Colors.grey); + } + return const FlLine( + strokeWidth: 0); + }, + ), ), ), ), - ), - ], + ], + ), ), ); } diff --git a/lib/src/shared/display/blog_post_widget.dart b/lib/src/shared/display/blog_post_widget.dart new file mode 100644 index 00000000..0cf851f7 --- /dev/null +++ b/lib/src/shared/display/blog_post_widget.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/helpers.dart'; + +class BlogPostWidget extends StatelessWidget { + final String title; + final String imageUrl; + final String description; + + const BlogPostWidget({ + Key? key, + required this.title, + required this.imageUrl, + required this.description, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: theme.textTheme.headlineMedium), + SvgPicture.asset( + imageUrl, + width: double.infinity, + height: getOrientationAwareScreenSize(context).height * 0.30, + fit: BoxFit.cover, + ), + Expanded(child: Markdown(data: description)), + ], + ), + ); + } +} diff --git a/lib/src/shared/display/custome_filter_chart.dart b/lib/src/shared/display/custome_filter_chart.dart new file mode 100644 index 00000000..d3793f4d --- /dev/null +++ b/lib/src/shared/display/custome_filter_chart.dart @@ -0,0 +1,140 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class CustomFilterLineChart extends StatelessWidget { + final List dataPoints; + final String? xAxisLabel; + final String? yAxisLabel; + final double? minX; + final double? maxX; + final double? minY; + final double? maxY; + final bool leftTile; + final Color? barColor; + final bool bottomTile; + final List gradientColors; + final double? interval; + final String? filter; + final List dateTimes; + + const CustomFilterLineChart({ + Key? key, + required this.dataPoints, + this.xAxisLabel, + this.yAxisLabel, + this.minX, + this.maxX, + this.minY, + this.maxY, + required this.leftTile, + this.barColor, + required this.gradientColors, + required this.bottomTile, + this.interval, + this.filter, + required this.dateTimes, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: 300, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: LineChart( + LineChartData( + lineBarsData: [ + LineChartBarData( + spots: dataPoints, + isCurved: true, + color: barColor, + barWidth: 2, + belowBarData: BarAreaData(show: false), + dotData: FlDotData(show: true), + ), + ], + titlesData: FlTitlesData( + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: bottomTile, + getTitlesWidget: (value, meta) { + int index = value.toInt(); + String label; + + // Determine the label based on the filter + switch (filter) { + case 'Daily': + DateTime date = DateTime.parse(dateTimes[index]); + label = DateFormat('E').format(date); + break; + case 'Weekly': + label = 'Week ${index + 1}'; // Week number + break; + case 'Monthly': + label = 'Month ${index + 1}'; // Month number + break; + case 'Yearly': + label = 'Year ${index + 1}'; // Year number + break; + default: + label = ''; + } + + return Padding( + padding: const EdgeInsets.all(4.0), + child: Text(label), + ); + }, + reservedSize: 30, + interval: 1, + ), + axisNameWidget: Text(xAxisLabel ?? ''), + ), + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: leftTile, + getTitlesWidget: (value, meta) { + return Text( + value.toString(), + style: const TextStyle(fontSize: 10), + ); + }, + reservedSize: 30, + interval: interval ?? 1, + ), + axisNameWidget: Text(yAxisLabel ?? ''), + ), + topTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + rightTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + ), + minX: minX, + maxX: maxX, + minY: minY, + maxY: maxY, + borderData: FlBorderData(show: false), + gridData: FlGridData( + show: true, + drawVerticalLine: false, + drawHorizontalLine: true, + getDrawingHorizontalLine: (value) { + return const FlLine(strokeWidth: 1, color: Colors.grey); + }, + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/shared/display/daily_card.dart b/lib/src/shared/display/daily_card.dart new file mode 100644 index 00000000..7c25f2fb --- /dev/null +++ b/lib/src/shared/display/daily_card.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class FilterCard extends StatelessWidget { + final VoidCallback? onPressed; + + const FilterCard({ + Key? key, + this.onPressed + }) : super(key: key); + + @override + Widget build(BuildContext context) { + + return Card( + color: Constants.bgColor, + elevation: 4, + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: _buildColumn("Daily", context)), + const VerticalDivider(thickness: 3, color: Colors.grey), + Expanded(child: _buildColumn("Weekly", context)), + const VerticalDivider(thickness: 3, color: Colors.grey), + Expanded(child: _buildColumn("Monthly", context)), + const VerticalDivider(thickness: 3, color: Colors.grey), + Expanded(child: _buildColumn("6Months", context)), + const VerticalDivider(thickness: 3, color: Colors.grey), + Expanded(child: _buildColumn("Yearly", context)), + ], + ), + ], + ), + ), + ); + } + + Widget _buildColumn(String day, BuildContext context) { + final theme = Theme.of(context); + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + TextButton( + onPressed: onPressed, + child: Text(day, style: theme.textTheme.titleLarge), + ) + + // const SizedBox(width: 4), + // Text("TUE", style: theme.textTheme.titleLarge), + ], + ), + ], + ), + ); + } +} diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index a0d5222a..391be8b3 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -48,4 +48,5 @@ class Constants { static const providerBgColor = Color.fromARGB(255, 37, 102, 92); static const selfScreeningBgColor = Color.fromARGB(255, 151, 57, 54); static const bgColor = Color.fromARGB(255, 245, 245, 245); + static const barColor = Color.fromARGB(255, 4, 191, 218); } diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 3704b760..06f5a952 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -78,6 +78,11 @@ class RouteNames { static const DAWA_DROP_MANAGER = "dawa-drop-manager"; static const LOCATION_SELECTION = "location-selection"; static const PROVIDER_DETAILS = "provider-details"; + static const BLOOD_SUGAR = "blood-sugar"; + static const BLOOD_SUGAR_INSIGHT = 'blood-sugar-insight'; + static const BLOOD_SUGAR_POSTS = 'blood-sugar-posts'; + static const BLOOD_PRESSURE_INSIGHT = 'blood-pressure-insight'; + static const BLOOD_PRESSURE_POSTS = 'blood-pressure-posts'; } class MenuItemNames { From 563bdda4e94c0dc34bcdd017c319565a76e5f194 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 22 Oct 2024 18:04:47 +0300 Subject: [PATCH 104/140] move bp to self screening module --- lib/src/app/navigation/app_router.dart | 2 +- .../features/bmi/presentation/widgets/BMILineList.dart | 3 --- .../dashboard/presentation/widgets/GeneralDashboard.dart | 4 ++-- .../bp/data/models/blood_pressure.dart | 0 .../bp/data/models/blood_pressure.freezed.dart | 0 .../bp/data/models/blood_pressure.g.dart | 0 .../bp/data/providers/blood_pressure_provider.dart | 6 +++--- .../bp/data/repository/blood_pressure_repository.dart | 4 ++-- .../bp/data/services/ble_service.dart | 0 .../bp/data/services/blood_pressure_service.dart | 2 +- .../bp/presentation/pages/BPLinelistScreen.dart | 2 +- .../bp/presentation/pages/bpMonitorScreen.dart | 8 ++++---- .../bp/presentation/pages/trend_chart_screen.dart | 2 +- 13 files changed, 15 insertions(+), 18 deletions(-) rename lib/src/features/{ => self_screening}/bp/data/models/blood_pressure.dart (100%) rename lib/src/features/{ => self_screening}/bp/data/models/blood_pressure.freezed.dart (100%) rename lib/src/features/{ => self_screening}/bp/data/models/blood_pressure.g.dart (100%) rename lib/src/features/{ => self_screening}/bp/data/providers/blood_pressure_provider.dart (57%) rename lib/src/features/{ => self_screening}/bp/data/repository/blood_pressure_repository.dart (64%) rename lib/src/features/{ => self_screening}/bp/data/services/ble_service.dart (100%) rename lib/src/features/{ => self_screening}/bp/data/services/blood_pressure_service.dart (97%) rename lib/src/features/{ => self_screening}/bp/presentation/pages/BPLinelistScreen.dart (96%) rename lib/src/features/{ => self_screening}/bp/presentation/pages/bpMonitorScreen.dart (96%) rename lib/src/features/{ => self_screening}/bp/presentation/pages/trend_chart_screen.dart (97%) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 4deeb43e..10a37f8b 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -23,7 +23,7 @@ import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pa import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMIHistoryScreen.dart'; -import 'package:nishauri/src/features/bp/presentation/pages/bpMonitorScreen.dart'; +import 'package:nishauri/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart'; import 'package:nishauri/src/features/chatbot/presentations/ChatScreen.dart'; import 'package:nishauri/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart'; import 'package:nishauri/src/features/common/presentation/pages/FaqPage.dart'; diff --git a/lib/src/features/bmi/presentation/widgets/BMILineList.dart b/lib/src/features/bmi/presentation/widgets/BMILineList.dart index a38a54c8..adb2a23c 100644 --- a/lib/src/features/bmi/presentation/widgets/BMILineList.dart +++ b/lib/src/features/bmi/presentation/widgets/BMILineList.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; -import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; -import 'package:nishauri/src/features/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/utils/constants.dart'; class BMILinelist extends StatelessWidget { diff --git a/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart b/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart index 736eb88e..c9cd1200 100644 --- a/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart +++ b/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/bmi/presentation/widgets/BMILineGraph.dart'; -import 'package:nishauri/src/features/bp/data/providers/blood_pressure_provider.dart'; -import 'package:nishauri/src/features/bp/presentation/pages/trend_chart_screen.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; +import 'package:nishauri/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart'; diff --git a/lib/src/features/bp/data/models/blood_pressure.dart b/lib/src/features/self_screening/bp/data/models/blood_pressure.dart similarity index 100% rename from lib/src/features/bp/data/models/blood_pressure.dart rename to lib/src/features/self_screening/bp/data/models/blood_pressure.dart diff --git a/lib/src/features/bp/data/models/blood_pressure.freezed.dart b/lib/src/features/self_screening/bp/data/models/blood_pressure.freezed.dart similarity index 100% rename from lib/src/features/bp/data/models/blood_pressure.freezed.dart rename to lib/src/features/self_screening/bp/data/models/blood_pressure.freezed.dart diff --git a/lib/src/features/bp/data/models/blood_pressure.g.dart b/lib/src/features/self_screening/bp/data/models/blood_pressure.g.dart similarity index 100% rename from lib/src/features/bp/data/models/blood_pressure.g.dart rename to lib/src/features/self_screening/bp/data/models/blood_pressure.g.dart diff --git a/lib/src/features/bp/data/providers/blood_pressure_provider.dart b/lib/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart similarity index 57% rename from lib/src/features/bp/data/providers/blood_pressure_provider.dart rename to lib/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart index ab7ffafb..a0ab6796 100644 --- a/lib/src/features/bp/data/providers/blood_pressure_provider.dart +++ b/lib/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/bp/data/models/blood_pressure.dart'; -import 'package:nishauri/src/features/bp/data/repository/blood_pressure_repository.dart'; -import 'package:nishauri/src/features/bp/data/services/blood_pressure_service.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/repository/blood_pressure_repository.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/services/blood_pressure_service.dart'; final bloodPressureRepositoryProvider = Provider((ref) { return BloodPressureRepository(BloodPressureService()); diff --git a/lib/src/features/bp/data/repository/blood_pressure_repository.dart b/lib/src/features/self_screening/bp/data/repository/blood_pressure_repository.dart similarity index 64% rename from lib/src/features/bp/data/repository/blood_pressure_repository.dart rename to lib/src/features/self_screening/bp/data/repository/blood_pressure_repository.dart index b32b316e..c89e9c3a 100644 --- a/lib/src/features/bp/data/repository/blood_pressure_repository.dart +++ b/lib/src/features/self_screening/bp/data/repository/blood_pressure_repository.dart @@ -1,5 +1,5 @@ -import 'package:nishauri/src/features/bp/data/models/blood_pressure.dart'; -import 'package:nishauri/src/features/bp/data/services/blood_pressure_service.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/services/blood_pressure_service.dart'; class BloodPressureRepository { final BloodPressureService _service; diff --git a/lib/src/features/bp/data/services/ble_service.dart b/lib/src/features/self_screening/bp/data/services/ble_service.dart similarity index 100% rename from lib/src/features/bp/data/services/ble_service.dart rename to lib/src/features/self_screening/bp/data/services/ble_service.dart diff --git a/lib/src/features/bp/data/services/blood_pressure_service.dart b/lib/src/features/self_screening/bp/data/services/blood_pressure_service.dart similarity index 97% rename from lib/src/features/bp/data/services/blood_pressure_service.dart rename to lib/src/features/self_screening/bp/data/services/blood_pressure_service.dart index 4e5da5c4..988a18ea 100644 --- a/lib/src/features/bp/data/services/blood_pressure_service.dart +++ b/lib/src/features/self_screening/bp/data/services/blood_pressure_service.dart @@ -5,7 +5,7 @@ import 'package:flutter/services.dart'; import 'package:http/http.dart'; import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; -import 'package:nishauri/src/features/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/bp/presentation/pages/BPLinelistScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart similarity index 96% rename from lib/src/features/bp/presentation/pages/BPLinelistScreen.dart rename to lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart index 159fd55f..39c9c654 100644 --- a/lib/src/features/bp/presentation/pages/BPLinelistScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; import 'package:nishauri/src/utils/constants.dart'; class BPLinelistScreen extends StatelessWidget { diff --git a/lib/src/features/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart similarity index 96% rename from lib/src/features/bp/presentation/pages/bpMonitorScreen.dart rename to lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index 427f540f..0555414d 100644 --- a/lib/src/features/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -1,10 +1,10 @@ import 'dart:core'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/bp/data/models/blood_pressure.dart'; -import 'package:nishauri/src/features/bp/data/providers/blood_pressure_provider.dart'; -import 'package:nishauri/src/features/bp/presentation/pages/BPLinelistScreen.dart'; -import 'package:nishauri/src/features/bp/presentation/pages/trend_chart_screen.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; +import 'package:nishauri/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart'; +import 'package:nishauri/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/bp/presentation/pages/trend_chart_screen.dart b/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart similarity index 97% rename from lib/src/features/bp/presentation/pages/trend_chart_screen.dart rename to lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart index ec6ce603..ab70a00a 100644 --- a/lib/src/features/bp/presentation/pages/trend_chart_screen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart @@ -1,6 +1,6 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; import 'package:nishauri/src/shared/charts/CustomeMultLineChart.dart'; import 'package:nishauri/src/utils/constants.dart'; From 6960bcf50503be28699d66e923bbb280fbeed43e Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 23 Oct 2024 08:25:54 +0300 Subject: [PATCH 105/140] :construction: ref blood pressure --- lib/src/app/navigation/app_router.dart | 2 +- .../presentation/pages/bpMonitorScreen.dart | 120 +++++++++++++++--- .../pages/trend_chart_screen.dart | 20 +-- .../shared/charts/CustomeMultLineChart.dart | 50 ++++++-- .../shared/display/custome_filter_chart.dart | 6 +- 5 files changed, 160 insertions(+), 38 deletions(-) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 10a37f8b..daa59bbe 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -480,7 +480,7 @@ final List selfScreeningRoutes = [ name: RouteNames.BLOOD_PRESSURE_INSIGHT, path: 'blood-pressure-insight', builder: (BuildContext context, GoRouterState state) { - return BsInsightScreen(); + return BpInsightScreen(); }, routes: [ GoRoute( diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index 0555414d..e65181a1 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -1,13 +1,18 @@ import 'dart:core'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/shared/display/custome_filter_chart.dart'; +import 'package:nishauri/src/shared/display/daily_card.dart'; +import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class BPMonitorScreen extends ConsumerStatefulWidget { @override @@ -200,25 +205,108 @@ class _BPMonitorScreenState extends ConsumerState { body: Column( children: [ const CustomAppBar( - title: "Blood Pressure Monitor 📈", - color: Constants.bmiCalculatorColor, + title: "Blood Pressure", + color: Constants.selfScreeningBgColor, ), Expanded( - child: Center( - child: Padding( - padding: const EdgeInsets.only(top: 20), - child: Column( - children: [ - Expanded( - flex: 1, - child: TrendChartScreen(data: displayedData), - ), - Expanded( - flex: 1, - child: BPLinelistScreen(data: data), + child: SingleChildScrollView( + child: Stack( + children: [ + Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + spacing: 16, + runSpacing: 16, + children: [ + FilterCard( + onPressed: (){ + + }, + ), + ], + ), + SizedBox(height: Constants.SPACING,), + Text("18 Oct 2024", style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), + + SizedBox(height: Constants.SPACING,), + Row( + children: [ + Text("4.1", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), + const SizedBox(width: 4), + Text("mmol/L", style: theme.textTheme.bodyMedium), + ], + ), + SizedBox(height: Constants.SPACING,), + Wrap( + spacing: 1, + runSpacing: 16, + children: [ + TrendChartScreen(data: displayedData,) + ], + ), + SizedBox(height: Constants.SPACING,), + Card( + color: Constants.bgColor, + child: ListTile( + title: Text("Show All Data", style: theme.textTheme.titleSmall!.copyWith(fontWeight: FontWeight.bold),), + trailing: const Icon(Icons.arrow_forward_ios_outlined), + onTap: (){ + // implementing on tap method + }, + ), + ), + SizedBox(height: Constants.SPACING,), + Container( + color: Constants.bgColor, + height: 250, + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + title: Text( + 'What is Blood Pressure', + style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), + ), + subtitle: Text( + "Blood Pressure, is the force of blood pushing against the walls of your blood vessels (arteries) as it is pumped by the heart1. It's measured in millimeters of mercury (mmHg) and recorded with two numbers: systolic (the pressure when your heart beats) and diastolic (the pressure when your heart rests between beats)", + style: theme.textTheme.bodyMedium, + ), + ), + ], + ), + ), + ), + ), + SizedBox(height: Constants.SPACING), + Button( + title: "More Insight", + onPress: (){ + context.goNamed(RouteNames.BLOOD_PRESSURE_INSIGHT); + }, + textColor: Constants.selfScreeningBgColor, + // onPressed: () { + // // implement on Pressed + // }, + // child: Text('More Insight', style: theme.textTheme.bodyLarge!.copyWith(color: Constants.selfScreeningBgColor)), + // style: TextButton.styleFrom( + // backgroundColor: Constants.bgColor, + // padding: EdgeInsets.all(10), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(8), // Rounded corners + // ), + // ), + ), + + ], ), - ], - ), + ), + ], ), ), ), diff --git a/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart b/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart index ab70a00a..983b792a 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart @@ -37,8 +37,10 @@ class TrendChartScreen extends StatelessWidget { print(data); print(date); - return Scaffold( - body: Padding( + return Container( + height: 350, + child: Scaffold( + body: Padding( padding: const EdgeInsets.all(16.0), child: CustomMultiLineChart( lineBarsData: [ @@ -46,9 +48,9 @@ class TrendChartScreen extends StatelessWidget { spots: systolicSpots, isCurved: true, color: Colors.red, - barWidth: 5, + barWidth: 2, belowBarData: BarAreaData( - show: true, + show: false, gradient: LinearGradient( colors: [Colors.red.withOpacity(0.3), Colors.red.withOpacity(0)], ), @@ -59,9 +61,9 @@ class TrendChartScreen extends StatelessWidget { spots: diastolicSpots, isCurved: true, color: Colors.orange, - barWidth: 5, + barWidth: 2, belowBarData: BarAreaData( - show: true, + show: false, gradient: LinearGradient( colors: [Colors.orange.withOpacity(0.3), Colors.orange.withOpacity(0)], ), @@ -72,9 +74,9 @@ class TrendChartScreen extends StatelessWidget { spots: pulseRateSpots, isCurved: true, color: Constants.programsColor, - barWidth: 5, + barWidth: 2, belowBarData: BarAreaData( - show: true, + show: false, gradient: LinearGradient( colors: [Constants.programsColor.withOpacity(0.3), Constants.programsColor.withOpacity(0)], ), @@ -87,8 +89,10 @@ class TrendChartScreen extends StatelessWidget { minY: 29, dateTimes: date, showLeftTitles: false, + filter: "Daily", ), ), + ), ); } } diff --git a/lib/src/shared/charts/CustomeMultLineChart.dart b/lib/src/shared/charts/CustomeMultLineChart.dart index 55853adc..f55f52c3 100644 --- a/lib/src/shared/charts/CustomeMultLineChart.dart +++ b/lib/src/shared/charts/CustomeMultLineChart.dart @@ -12,6 +12,7 @@ class CustomMultiLineChart extends StatelessWidget { final double? minY; final double? maxY; final bool showLeftTitles; + final String? filter; const CustomMultiLineChart({ Key? key, @@ -24,6 +25,7 @@ class CustomMultiLineChart extends StatelessWidget { this.maxY, required this.dateTimes, required this.showLeftTitles, + this.filter }) : super(key: key); @override @@ -43,13 +45,41 @@ class CustomMultiLineChart extends StatelessWidget { showTitles: true, getTitlesWidget: (value, meta) { int index = value.toInt(); + + // return Padding( + // padding: const EdgeInsets.all(4.0), + // child: Text(label), + // ); if (index >= 0 && index < dateTimes.length) { DateTime date = DateTime.parse(dateTimes[index]); + print(date); + + String label; + + // Determine the label based on the filter + switch (filter) { + case 'Daily': + // DateTime date = DateTime.parse(dateTimes[index]); + label = DateFormat('E').format(date); + break; + case 'Weekly': + label = 'Week ${index + 1}'; // Week number + break; + case 'Monthly': + label = 'Month ${index + 1}'; // Month number + break; + case 'Yearly': + label = 'Year ${index + 1}'; // Year number + break; + default: + label = ''; + } return Padding( padding: const EdgeInsets.all(4.0), child: Transform.rotate( - angle: -45 * (3.14 / 180), // Rotate the text by -45 degrees - child: Text(DateFormat('HH:mm-dd/MM').format(date)), + angle: -45 * (3.14 / 180), + child: Text(label), + // child: Text(DateFormat('HH:mm-dd/MM').format(date)), ), ); } @@ -82,17 +112,17 @@ class CustomMultiLineChart extends StatelessWidget { maxX: maxX, minY: minY, maxY: maxY, - borderData: FlBorderData(show: true), + borderData: FlBorderData(show: false), gridData: FlGridData( show: true, - drawVerticalLine: true, + drawVerticalLine: false, drawHorizontalLine: true, - getDrawingHorizontalLine: (value) { - return FlLine(strokeWidth: 1, color: Colors.grey); - }, - getDrawingVerticalLine: (value) { - return FlLine(strokeWidth: 1, color: Colors.grey); - }, + // getDrawingHorizontalLine: (value) { + // return FlLine(strokeWidth: 1, color: Colors.grey); + // }, + // getDrawingVerticalLine: (value) { + // return FlLine(strokeWidth: 1, color: Colors.grey); + // }, ), ), ), diff --git a/lib/src/shared/display/custome_filter_chart.dart b/lib/src/shared/display/custome_filter_chart.dart index d3793f4d..c7d2368a 100644 --- a/lib/src/shared/display/custome_filter_chart.dart +++ b/lib/src/shared/display/custome_filter_chart.dart @@ -125,9 +125,9 @@ class CustomFilterLineChart extends StatelessWidget { show: true, drawVerticalLine: false, drawHorizontalLine: true, - getDrawingHorizontalLine: (value) { - return const FlLine(strokeWidth: 1, color: Colors.grey); - }, + // getDrawingHorizontalLine: (value) { + // return const FlLine(strokeWidth: 1, color: Colors.grey); + // }, ), ), ), From 12d01db87d01b44a9c59990f27d90782085dfb2c Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 23 Oct 2024 10:36:19 +0300 Subject: [PATCH 106/140] :construction: refactor custom App Bar --- .../presentation/pages/BloodSugarScreen.dart | 4 +- .../presentation/pages/bpMonitorScreen.dart | 7 +- lib/src/shared/display/CustomAppBar.dart | 121 ++++++++++++------ 3 files changed, 87 insertions(+), 45 deletions(-) diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart index fda5fa9b..f0886710 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -67,8 +67,10 @@ class _BloodSugarScreenState extends ConsumerState { body: Column( children: [ const CustomAppBar( - title: "Blood Sugar", + smallTitle: "Blood Sugar", + height: 120, color: Constants.selfScreeningBgColor, + rightBtTitle: "Add Data", ), Expanded( child: SingleChildScrollView( diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index e65181a1..b7cb67f0 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -205,8 +205,11 @@ class _BPMonitorScreenState extends ConsumerState { body: Column( children: [ const CustomAppBar( - title: "Blood Pressure", + // title: "Blood Pressure", color: Constants.selfScreeningBgColor, + height: 120, + smallTitle: "Blood Pressure", + rightBtTitle: "Add Data", ), Expanded( child: SingleChildScrollView( @@ -274,7 +277,7 @@ class _BPMonitorScreenState extends ConsumerState { style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), ), subtitle: Text( - "Blood Pressure, is the force of blood pushing against the walls of your blood vessels (arteries) as it is pumped by the heart1. It's measured in millimeters of mercury (mmHg) and recorded with two numbers: systolic (the pressure when your heart beats) and diastolic (the pressure when your heart rests between beats)", + "Blood pressure is the force of your blood pushing against the walls of your arteries as your heart pumps it around your body. It’s measured with two numbers: the first (systolic) is the pressure when your heart beats, and the second (diastolic) is the pressure when your heart rests between beats. For most people, a normal reading is around 120/80. Keeping your blood pressure in a healthy range is important because high or low blood pressure can lead to health problems. Regular checks can help you stay on top of it.", style: theme.textTheme.bodyMedium, ), ), diff --git a/lib/src/shared/display/CustomAppBar.dart b/lib/src/shared/display/CustomAppBar.dart index bff68d9b..869d8bfa 100644 --- a/lib/src/shared/display/CustomAppBar.dart +++ b/lib/src/shared/display/CustomAppBar.dart @@ -1,41 +1,46 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; import '../../utils/helpers.dart'; class CustomAppBar extends StatelessWidget { - final String title; + final String? title; final String? subTitle; final IconData? icon; final Color? color; final Widget? bottom; + final double? height; + final String? smallTitle; + final String? rightBtTitle; - const CustomAppBar( - {super.key, - required this.title, - this.subTitle, - this.icon, - this.bottom, - this.color}); + const CustomAppBar({ + super.key, + this.title, + this.subTitle, + this.icon, + this.bottom, + this.color, + this.height, + this.smallTitle, + this.rightBtTitle, + }); @override Widget build(BuildContext context) { final theme = Theme.of(context); return Container( + height: height, + width: double.infinity, // Use double.infinity for responsive width padding: const EdgeInsets.symmetric( - horizontal: Constants.SPACING, vertical: Constants.SPACING * 3), + horizontal: Constants.SPACING, + vertical: Constants.SPACING * 3, + ), decoration: BoxDecoration( color: color ?? theme.colorScheme.primary, - // gradient: LinearGradient( - // begin: Alignment.topLeft, - // end: Alignment.bottomRight, - // colors: [ - // color ?? theme.colorScheme.primary, - // theme.colorScheme.onSurface - // ]), borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(Constants.SPACING), bottomRight: Radius.circular(Constants.SPACING), @@ -50,39 +55,71 @@ class CustomAppBar extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: Constants.SPACING), - InkWell( - child: SvgPicture.asset( - "assets/images/reply.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: 40, - height: 40, - ), - onTap: () => context.pop(), - ), Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - title, - style: theme.textTheme.headlineMedium - ?.copyWith(color: Colors.white), - ), - const SizedBox(width: Constants.SPACING), - Icon( - icon, - color: theme.canvasColor, - ) - ], + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + child: SvgPicture.asset( + "assets/images/reply.svg", + semanticsLabel: "Back", + fit: BoxFit.contain, + width: 25, + height: 25, + ), + onTap: () => context.pop(), + ), + if (smallTitle != null) + Text( + smallTitle ?? '', + style: theme.textTheme.titleMedium?.copyWith(color: Colors.white), + ), + if (rightBtTitle != null) + TextButton( + onPressed: (){ + + }, + child: Text(rightBtTitle??'', style: theme.textTheme.titleSmall!.copyWith(color: Constants.bgColor),) + // Container( + // height: 10, + // width: 150, + // child: Button( + // backgroundColor: color, + // textColor: Constants.bgColor, + // title: rightBtTitle ?? '', + // onPress: () { + // // Add your onPress logic here + // }, + // ), + ) + ], ), - if (subTitle != null) const SizedBox(height: Constants.SPACING * 2), + if (title != null) + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: Constants.SPACING), + Text( + title ?? '', + style: theme.textTheme.headlineMedium?.copyWith(color: Colors.white), + ), + const SizedBox(width: Constants.SPACING), + if (icon != null) + Icon( + icon, + color: theme.canvasColor, + ), + ], + ), + if (subTitle != null) + const SizedBox(height: Constants.SPACING * 2), if (subTitle != null) Text( subTitle!, style: theme.textTheme.titleLarge?.copyWith(color: Colors.white), ), - if (bottom != null) const SizedBox(height: Constants.SPACING * 2), - if (bottom != null) bottom! + // if (bottom != null) + // const SizedBox(height: Constants.SPACING * 2), + // bottom!, ], ), ); From 451c21531989011d91700123d3402656f439fc8b Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 23 Oct 2024 12:05:15 +0300 Subject: [PATCH 107/140] refacor blood pressure records --- assets/images/emptyself_screening.svg | 62 ++++++++ lib/src/app/navigation/app_router.dart | 9 ++ .../presentation/pages/BPLinelistScreen.dart | 133 ++++++++++++------ .../presentation/pages/bpMonitorScreen.dart | 2 +- lib/src/utils/routes.dart | 1 + 5 files changed, 161 insertions(+), 46 deletions(-) create mode 100644 assets/images/emptyself_screening.svg diff --git a/assets/images/emptyself_screening.svg b/assets/images/emptyself_screening.svg new file mode 100644 index 00000000..e5bbe42a --- /dev/null +++ b/assets/images/emptyself_screening.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index daa59bbe..1c4565bd 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -23,6 +23,7 @@ import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pa import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMIHistoryScreen.dart'; +import 'package:nishauri/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart'; import 'package:nishauri/src/features/chatbot/presentations/ChatScreen.dart'; import 'package:nishauri/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart'; @@ -493,6 +494,14 @@ final List selfScreeningRoutes = [ ) ] ), + GoRoute( + name: RouteNames.BLOOD_PRESSURE_RECORDS, + path: 'blood-pressure-records', + builder: (context, state) { + dynamic extras = state.extra; + return BloodPressureRecords(data: extras); + }, + ), ] ), GoRoute( diff --git a/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart index 39c9c654..786b811d 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart @@ -1,62 +1,105 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:intl/intl.dart'; import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; -class BPLinelistScreen extends StatelessWidget { +class BloodPressureRecords extends StatelessWidget { final List data; - const BPLinelistScreen({ + + const BloodPressureRecords({ required this.data, Key? key, }) : super(key: key); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + if (data.isEmpty) + { + BackgroundImageWidget( + customAppBar: const CustomAppBar( + color: Constants.selfScreeningBgColor, + height: 120, + smallTitle: "All Record Data", + rightBtTitle: "", + ), svgImage: 'assets/images/emptyself_screening.svg', + notFoundText: 'No Data Recorded Yet', + ); + } - return ListView.builder( - itemCount: data.length + 1, - itemBuilder: (context, index) { - if (index == 0) { - // Header row - return Card( - margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text('Systolic', style: TextStyle(fontWeight: FontWeight.bold)), - Text('Diastolic', style: TextStyle(fontWeight: FontWeight.bold)), - Text('Pulse Rate', style: TextStyle(fontWeight: FontWeight.bold)), - ], - ), - ), - ); - } else { - final bp = data[index - 1]; - return Card( - margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), - child: ExpansionTile( - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text(bp.systolic.toString(), style: TextStyle(color: Colors.red)), - Text(bp.diastolic.toString(), style: TextStyle(color: Colors.orange)), - Text(bp.pulse_rate.toString(), style: TextStyle(color: Constants.programsColor)), - ], + return Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const CustomAppBar( + color: Constants.selfScreeningBgColor, + height: 120, + smallTitle: "All Record Data", + rightBtTitle: "Edit", + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "MMGH", + style: theme.textTheme.titleMedium?.copyWith(color: Colors.grey), ), - children: [ - ListTile( - title: Text('Time: ${DateFormat('HH:mm - dd-MM-yy').format(DateTime.parse(bp.created_at.toString()))}'), - subtitle: bp.notes != null && bp.notes!.isNotEmpty - ? Text('Notes: ${bp.notes}') - : null, + Expanded( + child: Container( + color: Constants.bgColor, + child: ListView.builder( + itemCount: data.length, + itemBuilder: (context, index) { + final bp = data[index]; + return Column( + children: [ + ListTile( + leading: SvgPicture.asset( + "assets/images/boldDuotoneLikeHearts.svg", + width: 20, + height: 20, + ), + title: ExpansionTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "${bp.systolic}/${bp.diastolic}", + style: theme.textTheme.titleMedium, + ), + Text( + DateFormat('dd MMM yy HH:mm').format(DateTime.parse(bp.created_at.toString()),), style: theme.textTheme.bodyMedium!.copyWith(color: Colors.grey), + ), + ], + ), + children: [ + ListTile( + title: bp.notes != null && bp.notes!.isNotEmpty + ? Text('Notes: ${bp.notes}') + : null, + ), + ], + ), + ), + const Divider(), // Add the Divider here + ], + ); + }, + ), ), - ], - ), - ); - } - }, - ); + ), + ], + ), + ), + ), + ], + ), + ); } } diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index b7cb67f0..f9911d11 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -257,7 +257,7 @@ class _BPMonitorScreenState extends ConsumerState { title: Text("Show All Data", style: theme.textTheme.titleSmall!.copyWith(fontWeight: FontWeight.bold),), trailing: const Icon(Icons.arrow_forward_ios_outlined), onTap: (){ - // implementing on tap method + context.goNamed(RouteNames.BLOOD_PRESSURE_RECORDS, extra: data); }, ), ), diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 06f5a952..848172b1 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -83,6 +83,7 @@ class RouteNames { static const BLOOD_SUGAR_POSTS = 'blood-sugar-posts'; static const BLOOD_PRESSURE_INSIGHT = 'blood-pressure-insight'; static const BLOOD_PRESSURE_POSTS = 'blood-pressure-posts'; + static const BLOOD_PRESSURE_RECORDS = 'blood-pressure-records'; } class MenuItemNames { From 55bb9417afbba2ef6229967b2518e517ea6eb81a Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 23 Oct 2024 15:42:22 +0300 Subject: [PATCH 108/140] :construction: add blood sugar records --- lib/src/app/navigation/app_router.dart | 9 ++ .../presentation/pages/BloodSugarScreen.dart | 2 +- .../pages/bs_line_list_Screen.dart | 121 ++++++++++++++++++ lib/src/utils/routes.dart | 1 + 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 1c4565bd..3c2ef222 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -23,6 +23,7 @@ import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pa import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMIHistoryScreen.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart'; import 'package:nishauri/src/features/chatbot/presentations/ChatScreen.dart'; @@ -528,6 +529,14 @@ final List selfScreeningRoutes = [ ) ] ), + GoRoute( + name: RouteNames.BLOOD_SUGAR_RECORDS, + path: 'blood-sugar-records', + builder: (context, state) { + dynamic extras = state.extra; + return BloodSugarRecords(data: extras); + }, + ), ] ), //Routes for the Period Planner diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart index f0886710..5120b901 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -133,7 +133,7 @@ class _BloodSugarScreenState extends ConsumerState { title: Text("Show All Data", style: theme.textTheme.titleSmall!.copyWith(fontWeight: FontWeight.bold),), trailing: const Icon(Icons.arrow_forward_ios_outlined), onTap: (){ - // implementing on tap method + context.goNamed(RouteNames.BLOOD_SUGAR_RECORDS, extra: data); }, ), ), diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart new file mode 100644 index 00000000..25e9bfff --- /dev/null +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class BloodSugarRecords extends StatelessWidget { + final List data; + + const BloodSugarRecords({ + required this.data, + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + if (data.isEmpty) + { + BackgroundImageWidget( + customAppBar: const CustomAppBar( + color: Constants.selfScreeningBgColor, + height: 120, + smallTitle: "All Record Data", + rightBtTitle: "", + ), svgImage: 'assets/images/emptyself_screening.svg', + notFoundText: 'No Data Recorded Yet', + ); + } + + return Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const CustomAppBar( + color: Constants.selfScreeningBgColor, + height: 120, + smallTitle: "All Record Data", + rightBtTitle: "Edit", + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "MMOL/L", + style: theme.textTheme.titleMedium?.copyWith(color: Colors.grey), + ), + Expanded( + child: Container( + color: Constants.bgColor, + child: ListView.builder( + itemCount: data.length, + itemBuilder: (context, index) { + final bs = data[index]; + return Column( + children: [ + ListTile( + leading: SvgPicture.asset( + "assets/images/boldDuotoneMedicinePulse.svg", + width: 20, + height: 20, + ), + title: ExpansionTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + RichText( + text: TextSpan( + children: [ + TextSpan( + text: '${bs.level}', + style: theme.textTheme.titleMedium + ), + + TextSpan( + text: ' mmol/L', + style: theme.textTheme.titleSmall + ), + ] + ) + ), + // Text( + // "${bs.level}", + // style: theme.textTheme.titleMedium, + // ), + Text( + DateFormat('dd MMM yy HH:mm').format(DateTime.parse(bs.created_at.toString()),), style: theme.textTheme.bodyMedium!.copyWith(color: Colors.grey), + ), + ], + ), + children: [ + ListTile( + title: bs.condition != null && bs.condition!.isNotEmpty + ? Text('Condition: ${bs.condition}') + : null, + subtitle: bs.notes != null && bs.notes!.isNotEmpty ? Text('Notes: ${bs.notes}') : null, + ), + ], + ), + ), + const Divider(), // Add the Divider here + ], + ); + }, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 848172b1..c5d0b7b3 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -84,6 +84,7 @@ class RouteNames { static const BLOOD_PRESSURE_INSIGHT = 'blood-pressure-insight'; static const BLOOD_PRESSURE_POSTS = 'blood-pressure-posts'; static const BLOOD_PRESSURE_RECORDS = 'blood-pressure-records'; + static const BLOOD_SUGAR_RECORDS = 'blood-sugar-records'; } class MenuItemNames { From b48a5e21d3dfeb74c2dced935fbf11bff2daecfb Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 24 Oct 2024 16:05:13 +0300 Subject: [PATCH 109/140] :constaruction: Add bp input form --- assets/images/selfscreeningImage.svg | 4 + lib/src/app/navigation/app_router.dart | 8 + lib/src/app/navigation/menu/menuItems.dart | 4 +- .../presentation/pages/bpMonitorScreen.dart | 1 + .../presentation/pages/bp_input_screen.dart | 212 ++++++++++++++++++ lib/src/shared/display/CustomAppBar.dart | 4 +- lib/src/utils/constants.dart | 1 + lib/src/utils/routes.dart | 1 + 8 files changed, 232 insertions(+), 3 deletions(-) create mode 100644 assets/images/selfscreeningImage.svg create mode 100644 lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart diff --git a/assets/images/selfscreeningImage.svg b/assets/images/selfscreeningImage.svg new file mode 100644 index 00000000..6ed2cf33 --- /dev/null +++ b/assets/images/selfscreeningImage.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 3c2ef222..18e15ce5 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -68,6 +68,7 @@ import 'package:nishauri/src/features/provider/dawa_drop_management/presentation import 'package:nishauri/src/features/provider/presentation/pages/provider_main_Screen.dart'; import 'package:nishauri/src/features/provider/provider_registry/presentaion/pages/location_selection_screen.dart'; import 'package:nishauri/src/features/provider/provider_registry/presentaion/pages/provider_details.dart'; +import 'package:nishauri/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/blood_pressure_posts.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/blood_sugar_posts.dart'; import 'package:nishauri/src/features/self_screening/presentation/pages/bpInsightScreen.dart'; @@ -503,6 +504,13 @@ final List selfScreeningRoutes = [ return BloodPressureRecords(data: extras); }, ), + GoRoute( + name: RouteNames.BLOOD_PRESSURE_INPUT, + path: 'blood-pressure-input', + builder: (context, state) { + return BloodPressureInputs(); + }, + ), ] ), GoRoute( diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 530a25dc..002dbfe1 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -260,14 +260,14 @@ List getPatientModules(BuildContext context) { MenuItem( shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, icon: SvgPicture.asset( - "assets/images/healthcare-medical.svg", + "assets/images/selfscreeningImage.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, height: 80, width: 80, ), shortcutIcon: SvgPicture.asset( - "assets/images/healthcare-medical.svg", + "assets/images/selfscreeningImage.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, width: Constants.shortcutIconSize, diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index f9911d11..2e6d27bd 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -210,6 +210,7 @@ class _BPMonitorScreenState extends ConsumerState { height: 120, smallTitle: "Blood Pressure", rightBtTitle: "Add Data", + path: RouteNames.BLOOD_PRESSURE_INPUT, ), Expanded( child: SingleChildScrollView( diff --git a/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart b/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart new file mode 100644 index 00000000..846a4c48 --- /dev/null +++ b/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart @@ -0,0 +1,212 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class BloodPressureInputs extends StatefulWidget { + @override + _BloodPressureInputsState createState() => _BloodPressureInputsState(); +} + +class _BloodPressureInputsState extends State { + final TextEditingController _dateController = TextEditingController(); + final TextEditingController _timeController = TextEditingController(); + final TextEditingController _systolicController = TextEditingController(text: '120'); + final TextEditingController _diastolicController = TextEditingController(text: '80'); + + @override + void initState() { + super.initState(); + final now = DateTime.now(); + _dateController.text = DateFormat('dd MMM yyyy').format(now); + _timeController.text = "${TimeOfDay.now().hour}:${TimeOfDay.now().minute.toString().padLeft(2, '0')}"; + } + + Future _selectDate(BuildContext context) async { + final DateTime? picked = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2000), + lastDate: DateTime.now(), + ); + if (picked != null) { + setState(() { + _dateController.text = DateFormat('dd MMM yyyy').format(picked); + }); + } + } + + Future _selectTime(BuildContext context) async { + final TimeOfDay? picked = await showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ); + if (picked != null) { + setState(() { + _timeController.text = '${picked.hour}:${picked.minute.toString().padLeft(2, '0')}'; + }); + } + } + + void _saveData() { + final systolic = int.tryParse(_systolicController.text); + final diastolic = int.tryParse(_diastolicController.text); + if (systolic != null && diastolic != null && systolic > 0 && diastolic > 0) { + if (systolic > 140 || diastolic > 90) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Warning: High blood pressure detected!'), + backgroundColor: Colors.red, + ), + ); + } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Data saved: $systolic/$diastolic on ${_dateController.text} at ${_timeController.text}'), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Please enter valid blood pressure readings.')), + ); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.selfScreeningBgColor, + height: 120, + smallTitle: "Blood Pressure Input", + rightBtTitle: "Add Data", + ), + Padding( + padding: const EdgeInsets.all(16.0), + // main container + child: Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.bgColor, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: Constants.bgColor), + ), + child: Column( + children: [ + const SizedBox(height: Constants.SPACING), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Date:", style: theme.textTheme.bodyLarge,), + GestureDetector( + onTap: () => _selectDate(context), + child: AbsorbPointer( + child: Container( + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + padding: const EdgeInsets.all(Constants.SPACING), + width: 150, + height: 40, + child: TextField( + controller: _dateController, + decoration: null, + ), + ), + ), + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Time:", style: theme.textTheme.bodyLarge), + GestureDetector( + onTap: () => _selectTime(context), // Updated to call _selectTime + child: AbsorbPointer( + child: Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: 150, + height: 40, + child: TextField( + controller: _timeController, + decoration: null, + ), + ), + ), + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Systolic:", style: theme.textTheme.bodyLarge), + Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: 150, + height: 40, + child: TextField( + controller: _systolicController, + keyboardType: TextInputType.number, + decoration: null, + ), + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Diastolic", style: theme.textTheme.bodyLarge,), + Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: 150, + height: 40, + child: TextField( + controller: _diastolicController, + keyboardType: TextInputType.number, + decoration: null, + ), + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + ElevatedButton( + onPressed: _saveData, + child: Text('Save Data', style: TextStyle(color: Constants.selfScreeningBgColor),), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/shared/display/CustomAppBar.dart b/lib/src/shared/display/CustomAppBar.dart index 869d8bfa..e7d5a3cf 100644 --- a/lib/src/shared/display/CustomAppBar.dart +++ b/lib/src/shared/display/CustomAppBar.dart @@ -15,6 +15,7 @@ class CustomAppBar extends StatelessWidget { final double? height; final String? smallTitle; final String? rightBtTitle; + final String? path; const CustomAppBar({ super.key, @@ -26,6 +27,7 @@ class CustomAppBar extends StatelessWidget { this.height, this.smallTitle, this.rightBtTitle, + this.path }); @override @@ -76,7 +78,7 @@ class CustomAppBar extends StatelessWidget { if (rightBtTitle != null) TextButton( onPressed: (){ - + context.goNamed(path??''); }, child: Text(rightBtTitle??'', style: theme.textTheme.titleSmall!.copyWith(color: Constants.bgColor),) // Container( diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index 391be8b3..45558b57 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -49,4 +49,5 @@ class Constants { static const selfScreeningBgColor = Color.fromARGB(255, 151, 57, 54); static const bgColor = Color.fromARGB(255, 245, 245, 245); static const barColor = Color.fromARGB(255, 4, 191, 218); + static const white = Color.fromARGB(255, 255, 255, 255); } diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index c5d0b7b3..6231cfd2 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -85,6 +85,7 @@ class RouteNames { static const BLOOD_PRESSURE_POSTS = 'blood-pressure-posts'; static const BLOOD_PRESSURE_RECORDS = 'blood-pressure-records'; static const BLOOD_SUGAR_RECORDS = 'blood-sugar-records'; + static const BLOOD_PRESSURE_INPUT= 'blood-pressure-input'; } class MenuItemNames { From b5e87cededa9a10852540383df703578df52aa81 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 24 Oct 2024 17:40:08 +0300 Subject: [PATCH 110/140] add notes controller --- .../presentation/pages/bp_input_screen.dart | 96 ++++++++++++++++++- 1 file changed, 91 insertions(+), 5 deletions(-) diff --git a/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart b/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart index 846a4c48..9fdd4a14 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart @@ -1,16 +1,20 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/utils/constants.dart'; -class BloodPressureInputs extends StatefulWidget { +class BloodPressureInputs extends ConsumerStatefulWidget { @override _BloodPressureInputsState createState() => _BloodPressureInputsState(); } -class _BloodPressureInputsState extends State { +class _BloodPressureInputsState extends ConsumerState { final TextEditingController _dateController = TextEditingController(); final TextEditingController _timeController = TextEditingController(); + final TextEditingController _notesController = TextEditingController(); final TextEditingController _systolicController = TextEditingController(text: '120'); final TextEditingController _diastolicController = TextEditingController(text: '80'); @@ -48,9 +52,40 @@ class _BloodPressureInputsState extends State { } } + void _reloadData() { + ref.refresh(bloodPressureListProvider); + } + + void _submitData(double systolic, double diastolic, double? pulseRate){ + final String notes = _notesController.text; + final DateTime measurementTime = DateTime.now(); + final bp = BloodPressure( + systolic: systolic, + diastolic: diastolic, + pulse_rate: pulseRate!, + created_at: measurementTime, + notes: notes, + ); + + ref.read(bloodPressureRepositoryProvider).saveBloodPressure(bp).then((value) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(value)), + ); + _reloadData(); + // _clearForm(systolic, diastolic, heartRate, notesController); + Navigator.of(context).pop(); + }).catchError((error) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(error)), + ); + }); + } + void _saveData() { - final systolic = int.tryParse(_systolicController.text); - final diastolic = int.tryParse(_diastolicController.text); + final systolic = double.parse(_systolicController.text); + final diastolic = double.parse(_diastolicController.text); + final pulseRate = double.parse(_diastolicController.text); + _submitData(systolic, diastolic, pulseRate); if (systolic != null && diastolic != null && systolic > 0 && diastolic > 0) { if (systolic > 140 || diastolic > 90) { ScaffoldMessenger.of(context).showSnackBar( @@ -60,6 +95,14 @@ class _BloodPressureInputsState extends State { ), ); } + else if (systolic < 90 || diastolic < 60){ + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Warning: Low blood pressure detected!'), + backgroundColor: Colors.red, + ), + ); + } ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Data saved: $systolic/$diastolic on ${_dateController.text} at ${_timeController.text}'), @@ -129,7 +172,7 @@ class _BloodPressureInputsState extends State { children: [ Text("Time:", style: theme.textTheme.bodyLarge), GestureDetector( - onTap: () => _selectTime(context), // Updated to call _selectTime + onTap: () => _selectTime(context), child: AbsorbPointer( child: Container( padding: const EdgeInsets.all(Constants.SPACING), @@ -188,6 +231,7 @@ class _BloodPressureInputsState extends State { width: 150, height: 40, child: TextField( + controller: _diastolicController, keyboardType: TextInputType.number, decoration: null, @@ -195,6 +239,48 @@ class _BloodPressureInputsState extends State { ), ], ), + + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.start, + + children: [ + Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: MediaQuery.of(context).size.width *0.9, + child: TextFormField( + style: theme.textTheme.bodyMedium!.copyWith(decoration: null), + controller: _notesController, + decoration: InputDecoration( + labelText: "Notes", + border: const OutlineInputBorder( + gapPadding: 5, + borderRadius: BorderRadius.all(Radius.circular(15)), + borderSide: BorderSide(color: Constants.bgColor), + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Constants.bgColor), + borderRadius: BorderRadius.all(Radius.circular(15)), + ), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Constants.bgColor), + borderRadius: BorderRadius.all(Radius.circular(15)), + ), + labelStyle: TextStyle(color: Constants.selfScreeningBgColor), + ), + keyboardType: TextInputType.text, + maxLines: null, + ), + + ), + ], + ), const SizedBox(height: Constants.SPACING), const Divider(), ElevatedButton( From f12b6b3535d82a91a149b140b8a7279471d43621 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 24 Oct 2024 23:03:00 +0300 Subject: [PATCH 111/140] :construction: add input form for blood sugar --- lib/src/app/navigation/app_router.dart | 8 + .../presentation/pages/BloodSugarScreen.dart | 13 +- .../presentation/pages/bs_input_screen.dart | 372 ++++++++++++++++++ .../presentation/pages/bp_input_screen.dart | 12 +- lib/src/utils/routes.dart | 1 + 5 files changed, 394 insertions(+), 12 deletions(-) create mode 100644 lib/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 18e15ce5..c2c23a75 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -23,6 +23,7 @@ import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pa import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMIHistoryScreen.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart'; @@ -545,6 +546,13 @@ final List selfScreeningRoutes = [ return BloodSugarRecords(data: extras); }, ), + GoRoute( + name: RouteNames.BLOOD_SUGAR_INPUT, + path: 'blood-sugar-input', + builder: (context, state) { + return BloodSugarInputs(); + }, + ), ] ), //Routes for the Period Planner diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart index 5120b901..c1dff694 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -71,6 +71,7 @@ class _BloodSugarScreenState extends ConsumerState { height: 120, color: Constants.selfScreeningBgColor, rightBtTitle: "Add Data", + path: RouteNames.BLOOD_SUGAR_INPUT, ), Expanded( child: SingleChildScrollView( @@ -90,10 +91,10 @@ class _BloodSugarScreenState extends ConsumerState { ), ], ), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Text("18 Oct 2024", style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Row( children: [ Text("4.1", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), @@ -101,7 +102,7 @@ class _BloodSugarScreenState extends ConsumerState { Text("mmol/L", style: theme.textTheme.bodyMedium), ], ), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Wrap( spacing: 1, runSpacing: 16, @@ -126,7 +127,7 @@ class _BloodSugarScreenState extends ConsumerState { ), ], ), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Card( color: Constants.bgColor, child: ListTile( @@ -137,7 +138,7 @@ class _BloodSugarScreenState extends ConsumerState { }, ), ), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Container( color: Constants.bgColor, height: 250, @@ -162,7 +163,7 @@ class _BloodSugarScreenState extends ConsumerState { ), ), ), - SizedBox(height: Constants.SPACING), + const SizedBox(height: Constants.SPACING), Button( title: "More Insight", onPress: (){ diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart new file mode 100644 index 00000000..658c6d65 --- /dev/null +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart @@ -0,0 +1,372 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class BloodSugarInputs extends ConsumerStatefulWidget { + const BloodSugarInputs({super.key}); + + @override + _BloodSugarInputsState createState() => _BloodSugarInputsState(); +} + +class _BloodSugarInputsState extends ConsumerState { + final TextEditingController _dateController = TextEditingController(); + final TextEditingController _timeController = TextEditingController(); + final TextEditingController _notesController = TextEditingController(); + final TextEditingController _bloodGlucoseController = TextEditingController(text: "100"); + final TextEditingController _conditionController = TextEditingController(); + + final List _dropdownOptions = [ + 'Fasting (before meals)', + 'Postprandial (after meals)' + ]; + String _selectedCondition = "Fasting (before meals)"; + + @override + void initState() { + super.initState(); + final now = DateTime.now(); + _dateController.text = DateFormat('dd MMM yyyy').format(now); + _timeController.text = "${TimeOfDay.now().hour}:${TimeOfDay.now().minute.toString().padLeft(2, '0')}"; + _conditionController.text = _selectedCondition; + } + + Future _selectDate(BuildContext context) async { + final DateTime? picked = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2000), + lastDate: DateTime.now(), + ); + if (picked != null) { + setState(() { + _dateController.text = DateFormat('dd MMM yyyy').format(picked); + }); + } + } + + Future _selectTime(BuildContext context) async { + final TimeOfDay? picked = await showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ); + if (picked != null) { + setState(() { + _timeController.text = '${picked.hour}:${picked.minute.toString().padLeft(2, '0')}'; + }); + } + } + + void _reloadData() { + ref.refresh(bloodSugarProvider); + } + + void _submitData(double level){ + final String notes = _notesController.text; + final condition = _conditionController.text; + final DateTime measurementTime = DateTime.now(); + final bs = BloodSugar( + level: level, + condition: condition??'', + created_at: measurementTime, + notes: notes, + ); + + ref.read(bloodSugarProvider).saveBloodSugar(bs).then((value) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(value)), + ); + _reloadData(); + // _clearForm(systolic, diastolic, heartRate, notesController); + Navigator.of(context).pop(); + }).catchError((error) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(error)), + ); + }); + } + + void _saveData() { + final level = double.tryParse(_bloodGlucoseController.text); + final condition = _conditionController.text; + + if (level != null && level > 0) { + _submitData(level); + + bool isHigh = false; + bool isLow = false; + + if (condition == "Fasting (before meals)") { + if (level > 100) { + isHigh = true; + } else if (level < 70) { + isLow = true; + } + } else if (condition == "Postprandial (after meals)") { + if (level > 140) { + isHigh = true; + } else if (level < 90) { + isLow = true; + } + } + if (isHigh) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Warning: High blood sugar detected!'), + backgroundColor: Colors.red, + ), + ); + } else if (isLow) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Warning: Low blood sugar detected!'), + backgroundColor: Colors.red, + ), + ); + } + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Data saved: $level mg/dL with condition ${_conditionController.text} on ${_dateController.text} at ${_timeController.text}'), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please enter valid blood sugar readings.')), + ); + } + } + + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.selfScreeningBgColor, + height: 120, + smallTitle: "Blood Pressure Input", + rightBtTitle: "Add Data", + ), + Padding( + padding: const EdgeInsets.all(16.0), + // main container + child: Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.bgColor, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: Constants.bgColor), + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + width: MediaQuery.of(context).size.width *0.9, + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(1), + border: Border.all(color: Constants.bgColor), + ), + child: Text("mg/dL", style: theme.textTheme.bodyLarge,), + ), + ], + ), + const Divider(), + const SizedBox(height: Constants.SPACING), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Date:", style: theme.textTheme.bodyLarge,), + GestureDetector( + onTap: () => _selectDate(context), + child: AbsorbPointer( + child: Container( + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + padding: const EdgeInsets.all(Constants.SPACING), + width: 270, + height: 40, + child: TextField( + controller: _dateController, + decoration: null, + ), + ), + ), + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Time:", style: theme.textTheme.bodyLarge), + GestureDetector( + onTap: () => _selectTime(context), + child: AbsorbPointer( + child: Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: 270, + height: 40, + child: TextField( + controller: _timeController, + decoration: null, + ), + ), + ), + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Blood Sugar Level", style: theme.textTheme.bodyLarge), + Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: 270, + height: 40, + child: TextField( + controller: _bloodGlucoseController, + keyboardType: TextInputType.number, + decoration: null, + ), + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Meal Time", style: theme.textTheme.bodyLarge,), + Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: 270, + height: 60, + child: TextField( + controller: _conditionController, + readOnly: true, + style: theme.textTheme.bodyMedium!.copyWith(decoration: null), + decoration: InputDecoration( + border: const OutlineInputBorder( + gapPadding: 4, + borderRadius: BorderRadius.all(Radius.circular(15)), + borderSide: BorderSide(color: Constants.white), + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Constants.white), + // borderRadius: BorderRadius.all(Radius.circular(15)), + ), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Constants.white), + borderRadius: BorderRadius.all(Radius.circular(15)), + ), + suffixIcon: PopupMenuButton( + icon: const Icon(Icons.arrow_drop_down), + onSelected: (String value) { + _conditionController.text = value; + setState(() { + _selectedCondition = value; + }); + }, + itemBuilder: (BuildContext context) { + return _dropdownOptions.map>((String value) { + return PopupMenuItem( + value: value, + child: Text(value), + ); + }).toList(); + }, + ), + // FormBuilderDropdown( + ), + ), + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.start, + + children: [ + Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: MediaQuery.of(context).size.width *0.9, + child: TextFormField( + style: theme.textTheme.bodyMedium!.copyWith(decoration: null), + controller: _notesController, + decoration: const InputDecoration( + labelText: "Notes (optional)", + border: OutlineInputBorder( + gapPadding: 5, + borderRadius: BorderRadius.all(Radius.circular(15)), + borderSide: BorderSide(color: Constants.bgColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Constants.bgColor), + borderRadius: BorderRadius.all(Radius.circular(15)), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Constants.bgColor), + borderRadius: BorderRadius.all(Radius.circular(15)), + ), + labelStyle: TextStyle(color: Constants.selfScreeningBgColor), + ), + keyboardType: TextInputType.text, + maxLines: null, + ), + + ), + ], + ), + const SizedBox(height: Constants.SPACING), + const Divider(), + ElevatedButton( + onPressed: _saveData, + child: const Text('Save Data', style: TextStyle(color: Constants.selfScreeningBgColor),), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart b/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart index 9fdd4a14..ba713d7c 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart @@ -257,18 +257,18 @@ class _BloodPressureInputsState extends ConsumerState { child: TextFormField( style: theme.textTheme.bodyMedium!.copyWith(decoration: null), controller: _notesController, - decoration: InputDecoration( - labelText: "Notes", - border: const OutlineInputBorder( + decoration: const InputDecoration( + labelText: "Notes Optional", + border: OutlineInputBorder( gapPadding: 5, borderRadius: BorderRadius.all(Radius.circular(15)), borderSide: BorderSide(color: Constants.bgColor), ), - enabledBorder: const OutlineInputBorder( + enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: Constants.bgColor), borderRadius: BorderRadius.all(Radius.circular(15)), ), - focusedBorder: const OutlineInputBorder( + focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: Constants.bgColor), borderRadius: BorderRadius.all(Radius.circular(15)), ), @@ -285,7 +285,7 @@ class _BloodPressureInputsState extends ConsumerState { const Divider(), ElevatedButton( onPressed: _saveData, - child: Text('Save Data', style: TextStyle(color: Constants.selfScreeningBgColor),), + child: const Text('Save Data', style: TextStyle(color: Constants.selfScreeningBgColor),), ), ], ), diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 6231cfd2..716b1eff 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -86,6 +86,7 @@ class RouteNames { static const BLOOD_PRESSURE_RECORDS = 'blood-pressure-records'; static const BLOOD_SUGAR_RECORDS = 'blood-sugar-records'; static const BLOOD_PRESSURE_INPUT= 'blood-pressure-input'; + static const BLOOD_SUGAR_INPUT= 'blood-sugar-input'; } class MenuItemNames { From 4cac28a8262cb6d7a6131a040f3107180fb5861c Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 25 Oct 2024 09:14:25 +0300 Subject: [PATCH 112/140] Add condition to check current entries in bp and bs --- .../presentation/pages/bp_input_screen.dart | 26 +- .../pages/self_screening_menu.dart | 319 ++++++++---------- .../presentation/widgets/health_list.dart | 8 +- 3 files changed, 165 insertions(+), 188 deletions(-) diff --git a/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart b/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart index ba713d7c..617eca6a 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bp_input_screen.dart @@ -17,6 +17,7 @@ class _BloodPressureInputsState extends ConsumerState { final TextEditingController _notesController = TextEditingController(); final TextEditingController _systolicController = TextEditingController(text: '120'); final TextEditingController _diastolicController = TextEditingController(text: '80'); + final TextEditingController _pulseRateController = TextEditingController(text: '75'); @override void initState() { @@ -84,7 +85,7 @@ class _BloodPressureInputsState extends ConsumerState { void _saveData() { final systolic = double.parse(_systolicController.text); final diastolic = double.parse(_diastolicController.text); - final pulseRate = double.parse(_diastolicController.text); + final pulseRate = double.parse(_pulseRateController.text); _submitData(systolic, diastolic, pulseRate); if (systolic != null && diastolic != null && systolic > 0 && diastolic > 0) { if (systolic > 140 || diastolic > 90) { @@ -239,7 +240,30 @@ class _BloodPressureInputsState extends ConsumerState { ), ], ), + const SizedBox(height: Constants.SPACING), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Pulse Rate", style: theme.textTheme.bodyLarge,), + Container( + padding: const EdgeInsets.all(Constants.SPACING), + decoration: BoxDecoration( + color: Constants.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Constants.bgColor), + ), + width: 150, + height: 40, + child: TextField( + controller: _pulseRateController, + keyboardType: TextInputType.number, + decoration: null, + ), + ), + ], + ), const SizedBox(height: Constants.SPACING), const Divider(), Row( diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index fa2032e6..c6fe1ed3 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -4,7 +4,10 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; import 'package:nishauri/src/features/common/presentation/pages/chat_feeback_form.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/features/self_screening/presentation/widgets/health_card.dart'; import 'package:nishauri/src/features/self_screening/presentation/widgets/health_list.dart'; import 'package:nishauri/src/features/self_screening/presentation/widgets/image_card.dart'; @@ -21,97 +24,141 @@ class SelfScreening extends HookConsumerWidget { int _currIndex = 0; int _messagesCount = 0; + final bpAsync = ref.watch(bloodPressureListProvider); + + final currentBpEntries = bpAsync.when( + data: (data) { + // Sort the list by date in descending order + data.sort((a, b) => b.created_at.compareTo(a.created_at)); + // Return the most current object + return data.isNotEmpty ? data.first : null; + }, + error: (error, _) { + return null; + }, + loading: () { + return null; + }, + ); + + final bsAsync = ref.watch(bloodSugarEntriesProvider); + + final currentBsEntries = bsAsync.when( + data: (data) { + // Sort the list by date in descending order + data.sort((a, b) => b.created_at.compareTo(a.created_at)); + // Return the most current object + return data.isNotEmpty ? data.first : null; + }, + error: (error, _) { + return null; + }, + loading: () { + return null; + }, + ); + + // Create a list of items and remove "Blood Pressure" if currentBpEntries is not null + final List items = ["Blood Sugar", "Blood Pressure", "BMI", "Period Calendar"]; + final List paths = [RouteNames.BLOOD_PRESSURE, RouteNames.BLOOD_SUGAR,]; + if (currentBpEntries != null) { + items.remove("Blood Pressure"); + paths.remove(RouteNames.BLOOD_PRESSURE); + } + if (currentBsEntries != null) { + items.remove("Blood Sugar"); + paths.remove(RouteNames.BLOOD_SUGAR); + } + return Scaffold( body: Column( - children: [ - const CustomAppBar( - title: "Self Screening🌡", - subTitle: "Easily track your health. Stay informed and take control of well-being.", - color: Constants.selfScreeningBgColor, - ), - Expanded( - child: SingleChildScrollView( - child: Stack( - alignment: AlignmentDirectional.center, - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Cards showing health data - Wrap( - spacing: 5, - runSpacing: 16, - children: [ - HealthCard( - svgAsset: "assets/images/boldDuotoneLikeHearts.svg", - title: "Blood Pressure", - value1: "120", - text1: "mmHG", - vName1: "Systolic", - value2: "80", - text2: "mmHG", - vName2: "Diastolic", - value3: "73", - text3: "Pulse/Min", - vName3: "Pulse Rate", - onPressed: (){ - context.goNamed(RouteNames.BLOOD_PRESSURE); - }, - ), - HealthCard( - svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", - title: "Blood Sugar", - value1: "120", - text1: "mmHG", - value3: "73/Min", - vName3: "Pulse Rate", - onPressed: (){ - context.goNamed(RouteNames.BLOOD_SUGAR); - }, - ), - ], - ), - const SizedBox(height: 10), - ItemList(items: ["Blood Sugar", "Blood Pressure", "BMI", "Period Calendar"]), - const SizedBox(height: 20), - // Title for the next section - Text( - "About Self Screening", - style: theme.textTheme.headline6, - ), - const SizedBox(height: 10), - Wrap( - alignment: WrapAlignment.center, - spacing: 1, - runSpacing: 16, - children: [ - ImageCard(imagePath: 'assets/images/hospital_building.svg'), - ImageCard(imagePath: 'assets/images/hospital_building.svg'), - ], - ), - const SizedBox(height: 20), - // Title for the understanding health section - Text( - "Understanding Your Health", - style: theme.textTheme.headline6, - ), - const SizedBox(height: 10), - Text( - "Understanding your health metrics is crucial for maintaining a healthy lifestyle. " - "Stay informed about your numbers and consult your healthcare provider when needed.", - style: theme.textTheme.bodyText2, - ), - ], - ), + children: [ + const CustomAppBar( + title: "Self Screening", + subTitle: "Easily track your health. Stay informed and take control of well-being.", + color: Constants.selfScreeningBgColor, + ), + Expanded( + child: SingleChildScrollView( + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Cards showing health data + Wrap( + spacing: 5, + runSpacing: 16, + children: [ + currentBpEntries != null ? HealthCard( + svgAsset: "assets/images/boldDuotoneLikeHearts.svg", + title: "Blood Pressure", + value1: "${currentBpEntries.systolic}", + text1: "mmHG", + vName1: "Systolic", + value2: "${currentBpEntries.diastolic}", + text2: "mmHG", + vName2: "Diastolic", + value3: "${currentBpEntries.pulse_rate}", + text3: "Pulse/Min", + vName3: "Pulse Rate", + onPressed: () { + context.goNamed(RouteNames.BLOOD_PRESSURE); + }, + ) : SizedBox(), + HealthCard( + svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", + title: "Blood Sugar", + value1: "${currentBsEntries!.level}", + text1: "mmHG", + onPressed: () { + context.goNamed(RouteNames.BLOOD_SUGAR); + }, + ), + ], + ), + const SizedBox(height: 10), + ItemList(items: items, path: paths,), + const SizedBox(height: 20), + // Title for the next section + Text( + "About Self Screening", + style: theme.textTheme.titleMedium, + ), + const SizedBox(height: 10), + Wrap( + alignment: WrapAlignment.center, + spacing: 1, + runSpacing: 16, + children: [ + ImageCard(imagePath: 'assets/images/hospital_building.svg'), + ImageCard(imagePath: 'assets/images/hospital_building.svg'), + ], + ), + const SizedBox(height: 20), + // Title for the understanding health section + Text( + "Understanding Your Health", + style: theme.textTheme.titleMedium, + ), + const SizedBox(height: 10), + Text( + "Understanding your health metrics is crucial for maintaining a healthy lifestyle. " + "Stay informed about your numbers and consult your healthcare provider when needed.", + style: theme.textTheme.bodyMedium, + ), + ], ), - ], - ), - ) - ), - ], - ), + ), + ], + ), + ) + ), + ], + ), bottomNavigationBar: BottomNavigationBar( elevation: 0, selectedItemColor: theme.colorScheme.primary, @@ -169,99 +216,3 @@ class SelfScreening extends HookConsumerWidget { ); } } - - -// List _menuItems(BuildContext context, WidgetRef ref) => [ -// MenuItem( -// icon: const Icon(Icons.calculate), -// shortcutIcon: const Icon(Icons.calculate), -// color: Constants.bmiCalculatorShortcutBgColor, -// shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, -// title: "BMI Calculator", -// onPressed: () => context.goNamed(RouteNames.BMI_CALCULATOR), -// ), -// MenuItem( -// icon: const Icon(Icons.trending_up), -// shortcutIcon: const Icon(Icons.trending_up), -// color: Constants.bpShortCutBgColor, -// shortcutBackgroundColor: Constants.bpShortCutBgColor, -// title: "B P Monitor", -// onPressed: () => context.goNamed(RouteNames.BLOOD_PRESSURE), -// ), -// MenuItem( -// shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, -// icon: const Icon(Icons.sanitizer), -// shortcutIcon: const Icon(Icons.sanitizer), -// title: MenuItemNames.BLOOD_SUGAR, -// onPressed: () => context.goNamed(MenuItemNames.BLOOD_SUGAR), -// color: Constants.bloodSugarColor.withOpacity(0.5), -// ), -// MenuItem( -// shortcutBackgroundColor: Constants.periodPlannerShortcutBgColor, -// icon: const Icon(Icons.calendar_month_outlined), -// shortcutIcon: const Icon(Icons.calendar_month_outlined), -// title: MenuItemNames.PERIOD_PLANNER, -// onPressed: () { -// ref.read(cyclesProvider.notifier).fetchCycles() -// .then((cycles) { -// // if (cycles.isEmpty) { -// // context.goNamed(RouteNames.NEW_USER_SCREEN); -// // } -// // else { -// // context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); -// // } -// context.goNamed(RouteNames.PERIOD_PLANNER_SCREEN); -// }); -// }, -// color: Constants.periodPlannerShortcutBgColor.withOpacity(0.5), -// ), -// ]; - -// class SelfScreening extends HookConsumerWidget { -// const SelfScreening({super.key}); -// -// @override -// Widget build(BuildContext context, WidgetRef ref) { -// final theme = Theme.of(context); -// final _items = _menuItems(context, ref); -// final insightAsync = ref.watch(insightProvider); -// -// return Scaffold( -// body: Column( -// children: [ -// const CustomAppBar( -// title: "Self Screening🌡", -// subTitle: "Easily track your health. Stay informed and take control of well-being.", -// color: Constants.selfScreeningBgColor, -// ), -// Expanded( -// child: MenuItemsBuilder( -// crossAxisCount: 3, -// itemBuilder: (item) => MenuOption( -// title: item.title ?? "", -// icon: item.shortcutIcon, -// bgColor: item.color ?? Constants.bmiCalculatorShortcutBgColor, -// onPress: item.onPressed, -// ), -// items: _items, -// ), -// ), -// ], -// ), -// floatingActionButton: Column( -// mainAxisAlignment: MainAxisAlignment.end, -// children: [ -// FloatingActionButton( -// tooltip: "Module insight", -// hoverColor: Constants.bmiCalculatorShortcutBgColor, -// onPressed: () { -// context.goNamed(RouteNames.INSIGHT); -// }, -// backgroundColor: Constants.bmiCalculatorShortcutBgColor, -// child: const Icon(Icons.insights), -// ), -// ], -// ), -// ); -// } -// } diff --git a/lib/src/features/self_screening/presentation/widgets/health_list.dart b/lib/src/features/self_screening/presentation/widgets/health_list.dart index 011e1faa..3ab95dc6 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_list.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_list.dart @@ -1,12 +1,15 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:nishauri/src/utils/constants.dart'; class ItemList extends StatelessWidget { final List items; final Color backgroundColor; + final List path; const ItemList({ Key? key, required this.items, + required this.path, this.backgroundColor = Constants.bgColor, }) : super(key: key); @@ -28,13 +31,12 @@ class ItemList extends StatelessWidget { return ListTile( title: Text(items[index]), onTap: () { - // Handle item tap + context.goNamed(path[index]); }, trailing: const Icon(Icons.chevron_right), ); } else { - // This is the separator item - return const SizedBox.shrink(); // No content for the separator item + return const SizedBox.shrink(); } }, ), From 5b3b4cd6726f78b407a1d9b45f9bbf1f1a6a6950 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 25 Oct 2024 15:34:59 +0300 Subject: [PATCH 113/140] add advice for blood pressure satus. --- assets/data/blood_pressure_advice.json | 40 ++ .../bp/data/models/bp_advice.dart | 14 + .../bp/data/models/bp_advice.freezed.dart | 167 +++++++ .../bp/data/models/bp_advice.g.dart | 19 + .../providers/blood_pressure_provider.dart | 12 + .../data/repository/bp_advice_repository.dart | 14 + .../bp/data/services/bp_advice_service.dart | 34 ++ .../presentation/pages/bpMonitorScreen.dart | 434 ++++++++++-------- .../pages/trend_chart_screen.dart | 38 +- .../pages/self_screening_menu.dart | 2 +- 10 files changed, 566 insertions(+), 208 deletions(-) create mode 100644 assets/data/blood_pressure_advice.json create mode 100644 lib/src/features/self_screening/bp/data/models/bp_advice.dart create mode 100644 lib/src/features/self_screening/bp/data/models/bp_advice.freezed.dart create mode 100644 lib/src/features/self_screening/bp/data/models/bp_advice.g.dart create mode 100644 lib/src/features/self_screening/bp/data/repository/bp_advice_repository.dart create mode 100644 lib/src/features/self_screening/bp/data/services/bp_advice_service.dart diff --git a/assets/data/blood_pressure_advice.json b/assets/data/blood_pressure_advice.json new file mode 100644 index 00000000..b43a064d --- /dev/null +++ b/assets/data/blood_pressure_advice.json @@ -0,0 +1,40 @@ +{ +"bloodPressureCategories": [ +{ +"status": "Optimal", +"systolic": "<120", +"diastolic": "<80", +"advice": "Maintain a healthy lifestyle with regular exercise, a balanced diet rich in fruits and vegetables, and limit salt intake." +}, +{ +"status": "Normal", +"systolic": "120-129", +"diastolic": "<80", +"advice": "Continue healthy habits; monitor your blood pressure regularly. Aim for physical activity most days of the week." +}, +{ +"status": "Elevated", +"systolic": "130-139", +"diastolic": "<80", +"advice": "Adopt a heart-healthy diet, reduce sodium intake, and increase physical activity. Consider stress management techniques." +}, +{ +"status": "Hypertension Grade 1", +"systolic": "140-159", +"diastolic": "80-89", +"advice": "Consult a healthcare provider for lifestyle changes, such as weight management, and possible medication. Regular monitoring is crucial." +}, +{ +"status": "Hypertension Grade 2", +"systolic": "160-179", +"diastolic": "90-109", +"advice": "Seek medical advice for more intensive management and treatment options. Focus on a low-sodium diet and consistent exercise." +}, +{ +"status": "Hypertension Grade 3", +"systolic": "≥180", +"diastolic": "≥110", +"advice": "Immediate medical attention is necessary. Follow a strict treatment plan, including medication adherence and regular follow-ups with your healthcare provider." +} +] +} diff --git a/lib/src/features/self_screening/bp/data/models/bp_advice.dart b/lib/src/features/self_screening/bp/data/models/bp_advice.dart new file mode 100644 index 00000000..0ec77755 --- /dev/null +++ b/lib/src/features/self_screening/bp/data/models/bp_advice.dart @@ -0,0 +1,14 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'bp_advice.freezed.dart'; +part 'bp_advice.g.dart'; + +@Freezed() +class BpAdvice with _$BpAdvice { + const factory BpAdvice({ + String? status, + String? advice, + + }) = _BpAdvice; + factory BpAdvice.fromJson(Map json)=> _$BpAdviceFromJson(json); +} \ No newline at end of file diff --git a/lib/src/features/self_screening/bp/data/models/bp_advice.freezed.dart b/lib/src/features/self_screening/bp/data/models/bp_advice.freezed.dart new file mode 100644 index 00000000..9369eccd --- /dev/null +++ b/lib/src/features/self_screening/bp/data/models/bp_advice.freezed.dart @@ -0,0 +1,167 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'bp_advice.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +BpAdvice _$BpAdviceFromJson(Map json) { + return _BpAdvice.fromJson(json); +} + +/// @nodoc +mixin _$BpAdvice { + String? get status => throw _privateConstructorUsedError; + String? get advice => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $BpAdviceCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BpAdviceCopyWith<$Res> { + factory $BpAdviceCopyWith(BpAdvice value, $Res Function(BpAdvice) then) = + _$BpAdviceCopyWithImpl<$Res, BpAdvice>; + @useResult + $Res call({String? status, String? advice}); +} + +/// @nodoc +class _$BpAdviceCopyWithImpl<$Res, $Val extends BpAdvice> + implements $BpAdviceCopyWith<$Res> { + _$BpAdviceCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = freezed, + Object? advice = freezed, + }) { + return _then(_value.copyWith( + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String?, + advice: freezed == advice + ? _value.advice + : advice // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$BpAdviceImplCopyWith<$Res> + implements $BpAdviceCopyWith<$Res> { + factory _$$BpAdviceImplCopyWith( + _$BpAdviceImpl value, $Res Function(_$BpAdviceImpl) then) = + __$$BpAdviceImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? status, String? advice}); +} + +/// @nodoc +class __$$BpAdviceImplCopyWithImpl<$Res> + extends _$BpAdviceCopyWithImpl<$Res, _$BpAdviceImpl> + implements _$$BpAdviceImplCopyWith<$Res> { + __$$BpAdviceImplCopyWithImpl( + _$BpAdviceImpl _value, $Res Function(_$BpAdviceImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = freezed, + Object? advice = freezed, + }) { + return _then(_$BpAdviceImpl( + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String?, + advice: freezed == advice + ? _value.advice + : advice // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$BpAdviceImpl implements _BpAdvice { + const _$BpAdviceImpl({this.status, this.advice}); + + factory _$BpAdviceImpl.fromJson(Map json) => + _$$BpAdviceImplFromJson(json); + + @override + final String? status; + @override + final String? advice; + + @override + String toString() { + return 'BpAdvice(status: $status, advice: $advice)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BpAdviceImpl && + (identical(other.status, status) || other.status == status) && + (identical(other.advice, advice) || other.advice == advice)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, status, advice); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$BpAdviceImplCopyWith<_$BpAdviceImpl> get copyWith => + __$$BpAdviceImplCopyWithImpl<_$BpAdviceImpl>(this, _$identity); + + @override + Map toJson() { + return _$$BpAdviceImplToJson( + this, + ); + } +} + +abstract class _BpAdvice implements BpAdvice { + const factory _BpAdvice({final String? status, final String? advice}) = + _$BpAdviceImpl; + + factory _BpAdvice.fromJson(Map json) = + _$BpAdviceImpl.fromJson; + + @override + String? get status; + @override + String? get advice; + @override + @JsonKey(ignore: true) + _$$BpAdviceImplCopyWith<_$BpAdviceImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/self_screening/bp/data/models/bp_advice.g.dart b/lib/src/features/self_screening/bp/data/models/bp_advice.g.dart new file mode 100644 index 00000000..a8a0c54e --- /dev/null +++ b/lib/src/features/self_screening/bp/data/models/bp_advice.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'bp_advice.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$BpAdviceImpl _$$BpAdviceImplFromJson(Map json) => + _$BpAdviceImpl( + status: json['status'] as String?, + advice: json['advice'] as String?, + ); + +Map _$$BpAdviceImplToJson(_$BpAdviceImpl instance) => + { + 'status': instance.status, + 'advice': instance.advice, + }; diff --git a/lib/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart b/lib/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart index a0ab6796..b99779ae 100644 --- a/lib/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart +++ b/lib/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart @@ -1,7 +1,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/bp_advice.dart'; import 'package:nishauri/src/features/self_screening/bp/data/repository/blood_pressure_repository.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/repository/bp_advice_repository.dart'; import 'package:nishauri/src/features/self_screening/bp/data/services/blood_pressure_service.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/services/bp_advice_service.dart'; final bloodPressureRepositoryProvider = Provider((ref) { return BloodPressureRepository(BloodPressureService()); @@ -10,4 +13,13 @@ final bloodPressureRepositoryProvider = Provider((ref) final bloodPressureListProvider = FutureProvider>((ref) async { final repository = ref.watch(bloodPressureRepositoryProvider); return await repository.getBloodPressures(); +}); + +final bpAdviceRepositoryProvider = Provider((ref) { + return BpAdviceRepository(BpAdviceService()); +}); + +final bloodPressureListAdviceProvider = FutureProvider>((ref) async { + final repository = ref.watch(bpAdviceRepositoryProvider); + return await repository.getBloodPressuresAdvice(); }); \ No newline at end of file diff --git a/lib/src/features/self_screening/bp/data/repository/bp_advice_repository.dart b/lib/src/features/self_screening/bp/data/repository/bp_advice_repository.dart new file mode 100644 index 00000000..6530e6e5 --- /dev/null +++ b/lib/src/features/self_screening/bp/data/repository/bp_advice_repository.dart @@ -0,0 +1,14 @@ +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/bp_advice.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/services/blood_pressure_service.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/services/bp_advice_service.dart'; + +class BpAdviceRepository { + final BpAdviceService _service; + + BpAdviceRepository(this._service); + + Future> getBloodPressuresAdvice() async { + return await _service.fetchBloodPressuresAdvice(); + } +} \ No newline at end of file diff --git a/lib/src/features/self_screening/bp/data/services/bp_advice_service.dart b/lib/src/features/self_screening/bp/data/services/bp_advice_service.dart new file mode 100644 index 00000000..bbdf1be4 --- /dev/null +++ b/lib/src/features/self_screening/bp/data/services/bp_advice_service.dart @@ -0,0 +1,34 @@ +import 'dart:convert'; +import 'package:flutter/services.dart'; +import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; +import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/bp_advice.dart'; +import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; + +class BpAdviceService extends HTTPService { + final AuthRepository _repository = AuthRepository(AuthApiService()); + + // Future fetchBloodPressuresAdvice_(dynamic args) async { + // final id = await _repository.getUserId(); + // final tokenPair = await getCachedToken(); + // var headers = {'Authorization': 'Bearer ${tokenPair.accessToken}'}; + // var url = '${Constants.BASE_URL_NEW}get_blood_pressure?user_id=$id'; + // final response = request( + // url: url, + // token: tokenPair, + // method: 'GET', + // requestHeaders: headers, + // userId: id); + // return response; + // } + + Future> fetchBloodPressuresAdvice() async { + List bp = []; + final String responseString = await rootBundle.loadString('assets/data/blood_pressure_advice.json'); + final Map responseData = json.decode(responseString); + final List jsonList = responseData["bloodPressureCategories"]; + bp.addAll(jsonList.map((json) => BpAdvice.fromJson(json))); + return bp; + } +} \ No newline at end of file diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index 2e6d27bd..95799baf 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -2,6 +2,7 @@ import 'dart:core'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; +import 'package:intl/intl.dart'; import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart'; @@ -20,174 +21,210 @@ class BPMonitorScreen extends ConsumerStatefulWidget { } class _BPMonitorScreenState extends ConsumerState { - final _formKey = GlobalKey(); - final _notesController = TextEditingController(); + // final _formKey = GlobalKey(); + // final _notesController = TextEditingController(); + // + // void _clearForm(double systolic, double diastolic, double heartRate, TextEditingController notesController) { + // setState(() { + // systolic = 120; + // diastolic = 80; + // heartRate = 70; + // notesController.clear(); + // }); + // } - void _clearForm(double systolic, double diastolic, double heartRate, TextEditingController notesController) { - setState(() { - systolic = 120; - diastolic = 80; - heartRate = 70; - notesController.clear(); - }); - } - - void _submitData(BuildContext context, double systolic, double diastolic, double heartRate, TextEditingController notesController) { - final String notes = notesController.text; - final DateTime measurementTime = DateTime.now(); - - final bp = BloodPressure( - systolic: systolic, - diastolic: diastolic, - pulse_rate: heartRate, - created_at: measurementTime, - notes: notes, - ); + // void _submitData(BuildContext context, double systolic, double diastolic, double heartRate, TextEditingController notesController) { + // final String notes = notesController.text; + // final DateTime measurementTime = DateTime.now(); + // + // final bp = BloodPressure( + // systolic: systolic, + // diastolic: diastolic, + // pulse_rate: heartRate, + // created_at: measurementTime, + // notes: notes, + // ); + // + // ref.read(bloodPressureRepositoryProvider).saveBloodPressure(bp).then((value) { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar(content: Text(value)), + // ); + // _reloadData(); + // _clearForm(systolic, diastolic, heartRate, notesController); + // Navigator.of(context).pop(); + // }).catchError((error) { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar(content: Text(error)), + // ); + // }); + // } - ref.read(bloodPressureRepositoryProvider).saveBloodPressure(bp).then((value) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(value)), - ); - _reloadData(); - _clearForm(systolic, diastolic, heartRate, notesController); - Navigator.of(context).pop(); - }).catchError((error) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(error)), - ); - }); - } + // String _getWarningText(String label, double value) { + // if (label == 'Systolic') { + // if (value < 90) return 'Systolic pressure is too low'; + // if (value > 140) return 'Systolic pressure is too high'; + // } else if (label == 'Diastolic') { + // if (value < 60) return 'Diastolic pressure is too low'; + // if (value > 90) return 'Diastolic pressure is too high'; + // } else if (label == 'Heart Rate') { + // if (value < 60) return 'Heart rate is too low'; + // if (value > 100) return 'Heart rate is too high'; + // } + // return ''; + // } + // + // Color _getSliderColor(String label, double value) { + // if (label == 'Systolic') { + // if (value < 90 || value > 140) return Colors.red; + // } else if (label == 'Diastolic') { + // if (value < 60 || value > 90) return Colors.orange; + // } else if (label == 'Heart Rate') { + // if (value < 60 || value > 100) return Colors.blue; + // } + // return Colors.green; + // } + // + // void _showDialogForm(BuildContext context) { + // double systolic = 120; + // double diastolic = 80; + // double heartRate = 70; + // final notesController = TextEditingController(); + // + // showDialog( + // context: context, + // builder: (BuildContext context) { + // return StatefulBuilder( + // builder: (context, setState) { + // return AlertDialog( + // title: Text('Enter Blood Pressure Data'), + // content: SingleChildScrollView( + // child: Form( + // key: _formKey, + // child: Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // Text( + // 'Systolic Pressure (mmHg): ${systolic.toInt()}', + // style: TextStyle(color: _getSliderColor('Systolic', systolic)), + // ), + // Slider( + // value: systolic, + // min: 50, + // max: 200, + // divisions: 150, + // label: systolic.toInt().toString(), + // onChanged: (value) { + // setState(() { + // systolic = value; + // }); + // }, + // ), + // Text(_getWarningText('Systolic', systolic)), + // Text( + // 'Diastolic Pressure (mmHg): ${diastolic.toInt()}', + // style: TextStyle(color: _getSliderColor('Diastolic', diastolic)), + // ), + // Slider( + // value: diastolic, + // min: 30, + // max: 120, + // divisions: 90, + // label: diastolic.toInt().toString(), + // onChanged: (value) { + // setState(() { + // diastolic = value; + // }); + // }, + // ), + // Text(_getWarningText('Diastolic', diastolic)), + // Text( + // 'Heart Rate (bpm): ${heartRate.toInt()}', + // style: TextStyle(color: _getSliderColor('Heart Rate', heartRate)), + // ), + // Slider( + // value: heartRate, + // min: 40, + // max: 180, + // divisions: 140, + // label: heartRate.toInt().toString(), + // onChanged: (value) { + // setState(() { + // heartRate = value; + // }); + // }, + // ), + // Text(_getWarningText('Heart Rate', heartRate)), + // TextFormField( + // controller: notesController, + // decoration: InputDecoration( + // labelText: 'Notes', + // border: OutlineInputBorder(), + // ), + // keyboardType: TextInputType.text, + // maxLines: null, + // ), + // ], + // ), + // ), + // ), + // actions: [ + // TextButton( + // onPressed: () { + // _clearForm(systolic, diastolic, heartRate, notesController); + // Navigator.of(context).pop(); + // }, + // child: Text('Cancel'), + // ), + // ElevatedButton( + // onPressed: () { + // _submitData(context, systolic, diastolic, heartRate, notesController); + // _reloadData(); + // }, + // child: Text('Submit'), + // ), + // ], + // ); + // }, + // ); + // }, + // ); + // } - String _getWarningText(String label, double value) { - if (label == 'Systolic') { - if (value < 90) return 'Systolic pressure is too low'; - if (value > 140) return 'Systolic pressure is too high'; - } else if (label == 'Diastolic') { - if (value < 60) return 'Diastolic pressure is too low'; - if (value > 90) return 'Diastolic pressure is too high'; - } else if (label == 'Heart Rate') { - if (value < 60) return 'Heart rate is too low'; - if (value > 100) return 'Heart rate is too high'; + String _getBloodPressureStatus(double systolic, double diastolic) { + if (systolic < 120 && diastolic < 80) { + return 'Optimal'; + } else if (systolic < 130 && diastolic < 80) { + return 'Normal'; + } else if (systolic < 140 || diastolic < 90) { + return 'Elevated'; + } else if (systolic < 160 || diastolic < 100) { + return 'Hypertension Grade 1'; + } else if (systolic < 180 || diastolic < 110) { + return 'Hypertension Grade 2'; + } else { + return 'Hypertension Grade 3'; } - return ''; } - Color _getSliderColor(String label, double value) { - if (label == 'Systolic') { - if (value < 90 || value > 140) return Colors.red; - } else if (label == 'Diastolic') { - if (value < 60 || value > 90) return Colors.orange; - } else if (label == 'Heart Rate') { - if (value < 60 || value > 100) return Colors.blue; + Color _getStatusColor(String status) { + switch (status) { + case 'Optimal': + return Colors.green; + case 'Normal': + return Colors.blue; + case 'Elevated': + return Colors.orange; + case 'Hypertension Grade 1': + return Colors.yellow; + case 'Hypertension Grade 2': + return Colors.red; + case 'Hypertension Grade 3': + return Colors.redAccent; + default: + return Colors.black; } - return Colors.green; } - void _showDialogForm(BuildContext context) { - double systolic = 120; - double diastolic = 80; - double heartRate = 70; - final notesController = TextEditingController(); - - showDialog( - context: context, - builder: (BuildContext context) { - return StatefulBuilder( - builder: (context, setState) { - return AlertDialog( - title: Text('Enter Blood Pressure Data'), - content: SingleChildScrollView( - child: Form( - key: _formKey, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'Systolic Pressure (mmHg): ${systolic.toInt()}', - style: TextStyle(color: _getSliderColor('Systolic', systolic)), - ), - Slider( - value: systolic, - min: 50, - max: 200, - divisions: 150, - label: systolic.toInt().toString(), - onChanged: (value) { - setState(() { - systolic = value; - }); - }, - ), - Text(_getWarningText('Systolic', systolic)), - Text( - 'Diastolic Pressure (mmHg): ${diastolic.toInt()}', - style: TextStyle(color: _getSliderColor('Diastolic', diastolic)), - ), - Slider( - value: diastolic, - min: 30, - max: 120, - divisions: 90, - label: diastolic.toInt().toString(), - onChanged: (value) { - setState(() { - diastolic = value; - }); - }, - ), - Text(_getWarningText('Diastolic', diastolic)), - Text( - 'Heart Rate (bpm): ${heartRate.toInt()}', - style: TextStyle(color: _getSliderColor('Heart Rate', heartRate)), - ), - Slider( - value: heartRate, - min: 40, - max: 180, - divisions: 140, - label: heartRate.toInt().toString(), - onChanged: (value) { - setState(() { - heartRate = value; - }); - }, - ), - Text(_getWarningText('Heart Rate', heartRate)), - TextFormField( - controller: notesController, - decoration: InputDecoration( - labelText: 'Notes', - border: OutlineInputBorder(), - ), - keyboardType: TextInputType.text, - maxLines: null, - ), - ], - ), - ), - ), - actions: [ - TextButton( - onPressed: () { - _clearForm(systolic, diastolic, heartRate, notesController); - Navigator.of(context).pop(); - }, - child: Text('Cancel'), - ), - ElevatedButton( - onPressed: () { - _submitData(context, systolic, diastolic, heartRate, notesController); - _reloadData(); - }, - child: Text('Submit'), - ), - ], - ); - }, - ); - }, - ); - } void _reloadData() { ref.refresh(bloodPressureListProvider); @@ -197,10 +234,26 @@ class _BPMonitorScreenState extends ConsumerState { Widget build(BuildContext context) { final bloodPressureListAsync = ref.watch(bloodPressureListProvider); final theme = Theme.of(context); + final adviceAsync = ref.watch(bloodPressureListAdviceProvider); return bloodPressureListAsync.when( data: (data) { + data.sort((a, b) => b.created_at.compareTo(a.created_at)); + final displayedData = data.isNotEmpty ? data.first : null; + final chatData = data.length > 5 ? data.sublist(data.length - 5) : data; + + final status = _getBloodPressureStatus(displayedData!.systolic, displayedData.diastolic); + + final advice = adviceAsync.when( + data: (adviceData) => adviceData.firstWhere( + (ad) => ad.status == status, + // orElse: () => null, + )?.advice ?? 'No advice available', + error: (error, _) => 'Error loading advice', + loading: () => 'Loading advice...', + ); + + print(advice); - final displayedData = data.length > 5 ? data.sublist(data.length - 5) : data; return Scaffold( body: Column( children: [ @@ -232,15 +285,23 @@ class _BPMonitorScreenState extends ConsumerState { ), ], ), - SizedBox(height: Constants.SPACING,), - Text("18 Oct 2024", style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), + const SizedBox(height: Constants.SPACING,), + Row( + children: [ + Text("Last Record Date:", style: theme.textTheme.bodyLarge), + const SizedBox(width: 4), + Text(DateFormat('dd MMM yyyy').format(displayedData!.created_at), style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), + ], + ), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Row( children: [ - Text("4.1", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), + Text("${displayedData.systolic}/${displayedData.diastolic}", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), const SizedBox(width: 4), - Text("mmol/L", style: theme.textTheme.bodyMedium), + Text("mmHG", style: theme.textTheme.bodyMedium), + const SizedBox(width: 4,), + Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status,), ),) ], ), SizedBox(height: Constants.SPACING,), @@ -248,7 +309,7 @@ class _BPMonitorScreenState extends ConsumerState { spacing: 1, runSpacing: 16, children: [ - TrendChartScreen(data: displayedData,) + TrendChartScreen(data: chatData,) ], ), SizedBox(height: Constants.SPACING,), @@ -264,8 +325,13 @@ class _BPMonitorScreenState extends ConsumerState { ), SizedBox(height: Constants.SPACING,), Container( - color: Constants.bgColor, - height: 250, + decoration: BoxDecoration( + color: Constants.bgColor, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: Constants.bgColor), + ), + // color: Constants.bgColor, + // height: 250, child: Padding( padding: const EdgeInsets.all(Constants.SPACING), child: SingleChildScrollView( @@ -273,13 +339,19 @@ class _BPMonitorScreenState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ ListTile( - title: Text( - 'What is Blood Pressure', - style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), + title: Row( + children: [ + Text( + 'Your Blood Pressure is ', + style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox(width: 4,), + Text("($status)", style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status,), ),) + ], ), subtitle: Text( - "Blood pressure is the force of your blood pushing against the walls of your arteries as your heart pumps it around your body. It’s measured with two numbers: the first (systolic) is the pressure when your heart beats, and the second (diastolic) is the pressure when your heart rests between beats. For most people, a normal reading is around 120/80. Keeping your blood pressure in a healthy range is important because high or low blood pressure can lead to health problems. Regular checks can help you stay on top of it.", - style: theme.textTheme.bodyMedium, + advice, + style: theme.textTheme.bodyLarge, ), ), ], @@ -287,7 +359,7 @@ class _BPMonitorScreenState extends ConsumerState { ), ), ), - SizedBox(height: Constants.SPACING), + const SizedBox(height: Constants.SPACING), Button( title: "More Insight", onPress: (){ @@ -324,15 +396,6 @@ class _BPMonitorScreenState extends ConsumerState { child: Icon(Icons.refresh), heroTag: null, ), - SizedBox(height: 10), - FloatingActionButton( - onPressed: () { - _showDialogForm(context); - _reloadData(); - }, - child: Icon(Icons.add), - heroTag: null, - ), ], ), ); @@ -348,11 +411,6 @@ class _BPMonitorScreenState extends ConsumerState { floatingButtonAction1: () { _reloadData(); }, - floatingButtonIcon2: Icons.add, - floatingButtonAction2: () { - _showDialogForm(context); - _reloadData(); - }, ), loading: () => Center( child: Column( diff --git a/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart b/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart index 983b792a..84044b9c 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart @@ -25,11 +25,11 @@ class TrendChartScreen extends StatelessWidget { return FlSpot(index, diastolic); }).toList(); - final pulseRateSpots = data.asMap().entries.map((entry) { - final index = entry.key.toDouble(); - final pulse = entry.value.pulse_rate; - return FlSpot(index, pulse); - }).toList(); + // final pulseRateSpots = data.asMap().entries.map((entry) { + // final index = entry.key.toDouble(); + // final pulse = entry.value.pulse_rate; + // return FlSpot(index, pulse); + // }).toList(); final date = data.asMap().entries.map((e) { return e.value.created_at.toString(); @@ -70,22 +70,22 @@ class TrendChartScreen extends StatelessWidget { ), dotData: FlDotData(show: true), ), - LineChartBarData( - spots: pulseRateSpots, - isCurved: true, - color: Constants.programsColor, - barWidth: 2, - belowBarData: BarAreaData( - show: false, - gradient: LinearGradient( - colors: [Constants.programsColor.withOpacity(0.3), Constants.programsColor.withOpacity(0)], - ), - ), - dotData: FlDotData(show: true), - ), + // LineChartBarData( + // spots: pulseRateSpots, + // isCurved: true, + // color: Constants.programsColor, + // barWidth: 2, + // belowBarData: BarAreaData( + // show: false, + // gradient: LinearGradient( + // colors: [Constants.programsColor.withOpacity(0.3), Constants.programsColor.withOpacity(0)], + // ), + // ), + // dotData: FlDotData(show: true), + // ), ], minX: 0, - maxX: pulseRateSpots.length - 1, + maxX: systolicSpots.length - 1, minY: 29, dateTimes: date, showLeftTitles: false, diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index c6fe1ed3..f306072f 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -112,7 +112,7 @@ class SelfScreening extends HookConsumerWidget { HealthCard( svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", title: "Blood Sugar", - value1: "${currentBsEntries!.level}", + value1: "${currentBsEntries?.level}", text1: "mmHG", onPressed: () { context.goNamed(RouteNames.BLOOD_SUGAR); From 69e73784bc37cf95816dc00c7522b5ae1b2f7716 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 28 Oct 2024 12:23:46 +0300 Subject: [PATCH 114/140] :construction: conditional advice ps --- assets/data/blood_sugar_advice.json | 24 +++ .../blood_sugar/data/models/bs_advice.dart | 15 ++ .../data/models/bs_advice.freezed.dart | 186 ++++++++++++++++++ .../blood_sugar/data/models/bs_advice.g.dart | 21 ++ .../data/providers/blood_sugar_provider.dart | 12 ++ .../data/repository/bs_advice_repository.dart | 12 ++ .../data/services/bs_advice_service.dart | 35 ++++ .../presentation/pages/BloodSugarScreen.dart | 98 +++++++-- .../presentation/pages/bpMonitorScreen.dart | 10 +- 9 files changed, 391 insertions(+), 22 deletions(-) create mode 100644 assets/data/blood_sugar_advice.json create mode 100644 lib/src/features/self_screening/blood_sugar/data/models/bs_advice.dart create mode 100644 lib/src/features/self_screening/blood_sugar/data/models/bs_advice.freezed.dart create mode 100644 lib/src/features/self_screening/blood_sugar/data/models/bs_advice.g.dart create mode 100644 lib/src/features/self_screening/blood_sugar/data/repository/bs_advice_repository.dart create mode 100644 lib/src/features/self_screening/blood_sugar/data/services/bs_advice_service.dart diff --git a/assets/data/blood_sugar_advice.json b/assets/data/blood_sugar_advice.json new file mode 100644 index 00000000..f0dd325f --- /dev/null +++ b/assets/data/blood_sugar_advice.json @@ -0,0 +1,24 @@ +{ + "status": [ + { + "label": "Normal", + "description": "Blood sugar levels are within the normal range.", + "advice": "Maintain a balanced diet and regular exercise to keep your blood sugar stable." + }, + { + "label": "Impaired Fasting", + "description": "Blood sugar levels are elevated after fasting.", + "advice": "Consider lifestyle changes such as a healthier diet, regular physical activity, and monitoring your blood sugar levels." + }, + { + "label": "Impaired Glucose Tolerance", + "description": "Blood sugar levels are elevated after meals.", + "advice": "Implement dietary changes, increase physical activity, and consult a healthcare professional for a personalized plan." + }, + { + "label": "Diabetes", + "description": "Blood sugar levels indicate diabetes.", + "advice": "Seek medical advice for a comprehensive management plan, including medication, diet, and exercise." + } + ] +} diff --git a/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.dart b/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.dart new file mode 100644 index 00000000..ffbfda9a --- /dev/null +++ b/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'bs_advice.freezed.dart'; +part 'bs_advice.g.dart'; + +@Freezed() +class BsAdvice with _$BsAdvice { + const factory BsAdvice({ + String? label, + String? description, + String? advice, + + }) = _BsAdvice; + factory BsAdvice.fromJson(Map json)=> _$BsAdviceFromJson(json); +} \ No newline at end of file diff --git a/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.freezed.dart b/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.freezed.dart new file mode 100644 index 00000000..2d3a835e --- /dev/null +++ b/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.freezed.dart @@ -0,0 +1,186 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'bs_advice.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +BsAdvice _$BsAdviceFromJson(Map json) { + return _BsAdvice.fromJson(json); +} + +/// @nodoc +mixin _$BsAdvice { + String? get label => throw _privateConstructorUsedError; + String? get description => throw _privateConstructorUsedError; + String? get advice => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $BsAdviceCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BsAdviceCopyWith<$Res> { + factory $BsAdviceCopyWith(BsAdvice value, $Res Function(BsAdvice) then) = + _$BsAdviceCopyWithImpl<$Res, BsAdvice>; + @useResult + $Res call({String? label, String? description, String? advice}); +} + +/// @nodoc +class _$BsAdviceCopyWithImpl<$Res, $Val extends BsAdvice> + implements $BsAdviceCopyWith<$Res> { + _$BsAdviceCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? label = freezed, + Object? description = freezed, + Object? advice = freezed, + }) { + return _then(_value.copyWith( + label: freezed == label + ? _value.label + : label // ignore: cast_nullable_to_non_nullable + as String?, + description: freezed == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String?, + advice: freezed == advice + ? _value.advice + : advice // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$BsAdviceImplCopyWith<$Res> + implements $BsAdviceCopyWith<$Res> { + factory _$$BsAdviceImplCopyWith( + _$BsAdviceImpl value, $Res Function(_$BsAdviceImpl) then) = + __$$BsAdviceImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? label, String? description, String? advice}); +} + +/// @nodoc +class __$$BsAdviceImplCopyWithImpl<$Res> + extends _$BsAdviceCopyWithImpl<$Res, _$BsAdviceImpl> + implements _$$BsAdviceImplCopyWith<$Res> { + __$$BsAdviceImplCopyWithImpl( + _$BsAdviceImpl _value, $Res Function(_$BsAdviceImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? label = freezed, + Object? description = freezed, + Object? advice = freezed, + }) { + return _then(_$BsAdviceImpl( + label: freezed == label + ? _value.label + : label // ignore: cast_nullable_to_non_nullable + as String?, + description: freezed == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String?, + advice: freezed == advice + ? _value.advice + : advice // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$BsAdviceImpl implements _BsAdvice { + const _$BsAdviceImpl({this.label, this.description, this.advice}); + + factory _$BsAdviceImpl.fromJson(Map json) => + _$$BsAdviceImplFromJson(json); + + @override + final String? label; + @override + final String? description; + @override + final String? advice; + + @override + String toString() { + return 'BsAdvice(label: $label, description: $description, advice: $advice)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BsAdviceImpl && + (identical(other.label, label) || other.label == label) && + (identical(other.description, description) || + other.description == description) && + (identical(other.advice, advice) || other.advice == advice)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, label, description, advice); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$BsAdviceImplCopyWith<_$BsAdviceImpl> get copyWith => + __$$BsAdviceImplCopyWithImpl<_$BsAdviceImpl>(this, _$identity); + + @override + Map toJson() { + return _$$BsAdviceImplToJson( + this, + ); + } +} + +abstract class _BsAdvice implements BsAdvice { + const factory _BsAdvice( + {final String? label, + final String? description, + final String? advice}) = _$BsAdviceImpl; + + factory _BsAdvice.fromJson(Map json) = + _$BsAdviceImpl.fromJson; + + @override + String? get label; + @override + String? get description; + @override + String? get advice; + @override + @JsonKey(ignore: true) + _$$BsAdviceImplCopyWith<_$BsAdviceImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.g.dart b/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.g.dart new file mode 100644 index 00000000..bd015b2a --- /dev/null +++ b/lib/src/features/self_screening/blood_sugar/data/models/bs_advice.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'bs_advice.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$BsAdviceImpl _$$BsAdviceImplFromJson(Map json) => + _$BsAdviceImpl( + label: json['label'] as String?, + description: json['description'] as String?, + advice: json['advice'] as String?, + ); + +Map _$$BsAdviceImplToJson(_$BsAdviceImpl instance) => + { + 'label': instance.label, + 'description': instance.description, + 'advice': instance.advice, + }; diff --git a/lib/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart b/lib/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart index 6a88aa63..eb0ba731 100644 --- a/lib/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart +++ b/lib/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart @@ -1,7 +1,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/bs_advice.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/repository/blood_sugar_repository.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/repository/bs_advice_repository.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/services/blood_sugar_service.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/services/bs_advice_service.dart'; final bloodSugarProvider = Provider((ref) { return BloodSugarRepository(BloodSugarService()); @@ -11,3 +14,12 @@ final bloodSugarEntriesProvider = FutureProvider>((ref) async { final repository = ref.watch(bloodSugarProvider); return await repository.getBloodSugars(); }); + +final bsAdviceRepositoryProvider = Provider((ref) { + return BsAdviceRepository(BsAdviceService()); +}); + +final bloodSugarListAdviceProvider = FutureProvider>((ref) async { + final repository = ref.watch(bsAdviceRepositoryProvider); + return await repository.getBloodPressuresAdvice(); +}); diff --git a/lib/src/features/self_screening/blood_sugar/data/repository/bs_advice_repository.dart b/lib/src/features/self_screening/blood_sugar/data/repository/bs_advice_repository.dart new file mode 100644 index 00000000..3411c327 --- /dev/null +++ b/lib/src/features/self_screening/blood_sugar/data/repository/bs_advice_repository.dart @@ -0,0 +1,12 @@ +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/bs_advice.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/services/bs_advice_service.dart'; + +class BsAdviceRepository { + final BsAdviceService _service; + + BsAdviceRepository(this._service); + + Future> getBloodPressuresAdvice() async { + return await _service.fetchBloodSugarAdvice(); + } +} \ No newline at end of file diff --git a/lib/src/features/self_screening/blood_sugar/data/services/bs_advice_service.dart b/lib/src/features/self_screening/blood_sugar/data/services/bs_advice_service.dart new file mode 100644 index 00000000..a73a1263 --- /dev/null +++ b/lib/src/features/self_screening/blood_sugar/data/services/bs_advice_service.dart @@ -0,0 +1,35 @@ +import 'dart:convert'; +import 'package:flutter/services.dart'; +import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; +import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; +import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/bs_advice.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressure.dart'; +import 'package:nishauri/src/features/self_screening/bp/data/models/bp_advice.dart'; +import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; + +class BsAdviceService extends HTTPService { + final AuthRepository _repository = AuthRepository(AuthApiService()); + + // Future fetchBloodPressuresAdvice_(dynamic args) async { + // final id = await _repository.getUserId(); + // final tokenPair = await getCachedToken(); + // var headers = {'Authorization': 'Bearer ${tokenPair.accessToken}'}; + // var url = '${Constants.BASE_URL_NEW}get_blood_pressure?user_id=$id'; + // final response = request( + // url: url, + // token: tokenPair, + // method: 'GET', + // requestHeaders: headers, + // userId: id); + // return response; + // } + + Future> fetchBloodSugarAdvice() async { + List bs = []; + final String responseString = await rootBundle.loadString('assets/data/blood_sugar_advice.json'); + final Map responseData = json.decode(responseString); + final List jsonList = responseData["status"]; + bs.addAll(jsonList.map((json) => BsAdvice.fromJson(json))); + return bs; + } +} \ No newline at end of file diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart index c1dff694..3533795a 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -5,15 +5,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blood_sugar.dart'; +import 'package:intl/intl.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; -import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/AddBloodSugarScreen.dart'; -import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_sugar_entry_card.dart'; -import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/widgets/blood_suger_trend_chart.dart'; -import 'package:nishauri/src/features/self_screening/presentation/widgets/image_card.dart'; -import 'package:nishauri/src/shared/charts/CustomLineChart.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; -import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/shared/display/custome_filter_chart.dart'; import 'package:nishauri/src/shared/display/daily_card.dart'; import 'package:nishauri/src/shared/input/Button.dart'; @@ -36,13 +30,57 @@ class _BloodSugarScreenState extends ConsumerState { }); } + Color _getStatusColor(String status) { + switch (status) { + case 'Normal': + return Colors.green; + case 'Impaired fasting': + return Colors.yellow; + case 'Impaired Glucose Tolerance': + return Colors.orange; + case 'Diabetes': + return Colors.red; + default: + return Colors.white24; + } + } + + String _getBloodSugarStatus(double level, String condition) { + if (condition == 'Fasting (before meals)'){ + if (level < 100) { + return 'Normal'; + } else if (100 <= level && level < 126) { + return 'Impaired Fasting'; + } + else { + return 'Diabetes'; + } + } + else if (condition == 'Postprandial (after meals)'){ + if (level < 140) { + return 'Normal'; + } else if (140 <= level && level < 200) { + return 'Impaired Glucose Tolerance'; + } + else { + return 'Diabetes'; + } + } else { + return 'Invalid condition'; + } + } + @override Widget build(BuildContext context) { final bloodSugarListProvider = ref.watch(bloodSugarEntriesProvider); + final adviceAsync = ref.watch(bloodSugarListAdviceProvider); final theme = Theme.of(context); + + final data = bloodSugarListProvider.when( data: (data) { + data.sort((a, b) => b.created_at.compareTo(a.created_at)); return data ?? []; }, error: (error, _) { @@ -53,6 +91,19 @@ class _BloodSugarScreenState extends ConsumerState { }, ); + final displayedData = data.isNotEmpty ? data.first : null; + + final status = _getBloodSugarStatus(displayedData.level, displayedData.condition); + + final advice = adviceAsync.when( + data: (adviceData) => adviceData.firstWhere( + (ad) => ad.label == status, + // orElse: () => null, + ).advice ?? 'No advice available', + error: (error, _) => 'Error loading advice', + loading: () => 'Loading advice...', + ); + final dataPoints = data.asMap().entries.map((entry) { final index = entry.key.toDouble(); final systolic = entry.value.level; @@ -92,16 +143,26 @@ class _BloodSugarScreenState extends ConsumerState { ], ), const SizedBox(height: Constants.SPACING,), - Text("18 Oct 2024", style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), + Row( + children: [ + Text("Last Record Date:", style: theme.textTheme.bodyLarge), + const SizedBox(width: 4), + Text(DateFormat('dd MMM yyyy').format(displayedData!.created_at), style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), + ], + ), const SizedBox(height: Constants.SPACING,), Row( children: [ - Text("4.1", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), + Text("${displayedData.level}", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), const SizedBox(width: 4), - Text("mmol/L", style: theme.textTheme.bodyMedium), + Text("MM/GH", style: theme.textTheme.bodyMedium), + const SizedBox(width: 4,), + Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status,), ),) ], ), + const SizedBox(height: Constants.SPACING), + Text(displayedData.condition, style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold, color: Colors.blueGrey),), const SizedBox(height: Constants.SPACING,), Wrap( spacing: 1, @@ -141,7 +202,7 @@ class _BloodSugarScreenState extends ConsumerState { const SizedBox(height: Constants.SPACING,), Container( color: Constants.bgColor, - height: 250, + // height: 250, child: Padding( padding: const EdgeInsets.all(Constants.SPACING), child: SingleChildScrollView( @@ -149,12 +210,19 @@ class _BloodSugarScreenState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ ListTile( - title: Text( - 'What is Blood Sugar', - style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), + title: Row( + children: [ + Text( + 'Your Blood Sugar Levels are ', + style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox(width: 4,), + Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: Colors.green),), + const SizedBox(height: Constants.SPACING,), + ], ), subtitle: Text( - "Blood sugar, or glucose, is the main type of sugar found in your blood. It’s your body’s primary source of energy, coming from the food you eat, especially carbohydrates. When you eat, your body breaks down the food into glucose, which then enters your bloodstream. Your pancreas releases a hormone called insulin to help move this glucose into your cells, where it’s used for energy. Maintaining balanced blood sugar levels is crucial because too much or too little can lead to health issues like diabetes or hypoglycemia. Think of it as the fuel that keeps your body running smoothly!", + advice, style: theme.textTheme.bodyMedium, ), ), diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index 95799baf..d113b57c 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -251,9 +251,6 @@ class _BPMonitorScreenState extends ConsumerState { error: (error, _) => 'Error loading advice', loading: () => 'Loading advice...', ); - - print(advice); - return Scaffold( body: Column( children: [ @@ -293,7 +290,6 @@ class _BPMonitorScreenState extends ConsumerState { Text(DateFormat('dd MMM yyyy').format(displayedData!.created_at), style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), ], ), - const SizedBox(height: Constants.SPACING,), Row( children: [ @@ -304,7 +300,7 @@ class _BPMonitorScreenState extends ConsumerState { Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status,), ),) ], ), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Wrap( spacing: 1, runSpacing: 16, @@ -312,7 +308,7 @@ class _BPMonitorScreenState extends ConsumerState { TrendChartScreen(data: chatData,) ], ), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Card( color: Constants.bgColor, child: ListTile( @@ -323,7 +319,7 @@ class _BPMonitorScreenState extends ConsumerState { }, ), ), - SizedBox(height: Constants.SPACING,), + const SizedBox(height: Constants.SPACING,), Container( decoration: BoxDecoration( color: Constants.bgColor, From 23d69d6f5599e5fa0357a6f0ee759d2d1d380975 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 28 Oct 2024 19:16:45 +0300 Subject: [PATCH 115/140] :construction: Start my clinic card ref --- .../boldDuotoneFoldersFolderPathConnect.svg | 5 + assets/images/boldDuotoneMedicineBone.svg | 4 + .../images/boldDuotoneMedicineHeartPulse2.svg | 4 + .../images/boldDuotoneMedicineJarOfPills2.svg | 8 + .../images/boldDuotoneMedicineStethoscope.svg | 5 + assets/images/boldDuotoneMedicineSyringe.svg | 7 + assets/images/boldDuotoneMedicineTestTube.svg | 6 + assets/images/boldDuotoneMedicineVirus.svg | 13 ++ .../presentation/pages/ClinicCardScreen.dart | 211 ++++++++++-------- .../presentation/widgets/shr_list.dart | 72 ++++++ .../presentation/widgets/health_list.dart | 11 + lib/src/utils/constants.dart | 1 + 12 files changed, 257 insertions(+), 90 deletions(-) create mode 100644 assets/images/boldDuotoneFoldersFolderPathConnect.svg create mode 100644 assets/images/boldDuotoneMedicineBone.svg create mode 100644 assets/images/boldDuotoneMedicineHeartPulse2.svg create mode 100644 assets/images/boldDuotoneMedicineJarOfPills2.svg create mode 100644 assets/images/boldDuotoneMedicineStethoscope.svg create mode 100644 assets/images/boldDuotoneMedicineSyringe.svg create mode 100644 assets/images/boldDuotoneMedicineTestTube.svg create mode 100644 assets/images/boldDuotoneMedicineVirus.svg create mode 100644 lib/src/features/clinic_card/presentation/widgets/shr_list.dart diff --git a/assets/images/boldDuotoneFoldersFolderPathConnect.svg b/assets/images/boldDuotoneFoldersFolderPathConnect.svg new file mode 100644 index 00000000..b9fc51fe --- /dev/null +++ b/assets/images/boldDuotoneFoldersFolderPathConnect.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/boldDuotoneMedicineBone.svg b/assets/images/boldDuotoneMedicineBone.svg new file mode 100644 index 00000000..5f4de829 --- /dev/null +++ b/assets/images/boldDuotoneMedicineBone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/boldDuotoneMedicineHeartPulse2.svg b/assets/images/boldDuotoneMedicineHeartPulse2.svg new file mode 100644 index 00000000..80887742 --- /dev/null +++ b/assets/images/boldDuotoneMedicineHeartPulse2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/boldDuotoneMedicineJarOfPills2.svg b/assets/images/boldDuotoneMedicineJarOfPills2.svg new file mode 100644 index 00000000..4828b2df --- /dev/null +++ b/assets/images/boldDuotoneMedicineJarOfPills2.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/boldDuotoneMedicineStethoscope.svg b/assets/images/boldDuotoneMedicineStethoscope.svg new file mode 100644 index 00000000..4b692319 --- /dev/null +++ b/assets/images/boldDuotoneMedicineStethoscope.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/boldDuotoneMedicineSyringe.svg b/assets/images/boldDuotoneMedicineSyringe.svg new file mode 100644 index 00000000..805439bd --- /dev/null +++ b/assets/images/boldDuotoneMedicineSyringe.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/boldDuotoneMedicineTestTube.svg b/assets/images/boldDuotoneMedicineTestTube.svg new file mode 100644 index 00000000..aa54bbd4 --- /dev/null +++ b/assets/images/boldDuotoneMedicineTestTube.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/boldDuotoneMedicineVirus.svg b/assets/images/boldDuotoneMedicineVirus.svg new file mode 100644 index 00000000..89a0b4e0 --- /dev/null +++ b/assets/images/boldDuotoneMedicineVirus.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index ca11e178..96d634a8 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -1,15 +1,13 @@ -import 'dart:developer'; - +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/clinic_card/data/providers/programProvider.dart'; -import 'package:nishauri/src/features/clinic_card/presentation/widgets/clinicalDetails.dart'; -import 'package:nishauri/src/shared/display/CustomTabBar.dart'; +import 'package:nishauri/src/features/self_screening/presentation/widgets/health_list.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; import '../../../user_programs/data/providers/program_provider.dart'; @@ -22,114 +20,147 @@ class ClinicCardScreen extends HookConsumerWidget { final programAsync = ref.watch(programProvider); final userPrograms = ref.watch(userProgramProvider); + final List items = [ + "All Records", + "Allergies", + "Conditions", + "Immunizations", + "Lab Results", + "Medications", + "Procedures", + "Vitals" + ]; + + final List icons = [ + "assets/images/boldDuotoneFoldersFolderPathConnect.svg", + "assets/images/boldDuotoneMedicineVirus.svg", + "assets/images/boldDuotoneMedicineStethoscope.svg", + "assets/images/boldDuotoneMedicineSyringe.svg", + "assets/images/boldDuotoneMedicineTestTube.svg", + "assets/images/boldDuotoneMedicineJarOfPills2.svg", + "assets/images/boldDuotoneMedicineBone.svg", + "assets/images/boldDuotoneMedicineHeartPulse2.svg" + ]; + + final List paths = [ + RouteNames.BLOOD_PRESSURE, + RouteNames.BLOOD_SUGAR, + ]; + void _reloadData() { ref.refresh(programProvider); ref.refresh(userProgramProvider); } - final currIndex = useState(0); return programAsync.when( data: (data) { - final activePrograms = data.where((element) { - if (userPrograms.hasValue) { - return userPrograms.value! - .where((e) => element.name == e.program_name && e.isActive) - .isNotEmpty; - } - return false; + final activePrograms = data.where((program) { + return userPrograms.hasValue && userPrograms.value!.any( + (userProgram) => userProgram.program_name == program.name && userProgram.isActive + ); }); - // Check if the data list is empty + if (activePrograms.isEmpty) { - return BackgroundImageWidget( - customAppBar: CustomAppBar( - title: "My Clinic Card 🎫", - // icon: Icons.file_present, - subTitle: "Access medical services using \nyour clinic cards", - color: Colors.blue[900], - ), - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No programs available", - floatingButtonIcon1: Icons.refresh, - floatingButtonAction1: () { - _reloadData(); - }, - ); + return _buildEmptyState(context, _reloadData); } - final screens = activePrograms - .map((program) => ClinicalDetailsTab(program: program)); return Scaffold( body: Column( children: [ - CustomAppBar( - title: "My Clinic Card 🎫", - // icon: Icons.file_present, - color: Colors.blue[900], - subTitle: "Access medical services using \nyour clinic cards", + const CustomAppBar( + title: "My Clinic Card 👨🏾‍💼", + color: Constants.clinicCardBgColor, + subTitle: "Access all your medical details", ), - CustomTabBar( - onTap: (item, index) { - currIndex.value = index; - }, - activeColor: Constants.clinicCardColor, - items: activePrograms - .map( - (program) => CustomTabBarItem( - title: program.name, - icon: Icons.multiple_stop, - ), + Expanded( + child: SingleChildScrollView( + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + children: [Text("Health Records", style: theme.textTheme.titleMedium), + ] + ), + const SizedBox(height: 10), + ItemList(items: items, path: paths, svgAsset: icons), + const SizedBox(height: 10), + Row( + children: [Text("Programs", style: theme.textTheme.titleMedium), + ] + ), + ItemList(items: items, path: paths), + ], + ), + ), + ], ) - .toList(), - activeIndex: currIndex.value, + ), ), - Expanded(child: screens.elementAt(currIndex.value)) ], ), - floatingActionButton: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - FloatingActionButton( - onPressed: _reloadData, - child: Icon(Icons.refresh), - heroTag: null, - ), - ], + floatingActionButton: FloatingActionButton( + onPressed: _reloadData, + child: const Icon(Icons.refresh), + tooltip: 'Refresh Data', ), ); }, - error: (error, _) => BackgroundImageWidget( - customAppBar: CustomAppBar( - title: "My Clinic Card 🎫", - // icon: Icons.file_present, - subTitle: "Access medical services using \nyour clinic cards", - color: Colors.blue[900], - ), - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: error.toString(), - floatingButtonIcon1: Icons.refresh, - floatingButtonAction1: () { - _reloadData(); - }, + error: (error, _) => _buildErrorState(context, error.toString(), _reloadData), + loading: () => _buildLoadingState(context, theme), + ); + } + + Widget _buildEmptyState(BuildContext context, VoidCallback reload) { + return BackgroundImageWidget( + customAppBar: const CustomAppBar( + title: "My Clinic Card 👨🏾‍💼", + color: Constants.clinicCardBgColor, + subTitle: "Access all your medical details", ), - loading: () => Scaffold( - body: Column( - // mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - CustomAppBar( - title: "My Clinic Card 🎫", - // icon: Icons.file_present, - color: Colors.blue[900], - subTitle: "Access medical services using \nyour clinic cards", - ), - Text( - "Loading Programs", - style: theme.textTheme.headline6, - ), - const SizedBox(height: Constants.SPACING * 2), - const CircularProgressIndicator(), - ], - ), + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No programs available", + floatingButtonIcon1: Icons.refresh, + floatingButtonAction1: reload, + ); + } + + Widget _buildErrorState(BuildContext context, String error, VoidCallback reload) { + return BackgroundImageWidget( + customAppBar: const CustomAppBar( + title: "My Clinic Card 👨🏾‍💼", + color: Constants.clinicCardBgColor, + subTitle: "Access all your medical details", + ), + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: error, + floatingButtonIcon1: Icons.refresh, + floatingButtonAction1: reload, + ); + } + + Widget _buildLoadingState(BuildContext context, ThemeData theme) { + return Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const CustomAppBar( + title: "My Clinic Card 👨🏾‍💼", + color: Constants.clinicCardBgColor, + subTitle: "Access all your medical details", + ), + Text( + "Loading Programs", + style: theme.textTheme.headline6, + ), + const SizedBox(height: Constants.SPACING * 2), + const CircularProgressIndicator(), + ], ), ); } diff --git a/lib/src/features/clinic_card/presentation/widgets/shr_list.dart b/lib/src/features/clinic_card/presentation/widgets/shr_list.dart new file mode 100644 index 00000000..30c14f7e --- /dev/null +++ b/lib/src/features/clinic_card/presentation/widgets/shr_list.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/program.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class HealthRecord extends StatelessWidget { + // final Program program; + // const HealthRecord({Key? key, required this.program}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Column( + children: [ + // ListTile( + // title: Text(program.name), + // // subtitle: Text('Facility Name: ${program.facility_name}'), + // ), + Expanded( + child: ListView.builder( + // itemCount: program.obs.length, + itemCount: 7, + itemBuilder: (BuildContext context, int index) { + // final observations = program.obs[index]; + return Column( + children: [ + const Divider(), + ListTile( + leading: SvgPicture.asset( + "assets/images/boldDuotoneFoldersFolderPathConnect.svg", + width: 20, + height: 20, + ), + title: Text("All Records", style: theme.textTheme.titleMedium,), + trailing: const Icon(Icons.chevron_right), + // title: Card( + // child: Padding( + // padding: const EdgeInsets.all(Constants.SPACING), + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Text( + // observations.label, + // style: theme.textTheme.headline6, + // overflow: TextOverflow.ellipsis, + // maxLines: 1, + // ), + // const SizedBox(height: Constants.SPACING), + // Row( + // children: [ + // Icon( + // Icons.diamond_outlined, + // color: theme.colorScheme.primary, + // ), + // const SizedBox(width: Constants.SPACING), + // Text(observations.value?? "",), + // ], + // ), + // ], + // ), + // ), + // ), + ), + ], + ); + }, + ), + ), + ], + ); + } +} diff --git a/lib/src/features/self_screening/presentation/widgets/health_list.dart b/lib/src/features/self_screening/presentation/widgets/health_list.dart index 3ab95dc6..0ff2aa4f 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_list.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_list.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:nishauri/src/utils/constants.dart'; @@ -6,16 +7,19 @@ class ItemList extends StatelessWidget { final List items; final Color backgroundColor; final List path; + final List? svgAsset; const ItemList({ Key? key, required this.items, required this.path, + this.svgAsset, this.backgroundColor = Constants.bgColor, }) : super(key: key); @override Widget build(BuildContext context) { final height = 100 + (items.length - 1) * 70 + 5; + print(svgAsset); return Container( color: backgroundColor, @@ -29,6 +33,13 @@ class ItemList extends StatelessWidget { itemBuilder: (context, index) { if (index < items.length) { return ListTile( + leading: svgAsset != null + ? SvgPicture.asset( + svgAsset![index], + width: 20, + height: 20, + ) + : null, title: Text(items[index]), onTap: () { context.goNamed(path[index]); diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index 45558b57..271c8403 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -50,4 +50,5 @@ class Constants { static const bgColor = Color.fromARGB(255, 245, 245, 245); static const barColor = Color.fromARGB(255, 4, 191, 218); static const white = Color.fromARGB(255, 255, 255, 255); + static const clinicCardBgColor = Color.fromARGB(255, 0, 122, 141); } From a9a846948f30aac9180f4c97deda708d3420e09e Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 28 Oct 2024 22:34:14 +0300 Subject: [PATCH 116/140] Add health record screen --- lib/src/app/navigation/app_router.dart | 10 + .../presentation/pages/ClinicCardScreen.dart | 2 +- .../presentation/widgets/health_record.dart | 178 ++++++++++++++++++ .../presentation/widgets/shr_list.dart | 72 ------- lib/src/utils/routes.dart | 1 + 5 files changed, 190 insertions(+), 73 deletions(-) create mode 100644 lib/src/features/clinic_card/presentation/widgets/health_record.dart delete mode 100644 lib/src/features/clinic_card/presentation/widgets/shr_list.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index c2c23a75..36e9c862 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -19,6 +19,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerificationScreen import 'package:nishauri/src/features/auth/presentation/pages/VerifiedResetPassword.dart'; import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswordScreen.dart'; import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; +import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorScreen.dart'; @@ -358,6 +359,15 @@ final List secureRoutes = [ builder: (BuildContext context, GoRouterState state) { return const ClinicCardScreen(); }, + routes: [ + GoRoute( + name: RouteNames.HEALTH_RECORD, + path: 'health-record', + builder: (BuildContext context, GoRouterState state) { + return const HealthRecord(); + }, + ), + ] ), GoRoute( name: RouteNames.DAWA_DROP, diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 96d634a8..f1154ff4 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -44,7 +44,7 @@ class ClinicCardScreen extends HookConsumerWidget { final List paths = [ RouteNames.BLOOD_PRESSURE, - RouteNames.BLOOD_SUGAR, + RouteNames.HEALTH_RECORD, ]; void _reloadData() { diff --git a/lib/src/features/clinic_card/presentation/widgets/health_record.dart b/lib/src/features/clinic_card/presentation/widgets/health_record.dart new file mode 100644 index 00000000..11cbd80b --- /dev/null +++ b/lib/src/features/clinic_card/presentation/widgets/health_record.dart @@ -0,0 +1,178 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/daily_card.dart'; +import 'package:nishauri/src/shared/input/Button.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class HealthRecord extends StatelessWidget { + const HealthRecord({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: 120, + smallTitle: "Allergies", + rightBtTitle: "", + ), + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildButtonRow(), + const SizedBox(height: Constants.SPACING), + _buildDateRow("16 October 2024", theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow("KENYATTA NATIONAL HOSPITAL", theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + const SizedBox(height: Constants.SPACING), + _buildListView(theme), + ], + ), + ), + ), + ], + ), + ); + } + + Widget _buildButtonRow() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Constants.bgColor, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.3), + spreadRadius: 2, + blurRadius: 5, + offset: const Offset(0, 3), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + HealthButton(title: "Last Update", color: Constants.bgColor), + HealthButton(title: "A - Z", color: Constants.bgColor), + ], + ), + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(date, style: theme.textTheme.titleMedium), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(hospital, style: theme.textTheme.titleLarge), + ], + ); + } + + Widget _buildListView(ThemeData theme) { + return ListView.builder( + itemCount: 3, // Adjust item count based on your data + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return ListTile( + title: Card( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildAllergyRow(theme), + _buildSeverityRow(theme), + ], + ), + ), + ], + ), + ), + ), + ); + }, + ); + } + + Widget _buildAllergyRow(ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneFoldersFolderPathConnect.svg", + width: 20, + height: 20, + ), + const SizedBox(width: Constants.SPACING), + Text("Allergies", style: theme.textTheme.titleMedium), + Spacer(), + TextButton( + onPressed: () {}, + child: const Icon(Icons.chevron_right), + ), + ], + ); + } + + Widget _buildSeverityRow(ThemeData theme) { + return Row( + children: [ + Text("Mild", style: theme.textTheme.bodyMedium), + ], + ); + } +} + +class HealthButton extends StatelessWidget { + final String title; + final Color? color; + + const HealthButton({Key? key, required this.title, this.color}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width * 0.47, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: color, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.3), + spreadRadius: 2, + blurRadius: 5, + offset: const Offset(0, 3), + ), + ], + ), + child: Button( + title: title, + backgroundColor: color, + titleStyle: TextStyle(color: Colors.black54), + onPress: () {}, + ), + ); + } +} diff --git a/lib/src/features/clinic_card/presentation/widgets/shr_list.dart b/lib/src/features/clinic_card/presentation/widgets/shr_list.dart deleted file mode 100644 index 30c14f7e..00000000 --- a/lib/src/features/clinic_card/presentation/widgets/shr_list.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:nishauri/src/features/clinic_card/data/models/program.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class HealthRecord extends StatelessWidget { - // final Program program; - // const HealthRecord({Key? key, required this.program}) : super(key: key); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - children: [ - // ListTile( - // title: Text(program.name), - // // subtitle: Text('Facility Name: ${program.facility_name}'), - // ), - Expanded( - child: ListView.builder( - // itemCount: program.obs.length, - itemCount: 7, - itemBuilder: (BuildContext context, int index) { - // final observations = program.obs[index]; - return Column( - children: [ - const Divider(), - ListTile( - leading: SvgPicture.asset( - "assets/images/boldDuotoneFoldersFolderPathConnect.svg", - width: 20, - height: 20, - ), - title: Text("All Records", style: theme.textTheme.titleMedium,), - trailing: const Icon(Icons.chevron_right), - // title: Card( - // child: Padding( - // padding: const EdgeInsets.all(Constants.SPACING), - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // Text( - // observations.label, - // style: theme.textTheme.headline6, - // overflow: TextOverflow.ellipsis, - // maxLines: 1, - // ), - // const SizedBox(height: Constants.SPACING), - // Row( - // children: [ - // Icon( - // Icons.diamond_outlined, - // color: theme.colorScheme.primary, - // ), - // const SizedBox(width: Constants.SPACING), - // Text(observations.value?? "",), - // ], - // ), - // ], - // ), - // ), - // ), - ), - ], - ); - }, - ), - ), - ], - ); - } -} diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 716b1eff..3a8888ae 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -45,6 +45,7 @@ class RouteNames { static const LAB_RESULTS = "lab-results"; static const MY_CLINIC_CARD = "clinic-card"; + static const HEALTH_RECORD = "health-record"; static const CHAT_BOT = "chat-bot"; static const SETTINGS = "settings"; From e12882b62c6664c939e132a3e2ed57bfcd4547d6 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 29 Oct 2024 14:49:52 +0300 Subject: [PATCH 117/140] Add validations BS --- lib/src/app/navigation/menu/menuItems.dart | 40 +-- .../presentation/pages/BloodSugarScreen.dart | 310 ++++++++---------- .../presentation/pages/bs_input_screen.dart | 115 ++++--- .../pages/bs_line_list_Screen.dart | 67 +++- .../presentation/pages/BPLinelistScreen.dart | 4 +- .../presentation/pages/bpMonitorScreen.dart | 169 +--------- .../pages/trend_chart_screen.dart | 4 +- .../pages/self_screening_menu.dart | 15 +- 8 files changed, 298 insertions(+), 426 deletions(-) diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 002dbfe1..70923f17 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -297,26 +297,26 @@ List getPatientModules(BuildContext context) { onPressed: () => context.goNamed(RouteNames.DAWA_DROP), color: Constants.dawaDropColor.withOpacity(0.5), ), - - MenuItem( - icon: SvgPicture.asset( - "assets/images/calendar.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 80, - width: 80, - ), - shortcutIcon: SvgPicture.asset( - "assets/images/calendar.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize, - ), - title: "Location selection", - onPressed: () => context.goNamed(RouteNames.LOCATION_SELECTION), - color: Constants.appointmentsColor, - ), + // + // MenuItem( + // icon: SvgPicture.asset( + // "assets/images/calendar.svg", + // semanticsLabel: "Doctors", + // fit: BoxFit.contain, + // height: 80, + // width: 80, + // ), + // shortcutIcon: SvgPicture.asset( + // "assets/images/calendar.svg", + // semanticsLabel: "Doctors", + // fit: BoxFit.contain, + // width: Constants.shortcutIconSize, + // height: Constants.shortcutIconSize, + // ), + // title: "Location selection", + // onPressed: () => context.goNamed(RouteNames.LOCATION_SELECTION), + // color: Constants.appointmentsColor, + // ), ]; } diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart index 3533795a..7642617d 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -1,8 +1,5 @@ - import 'package:fl_chart/fl_chart.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; @@ -46,28 +43,22 @@ class _BloodSugarScreenState extends ConsumerState { } String _getBloodSugarStatus(double level, String condition) { - if (condition == 'Fasting (before meals)'){ - if (level < 100) { - return 'Normal'; - } else if (100 <= level && level < 126) { - return 'Impaired Fasting'; - } - else { - return 'Diabetes'; - } - } - else if (condition == 'Postprandial (after meals)'){ - if (level < 140) { - return 'Normal'; - } else if (140 <= level && level < 200) { - return 'Impaired Glucose Tolerance'; - } - else { - return 'Diabetes'; - } - } else { - return 'Invalid condition'; + if (level > 30) level /= 18.0; + + if (condition == 'Fasting (before meals)') { + if (level < 5.6) return 'Normal'; + if (level < 7.0) return 'Impaired Fasting'; + return 'Diabetes'; + } else if (condition == 'Postprandial (after meals)') { + if (level < 7.8) return 'Normal'; + if (level < 11.1) return 'Impaired Glucose Tolerance'; + return 'Diabetes'; } + return 'Invalid condition'; + } + + double _convertToMMOL(double level) { + return level > 30 ? double.parse((level / 18.0).toStringAsFixed(1)) : level; } @override @@ -76,44 +67,45 @@ class _BloodSugarScreenState extends ConsumerState { final adviceAsync = ref.watch(bloodSugarListAdviceProvider); final theme = Theme.of(context); - - final data = bloodSugarListProvider.when( data: (data) { data.sort((a, b) => b.created_at.compareTo(a.created_at)); - return data ?? []; - }, - error: (error, _) { - return []; - }, - loading: () { - return []; + return data; }, + error: (_, __) => [], + loading: () => [], ); final displayedData = data.isNotEmpty ? data.first : null; + if (displayedData == null) return Center(child: CircularProgressIndicator()); final status = _getBloodSugarStatus(displayedData.level, displayedData.condition); - final advice = adviceAsync.when( - data: (adviceData) => adviceData.firstWhere( - (ad) => ad.label == status, - // orElse: () => null, - ).advice ?? 'No advice available', - error: (error, _) => 'Error loading advice', + data: (adviceData) => adviceData.firstWhere((ad) => ad.label == status).advice ?? 'No advice available', + error: (_, __) => 'Error loading advice', loading: () => 'Loading advice...', ); - final dataPoints = data.asMap().entries.map((entry) { - final index = entry.key.toDouble(); - final systolic = entry.value.level; - return FlSpot(index, systolic); - }).toList(); + final data2 = bloodSugarListProvider.when( + data: (data) { + // Sort the data by created_at date in ascending order + data.sort((a, b) => a.created_at.compareTo(b.created_at)); + + // Return the last five entries (or all if there are less than five) + return data.length > 5 ? data.sublist(data.length - 5) : data; + }, + error: (_, __) => [], + loading: () => [], + ); + - final dateTimeList = data.asMap().entries.map((e) { - return e.value.created_at.toString(); + + final dataPoints = data2.asMap().entries.map((entry) { + return FlSpot(entry.key.toDouble(), _convertToMMOL(entry.value.level)); }).toList(); + final dateTimeList = data2.map((e) => e.created_at.toString()).toList(); + return Scaffold( body: Column( children: [ @@ -126,135 +118,52 @@ class _BloodSugarScreenState extends ConsumerState { ), Expanded( child: SingleChildScrollView( - child: Stack( - children: [ - Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Wrap( - spacing: 16, - runSpacing: 16, - children: [ - FilterCard( - onPressed: _changeColor, - ), - ], - ), - const SizedBox(height: Constants.SPACING,), - Row( - children: [ - Text("Last Record Date:", style: theme.textTheme.bodyLarge), - const SizedBox(width: 4), - Text(DateFormat('dd MMM yyyy').format(displayedData!.created_at), style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), - ], - ), - - const SizedBox(height: Constants.SPACING,), - Row( - children: [ - Text("${displayedData.level}", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), - const SizedBox(width: 4), - Text("MM/GH", style: theme.textTheme.bodyMedium), - const SizedBox(width: 4,), - Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status,), ),) - ], - ), - const SizedBox(height: Constants.SPACING), - Text(displayedData.condition, style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold, color: Colors.blueGrey),), - const SizedBox(height: Constants.SPACING,), - Wrap( - spacing: 1, - runSpacing: 16, - children: [ - CustomFilterLineChart( - dataPoints: dataPoints, - dateTimes: dateTimeList, - gradientColors: [ - Constants.bloodSugarColor, - Constants.bloodSugarColor.withOpacity(0.3), - ], - minX: 0, - maxX: data.length.toDouble() - 1, - minY: 40.0, - maxY: 400.0, - leftTile: false, - bottomTile: true, - interval: 80, - // dateFormat: "HH:mm-dd", - filter: "Daily", - barColor: Constants.barColor, - ), - ], - ), - const SizedBox(height: Constants.SPACING,), - Card( - color: Constants.bgColor, - child: ListTile( - title: Text("Show All Data", style: theme.textTheme.titleSmall!.copyWith(fontWeight: FontWeight.bold),), - trailing: const Icon(Icons.arrow_forward_ios_outlined), - onTap: (){ - context.goNamed(RouteNames.BLOOD_SUGAR_RECORDS, extra: data); - }, - ), - ), - const SizedBox(height: Constants.SPACING,), - Container( - color: Constants.bgColor, - // height: 250, - child: Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ListTile( - title: Row( - children: [ - Text( - 'Your Blood Sugar Levels are ', - style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), - ), - const SizedBox(width: 4,), - Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: Colors.green),), - const SizedBox(height: Constants.SPACING,), - ], - ), - subtitle: Text( - advice, - style: theme.textTheme.bodyMedium, - ), - ), - ], - ), - ), - ), - ), - const SizedBox(height: Constants.SPACING), - Button( - title: "More Insight", - onPress: (){ - context.goNamed(RouteNames.BLOOD_SUGAR_INSIGHT); - }, - textColor: Constants.selfScreeningBgColor, - // onPressed: () { - // // implement on Pressed - // }, - // child: Text('More Insight', style: theme.textTheme.bodyLarge!.copyWith(color: Constants.selfScreeningBgColor)), - // style: TextButton.styleFrom( - // backgroundColor: Constants.bgColor, - // padding: EdgeInsets.all(10), - // shape: RoundedRectangleBorder( - // borderRadius: BorderRadius.circular(8), // Rounded corners - // ), - // ), - ), - + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + spacing: 16, + runSpacing: 16, + children: [FilterCard(onPressed: _changeColor)], + ), + const SizedBox(height: Constants.SPACING), + _buildLastRecordRow(displayedData, theme), + const SizedBox(height: Constants.SPACING), + _buildBloodSugarLevelRow(displayedData, status, theme), + const SizedBox(height: Constants.SPACING), + Text(displayedData.condition, style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold, color: Colors.blueGrey)), + const SizedBox(height: Constants.SPACING), + CustomFilterLineChart( + dataPoints: dataPoints, + dateTimes: dateTimeList, + gradientColors: [ + Constants.bloodSugarColor, + Constants.bloodSugarColor.withOpacity(0.3), ], + minX: 0, + maxX: data2.length.toDouble() - 1, + minY: 0.0, + maxY: 30.0, + leftTile: true, + bottomTile: true, + interval: 5, + filter: "Daily", + barColor: Constants.barColor, + ), + const SizedBox(height: Constants.SPACING), + _buildShowAllDataCard(data, theme), + const SizedBox(height: Constants.SPACING), + _buildAdviceCard(advice, status, theme), + const SizedBox(height: Constants.SPACING), + Button( + title: "More Insight", + onPress: () => context.goNamed(RouteNames.BLOOD_SUGAR_INSIGHT), + textColor: Constants.selfScreeningBgColor, ), - ), - ], + ], + ), ), ), ), @@ -262,4 +171,59 @@ class _BloodSugarScreenState extends ConsumerState { ), ); } + + Row _buildLastRecordRow(displayedData, ThemeData theme) { + return Row( + children: [ + Text("Last Record Date:", style: theme.textTheme.bodyLarge), + const SizedBox(width: 4), + Text(DateFormat('dd MMM yyyy').format(displayedData.created_at), style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), + ], + ); + } + + Row _buildBloodSugarLevelRow(displayedData, String status, ThemeData theme) { + return Row( + children: [ + Text("${_convertToMMOL(displayedData.level)}", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), + const SizedBox(width: 4), + Text("MMOL/L", style: theme.textTheme.bodyMedium), + const SizedBox(width: 4), + Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status))), + ], + ); + } + + Card _buildShowAllDataCard(List data, ThemeData theme) { + return Card( + color: Constants.bgColor, + child: ListTile( + title: Text("Show All Data", style: theme.textTheme.titleSmall!.copyWith(fontWeight: FontWeight.bold)), + trailing: const Icon(Icons.arrow_forward_ios_outlined), + onTap: () => context.goNamed(RouteNames.BLOOD_SUGAR_RECORDS, extra: data), + ), + ); + } + + Container _buildAdviceCard(String advice, String status, ThemeData theme) { + return Container( + color: Constants.bgColor, + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: ListTile( + title: Row( + children: [ + Text( + 'Your Blood Sugar Levels are ', + style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox(width: 4), + Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: Colors.green)), + ], + ), + subtitle: Text(advice, style: theme.textTheme.bodyMedium), + ), + ), + ); + } } diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart index 658c6d65..b7a76c46 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart @@ -18,7 +18,7 @@ class _BloodSugarInputsState extends ConsumerState { final TextEditingController _dateController = TextEditingController(); final TextEditingController _timeController = TextEditingController(); final TextEditingController _notesController = TextEditingController(); - final TextEditingController _bloodGlucoseController = TextEditingController(text: "100"); + final TextEditingController _bloodGlucoseController = TextEditingController(text: "5.0"); final TextEditingController _conditionController = TextEditingController(); final List _dropdownOptions = [ @@ -66,13 +66,13 @@ class _BloodSugarInputsState extends ConsumerState { ref.refresh(bloodSugarProvider); } - void _submitData(double level){ + void _submitData(double level) { final String notes = _notesController.text; final condition = _conditionController.text; final DateTime measurementTime = DateTime.now(); final bs = BloodSugar( level: level, - condition: condition??'', + condition: condition, created_at: measurementTime, notes: notes, ); @@ -82,7 +82,6 @@ class _BloodSugarInputsState extends ConsumerState { SnackBar(content: Text(value)), ); _reloadData(); - // _clearForm(systolic, diastolic, heartRate, notesController); Navigator.of(context).pop(); }).catchError((error) { ScaffoldMessenger.of(context).showSnackBar( @@ -95,53 +94,68 @@ class _BloodSugarInputsState extends ConsumerState { final level = double.tryParse(_bloodGlucoseController.text); final condition = _conditionController.text; - if (level != null && level > 0) { - _submitData(level); + if (_dateController.text.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please select a date.')), + ); + return; + } + + if (_timeController.text.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please select a time.')), + ); + return; + } + + if (level == null || level <= 0 || level > 30) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Please enter valid blood sugar readings (0 < level ≤ 30).')), + ); + return; + } - bool isHigh = false; - bool isLow = false; + _submitData(level); - if (condition == "Fasting (before meals)") { - if (level > 100) { - isHigh = true; - } else if (level < 70) { - isLow = true; - } - } else if (condition == "Postprandial (after meals)") { - if (level > 140) { - isHigh = true; - } else if (level < 90) { - isLow = true; - } + bool isHigh = false; + bool isLow = false; + + if (condition == "Fasting (before meals)") { + if (level > 5.6) { + isHigh = true; + } else if (level < 3.9) { + isLow = true; } - if (isHigh) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Warning: High blood sugar detected!'), - backgroundColor: Colors.red, - ), - ); - } else if (isLow) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Warning: Low blood sugar detected!'), - backgroundColor: Colors.red, - ), - ); + } else if (condition == "Postprandial (after meals)") { + if (level > 7.8) { + isHigh = true; + } else if (level < 5.0) { + isLow = true; } + } + if (isHigh) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Data saved: $level mg/dL with condition ${_conditionController.text} on ${_dateController.text} at ${_timeController.text}'), + const SnackBar( + content: Text('Warning: High blood sugar detected!'), + backgroundColor: Colors.red, ), ); - } else { + } else if (isLow) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Please enter valid blood sugar readings.')), + const SnackBar( + content: Text('Warning: Low blood sugar detected!'), + backgroundColor: Colors.red, + ), ); } - } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Data saved: $level mg/dL with condition $condition on ${_dateController.text} at ${_timeController.text}'), + ), + ); + } @override Widget build(BuildContext context) { @@ -152,12 +166,11 @@ class _BloodSugarInputsState extends ConsumerState { const CustomAppBar( color: Constants.selfScreeningBgColor, height: 120, - smallTitle: "Blood Pressure Input", + smallTitle: "Blood Sugar Input", rightBtTitle: "Add Data", ), Padding( padding: const EdgeInsets.all(16.0), - // main container child: Container( padding: const EdgeInsets.all(Constants.SPACING), decoration: BoxDecoration( @@ -171,13 +184,13 @@ class _BloodSugarInputsState extends ConsumerState { mainAxisAlignment: MainAxisAlignment.start, children: [ Container( - width: MediaQuery.of(context).size.width *0.9, + width: MediaQuery.of(context).size.width * 0.9, decoration: BoxDecoration( color: Constants.white, borderRadius: BorderRadius.circular(1), border: Border.all(color: Constants.bgColor), ), - child: Text("mg/dL", style: theme.textTheme.bodyLarge,), + child: Text("mmol/L", style: theme.textTheme.bodyLarge), ), ], ), @@ -186,7 +199,7 @@ class _BloodSugarInputsState extends ConsumerState { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Date:", style: theme.textTheme.bodyLarge,), + Text("Date:", style: theme.textTheme.bodyLarge), GestureDetector( onTap: () => _selectDate(context), child: AbsorbPointer( @@ -213,7 +226,7 @@ class _BloodSugarInputsState extends ConsumerState { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Time:", style: theme.textTheme.bodyLarge), + Text("Time:", style: theme.textTheme.bodyLarge), GestureDetector( onTap: () => _selectTime(context), child: AbsorbPointer( @@ -240,7 +253,7 @@ class _BloodSugarInputsState extends ConsumerState { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Blood Sugar Level", style: theme.textTheme.bodyLarge), + Text("Blood Sugar Level", style: theme.textTheme.bodyLarge), Container( padding: const EdgeInsets.all(Constants.SPACING), decoration: BoxDecoration( @@ -263,7 +276,7 @@ class _BloodSugarInputsState extends ConsumerState { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Meal Time", style: theme.textTheme.bodyLarge,), + Text("Meal Time", style: theme.textTheme.bodyLarge), Container( padding: const EdgeInsets.all(Constants.SPACING), decoration: BoxDecoration( @@ -285,7 +298,6 @@ class _BloodSugarInputsState extends ConsumerState { ), enabledBorder: const OutlineInputBorder( borderSide: BorderSide(color: Constants.white), - // borderRadius: BorderRadius.all(Radius.circular(15)), ), focusedBorder: const OutlineInputBorder( borderSide: BorderSide(color: Constants.white), @@ -308,7 +320,6 @@ class _BloodSugarInputsState extends ConsumerState { }).toList(); }, ), - // FormBuilderDropdown( ), ), ), @@ -318,7 +329,6 @@ class _BloodSugarInputsState extends ConsumerState { const Divider(), Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ Container( padding: const EdgeInsets.all(Constants.SPACING), @@ -327,7 +337,7 @@ class _BloodSugarInputsState extends ConsumerState { borderRadius: BorderRadius.circular(15), border: Border.all(color: Constants.bgColor), ), - width: MediaQuery.of(context).size.width *0.9, + width: MediaQuery.of(context).size.width * 0.9, child: TextFormField( style: theme.textTheme.bodyMedium!.copyWith(decoration: null), controller: _notesController, @@ -351,7 +361,6 @@ class _BloodSugarInputsState extends ConsumerState { keyboardType: TextInputType.text, maxLines: null, ), - ), ], ), @@ -359,7 +368,7 @@ class _BloodSugarInputsState extends ConsumerState { const Divider(), ElevatedButton( onPressed: _saveData, - child: const Text('Save Data', style: TextStyle(color: Constants.selfScreeningBgColor),), + child: const Text('Save Data', style: TextStyle(color: Constants.selfScreeningBgColor)), ), ], ), diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart index 25e9bfff..740face7 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart @@ -5,6 +5,7 @@ import 'package:nishauri/src/features/self_screening/blood_sugar/data/models/blo import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class BloodSugarRecords extends StatelessWidget { final List data; @@ -30,6 +31,55 @@ class BloodSugarRecords extends StatelessWidget { ); } + double _convertToMMOL(double level) { + if (level > 30) { + level = level / 18.0; + } + return double.parse(level.toStringAsFixed(1)); + } + + String _getBloodSugarStatus(double level, String condition) { + // If the level is greater than 30, assume it's in mg/dL and convert to mmol/L + if (level > 30) { + level = level / 18.0; + } + + if (condition == 'Fasting (before meals)') { + if (level < 5.6) { + return 'Normal'; + } else if (5.6 <= level && level < 7.0) { + return 'Impaired Fasting'; + } else { + return 'Diabetes'; + } + } else if (condition == 'Postprandial (after meals)') { + if (level < 7.8) { + return 'Normal'; + } else if (7.8 <= level && level < 11.1) { + return 'Impaired Glucose Tolerance'; + } else { + return 'Diabetes'; + } + } else { + return 'Invalid condition'; + } + } + + Color _getStatusColor(String status) { + switch (status) { + case 'Normal': + return Colors.green; + case 'Impaired fasting': + return Colors.yellow; + case 'Impaired Glucose Tolerance': + return Colors.orange; + case 'Diabetes': + return Colors.red; + default: + return Colors.black; + } + } + return Scaffold( body: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -38,7 +88,8 @@ class BloodSugarRecords extends StatelessWidget { color: Constants.selfScreeningBgColor, height: 120, smallTitle: "All Record Data", - rightBtTitle: "Edit", + rightBtTitle: "Add Data", + path: RouteNames.BLOOD_SUGAR_INPUT ), Expanded( child: Padding( @@ -57,6 +108,7 @@ class BloodSugarRecords extends StatelessWidget { itemCount: data.length, itemBuilder: (context, index) { final bs = data[index]; + final status = _getBloodSugarStatus(bs.level, bs.condition); return Column( children: [ ListTile( @@ -73,8 +125,8 @@ class BloodSugarRecords extends StatelessWidget { text: TextSpan( children: [ TextSpan( - text: '${bs.level}', - style: theme.textTheme.titleMedium + text: '${_convertToMMOL(bs.level)}', + style: theme.textTheme.titleMedium!.copyWith(color: _getStatusColor(status)) ), TextSpan( @@ -98,7 +150,14 @@ class BloodSugarRecords extends StatelessWidget { title: bs.condition != null && bs.condition!.isNotEmpty ? Text('Condition: ${bs.condition}') : null, - subtitle: bs.notes != null && bs.notes!.isNotEmpty ? Text('Notes: ${bs.notes}') : null, + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Your blood sugar level is ${_getBloodSugarStatus(bs.level, bs.condition)}", style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status)),), + const SizedBox(height: 10,), + Text('${bs.notes != null && bs.notes!.isNotEmpty ? 'Notes: ${bs.notes}': null}'), + ], + ), ), ], ), diff --git a/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart index 786b811d..b5c36b37 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart @@ -5,6 +5,7 @@ import 'package:nishauri/src/features/self_screening/bp/data/models/blood_pressu import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class BloodPressureRecords extends StatelessWidget { final List data; @@ -38,7 +39,8 @@ class BloodPressureRecords extends StatelessWidget { color: Constants.selfScreeningBgColor, height: 120, smallTitle: "All Record Data", - rightBtTitle: "Edit", + rightBtTitle: "Add Data", + path: RouteNames.BLOOD_PRESSURE_INPUT, ), Expanded( child: Padding( diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index d113b57c..7eedc6a7 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -21,174 +21,6 @@ class BPMonitorScreen extends ConsumerStatefulWidget { } class _BPMonitorScreenState extends ConsumerState { - // final _formKey = GlobalKey(); - // final _notesController = TextEditingController(); - // - // void _clearForm(double systolic, double diastolic, double heartRate, TextEditingController notesController) { - // setState(() { - // systolic = 120; - // diastolic = 80; - // heartRate = 70; - // notesController.clear(); - // }); - // } - - // void _submitData(BuildContext context, double systolic, double diastolic, double heartRate, TextEditingController notesController) { - // final String notes = notesController.text; - // final DateTime measurementTime = DateTime.now(); - // - // final bp = BloodPressure( - // systolic: systolic, - // diastolic: diastolic, - // pulse_rate: heartRate, - // created_at: measurementTime, - // notes: notes, - // ); - // - // ref.read(bloodPressureRepositoryProvider).saveBloodPressure(bp).then((value) { - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar(content: Text(value)), - // ); - // _reloadData(); - // _clearForm(systolic, diastolic, heartRate, notesController); - // Navigator.of(context).pop(); - // }).catchError((error) { - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar(content: Text(error)), - // ); - // }); - // } - - // String _getWarningText(String label, double value) { - // if (label == 'Systolic') { - // if (value < 90) return 'Systolic pressure is too low'; - // if (value > 140) return 'Systolic pressure is too high'; - // } else if (label == 'Diastolic') { - // if (value < 60) return 'Diastolic pressure is too low'; - // if (value > 90) return 'Diastolic pressure is too high'; - // } else if (label == 'Heart Rate') { - // if (value < 60) return 'Heart rate is too low'; - // if (value > 100) return 'Heart rate is too high'; - // } - // return ''; - // } - // - // Color _getSliderColor(String label, double value) { - // if (label == 'Systolic') { - // if (value < 90 || value > 140) return Colors.red; - // } else if (label == 'Diastolic') { - // if (value < 60 || value > 90) return Colors.orange; - // } else if (label == 'Heart Rate') { - // if (value < 60 || value > 100) return Colors.blue; - // } - // return Colors.green; - // } - // - // void _showDialogForm(BuildContext context) { - // double systolic = 120; - // double diastolic = 80; - // double heartRate = 70; - // final notesController = TextEditingController(); - // - // showDialog( - // context: context, - // builder: (BuildContext context) { - // return StatefulBuilder( - // builder: (context, setState) { - // return AlertDialog( - // title: Text('Enter Blood Pressure Data'), - // content: SingleChildScrollView( - // child: Form( - // key: _formKey, - // child: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // Text( - // 'Systolic Pressure (mmHg): ${systolic.toInt()}', - // style: TextStyle(color: _getSliderColor('Systolic', systolic)), - // ), - // Slider( - // value: systolic, - // min: 50, - // max: 200, - // divisions: 150, - // label: systolic.toInt().toString(), - // onChanged: (value) { - // setState(() { - // systolic = value; - // }); - // }, - // ), - // Text(_getWarningText('Systolic', systolic)), - // Text( - // 'Diastolic Pressure (mmHg): ${diastolic.toInt()}', - // style: TextStyle(color: _getSliderColor('Diastolic', diastolic)), - // ), - // Slider( - // value: diastolic, - // min: 30, - // max: 120, - // divisions: 90, - // label: diastolic.toInt().toString(), - // onChanged: (value) { - // setState(() { - // diastolic = value; - // }); - // }, - // ), - // Text(_getWarningText('Diastolic', diastolic)), - // Text( - // 'Heart Rate (bpm): ${heartRate.toInt()}', - // style: TextStyle(color: _getSliderColor('Heart Rate', heartRate)), - // ), - // Slider( - // value: heartRate, - // min: 40, - // max: 180, - // divisions: 140, - // label: heartRate.toInt().toString(), - // onChanged: (value) { - // setState(() { - // heartRate = value; - // }); - // }, - // ), - // Text(_getWarningText('Heart Rate', heartRate)), - // TextFormField( - // controller: notesController, - // decoration: InputDecoration( - // labelText: 'Notes', - // border: OutlineInputBorder(), - // ), - // keyboardType: TextInputType.text, - // maxLines: null, - // ), - // ], - // ), - // ), - // ), - // actions: [ - // TextButton( - // onPressed: () { - // _clearForm(systolic, diastolic, heartRate, notesController); - // Navigator.of(context).pop(); - // }, - // child: Text('Cancel'), - // ), - // ElevatedButton( - // onPressed: () { - // _submitData(context, systolic, diastolic, heartRate, notesController); - // _reloadData(); - // }, - // child: Text('Submit'), - // ), - // ], - // ); - // }, - // ); - // }, - // ); - // } String _getBloodPressureStatus(double systolic, double diastolic) { if (systolic < 120 && diastolic < 80) { @@ -239,6 +71,7 @@ class _BPMonitorScreenState extends ConsumerState { data: (data) { data.sort((a, b) => b.created_at.compareTo(a.created_at)); final displayedData = data.isNotEmpty ? data.first : null; + data.sort((a, b) => a.created_at.compareTo(b.created_at)); final chatData = data.length > 5 ? data.sublist(data.length - 5) : data; final status = _getBloodPressureStatus(displayedData!.systolic, displayedData.diastolic); diff --git a/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart b/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart index 84044b9c..5db9dad0 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart @@ -47,7 +47,7 @@ class TrendChartScreen extends StatelessWidget { LineChartBarData( spots: systolicSpots, isCurved: true, - color: Colors.red, + color: Constants.barColor, barWidth: 2, belowBarData: BarAreaData( show: false, @@ -60,7 +60,7 @@ class TrendChartScreen extends StatelessWidget { LineChartBarData( spots: diastolicSpots, isCurved: true, - color: Colors.orange, + color: Constants.facilityDirectoryColor, barWidth: 2, belowBarData: BarAreaData( show: false, diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index f306072f..c08e887d 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -45,10 +45,8 @@ class SelfScreening extends HookConsumerWidget { final currentBsEntries = bsAsync.when( data: (data) { - // Sort the list by date in descending order data.sort((a, b) => b.created_at.compareTo(a.created_at)); - // Return the most current object - return data.isNotEmpty ? data.first : null; + return data.first; }, error: (error, _) { return null; @@ -70,6 +68,13 @@ class SelfScreening extends HookConsumerWidget { paths.remove(RouteNames.BLOOD_SUGAR); } + double _convertToMMOL(double level) { + if (level > 30) { + level = level / 18.0; + } + return double.parse(level.toStringAsFixed(1)); + } + return Scaffold( body: Column( children: [ @@ -112,8 +117,8 @@ class SelfScreening extends HookConsumerWidget { HealthCard( svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", title: "Blood Sugar", - value1: "${currentBsEntries?.level}", - text1: "mmHG", + value1: "${currentBsEntries != null ? _convertToMMOL(currentBsEntries.level) : 'N/A'}", + text1: "mmol/L", onPressed: () { context.goNamed(RouteNames.BLOOD_SUGAR); }, From 7566d2cdc74ce2ab73f8d78bcd884161cd28148d Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 31 Oct 2024 09:29:24 +0300 Subject: [PATCH 118/140] Move BMI to Self screening module --- lib/src/app/navigation/app_router.dart | 6 +-- lib/src/app/navigation/menu/menuItems.dart | 52 +++++++++---------- .../bmi/data/model/bmi_log.dart | 0 .../bmi/data/model/bmi_log.freezed.dart | 0 .../bmi/data/model/bmi_log.g.dart | 0 .../bmi/data/model/bmi_nutrition_maping.dart | 0 .../model/bmi_nutrition_maping.freezed.dart | 0 .../data/model/bmi_nutrition_maping.g.dart | 0 .../bmi/data/providers/bmi_log_provider.dart | 8 +-- .../bmi_status_nutrition_provider.dart | 4 +- .../data/repositories/bmi_log_repository.dart | 4 +- .../bmi_status_nutrition_repository.dart | 4 +- .../data/services/bmi_calculator_service.dart | 5 +- .../bmi/data/services/bmi_log_service.dart | 3 +- .../bmi/onboardng_step.dart | 0 .../controllers/bmi_log_controller.dart | 3 +- .../pages/BMICalculatorResultsScreen.dart | 6 +-- .../pages/BMICalculatorScreen.dart | 9 ++-- .../presentation/pages/BMIHistoryScreen.dart | 6 +-- .../presentation/widgets/BMILineGraph.dart | 4 +- .../bmi/presentation/widgets/BMILineList.dart | 2 +- .../presentation/widgets/GenderPicker.dart | 3 +- .../presentation/widgets/HeightPicker.dart | 3 +- .../widgets/HeightUnitsPicker.dart | 0 .../presentation/widgets/health_list.dart | 1 - .../{complaint.dart => medication.dart} | 6 +-- .../models/{diagnosis.dart => procedure.dart} | 6 +-- 27 files changed, 62 insertions(+), 73 deletions(-) rename lib/src/features/{ => self_screening}/bmi/data/model/bmi_log.dart (100%) rename lib/src/features/{ => self_screening}/bmi/data/model/bmi_log.freezed.dart (100%) rename lib/src/features/{ => self_screening}/bmi/data/model/bmi_log.g.dart (100%) rename lib/src/features/{ => self_screening}/bmi/data/model/bmi_nutrition_maping.dart (100%) rename lib/src/features/{ => self_screening}/bmi/data/model/bmi_nutrition_maping.freezed.dart (100%) rename lib/src/features/{ => self_screening}/bmi/data/model/bmi_nutrition_maping.g.dart (100%) rename lib/src/features/{ => self_screening}/bmi/data/providers/bmi_log_provider.dart (58%) rename lib/src/features/{ => self_screening}/bmi/data/providers/bmi_status_nutrition_provider.dart (53%) rename lib/src/features/{ => self_screening}/bmi/data/repositories/bmi_log_repository.dart (61%) rename lib/src/features/{ => self_screening}/bmi/data/repositories/bmi_status_nutrition_repository.dart (59%) rename lib/src/features/{ => self_screening}/bmi/data/services/bmi_calculator_service.dart (89%) rename lib/src/features/{ => self_screening}/bmi/data/services/bmi_log_service.dart (96%) rename lib/src/features/{ => self_screening}/bmi/onboardng_step.dart (100%) rename lib/src/features/{ => self_screening}/bmi/presentation/controllers/bmi_log_controller.dart (81%) rename lib/src/features/{ => self_screening}/bmi/presentation/pages/BMICalculatorResultsScreen.dart (96%) rename lib/src/features/{ => self_screening}/bmi/presentation/pages/BMICalculatorScreen.dart (96%) rename lib/src/features/{ => self_screening}/bmi/presentation/pages/BMIHistoryScreen.dart (90%) rename lib/src/features/{ => self_screening}/bmi/presentation/widgets/BMILineGraph.dart (87%) rename lib/src/features/{ => self_screening}/bmi/presentation/widgets/BMILineList.dart (96%) rename lib/src/features/{ => self_screening}/bmi/presentation/widgets/GenderPicker.dart (97%) rename lib/src/features/{ => self_screening}/bmi/presentation/widgets/HeightPicker.dart (92%) rename lib/src/features/{ => self_screening}/bmi/presentation/widgets/HeightUnitsPicker.dart (100%) rename lib/src/features/visits/data/models/{complaint.dart => medication.dart} (68%) rename lib/src/features/visits/data/models/{diagnosis.dart => procedure.dart} (71%) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 36e9c862..152805c3 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -21,9 +21,9 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswor import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart'; -import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; -import 'package:nishauri/src/features/bmi/presentation/pages/BMICalculatorScreen.dart'; -import 'package:nishauri/src/features/bmi/presentation/pages/BMIHistoryScreen.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMIHistoryScreen.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/bs_input_screen.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/BPLinelistScreen.dart'; diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 70923f17..7ce34185 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -204,39 +204,39 @@ List getPatientModules(BuildContext context) { color: Constants.labResultsColor, ), MenuItem( - icon: FaIcon( + icon: const FaIcon( FontAwesomeIcons.addressCard, size: 50.0, - color: Colors.blue[400], + color: Constants.clinicCardBgColor, ), - shortcutIcon: FaIcon( + shortcutIcon: const FaIcon( FontAwesomeIcons.addressCard, - color: Colors.blue[400], + color: Constants.clinicCardBgColor, ), title: MenuItemNames.MY_CLINIC_CARD, onPressed: () => context.goNamed(RouteNames.MY_CLINIC_CARD), - color: Colors.blue[900], + color: Constants.clinicCardBgColor, ), - MenuItem( - icon: SvgPicture.asset( - "assets/images/Hospital building-bro.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 80, - width: 80, - ), - shortcutIcon: SvgPicture.asset( - "assets/images/Hospital building-bro.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - width: Constants.shortcutIconSize, - height: Constants.shortcutIconSize, - ), - title: "FACILITY VISITS", - onPressed: () => context.goNamed(RouteNames.FACILITY_VISITS), - color: Colors.blueGrey, - ), + // MenuItem( + // icon: SvgPicture.asset( + // "assets/images/Hospital building-bro.svg", + // semanticsLabel: "Doctors", + // fit: BoxFit.contain, + // height: 80, + // width: 80, + // ), + // shortcutIcon: SvgPicture.asset( + // "assets/images/Hospital building-bro.svg", + // semanticsLabel: "Doctors", + // fit: BoxFit.contain, + // width: Constants.shortcutIconSize, + // height: Constants.shortcutIconSize, + // ), + // title: "FACILITY VISITS", + // onPressed: () => context.goNamed(RouteNames.FACILITY_VISITS), + // color: Colors.blueGrey, + // ), MenuItem( icon: SvgPicture.asset( @@ -258,7 +258,7 @@ List getPatientModules(BuildContext context) { color: Constants.facilityDirectoryColor, ), MenuItem( - shortcutBackgroundColor: Constants.bmiCalculatorShortcutBgColor, + shortcutBackgroundColor: Constants.selfScreeningBgColor, icon: SvgPicture.asset( "assets/images/selfscreeningImage.svg", semanticsLabel: "Doctors", @@ -275,7 +275,7 @@ List getPatientModules(BuildContext context) { ), title: MenuItemNames.SELF_SCREENING, onPressed: () => context.goNamed(RouteNames.SELF_SCREENING), - color: Constants.bmiCalculatorColor, + color: Constants.selfScreeningBgColor, ), MenuItem( shortcutBackgroundColor: Constants.dawaDropShortcutBgColor, diff --git a/lib/src/features/bmi/data/model/bmi_log.dart b/lib/src/features/self_screening/bmi/data/model/bmi_log.dart similarity index 100% rename from lib/src/features/bmi/data/model/bmi_log.dart rename to lib/src/features/self_screening/bmi/data/model/bmi_log.dart diff --git a/lib/src/features/bmi/data/model/bmi_log.freezed.dart b/lib/src/features/self_screening/bmi/data/model/bmi_log.freezed.dart similarity index 100% rename from lib/src/features/bmi/data/model/bmi_log.freezed.dart rename to lib/src/features/self_screening/bmi/data/model/bmi_log.freezed.dart diff --git a/lib/src/features/bmi/data/model/bmi_log.g.dart b/lib/src/features/self_screening/bmi/data/model/bmi_log.g.dart similarity index 100% rename from lib/src/features/bmi/data/model/bmi_log.g.dart rename to lib/src/features/self_screening/bmi/data/model/bmi_log.g.dart diff --git a/lib/src/features/bmi/data/model/bmi_nutrition_maping.dart b/lib/src/features/self_screening/bmi/data/model/bmi_nutrition_maping.dart similarity index 100% rename from lib/src/features/bmi/data/model/bmi_nutrition_maping.dart rename to lib/src/features/self_screening/bmi/data/model/bmi_nutrition_maping.dart diff --git a/lib/src/features/bmi/data/model/bmi_nutrition_maping.freezed.dart b/lib/src/features/self_screening/bmi/data/model/bmi_nutrition_maping.freezed.dart similarity index 100% rename from lib/src/features/bmi/data/model/bmi_nutrition_maping.freezed.dart rename to lib/src/features/self_screening/bmi/data/model/bmi_nutrition_maping.freezed.dart diff --git a/lib/src/features/bmi/data/model/bmi_nutrition_maping.g.dart b/lib/src/features/self_screening/bmi/data/model/bmi_nutrition_maping.g.dart similarity index 100% rename from lib/src/features/bmi/data/model/bmi_nutrition_maping.g.dart rename to lib/src/features/self_screening/bmi/data/model/bmi_nutrition_maping.g.dart diff --git a/lib/src/features/bmi/data/providers/bmi_log_provider.dart b/lib/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart similarity index 58% rename from lib/src/features/bmi/data/providers/bmi_log_provider.dart rename to lib/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart index 03f0d411..faa9a387 100644 --- a/lib/src/features/bmi/data/providers/bmi_log_provider.dart +++ b/lib/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart @@ -1,8 +1,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; -import 'package:nishauri/src/features/bmi/data/repositories/bmi_log_repository.dart'; -import 'package:nishauri/src/features/bmi/data/services/bmi_log_service.dart'; -import 'package:nishauri/src/features/bmi/presentation/controllers/bmi_log_controller.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_log.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/repositories/bmi_log_repository.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/services/bmi_log_service.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/controllers/bmi_log_controller.dart'; final bmiLogProvider = StateNotifierProvider>((ref) { final service = BMILogService(); diff --git a/lib/src/features/bmi/data/providers/bmi_status_nutrition_provider.dart b/lib/src/features/self_screening/bmi/data/providers/bmi_status_nutrition_provider.dart similarity index 53% rename from lib/src/features/bmi/data/providers/bmi_status_nutrition_provider.dart rename to lib/src/features/self_screening/bmi/data/providers/bmi_status_nutrition_provider.dart index 2e2434fd..0a3ecbd0 100644 --- a/lib/src/features/bmi/data/providers/bmi_status_nutrition_provider.dart +++ b/lib/src/features/self_screening/bmi/data/providers/bmi_status_nutrition_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/bmi/data/repositories/bmi_status_nutrition_repository.dart'; -import 'package:nishauri/src/features/bmi/data/services/bmi_calculator_service.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/repositories/bmi_status_nutrition_repository.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/services/bmi_calculator_service.dart'; final bmiNutritionProvider = FutureProvider((ref)async { final repository = BMIStatusNutritionRepository(BMICalculatorService()); diff --git a/lib/src/features/bmi/data/repositories/bmi_log_repository.dart b/lib/src/features/self_screening/bmi/data/repositories/bmi_log_repository.dart similarity index 61% rename from lib/src/features/bmi/data/repositories/bmi_log_repository.dart rename to lib/src/features/self_screening/bmi/data/repositories/bmi_log_repository.dart index b0e94d26..94a50295 100644 --- a/lib/src/features/bmi/data/repositories/bmi_log_repository.dart +++ b/lib/src/features/self_screening/bmi/data/repositories/bmi_log_repository.dart @@ -1,5 +1,5 @@ -import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; -import 'package:nishauri/src/features/bmi/data/services/bmi_log_service.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_log.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/services/bmi_log_service.dart'; class BMILogRepository { final BMILogService _service; diff --git a/lib/src/features/bmi/data/repositories/bmi_status_nutrition_repository.dart b/lib/src/features/self_screening/bmi/data/repositories/bmi_status_nutrition_repository.dart similarity index 59% rename from lib/src/features/bmi/data/repositories/bmi_status_nutrition_repository.dart rename to lib/src/features/self_screening/bmi/data/repositories/bmi_status_nutrition_repository.dart index ba2742df..b7bf0cdd 100644 --- a/lib/src/features/bmi/data/repositories/bmi_status_nutrition_repository.dart +++ b/lib/src/features/self_screening/bmi/data/repositories/bmi_status_nutrition_repository.dart @@ -1,5 +1,5 @@ -import 'package:nishauri/src/features/bmi/data/model/bmi_nutrition_maping.dart'; -import 'package:nishauri/src/features/bmi/data/services/bmi_calculator_service.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_nutrition_maping.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/services/bmi_calculator_service.dart'; class BMIStatusNutritionRepository { final BMICalculatorService _service; diff --git a/lib/src/features/bmi/data/services/bmi_calculator_service.dart b/lib/src/features/self_screening/bmi/data/services/bmi_calculator_service.dart similarity index 89% rename from lib/src/features/bmi/data/services/bmi_calculator_service.dart rename to lib/src/features/self_screening/bmi/data/services/bmi_calculator_service.dart index a58c05d6..ee04bd67 100644 --- a/lib/src/features/bmi/data/services/bmi_calculator_service.dart +++ b/lib/src/features/self_screening/bmi/data/services/bmi_calculator_service.dart @@ -2,11 +2,10 @@ import 'dart:convert'; import 'dart:developer'; import 'package:http/http.dart'; -import 'package:nishauri/src/features/bmi/data/model/bmi_nutrition_maping.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_nutrition_maping.dart'; import 'package:nishauri/src/shared/exeptions/http_exceptions.dart'; import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; - -import '../../../../utils/constants.dart'; +import 'package:nishauri/src/utils/constants.dart'; class BMICalculatorService extends HTTPService { Future getBMIStatusNutrition_(dynamic args) async { diff --git a/lib/src/features/bmi/data/services/bmi_log_service.dart b/lib/src/features/self_screening/bmi/data/services/bmi_log_service.dart similarity index 96% rename from lib/src/features/bmi/data/services/bmi_log_service.dart rename to lib/src/features/self_screening/bmi/data/services/bmi_log_service.dart index c7965871..bfcbc483 100644 --- a/lib/src/features/bmi/data/services/bmi_log_service.dart +++ b/lib/src/features/self_screening/bmi/data/services/bmi_log_service.dart @@ -1,11 +1,10 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; import 'package:http/http.dart'; import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; -import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_log.dart'; import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/bmi/onboardng_step.dart b/lib/src/features/self_screening/bmi/onboardng_step.dart similarity index 100% rename from lib/src/features/bmi/onboardng_step.dart rename to lib/src/features/self_screening/bmi/onboardng_step.dart diff --git a/lib/src/features/bmi/presentation/controllers/bmi_log_controller.dart b/lib/src/features/self_screening/bmi/presentation/controllers/bmi_log_controller.dart similarity index 81% rename from lib/src/features/bmi/presentation/controllers/bmi_log_controller.dart rename to lib/src/features/self_screening/bmi/presentation/controllers/bmi_log_controller.dart index b40a9382..b1a6df70 100644 --- a/lib/src/features/bmi/presentation/controllers/bmi_log_controller.dart +++ b/lib/src/features/self_screening/bmi/presentation/controllers/bmi_log_controller.dart @@ -1,7 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; -import 'package:nishauri/src/features/bmi/data/repositories/bmi_log_repository.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/repositories/bmi_log_repository.dart'; class BMILogController extends StateNotifier> { final BMILogRepository _repository; diff --git a/lib/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart similarity index 96% rename from lib/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart rename to lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart index cfd69aba..d8d7c705 100644 --- a/lib/src/features/bmi/presentation/pages/BMICalculatorResultsScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart @@ -3,14 +3,12 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:nishauri/src/features/bmi/data/providers/bmi_status_nutrition_provider.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_status_nutrition_provider.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/helpers.dart'; -import '../../../../shared/input/Button.dart'; - class BMICalculatorResultsScreen extends HookConsumerWidget { final double bmi; diff --git a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart similarity index 96% rename from lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart rename to lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart index 53c8ba8b..0e7ab99c 100644 --- a/lib/src/features/bmi/presentation/pages/BMICalculatorScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart @@ -4,13 +4,12 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:nishauri/src/features/auth/data/providers/auth_provider.dart'; import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; -import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; -import 'package:nishauri/src/features/bmi/presentation/widgets/GenderPicker.dart'; -import 'package:nishauri/src/features/bmi/presentation/widgets/HeightPicker.dart'; -import 'package:nishauri/src/features/bmi/presentation/widgets/HeightUnitsPicker.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/GenderPicker.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/HeightPicker.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/HeightUnitsPicker.dart'; import 'package:nishauri/src/features/user/data/providers/user_provider.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; diff --git a/lib/src/features/bmi/presentation/pages/BMIHistoryScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMIHistoryScreen.dart similarity index 90% rename from lib/src/features/bmi/presentation/pages/BMIHistoryScreen.dart rename to lib/src/features/self_screening/bmi/presentation/pages/BMIHistoryScreen.dart index 2e5fbb76..7e09562f 100644 --- a/lib/src/features/bmi/presentation/pages/BMIHistoryScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMIHistoryScreen.dart @@ -2,9 +2,9 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; -import 'package:nishauri/src/features/bmi/presentation/widgets/BMILineGraph.dart'; -import 'package:nishauri/src/features/bmi/presentation/widgets/BMILineList.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/BMILineList.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/bmi/presentation/widgets/BMILineGraph.dart b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart similarity index 87% rename from lib/src/features/bmi/presentation/widgets/BMILineGraph.dart rename to lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart index 478bd7cc..5613bec3 100644 --- a/lib/src/features/bmi/presentation/widgets/BMILineGraph.dart +++ b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart @@ -1,8 +1,6 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; -import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_log.dart'; import 'package:nishauri/src/shared/charts/CustomLineChart.dart'; import 'package:nishauri/src/utils/constants.dart'; diff --git a/lib/src/features/bmi/presentation/widgets/BMILineList.dart b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineList.dart similarity index 96% rename from lib/src/features/bmi/presentation/widgets/BMILineList.dart rename to lib/src/features/self_screening/bmi/presentation/widgets/BMILineList.dart index adb2a23c..17861b00 100644 --- a/lib/src/features/bmi/presentation/widgets/BMILineList.dart +++ b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineList.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/bmi/data/model/bmi_log.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_log.dart'; import 'package:nishauri/src/utils/constants.dart'; class BMILinelist extends StatelessWidget { diff --git a/lib/src/features/bmi/presentation/widgets/GenderPicker.dart b/lib/src/features/self_screening/bmi/presentation/widgets/GenderPicker.dart similarity index 97% rename from lib/src/features/bmi/presentation/widgets/GenderPicker.dart rename to lib/src/features/self_screening/bmi/presentation/widgets/GenderPicker.dart index b0ca69be..73186153 100644 --- a/lib/src/features/bmi/presentation/widgets/GenderPicker.dart +++ b/lib/src/features/self_screening/bmi/presentation/widgets/GenderPicker.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:nishauri/src/utils/constants.dart'; -import 'package:nishauri/src/utils/constants.dart'; -import '../../../../utils/helpers.dart'; +import 'package:nishauri/src/utils/helpers.dart'; enum GenderPickerChoices { male, female } diff --git a/lib/src/features/bmi/presentation/widgets/HeightPicker.dart b/lib/src/features/self_screening/bmi/presentation/widgets/HeightPicker.dart similarity index 92% rename from lib/src/features/bmi/presentation/widgets/HeightPicker.dart rename to lib/src/features/self_screening/bmi/presentation/widgets/HeightPicker.dart index 1f78e79f..b99b2230 100644 --- a/lib/src/features/bmi/presentation/widgets/HeightPicker.dart +++ b/lib/src/features/self_screening/bmi/presentation/widgets/HeightPicker.dart @@ -1,7 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:nishauri/src/features/bmi/presentation/widgets/HeightUnitsPicker.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/HeightUnitsPicker.dart'; import 'package:nishauri/src/utils/constants.dart'; class HeightPicker extends StatelessWidget { diff --git a/lib/src/features/bmi/presentation/widgets/HeightUnitsPicker.dart b/lib/src/features/self_screening/bmi/presentation/widgets/HeightUnitsPicker.dart similarity index 100% rename from lib/src/features/bmi/presentation/widgets/HeightUnitsPicker.dart rename to lib/src/features/self_screening/bmi/presentation/widgets/HeightUnitsPicker.dart diff --git a/lib/src/features/self_screening/presentation/widgets/health_list.dart b/lib/src/features/self_screening/presentation/widgets/health_list.dart index 0ff2aa4f..8021c253 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_list.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_list.dart @@ -19,7 +19,6 @@ class ItemList extends StatelessWidget { @override Widget build(BuildContext context) { final height = 100 + (items.length - 1) * 70 + 5; - print(svgAsset); return Container( color: backgroundColor, diff --git a/lib/src/features/visits/data/models/complaint.dart b/lib/src/features/visits/data/models/medication.dart similarity index 68% rename from lib/src/features/visits/data/models/complaint.dart rename to lib/src/features/visits/data/models/medication.dart index c21840ab..750c4c55 100644 --- a/lib/src/features/visits/data/models/complaint.dart +++ b/lib/src/features/visits/data/models/medication.dart @@ -4,8 +4,8 @@ part 'complaint.freezed.dart'; part 'complaint.g.dart'; @Freezed() -class Complaint with _$Complaint { - const factory Complaint({ +class Medication with _$Complaint { + const factory Medication({ required String uuid, required String name, String? onsetDate, @@ -13,5 +13,5 @@ class Complaint with _$Complaint { required String value, }) = _Complaint; - factory Complaint.fromJson(Map json)=> _$ComplaintFromJson(json); + factory Medication.fromJson(Map json)=> _$ComplaintFromJson(json); } \ No newline at end of file diff --git a/lib/src/features/visits/data/models/diagnosis.dart b/lib/src/features/visits/data/models/procedure.dart similarity index 71% rename from lib/src/features/visits/data/models/diagnosis.dart rename to lib/src/features/visits/data/models/procedure.dart index a0aa3b61..4f7252b2 100644 --- a/lib/src/features/visits/data/models/diagnosis.dart +++ b/lib/src/features/visits/data/models/procedure.dart @@ -4,13 +4,13 @@ part 'diagnosis.freezed.dart'; part 'diagnosis.g.dart'; @Freezed() -class Diagnosis with _$Diagnosis { - const factory Diagnosis({ +class Procedure with _$Diagnosis { + const factory Procedure({ required String uuid, required String name, required String dateRecorded, required String value, }) = _Diagnosis; - factory Diagnosis.fromJson(Map json)=> _$DiagnosisFromJson(json); + factory Procedure.fromJson(Map json)=> _$DiagnosisFromJson(json); } \ No newline at end of file From 0e257b5703a6f09cada712ede4f64495a5b2b56e Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 31 Oct 2024 09:30:38 +0300 Subject: [PATCH 119/140] Move BMI to Self screening module --- .../features/auth/presentation/pages/onboarding_screen.dart | 3 +-- .../dashboard/presentation/widgets/GeneralDashboard.dart | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/src/features/auth/presentation/pages/onboarding_screen.dart b/lib/src/features/auth/presentation/pages/onboarding_screen.dart index 3eaa939e..fb3dbefc 100644 --- a/lib/src/features/auth/presentation/pages/onboarding_screen.dart +++ b/lib/src/features/auth/presentation/pages/onboarding_screen.dart @@ -1,9 +1,8 @@ -import 'package:dots_indicator/dots_indicator.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:go_router/go_router.dart'; -import 'package:nishauri/src/features/bmi/onboardng_step.dart'; +import 'package:nishauri/src/features/self_screening/bmi/onboardng_step.dart'; import 'package:nishauri/src/features/user_preference/data/providers/settings_provider.dart'; import 'package:nishauri/src/utils/data.dart'; diff --git a/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart b/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart index c9cd1200..3f40ef98 100644 --- a/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart +++ b/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:nishauri/src/features/bmi/data/providers/bmi_log_provider.dart'; -import 'package:nishauri/src/features/bmi/presentation/widgets/BMILineGraph.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart'; import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/features/self_screening/bp/presentation/pages/trend_chart_screen.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; From cb6fb346e1ba06923fa82ce3ac7255d4d45fc0cd Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 31 Oct 2024 12:11:18 +0300 Subject: [PATCH 120/140] Add BMI card on self screening screen --- .../presentation/widgets/Appointments.dart | 47 +++++++++++------ .../pages/BMICalculatorResultsScreen.dart | 2 +- .../pages/self_screening_menu.dart | 50 ++++++++++++++++--- 3 files changed, 76 insertions(+), 23 deletions(-) diff --git a/lib/src/features/common/presentation/widgets/Appointments.dart b/lib/src/features/common/presentation/widgets/Appointments.dart index 51e9eda3..1551efce 100644 --- a/lib/src/features/common/presentation/widgets/Appointments.dart +++ b/lib/src/features/common/presentation/widgets/Appointments.dart @@ -9,6 +9,7 @@ import 'package:nishauri/src/features/appointments/data/models/appointment.dart' import 'package:nishauri/src/features/appointments/data/providers/appointment_provider.dart'; import 'package:nishauri/src/features/appointments/presentation/pages/AppointmentRescheduleScreen.dart'; import 'package:nishauri/src/features/common/presentation/widgets/AppointmentCard.dart'; +import 'package:nishauri/src/features/dawa_drop/data/models/order_request/drug_order.dart'; import 'package:nishauri/src/local_storage/LocalStorage.dart'; import 'package:nishauri/src/shared/interfaces/notification_service.dart'; import 'package:nishauri/src/utils/helpers.dart'; @@ -24,19 +25,35 @@ class Appointments extends HookConsumerWidget { final appointmentsAsync = ref.watch(appointmentProvider(false)); final appointmentsNotifier = ref.watch(appointmentProvider(false).notifier); final screenSize = getOrientationAwareScreenSize(context); - final pendingOrders = ref - .watch(drugOrderProvider) - .valueOrNull - ?.where((order) => order.status != 'Fullfilled') - .toList() ?? - []; - final fullFilledOrders = ref - .watch(drugOrderProvider) - .valueOrNull - ?.where((order) => order.status == 'Fullfilled') - .toList() ?? - []; + // final pendingOrders = ref + // .watch(drugOrderProvider) + // .valueOrNull + // ?.where((order) => order.status != 'Fullfilled') + // .toList() ?? + // []; + List _pendingOrders(String appId){ + return ref + .watch(drugOrderProvider) + .valueOrNull + ?.where((order) => order.status != 'Fullfilled' && order.appointment?.id == appId) + .toList() ?? + []; + } + // final fullFilledOrders = ref + // .watch(drugOrderProvider) + // .valueOrNull + // ?.where((order) => order.status == 'Fullfilled') + // .toList() ?? + // []; + List _fullFilledOrders(String appId){ + return ref + .watch(drugOrderProvider) + .valueOrNull + ?.where((order) => order.status == 'Fullfilled' && order.appointment?.id == appId) + .toList() ?? + []; + } final theme = Theme.of(context); return appointmentsAsync.when( data: (data) { @@ -116,9 +133,9 @@ class Appointments extends HookConsumerWidget { child: SizedBox( width: size.width * 0.99, child: AppointmentCard( - rescheduleButtonText: pendingOrders.isNotEmpty + rescheduleButtonText: _pendingOrders(artAppointment.id??'').isNotEmpty ? "Has active order" - :fullFilledOrders.isNotEmpty ? "Appointment order has already been fulfilled" + :_fullFilledOrders(artAppointment.id??'').isNotEmpty ? "Appointment order has already been fulfilled" : (artAppointment.reschedule_status .toString() == "0" @@ -141,7 +158,7 @@ class Appointments extends HookConsumerWidget { null || artAppointment.reschedule_status .toString() == - "2" && !fullFilledOrders.isNotEmpty + "2" && !_fullFilledOrders(artAppointment.id??'').isNotEmpty ? () => context.goNamed( RouteNames.APPOINTMENTS_RESCHEDULE, extra: diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart index d8d7c705..74213415 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart @@ -23,7 +23,7 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { const CustomAppBar( title: "BMI Calculator ⚖️", // icon: Icons.calculate, - color: Constants.bmiCalculatorColor), + color: Constants.selfScreeningBgColor), Expanded( child: SingleChildScrollView( child: Padding( diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index c08e887d..31f7a27b 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -7,6 +7,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:nishauri/src/features/common/presentation/pages/chat_feeback_form.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; import 'package:nishauri/src/features/self_screening/presentation/widgets/health_card.dart'; import 'package:nishauri/src/features/self_screening/presentation/widgets/health_list.dart'; @@ -25,6 +26,7 @@ class SelfScreening extends HookConsumerWidget { int _messagesCount = 0; final bpAsync = ref.watch(bloodPressureListProvider); + final bmiListAsync = ref.watch(bmiListProvider); final currentBpEntries = bpAsync.when( data: (data) { @@ -56,16 +58,32 @@ class SelfScreening extends HookConsumerWidget { }, ); + final currentBMIEntries = bmiListAsync.when( + data: (data) { + data.sort((a, b) => b.created_at.compareTo(a.created_at)); + return data.first; + }, + error: (error, _) { + return null; + }, + loading: () { + return null; + }, + ); + // Create a list of items and remove "Blood Pressure" if currentBpEntries is not null final List items = ["Blood Sugar", "Blood Pressure", "BMI", "Period Calendar"]; - final List paths = [RouteNames.BLOOD_PRESSURE, RouteNames.BLOOD_SUGAR,]; + final List paths = [RouteNames.BLOOD_PRESSURE, RouteNames.BLOOD_SUGAR, RouteNames.BMI_CALCULATOR_RESULTS,]; + // final List extra = ['', '', '24']; if (currentBpEntries != null) { items.remove("Blood Pressure"); - paths.remove(RouteNames.BLOOD_PRESSURE); } if (currentBsEntries != null) { items.remove("Blood Sugar"); - paths.remove(RouteNames.BLOOD_SUGAR); + } + + if (currentBMIEntries != null) { + items.remove("BMI"); } double _convertToMMOL(double level) { @@ -75,6 +93,8 @@ class SelfScreening extends HookConsumerWidget { return double.parse(level.toStringAsFixed(1)); } + print(currentBMIEntries); + return Scaffold( body: Column( children: [ @@ -113,8 +133,8 @@ class SelfScreening extends HookConsumerWidget { onPressed: () { context.goNamed(RouteNames.BLOOD_PRESSURE); }, - ) : SizedBox(), - HealthCard( + ) : const SizedBox(), + currentBsEntries != null ? HealthCard( svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", title: "Blood Sugar", value1: "${currentBsEntries != null ? _convertToMMOL(currentBsEntries.level) : 'N/A'}", @@ -122,11 +142,27 @@ class SelfScreening extends HookConsumerWidget { onPressed: () { context.goNamed(RouteNames.BLOOD_SUGAR); }, + ) : const SizedBox(), + HealthCard( + svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", + title: "Body Measurements", + value1: "${currentBMIEntries?.weight}", + text1: "KGS", + vName1: "Weight", + value2: "${currentBMIEntries?.height}", + text2: "Centimetres", + vName2: "Height", + value3: "${currentBMIEntries?.results}", + text3: "", + vName3: "BMI", + onPressed: () { + context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS); + }, ), ], ), const SizedBox(height: 10), - ItemList(items: items, path: paths,), + ItemList(items: items, path: paths), const SizedBox(height: 20), // Title for the next section Text( @@ -134,7 +170,7 @@ class SelfScreening extends HookConsumerWidget { style: theme.textTheme.titleMedium, ), const SizedBox(height: 10), - Wrap( + const Wrap( alignment: WrapAlignment.center, spacing: 1, runSpacing: 16, From 062c13d0ba9baef8869b6afd6885ecb440446cbd Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 4 Nov 2024 22:03:06 +0300 Subject: [PATCH 121/140] Refactor BMI --- assets/data/visits.json | 335 +++++++----------- lib/src/app/navigation/app_router.dart | 53 ++- .../presentation/pages/ClinicCardScreen.dart | 40 ++- .../pages/BMICalculatorResultsScreen.dart | 156 +++++--- .../pages/BMICalculatorScreen.dart | 37 +- .../presentation/widgets/BMILineGraph.dart | 7 +- .../bmi/presentation/widgets/BMILineList.dart | 1 + .../presentation/widgets/GenderPicker.dart | 2 +- .../pages/self_screening_menu.dart | 296 ++++++---------- .../visits/data/models/immunization.dart | 16 + .../data/models/immunization.freezed.dart | 237 +++++++++++++ .../visits/data/models/immunization.g.dart | 25 ++ .../visits/data/models/medication.dart | 10 +- ...t.freezed.dart => medication.freezed.dart} | 77 ++-- .../{complaint.g.dart => medication.g.dart} | 8 +- .../visits/data/models/procedure.dart | 10 +- ...is.freezed.dart => procedure.freezed.dart} | 76 ++-- .../{diagnosis.g.dart => procedure.g.dart} | 8 +- .../features/visits/data/models/visit.dart | 11 +- .../visits/data/models/visit.freezed.dart | 154 +++++--- .../features/visits/data/models/visit.g.dart | 19 +- .../pages/FacilityVisitDetailScreen.dart | 24 +- .../presentations/widgets/ComplaintsTab.dart | 4 +- .../presentations/widgets/Diagnosis.dart | 4 +- lib/src/shared/charts/CustomLineChart.dart | 2 +- .../shared/display/custom_bottom_nav_bar.dart | 74 ++++ 26 files changed, 1049 insertions(+), 637 deletions(-) create mode 100644 lib/src/features/visits/data/models/immunization.dart create mode 100644 lib/src/features/visits/data/models/immunization.freezed.dart create mode 100644 lib/src/features/visits/data/models/immunization.g.dart rename lib/src/features/visits/data/models/{complaint.freezed.dart => medication.freezed.dart} (75%) rename lib/src/features/visits/data/models/{complaint.g.dart => medication.g.dart} (76%) rename lib/src/features/visits/data/models/{diagnosis.freezed.dart => procedure.freezed.dart} (73%) rename lib/src/features/visits/data/models/{diagnosis.g.dart => procedure.g.dart} (76%) create mode 100644 lib/src/shared/display/custom_bottom_nav_bar.dart diff --git a/assets/data/visits.json b/assets/data/visits.json index 817aa695..049c872a 100644 --- a/assets/data/visits.json +++ b/assets/data/visits.json @@ -1,203 +1,132 @@ -{ - "uuid": "1", - "visitDate": "2023-03-06", - "conditions": [ - { - "uuid": "18aac1664e1-b38b6152-5534-430b-8b6a-75e4991b4811", - "name": "Mixed Hyperlipidaemia", - "onsetDate": "", - "dateRecorded": "2023-03-22", - "status": "ACTIVE", - "value": "Mixed Hyperlipidaemia" - }, - { - "uuid": "18aac1664e1-76e384c4-1a7f-46a0-bd8c-a111e9587791", - "name": "Hypothyroidism", - "onsetDate": "", - "dateRecorded": "2023-06-22", - "status": "ACTIVE", - "value": "Hypothyroidism" - }, - { - "uuid": "18aac1664e1-fe9d9bcc-d4d1-407e-ac90-e0ed126c8f12", - "name": "Chronic Kidney Disease", - "onsetDate": "", - "dateRecorded": "2023-03-22", - "status": "ACTIVE", - "value": "Chronic Kidney Disease" - }, - { - "uuid": "18aac1664e1-8d395dfe-ac0c-4175-8682-b99f02b20b05", - "name": "Generalised Epilepsy", - "onsetDate": "", - "dateRecorded": "2023-03-22", - "status": "ACTIVE", - "value": "Generalised Epilepsy" - }, - { - "uuid": "18aac1664e1-58bee68a-1610-4663-b793-cbecfc508f0f", - "name": "Cystic Fibrosis", - "onsetDate": "", - "dateRecorded": "2023-03-22", - "status": "ACTIVE", - "value": "Cystic Fibrosis" - } - ], - "diagnosis": [ - { - "uuid": "18aac1664e1-04a0bdce-476f-412d-b0cc-3d44460b63ba", - "name": "Syndactyly of Fingers with Fusion of Bone", - "dateRecorded": "2023-03-22", - "value": "Syndactyly of Fingers with Fusion of Bone" - }, - { - "uuid": "18aac1664e2-a35ed577-b747-454c-85cf-1caf0b5ec76c", - "name": "Syndactyly of Fingers with Fusion of Bone", - "dateRecorded": "2023-03-22", - "value": "Syndactyly of Fingers with Fusion of Bone" - }, - { - "uuid": "18aac1664e2-5071db27-e8dc-480e-bae0-65686dc38f6b", - "name": "Furuncle of Other Specified Site", - "dateRecorded": "2023-03-22", - "value": "Furuncle of Other Specified Site" - }, - { - "uuid": "18aac1664e2-ac2b5c17-fc83-4256-8299-f9b222d50175", - "name": "Skin Rash due to Fur", - "dateRecorded": "2023-03-22", - "value": "Skin Rash due to Fur" - }, - { - "uuid": "18aac1664e2-4fef0625-96e6-4c6a-a61e-e5defe4c1c09", - "name": "Juvenile Fucosidosis", - "dateRecorded": "2023-03-22", - "value": "Juvenile Fucosidosis" - } - ], - "allergies": [ - { - "uuid": "18aac1664e2-bc3027eb-5446-44ee-877f-97270632dd94", - "allergen": "Sulfonamides", - "reaction": "Diarrhea", - "severity": "MILD", - "onsetDate": "", - "dateRecorded": "2023-03-06" - }, - { - "uuid": "18aac1664e2-8a0dd5e0-e4eb-4346-b9f3-ade9640f7bbc", - "allergen": "Heparins", - "reaction": "Pruritus", - "severity": "MILD", - "onsetDate": "", - "dateRecorded": "2023-03-06" - }, - { - "uuid": "18aac1664e2-14a8324c-ca0f-4221-bb2a-58444a0835c5", - "allergen": "ATAZANAVIR", - "reaction": "Angioedema", - "severity": "MILD", - "onsetDate": "", - "dateRecorded": "2023-03-06" - }, - { - "uuid": "18aac1664e2-eb5661dc-671e-4cdc-b8ce-48d40a16fdc4", - "allergen": "Cephalosporins", - "reaction": "Bronchospasm", - "severity": "MILD", - "onsetDate": "", - "dateRecorded": "2023-03-06" - }, - { - "uuid": "18aac1664e2-b4e3fe29-6e27-4509-86e8-30a4034da231", - "allergen": "TETRACYCLINE", - "reaction": "Hypertension", - "severity": "MILD", - "onsetDate": "", - "dateRecorded": "2023-03-06" - } - ], - "vitals": [ - { - "uuid": "28f55adb-b3b6-4276-8ed6-308e0a599bb8", - "name": "Height (cm)", - "dateRecorded": "2023-09-18", - "value": "175.0" - }, - { - "uuid": "618861ec-0807-4b60-a901-a7683ff9c7d4", - "name": "Systolic blood pressure", - "dateRecorded": "2023-09-18", - "value": "120.0" - }, - { - "uuid": "b1d0c707-f106-4547-89dc-ecdeea871f99", - "name": "Weight (kg)", - "dateRecorded": "2023-09-18", - "value": "57.0" - }, - { - "uuid": "c6c41390-5c6c-4e97-812b-2efbe5521931", - "name": "Diastolic blood pressure", - "dateRecorded": "2023-09-18", - "value": "89.0" - } - ], - "labResults": [ - { - "uuid": "3fa72777-deec-40c8-8d6b-347829e98c86", - "name": "Tuberculosis polymerase chain reaction with rifampin resistance checking", - "dateRecorded": "2023-09-19", - "value": "NEGATIVE" - }, - { - "uuid": "5a186ae0-5886-46c4-84da-022607cc523b", - "name": "SPUTUM FOR ACID FAST BACILLI", - "dateRecorded": "2023-09-19", - "value": "POSITIVE" - }, - { - "uuid": "de54580e-eb49-4aa6-90f3-64917f395350", - "name": "X-ray, chest", - "dateRecorded": "2023-09-19", - "value": "Abnormal Chest X-Ray" - } - ], - "complaints": [ - { - "uuid": "0bb86f42-386f-4970-9ef1-c0d753f0ae09", - "name": "CHIEF COMPLAINT", - "dateRecorded": "2023-03-22", - "onsetDate": "", - "value": "Dysphagia" - }, - { - "uuid": "54556532-1a03-4ad1-b5fd-2a41c7378446", - "name": "CHIEF COMPLAINT", - "dateRecorded": "2023-03-22", - "onsetDate": "", - "value": "Seizure" - }, - { - "uuid": "75421f5a-6c1c-4c4f-9fa9-86cbf81cd795", - "name": "CHIEF COMPLAINT", - "dateRecorded": "2023-03-22", - "onsetDate": "", - "value": "Pain of Breast" - }, - { - "uuid": "bb10e890-4afb-4065-9304-27347a3d5c86", - "name": "CHIEF COMPLAINT", - "dateRecorded": "2023-03-22", - "onsetDate": "", - "value": "Crying Infant" - }, - { - "uuid": "e714c7fa-7e97-47ea-8d72-dec21b06563b", - "name": "CHIEF COMPLAINT", - "dateRecorded": "2023-03-22", - "onsetDate": "", - "value": "Depression" - } - ] -} \ No newline at end of file +[ + { + "uuid": "1", + "visitDate": "2023-03-06", + "facility": "KENYATTA NATIONAL HOSPITAL", + "conditions": [ + { + "uuid": "c1", + "name": "Mixed Hyperlipidaemia", + "onsetDate": "", + "dateRecorded": "2023-03-22", + "status": "ACTIVE", + "value": "Mixed Hyperlipidaemia" + }, + { + "uuid": "c2", + "name": "Hypothyroidism", + "onsetDate": "", + "dateRecorded": "2023-06-22", + "status": "ACTIVE", + "value": "Hypothyroidism" + } + ], + "medications": [ + { + "uuid": "m1", + "name": "Levothyroxine", + "dateRecorded": "2023-03-06", + "value": "Levothyroxine 50 mcg" + } + ], + "allergies": [ + { + "uuid": "a1", + "allergen": "Penicillin", + "reaction": "Rash", + "severity": "MILD", + "onsetDate": "", + "dateRecorded": "2023-03-06" + } + ], + "vitals": [ + { + "uuid": "v1", + "name": "Weight (kg)", + "dateRecorded": "2023-03-06", + "value": "70.0" + } + ], + "labResults": [], + "procedures": [] + }, + { + "uuid": "2", + "visitDate": "2023-03-07", + "facility": "NATIONAL HOSPITAL", + "conditions": [], + "medications": [ + { + "uuid": "m2", + "name": "Metformin", + "dateRecorded": "2023-03-07", + "value": "Metformin 500 mg" + } + ], + "allergies": [], + "vitals": [ + { + "uuid": "v2", + "name": "Blood Pressure", + "dateRecorded": "2023-03-07", + "value": "130/85" + } + ], + "labResults": [], + "procedures": [] + }, + { + "uuid": "3", + "visitDate": "2023-03-08", + "facility": "CITY HOSPITAL", + "conditions": [ + { + "uuid": "c3", + "name": "Chronic Kidney Disease", + "onsetDate": "", + "dateRecorded": "2023-03-08", + "status": "ACTIVE", + "value": "Chronic Kidney Disease" + } + ], + "medications": [], + "allergies": [], + "vitals": [ + { + "uuid": "v3", + "name": "Height (cm)", + "dateRecorded": "2023-03-08", + "value": "180.0" + } + ], + "labResults": [], + "procedures": [] + }, + { + "uuid": "4", + "visitDate": "2023-03-09", + "facility": "GENERAL HOSPITAL", + "conditions": [], + "medications": [], + "allergies": [ + { + "uuid": "a2", + "allergen": "Aspirin", + "reaction": "Nausea", + "severity": "SEVERE", + "onsetDate": "", + "dateRecorded": "2023-03-09" + } + ], + "vitals": [], + "labResults": [ + { + "uuid": "l1", + "name": "Complete Blood Count", + "dateRecorded": "2023-03-09", + "value": "Normal" + } + ], + "procedures": [] + } +] diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 152805c3..5f73b7a5 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -463,26 +463,43 @@ final List openRoutes = [ final List selfScreeningRoutes = [ GoRoute( - name: RouteNames.BMI_CALCULATOR, - path: 'bmi-calculator', + name: RouteNames.BMI_CALCULATOR_RESULTS, + path: "bmi-calculator-results", builder: (BuildContext context, GoRouterState state) { - return const BMICalculatorScreen(); + // Ensure that state.extra is of the expected type + final extra = state.extra; + + if (extra is Map) { + double? bmi = extra['bmi'] as double?; + bool? isForSelf = extra['isForSelf'] as bool?; + return BMICalculatorResultsScreen( + otherBMI: bmi, + isForSelf: isForSelf, + ); + } else { + return BMICalculatorResultsScreen( + otherBMI: null, + isForSelf: true, + ); + } }, - routes: [ - GoRoute( - name: RouteNames.BMI_CALCULATOR_RESULTS, - path: "bmi-calculator-results", - builder: (BuildContext context, GoRouterState state) { - double extra = state.extra! as double; - return BMICalculatorResultsScreen(bmi: extra); - }), - GoRoute( - name: RouteNames.BMI_HISTORY, - path: "bmi-history", - builder: (BuildContext context, GoRouterState state) { - return BMIHistoryScreen(); - }), - ]), + routes: [ + GoRoute( + name: RouteNames.BMI_CALCULATOR, + path: 'bmi-calculator', + builder: (BuildContext context, GoRouterState state) { + return const BMICalculatorScreen(); + }, + ), + GoRoute( + name: RouteNames.BMI_HISTORY, + path: "bmi-history", + builder: (BuildContext context, GoRouterState state) { + return BMIHistoryScreen(); + } + ), + ] + ), GoRoute( name: RouteNames.BLOOD_PRESSURE, path: 'blood-pressure', diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index f1154ff4..1e6bd26b 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -4,6 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/clinic_card/data/providers/programProvider.dart'; import 'package:nishauri/src/features/self_screening/presentation/widgets/health_list.dart'; +import 'package:nishauri/src/features/visits/data/providers/visits_provider.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; @@ -19,9 +20,46 @@ class ClinicCardScreen extends HookConsumerWidget { final theme = Theme.of(context); final programAsync = ref.watch(programProvider); final userPrograms = ref.watch(userProgramProvider); + final visitAsync = ref.watch(visitProvider); + + final visits = visitAsync.when( + data: (data) { + return data; // This is a List + }, + error: (error, _) { + print("Error occurred: $error"); + return []; + }, + loading: () { + return []; + }, + ); + +// Check if visits is not empty before accessing properties + if (visits.isNotEmpty) { + // Print labResults for each visit + for (var visit in visits) { + print(visit.labResults); + } + + // Alternatively, if you only want the labResults from the first visit: + print(visits.first.labResults); + } else { + print("No visit data available."); + } + + + final Map svgMapping = { + "allergies": "assets/images/boldDuotoneMedicineVirus.svg", + "conditions": "assets/images/boldDuotoneMedicineStethoscope.svg", + "immunization": "assets/images/boldDuotoneMedicineSyringe.svg", + "labResults": "assets/images/boldDuotoneMedicineTestTube.svg", + "medications": "assets/images/boldDuotoneMedicineJarOfPills2.svg", + "procedures": "assets/images/boldDuotoneMedicineBone.svg", + "vitals": "assets/images/boldDuotoneMedicineHeartPulse2.svg" + }; final List items = [ - "All Records", "Allergies", "Conditions", "Immunizations", diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart index 74213415..35f0be5b 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart @@ -3,27 +3,73 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_status_nutrition_provider.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/helpers.dart'; +import 'package:nishauri/src/utils/routes.dart'; class BMICalculatorResultsScreen extends HookConsumerWidget { - final double bmi; + final double? otherBMI; + final bool? isForSelf; + const BMICalculatorResultsScreen({super.key, this.otherBMI, this.isForSelf}); - const BMICalculatorResultsScreen({super.key, required this.bmi}); + // Function to determine BMI category + String getBMICategory(double bmi) { + if (bmi < 18.5) { + return 'Malnutrition'; + } else if (bmi >= 18.5 && bmi < 24.9) { + return 'Normal'; + } else { + return 'Obese'; + } + } + + // Function to get color for the BMI segment + Color getSliderColor(double bmi) { + if (bmi < 18.5) { + return Colors.blue; // Malnutrition + } else if (bmi < 24.9) { + return Colors.green; // Normal + } else { + return Colors.red; // Obese + } + } @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); final bmiStatusNutritionAsync = ref.watch(bmiNutritionProvider); + final bmiListAsync = ref.watch(bmiListProvider); + + final currentBMIEntries = bmiListAsync.when( + data: (data) { + data.sort((a, b) => b.created_at.compareTo(a.created_at)); + return data.first; + }, + error: (error, _) { + return null; + }, + loading: () { + return null; + }, + ); + + final bmi = otherBMI != null ? otherBMI : currentBMIEntries?.results; + final bmiCategory = getBMICategory(bmi!); + final sliderColor = getSliderColor(bmi); + + print("this self : $isForSelf"); + return Scaffold( body: Column(children: [ const CustomAppBar( title: "BMI Calculator ⚖️", - // icon: Icons.calculate, - color: Constants.selfScreeningBgColor), + color: Constants.selfScreeningBgColor, + subTitle: "Empower Your Health Journey with BMI Insights", + ), Expanded( child: SingleChildScrollView( child: Padding( @@ -32,9 +78,9 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Results", + "Results ${isForSelf != true ? ' for others' : ''}", style: theme.textTheme.headlineLarge?.copyWith( - color: theme.colorScheme.primary, + color: Constants.selfScreeningBgColor, ), ), Card( @@ -43,34 +89,60 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { child: Column( children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("Your BMI is", - style: theme.textTheme.titleMedium), - Text( - getBMIStatusSimplified(bmi), - style: theme.textTheme.titleMedium?.copyWith( - color: - getBMIStatusSimplified(bmi) == 'Normal' - ? Constants.activeSelectionColor - : Colors.red[600], - ), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Your BMI is", style: theme.textTheme.titleMedium), + Text( + bmiCategory, + style: theme.textTheme.titleMedium?.copyWith( + color: sliderColor ), - ]), + ), + ], + ), Padding( padding: const EdgeInsets.all(Constants.SPACING), child: Text( bmi.toStringAsFixed(1), - style: theme.textTheme.displayLarge - ?.copyWith(color: theme.colorScheme.primary), + style: theme.textTheme.titleLarge + ?.copyWith(color: sliderColor, fontWeight: FontWeight.bold), + ), + ), + Container( + height: 20, + child: Stack( + alignment: Alignment.center, + children: [ + // Colored track + Positioned.fill( + child: Container( + decoration: BoxDecoration( + gradient: const LinearGradient( + colors: [ + Colors.blue, // Malnutrition + Colors.green, + Colors.red, // Obese + ], + stops: [0.0, 0.5, 0.75], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + borderRadius: BorderRadius.circular(5), + ), + ), + ), + // Slider + Slider( + value: bmi, + onChanged: (value) {}, + min: 0, + max: 60, + activeColor: Colors.transparent, + inactiveColor: Colors.transparent, + ), + ], ), ), - Slider( - value: bmi, - onChanged: (value) {}, - min: 0, - max: 60, - ) ], ), ), @@ -81,30 +153,26 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - getBMIStatusSimplified(bmi), + bmiCategory, style: theme.textTheme.titleLarge?.copyWith( - color: getBMIStatusSimplified(bmi) == 'Normal' - ? Constants.activeSelectionColor - : Colors.red[600], + color: sliderColor, fontWeight: FontWeight.bold ), ), const SizedBox(height: Constants.SPACING), Text( "Diet & Nutrition", - style: theme.textTheme.titleMedium?.copyWith( - color: theme.colorScheme.primary, + style: theme.textTheme.titleLarge?.copyWith( + color: Constants.labResultsColor, ), ), const SizedBox(height: Constants.SPACING), Markdown( data: data - .where((element) => - element.status == - getBMIStatusSimplified(bmi)) - .first - .description ?? + .where((element) => + element.status == bmiCategory) + .first + .description ?? "", - // style: theme.textTheme.titleMedium, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), ), @@ -116,10 +184,10 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { semanticsLabel: "Doctors", fit: BoxFit.contain, ), - backgroundColor: Constants.activeSelectionColor, + backgroundColor: Constants.selfScreeningBgColor, textColor: Colors.white, onPress: () { - context.pop(); + context.goNamed(RouteNames.BMI_CALCULATOR); }, ), ], @@ -131,14 +199,14 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { child: CircularProgressIndicator(), ), ), - - // Markdown(data: "data") ], ), ), ), ), - ]), + ] + ), + // bottomNavigationBar: , ); } } diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart index 0e7ab99c..1370b91a 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart @@ -50,7 +50,7 @@ class BMICalculatorScreen extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); - const activeColor = Constants.activeSelectionColor; + const activeColor = Constants.selfScreeningBgColor; final gender = useState(GenderPickerChoices.male); final isPregnant = useState(false); final height = useState(180); @@ -61,7 +61,6 @@ class BMICalculatorScreen extends HookConsumerWidget { useEffect(() { _fetchAge(ref).then((fetchedAge) { - print("Age fetched: $fetchedAge"); userAge.value = fetchedAge!; }); return null; @@ -73,7 +72,7 @@ class BMICalculatorScreen extends HookConsumerWidget { const CustomAppBar( title: "BMI Calculator ⚖️", subTitle: "Empower Your Health Journey \nWith BMI Insights", - color: Constants.bmiCalculatorColor, + color: Constants.selfScreeningBgColor, ), Expanded( child: SingleChildScrollView( @@ -99,6 +98,7 @@ class BMICalculatorScreen extends HookConsumerWidget { isSelected: [isForSelf.value, !isForSelf.value], onPressed: (index) { isForSelf.value = index == 0; + print(isForSelf.value); if (isForSelf.value) { _fetchAge(ref).then((fetchedAge) { userAge.value = fetchedAge!; @@ -151,12 +151,12 @@ class BMICalculatorScreen extends HookConsumerWidget { }, items: [ RadioGroupItem( - value: "yes", + value: "no", title: "Not Pregnant", icon: Icons.woman_rounded, ), RadioGroupItem( - value: "no", + value: "yes", title: "Pregnant", icon: Icons.pregnant_woman, ), @@ -170,7 +170,7 @@ class BMICalculatorScreen extends HookConsumerWidget { if (isPregnant_ != null) { isPregnant.value = !isPregnant_; gender.value = gender_; - if (isPregnant_) { + if (!isPregnant_) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text( @@ -246,24 +246,25 @@ class BMICalculatorScreen extends HookConsumerWidget { ref.read(bmiLogProvider.notifier) .logBMI(height.value.toString(), weight.value.toString(), bmi.toString()) .then((_) { - context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS, extra: bmi); + context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS, extra: {"bmi" : bmi, "others" : isForSelf.value}); + print("I am printing ${isForSelf.value}"); }); ref.refresh(bmiListProvider); } else { - context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS, extra: bmi); + context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS, extra: {"bmi" : bmi, "others" : isForSelf.value}); } }, ), - const SizedBox(height: Constants.SPACING), - Button( - title: "BMI History", - backgroundColor: activeColor, - textColor: theme.canvasColor, - onPress: () { - ref.refresh(bmiListProvider); - context.goNamed(RouteNames.BMI_HISTORY); - }, - ), + // const SizedBox(height: Constants.SPACING), + // Button( + // title: "BMI History", + // backgroundColor: activeColor, + // textColor: theme.canvasColor, + // onPress: () { + // ref.refresh(bmiListProvider); + // context.goNamed(RouteNames.BMI_HISTORY); + // }, + // ), ], ), ), diff --git a/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart index 5613bec3..0417b01c 100644 --- a/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart +++ b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart @@ -2,6 +2,7 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_log.dart'; import 'package:nishauri/src/shared/charts/CustomLineChart.dart'; +import 'package:nishauri/src/shared/display/custome_filter_chart.dart'; import 'package:nishauri/src/utils/constants.dart'; class BMILineGraph extends StatelessWidget { @@ -15,6 +16,7 @@ const BMILineGraph({required this.data, Key? key}): super(key: key); Constants.bmiCalculatorShortcutBgColor.withOpacity(0), ]; + data.sort((a, b) => b.created_at.compareTo(a.created_at)); final dataPoints = data.asMap().entries.map((entry) { final index = entry.key.toDouble(); final bmi = entry.value.results; @@ -28,7 +30,7 @@ const BMILineGraph({required this.data, Key? key}): super(key: key); return Scaffold( body: Padding( padding: const EdgeInsets.all(16.0), - child: CustomLineChart( + child: CustomFilterLineChart( dataPoints: dataPoints, dateTimes: date, minX: 0, @@ -38,7 +40,8 @@ const BMILineGraph({required this.data, Key? key}): super(key: key); barColor: Constants.bmiCalculatorColor, gradientColors: gradientColors, bottomTile: true, - dateFormat: "dd/MM/yy", + // dateFormat: "dd/MM/yy", + filter: "Daily", ), ), ); diff --git a/lib/src/features/self_screening/bmi/presentation/widgets/BMILineList.dart b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineList.dart index 17861b00..e311a577 100644 --- a/lib/src/features/self_screening/bmi/presentation/widgets/BMILineList.dart +++ b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineList.dart @@ -8,6 +8,7 @@ class BMILinelist extends StatelessWidget { const BMILinelist({required this.data, Key? key}) : super(key: key); @override Widget build(BuildContext context) { + data.sort((a, b) => a.created_at.compareTo(b.created_at)); return ListView.builder( itemCount: data.length + 1, // +1 for the header row itemBuilder: (context, index) { diff --git a/lib/src/features/self_screening/bmi/presentation/widgets/GenderPicker.dart b/lib/src/features/self_screening/bmi/presentation/widgets/GenderPicker.dart index 73186153..636f8b3f 100644 --- a/lib/src/features/self_screening/bmi/presentation/widgets/GenderPicker.dart +++ b/lib/src/features/self_screening/bmi/presentation/widgets/GenderPicker.dart @@ -23,7 +23,7 @@ class GenderPicker extends StatelessWidget { final screenSize = getOrientationAwareScreenSize(context); final theme = Theme.of(context); final color = theme.canvasColor; - final bgColor = activeColor ?? Constants.activeSelectionColor; + final bgColor = activeColor ?? Constants.selfScreeningBgColor; final disabledColor = Colors.grey; return Row( diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index 31f7a27b..d403c30a 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -1,11 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:go_router/go_router.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/common/presentation/pages/chat_feeback_form.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/data/providers/blood_sugar_provider.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; @@ -13,34 +8,42 @@ import 'package:nishauri/src/features/self_screening/presentation/widgets/health import 'package:nishauri/src/features/self_screening/presentation/widgets/health_list.dart'; import 'package:nishauri/src/features/self_screening/presentation/widgets/image_card.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/custom_bottom_nav_bar.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/routes.dart'; -class SelfScreening extends HookConsumerWidget { - const SelfScreening({super.key}); +class SelfScreening extends ConsumerStatefulWidget { + const SelfScreening({Key? key}) : super(key: key); @override - Widget build(BuildContext context, WidgetRef ref) { + _SelfScreeningState createState() => _SelfScreeningState(); +} + +class _SelfScreeningState extends ConsumerState { + int _currIndex = 0; + int _messagesCount = 0; + + void _onTap(int index) { + setState(() { + _currIndex = index; + _messagesCount = 0; // Reset messages count + }); + } + + @override + Widget build(BuildContext context) { final theme = Theme.of(context); - int _currIndex = 0; - int _messagesCount = 0; final bpAsync = ref.watch(bloodPressureListProvider); final bmiListAsync = ref.watch(bmiListProvider); final currentBpEntries = bpAsync.when( data: (data) { - // Sort the list by date in descending order data.sort((a, b) => b.created_at.compareTo(a.created_at)); - // Return the most current object return data.isNotEmpty ? data.first : null; }, - error: (error, _) { - return null; - }, - loading: () { - return null; - }, + error: (error, _) => null, + loading: () => null, ); final bsAsync = ref.watch(bloodSugarEntriesProvider); @@ -48,40 +51,31 @@ class SelfScreening extends HookConsumerWidget { final currentBsEntries = bsAsync.when( data: (data) { data.sort((a, b) => b.created_at.compareTo(a.created_at)); - return data.first; - }, - error: (error, _) { - return null; - }, - loading: () { - return null; + return data.isNotEmpty ? data.first : null; }, + error: (error, _) => null, + loading: () => null, ); final currentBMIEntries = bmiListAsync.when( data: (data) { data.sort((a, b) => b.created_at.compareTo(a.created_at)); - return data.first; - }, - error: (error, _) { - return null; - }, - loading: () { - return null; + return data.isNotEmpty ? data.first : null; }, + error: (error, _) => null, + loading: () => null, ); - // Create a list of items and remove "Blood Pressure" if currentBpEntries is not null + // Create a list of items and remove entries based on available data final List items = ["Blood Sugar", "Blood Pressure", "BMI", "Period Calendar"]; - final List paths = [RouteNames.BLOOD_PRESSURE, RouteNames.BLOOD_SUGAR, RouteNames.BMI_CALCULATOR_RESULTS,]; - // final List extra = ['', '', '24']; + final List paths = [RouteNames.BLOOD_PRESSURE, RouteNames.BLOOD_SUGAR, RouteNames.BMI_CALCULATOR_RESULTS]; + if (currentBpEntries != null) { items.remove("Blood Pressure"); } if (currentBsEntries != null) { items.remove("Blood Sugar"); } - if (currentBMIEntries != null) { items.remove("BMI"); } @@ -93,8 +87,6 @@ class SelfScreening extends HookConsumerWidget { return double.parse(level.toStringAsFixed(1)); } - print(currentBMIEntries); - return Scaffold( body: Column( children: [ @@ -104,155 +96,101 @@ class SelfScreening extends HookConsumerWidget { color: Constants.selfScreeningBgColor, ), Expanded( - child: SingleChildScrollView( - child: Stack( - alignment: AlignmentDirectional.center, + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Cards showing health data - Wrap( - spacing: 5, - runSpacing: 16, - children: [ - currentBpEntries != null ? HealthCard( - svgAsset: "assets/images/boldDuotoneLikeHearts.svg", - title: "Blood Pressure", - value1: "${currentBpEntries.systolic}", - text1: "mmHG", - vName1: "Systolic", - value2: "${currentBpEntries.diastolic}", - text2: "mmHG", - vName2: "Diastolic", - value3: "${currentBpEntries.pulse_rate}", - text3: "Pulse/Min", - vName3: "Pulse Rate", - onPressed: () { - context.goNamed(RouteNames.BLOOD_PRESSURE); - }, - ) : const SizedBox(), - currentBsEntries != null ? HealthCard( - svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", - title: "Blood Sugar", - value1: "${currentBsEntries != null ? _convertToMMOL(currentBsEntries.level) : 'N/A'}", - text1: "mmol/L", - onPressed: () { - context.goNamed(RouteNames.BLOOD_SUGAR); - }, - ) : const SizedBox(), - HealthCard( - svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", - title: "Body Measurements", - value1: "${currentBMIEntries?.weight}", - text1: "KGS", - vName1: "Weight", - value2: "${currentBMIEntries?.height}", - text2: "Centimetres", - vName2: "Height", - value3: "${currentBMIEntries?.results}", - text3: "", - vName3: "BMI", - onPressed: () { - context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS); - }, - ), - ], - ), - const SizedBox(height: 10), - ItemList(items: items, path: paths), - const SizedBox(height: 20), - // Title for the next section - Text( - "About Self Screening", - style: theme.textTheme.titleMedium, - ), - const SizedBox(height: 10), - const Wrap( - alignment: WrapAlignment.center, - spacing: 1, - runSpacing: 16, - children: [ - ImageCard(imagePath: 'assets/images/hospital_building.svg'), - ImageCard(imagePath: 'assets/images/hospital_building.svg'), - ], - ), - const SizedBox(height: 20), - // Title for the understanding health section - Text( - "Understanding Your Health", - style: theme.textTheme.titleMedium, - ), - const SizedBox(height: 10), - Text( - "Understanding your health metrics is crucial for maintaining a healthy lifestyle. " - "Stay informed about your numbers and consult your healthcare provider when needed.", - style: theme.textTheme.bodyMedium, - ), - ], - ), + // Cards showing health data + Wrap( + spacing: 5, + runSpacing: 16, + children: [ + if (currentBpEntries != null) HealthCard( + svgAsset: "assets/images/boldDuotoneLikeHearts.svg", + title: "Blood Pressure", + value1: "${currentBpEntries.systolic}", + text1: "mmHG", + vName1: "Systolic", + value2: "${currentBpEntries.diastolic}", + text2: "mmHG", + vName2: "Diastolic", + value3: "${currentBpEntries.pulse_rate}", + text3: "Pulse/Min", + vName3: "Pulse Rate", + onPressed: () { + context.goNamed(RouteNames.BLOOD_PRESSURE); + }, + ), + if (currentBsEntries != null) HealthCard( + svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", + title: "Blood Sugar", + value1: "${_convertToMMOL(currentBsEntries.level)}", + text1: "mmol/L", + onPressed: () { + context.goNamed(RouteNames.BLOOD_SUGAR); + }, + ), + HealthCard( + svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", + title: "Body Measurements", + value1: "${currentBMIEntries?.weight ?? 'N/A'}", + text1: "KGS", + vName1: "Weight", + value2: "${currentBMIEntries?.height ?? 'N/A'}", + text2: "Centimetres", + vName2: "Height", + value3: "${currentBMIEntries?.results ?? 'N/A'}", + text3: "", + vName3: "BMI", + onPressed: () { + context.goNamed(RouteNames.BMI_CALCULATOR_RESULTS); + }, + ), + ], + ), + const SizedBox(height: 10), + ItemList(items: items, path: paths), + const SizedBox(height: 20), + // Title for the next section + Text( + "About Self Screening", + style: theme.textTheme.titleMedium, + ), + const SizedBox(height: 10), + const Wrap( + alignment: WrapAlignment.center, + spacing: 1, + runSpacing: 16, + children: [ + ImageCard(imagePath: 'assets/images/hospital_building.svg'), + ImageCard(imagePath: 'assets/images/hospital_building.svg'), + ], + ), + const SizedBox(height: 20), + // Title for the understanding health section + Text( + "Understanding Your Health", + style: theme.textTheme.titleMedium, + ), + const SizedBox(height: 10), + Text( + "Understanding your health metrics is crucial for maintaining a healthy lifestyle. " + "Stay informed about your numbers and consult your healthcare provider when needed.", + style: theme.textTheme.bodyMedium, ), ], ), - ) + ), + ), ), ], ), - bottomNavigationBar: BottomNavigationBar( - elevation: 0, - selectedItemColor: theme.colorScheme.primary, - unselectedItemColor: theme.disabledColor, - items: [ - BottomNavigationBarItem( - icon: SvgPicture.asset("assets/images/Home.svg"), - label: "Home", - activeIcon: SvgPicture.asset("assets/images/Home-Active.svg"), - ), - BottomNavigationBarItem( - icon: SvgPicture.asset("assets/images/Modules.svg"), - label: "Apps", - activeIcon: SvgPicture.asset("assets/images/Modules-active.svg"), - ), - BottomNavigationBarItem( - icon: SvgPicture.asset("assets/images/Chatbot.svg"), - label: "Ask Nuru", - activeIcon: SvgPicture.asset("assets/images/Chatbot-Active.svg"), - ), - BottomNavigationBarItem( - icon: SvgPicture.asset("assets/images/Settings.svg"), - label: "Settings", - activeIcon: SvgPicture.asset("assets/images/Settings-Active.svg"), - ), - ], + bottomNavigationBar: CustomBottomNavigationBar( currentIndex: _currIndex, - onTap: (index) async { - if (_currIndex == 2 && index != 2 && _messagesCount > 2) { - await showDialog( - context: context, - barrierDismissible: false, - builder: (context) => AlertDialog( - content: Stack( - children: [ - const ChatFeedbackForm(), - Positioned( - right: 0, - top: 0, - child: IconButton( - onPressed: () => Navigator.of(context).pop(), - icon: const FaIcon(FontAwesomeIcons.xmark), - ), - ), - ], - ), - ), - ); - } - // Update current index and messages count - _currIndex = index; - _messagesCount = 0; - }, + onTap: _onTap, + messagesCount: _messagesCount, ), ); } diff --git a/lib/src/features/visits/data/models/immunization.dart b/lib/src/features/visits/data/models/immunization.dart new file mode 100644 index 00000000..46f0c657 --- /dev/null +++ b/lib/src/features/visits/data/models/immunization.dart @@ -0,0 +1,16 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +part 'immunization.freezed.dart'; +part 'immunization.g.dart'; + +@Freezed() +class Immunization with _$Immunization { + const factory Immunization({ + required String uuid, + required String name, + required String dateRecorded, + required String status, + required String value, + }) = _Immunization; + + factory Immunization.fromJson(Map json)=> _$ImmunizationFromJson(json); +} \ No newline at end of file diff --git a/lib/src/features/visits/data/models/immunization.freezed.dart b/lib/src/features/visits/data/models/immunization.freezed.dart new file mode 100644 index 00000000..fa371445 --- /dev/null +++ b/lib/src/features/visits/data/models/immunization.freezed.dart @@ -0,0 +1,237 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'immunization.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Immunization _$ImmunizationFromJson(Map json) { + return _Immunization.fromJson(json); +} + +/// @nodoc +mixin _$Immunization { + String get uuid => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + String get dateRecorded => throw _privateConstructorUsedError; + String get status => throw _privateConstructorUsedError; + String get value => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $ImmunizationCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ImmunizationCopyWith<$Res> { + factory $ImmunizationCopyWith( + Immunization value, $Res Function(Immunization) then) = + _$ImmunizationCopyWithImpl<$Res, Immunization>; + @useResult + $Res call( + {String uuid, + String name, + String dateRecorded, + String status, + String value}); +} + +/// @nodoc +class _$ImmunizationCopyWithImpl<$Res, $Val extends Immunization> + implements $ImmunizationCopyWith<$Res> { + _$ImmunizationCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? uuid = null, + Object? name = null, + Object? dateRecorded = null, + Object? status = null, + Object? value = null, + }) { + return _then(_value.copyWith( + uuid: null == uuid + ? _value.uuid + : uuid // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + dateRecorded: null == dateRecorded + ? _value.dateRecorded + : dateRecorded // ignore: cast_nullable_to_non_nullable + as String, + status: null == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String, + value: null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ImmunizationImplCopyWith<$Res> + implements $ImmunizationCopyWith<$Res> { + factory _$$ImmunizationImplCopyWith( + _$ImmunizationImpl value, $Res Function(_$ImmunizationImpl) then) = + __$$ImmunizationImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String uuid, + String name, + String dateRecorded, + String status, + String value}); +} + +/// @nodoc +class __$$ImmunizationImplCopyWithImpl<$Res> + extends _$ImmunizationCopyWithImpl<$Res, _$ImmunizationImpl> + implements _$$ImmunizationImplCopyWith<$Res> { + __$$ImmunizationImplCopyWithImpl( + _$ImmunizationImpl _value, $Res Function(_$ImmunizationImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? uuid = null, + Object? name = null, + Object? dateRecorded = null, + Object? status = null, + Object? value = null, + }) { + return _then(_$ImmunizationImpl( + uuid: null == uuid + ? _value.uuid + : uuid // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + dateRecorded: null == dateRecorded + ? _value.dateRecorded + : dateRecorded // ignore: cast_nullable_to_non_nullable + as String, + status: null == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String, + value: null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ImmunizationImpl implements _Immunization { + const _$ImmunizationImpl( + {required this.uuid, + required this.name, + required this.dateRecorded, + required this.status, + required this.value}); + + factory _$ImmunizationImpl.fromJson(Map json) => + _$$ImmunizationImplFromJson(json); + + @override + final String uuid; + @override + final String name; + @override + final String dateRecorded; + @override + final String status; + @override + final String value; + + @override + String toString() { + return 'Immunization(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, status: $status, value: $value)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ImmunizationImpl && + (identical(other.uuid, uuid) || other.uuid == uuid) && + (identical(other.name, name) || other.name == name) && + (identical(other.dateRecorded, dateRecorded) || + other.dateRecorded == dateRecorded) && + (identical(other.status, status) || other.status == status) && + (identical(other.value, value) || other.value == value)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => + Object.hash(runtimeType, uuid, name, dateRecorded, status, value); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ImmunizationImplCopyWith<_$ImmunizationImpl> get copyWith => + __$$ImmunizationImplCopyWithImpl<_$ImmunizationImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ImmunizationImplToJson( + this, + ); + } +} + +abstract class _Immunization implements Immunization { + const factory _Immunization( + {required final String uuid, + required final String name, + required final String dateRecorded, + required final String status, + required final String value}) = _$ImmunizationImpl; + + factory _Immunization.fromJson(Map json) = + _$ImmunizationImpl.fromJson; + + @override + String get uuid; + @override + String get name; + @override + String get dateRecorded; + @override + String get status; + @override + String get value; + @override + @JsonKey(ignore: true) + _$$ImmunizationImplCopyWith<_$ImmunizationImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/visits/data/models/immunization.g.dart b/lib/src/features/visits/data/models/immunization.g.dart new file mode 100644 index 00000000..fc7aa739 --- /dev/null +++ b/lib/src/features/visits/data/models/immunization.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'immunization.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ImmunizationImpl _$$ImmunizationImplFromJson(Map json) => + _$ImmunizationImpl( + uuid: json['uuid'] as String, + name: json['name'] as String, + dateRecorded: json['dateRecorded'] as String, + status: json['status'] as String, + value: json['value'] as String, + ); + +Map _$$ImmunizationImplToJson(_$ImmunizationImpl instance) => + { + 'uuid': instance.uuid, + 'name': instance.name, + 'dateRecorded': instance.dateRecorded, + 'status': instance.status, + 'value': instance.value, + }; diff --git a/lib/src/features/visits/data/models/medication.dart b/lib/src/features/visits/data/models/medication.dart index 750c4c55..0e593e1d 100644 --- a/lib/src/features/visits/data/models/medication.dart +++ b/lib/src/features/visits/data/models/medication.dart @@ -1,17 +1,17 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; -part 'complaint.freezed.dart'; -part 'complaint.g.dart'; +part 'medication.freezed.dart'; +part 'medication.g.dart'; @Freezed() -class Medication with _$Complaint { +class Medication with _$Medication { const factory Medication({ required String uuid, required String name, String? onsetDate, required String dateRecorded, required String value, - }) = _Complaint; + }) = _Medication; - factory Medication.fromJson(Map json)=> _$ComplaintFromJson(json); + factory Medication.fromJson(Map json)=> _$MedicationFromJson(json); } \ No newline at end of file diff --git a/lib/src/features/visits/data/models/complaint.freezed.dart b/lib/src/features/visits/data/models/medication.freezed.dart similarity index 75% rename from lib/src/features/visits/data/models/complaint.freezed.dart rename to lib/src/features/visits/data/models/medication.freezed.dart index c56a8c35..3e509f57 100644 --- a/lib/src/features/visits/data/models/complaint.freezed.dart +++ b/lib/src/features/visits/data/models/medication.freezed.dart @@ -3,7 +3,7 @@ // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark -part of 'complaint.dart'; +part of 'medication.dart'; // ************************************************************************** // FreezedGenerator @@ -14,12 +14,12 @@ T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); -Complaint _$ComplaintFromJson(Map json) { - return _Complaint.fromJson(json); +Medication _$MedicationFromJson(Map json) { + return _Medication.fromJson(json); } /// @nodoc -mixin _$Complaint { +mixin _$Medication { String get uuid => throw _privateConstructorUsedError; String get name => throw _privateConstructorUsedError; String? get onsetDate => throw _privateConstructorUsedError; @@ -28,14 +28,15 @@ mixin _$Complaint { Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) - $ComplaintCopyWith get copyWith => + $MedicationCopyWith get copyWith => throw _privateConstructorUsedError; } /// @nodoc -abstract class $ComplaintCopyWith<$Res> { - factory $ComplaintCopyWith(Complaint value, $Res Function(Complaint) then) = - _$ComplaintCopyWithImpl<$Res, Complaint>; +abstract class $MedicationCopyWith<$Res> { + factory $MedicationCopyWith( + Medication value, $Res Function(Medication) then) = + _$MedicationCopyWithImpl<$Res, Medication>; @useResult $Res call( {String uuid, @@ -46,9 +47,9 @@ abstract class $ComplaintCopyWith<$Res> { } /// @nodoc -class _$ComplaintCopyWithImpl<$Res, $Val extends Complaint> - implements $ComplaintCopyWith<$Res> { - _$ComplaintCopyWithImpl(this._value, this._then); +class _$MedicationCopyWithImpl<$Res, $Val extends Medication> + implements $MedicationCopyWith<$Res> { + _$MedicationCopyWithImpl(this._value, this._then); // ignore: unused_field final $Val _value; @@ -90,11 +91,11 @@ class _$ComplaintCopyWithImpl<$Res, $Val extends Complaint> } /// @nodoc -abstract class _$$ComplaintImplCopyWith<$Res> - implements $ComplaintCopyWith<$Res> { - factory _$$ComplaintImplCopyWith( - _$ComplaintImpl value, $Res Function(_$ComplaintImpl) then) = - __$$ComplaintImplCopyWithImpl<$Res>; +abstract class _$$MedicationImplCopyWith<$Res> + implements $MedicationCopyWith<$Res> { + factory _$$MedicationImplCopyWith( + _$MedicationImpl value, $Res Function(_$MedicationImpl) then) = + __$$MedicationImplCopyWithImpl<$Res>; @override @useResult $Res call( @@ -106,11 +107,11 @@ abstract class _$$ComplaintImplCopyWith<$Res> } /// @nodoc -class __$$ComplaintImplCopyWithImpl<$Res> - extends _$ComplaintCopyWithImpl<$Res, _$ComplaintImpl> - implements _$$ComplaintImplCopyWith<$Res> { - __$$ComplaintImplCopyWithImpl( - _$ComplaintImpl _value, $Res Function(_$ComplaintImpl) _then) +class __$$MedicationImplCopyWithImpl<$Res> + extends _$MedicationCopyWithImpl<$Res, _$MedicationImpl> + implements _$$MedicationImplCopyWith<$Res> { + __$$MedicationImplCopyWithImpl( + _$MedicationImpl _value, $Res Function(_$MedicationImpl) _then) : super(_value, _then); @pragma('vm:prefer-inline') @@ -122,7 +123,7 @@ class __$$ComplaintImplCopyWithImpl<$Res> Object? dateRecorded = null, Object? value = null, }) { - return _then(_$ComplaintImpl( + return _then(_$MedicationImpl( uuid: null == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable @@ -149,16 +150,16 @@ class __$$ComplaintImplCopyWithImpl<$Res> /// @nodoc @JsonSerializable() -class _$ComplaintImpl with DiagnosticableTreeMixin implements _Complaint { - const _$ComplaintImpl( +class _$MedicationImpl with DiagnosticableTreeMixin implements _Medication { + const _$MedicationImpl( {required this.uuid, required this.name, this.onsetDate, required this.dateRecorded, required this.value}); - factory _$ComplaintImpl.fromJson(Map json) => - _$$ComplaintImplFromJson(json); + factory _$MedicationImpl.fromJson(Map json) => + _$$MedicationImplFromJson(json); @override final String uuid; @@ -173,14 +174,14 @@ class _$ComplaintImpl with DiagnosticableTreeMixin implements _Complaint { @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'Complaint(uuid: $uuid, name: $name, onsetDate: $onsetDate, dateRecorded: $dateRecorded, value: $value)'; + return 'Medication(uuid: $uuid, name: $name, onsetDate: $onsetDate, dateRecorded: $dateRecorded, value: $value)'; } @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties - ..add(DiagnosticsProperty('type', 'Complaint')) + ..add(DiagnosticsProperty('type', 'Medication')) ..add(DiagnosticsProperty('uuid', uuid)) ..add(DiagnosticsProperty('name', name)) ..add(DiagnosticsProperty('onsetDate', onsetDate)) @@ -192,7 +193,7 @@ class _$ComplaintImpl with DiagnosticableTreeMixin implements _Complaint { bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && - other is _$ComplaintImpl && + other is _$MedicationImpl && (identical(other.uuid, uuid) || other.uuid == uuid) && (identical(other.name, name) || other.name == name) && (identical(other.onsetDate, onsetDate) || @@ -210,27 +211,27 @@ class _$ComplaintImpl with DiagnosticableTreeMixin implements _Complaint { @JsonKey(ignore: true) @override @pragma('vm:prefer-inline') - _$$ComplaintImplCopyWith<_$ComplaintImpl> get copyWith => - __$$ComplaintImplCopyWithImpl<_$ComplaintImpl>(this, _$identity); + _$$MedicationImplCopyWith<_$MedicationImpl> get copyWith => + __$$MedicationImplCopyWithImpl<_$MedicationImpl>(this, _$identity); @override Map toJson() { - return _$$ComplaintImplToJson( + return _$$MedicationImplToJson( this, ); } } -abstract class _Complaint implements Complaint { - const factory _Complaint( +abstract class _Medication implements Medication { + const factory _Medication( {required final String uuid, required final String name, final String? onsetDate, required final String dateRecorded, - required final String value}) = _$ComplaintImpl; + required final String value}) = _$MedicationImpl; - factory _Complaint.fromJson(Map json) = - _$ComplaintImpl.fromJson; + factory _Medication.fromJson(Map json) = + _$MedicationImpl.fromJson; @override String get uuid; @@ -244,6 +245,6 @@ abstract class _Complaint implements Complaint { String get value; @override @JsonKey(ignore: true) - _$$ComplaintImplCopyWith<_$ComplaintImpl> get copyWith => + _$$MedicationImplCopyWith<_$MedicationImpl> get copyWith => throw _privateConstructorUsedError; } diff --git a/lib/src/features/visits/data/models/complaint.g.dart b/lib/src/features/visits/data/models/medication.g.dart similarity index 76% rename from lib/src/features/visits/data/models/complaint.g.dart rename to lib/src/features/visits/data/models/medication.g.dart index bd80b415..19a1f53f 100644 --- a/lib/src/features/visits/data/models/complaint.g.dart +++ b/lib/src/features/visits/data/models/medication.g.dart @@ -1,13 +1,13 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'complaint.dart'; +part of 'medication.dart'; // ************************************************************************** // JsonSerializableGenerator // ************************************************************************** -_$ComplaintImpl _$$ComplaintImplFromJson(Map json) => - _$ComplaintImpl( +_$MedicationImpl _$$MedicationImplFromJson(Map json) => + _$MedicationImpl( uuid: json['uuid'] as String, name: json['name'] as String, onsetDate: json['onsetDate'] as String?, @@ -15,7 +15,7 @@ _$ComplaintImpl _$$ComplaintImplFromJson(Map json) => value: json['value'] as String, ); -Map _$$ComplaintImplToJson(_$ComplaintImpl instance) => +Map _$$MedicationImplToJson(_$MedicationImpl instance) => { 'uuid': instance.uuid, 'name': instance.name, diff --git a/lib/src/features/visits/data/models/procedure.dart b/lib/src/features/visits/data/models/procedure.dart index 4f7252b2..530641ce 100644 --- a/lib/src/features/visits/data/models/procedure.dart +++ b/lib/src/features/visits/data/models/procedure.dart @@ -1,16 +1,16 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; -part 'diagnosis.freezed.dart'; -part 'diagnosis.g.dart'; +part 'procedure.freezed.dart'; +part 'procedure.g.dart'; @Freezed() -class Procedure with _$Diagnosis { +class Procedure with _$Procedure { const factory Procedure({ required String uuid, required String name, required String dateRecorded, required String value, - }) = _Diagnosis; + }) = _Procedure; - factory Procedure.fromJson(Map json)=> _$DiagnosisFromJson(json); + factory Procedure.fromJson(Map json)=> _$ProcedureFromJson(json); } \ No newline at end of file diff --git a/lib/src/features/visits/data/models/diagnosis.freezed.dart b/lib/src/features/visits/data/models/procedure.freezed.dart similarity index 73% rename from lib/src/features/visits/data/models/diagnosis.freezed.dart rename to lib/src/features/visits/data/models/procedure.freezed.dart index 3b5cadf4..dbba61b9 100644 --- a/lib/src/features/visits/data/models/diagnosis.freezed.dart +++ b/lib/src/features/visits/data/models/procedure.freezed.dart @@ -3,7 +3,7 @@ // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark -part of 'diagnosis.dart'; +part of 'procedure.dart'; // ************************************************************************** // FreezedGenerator @@ -14,12 +14,12 @@ T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); -Diagnosis _$DiagnosisFromJson(Map json) { - return _Diagnosis.fromJson(json); +Procedure _$ProcedureFromJson(Map json) { + return _Procedure.fromJson(json); } /// @nodoc -mixin _$Diagnosis { +mixin _$Procedure { String get uuid => throw _privateConstructorUsedError; String get name => throw _privateConstructorUsedError; String get dateRecorded => throw _privateConstructorUsedError; @@ -27,22 +27,22 @@ mixin _$Diagnosis { Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) - $DiagnosisCopyWith get copyWith => + $ProcedureCopyWith get copyWith => throw _privateConstructorUsedError; } /// @nodoc -abstract class $DiagnosisCopyWith<$Res> { - factory $DiagnosisCopyWith(Diagnosis value, $Res Function(Diagnosis) then) = - _$DiagnosisCopyWithImpl<$Res, Diagnosis>; +abstract class $ProcedureCopyWith<$Res> { + factory $ProcedureCopyWith(Procedure value, $Res Function(Procedure) then) = + _$ProcedureCopyWithImpl<$Res, Procedure>; @useResult $Res call({String uuid, String name, String dateRecorded, String value}); } /// @nodoc -class _$DiagnosisCopyWithImpl<$Res, $Val extends Diagnosis> - implements $DiagnosisCopyWith<$Res> { - _$DiagnosisCopyWithImpl(this._value, this._then); +class _$ProcedureCopyWithImpl<$Res, $Val extends Procedure> + implements $ProcedureCopyWith<$Res> { + _$ProcedureCopyWithImpl(this._value, this._then); // ignore: unused_field final $Val _value; @@ -79,22 +79,22 @@ class _$DiagnosisCopyWithImpl<$Res, $Val extends Diagnosis> } /// @nodoc -abstract class _$$DiagnosisImplCopyWith<$Res> - implements $DiagnosisCopyWith<$Res> { - factory _$$DiagnosisImplCopyWith( - _$DiagnosisImpl value, $Res Function(_$DiagnosisImpl) then) = - __$$DiagnosisImplCopyWithImpl<$Res>; +abstract class _$$ProcedureImplCopyWith<$Res> + implements $ProcedureCopyWith<$Res> { + factory _$$ProcedureImplCopyWith( + _$ProcedureImpl value, $Res Function(_$ProcedureImpl) then) = + __$$ProcedureImplCopyWithImpl<$Res>; @override @useResult $Res call({String uuid, String name, String dateRecorded, String value}); } /// @nodoc -class __$$DiagnosisImplCopyWithImpl<$Res> - extends _$DiagnosisCopyWithImpl<$Res, _$DiagnosisImpl> - implements _$$DiagnosisImplCopyWith<$Res> { - __$$DiagnosisImplCopyWithImpl( - _$DiagnosisImpl _value, $Res Function(_$DiagnosisImpl) _then) +class __$$ProcedureImplCopyWithImpl<$Res> + extends _$ProcedureCopyWithImpl<$Res, _$ProcedureImpl> + implements _$$ProcedureImplCopyWith<$Res> { + __$$ProcedureImplCopyWithImpl( + _$ProcedureImpl _value, $Res Function(_$ProcedureImpl) _then) : super(_value, _then); @pragma('vm:prefer-inline') @@ -105,7 +105,7 @@ class __$$DiagnosisImplCopyWithImpl<$Res> Object? dateRecorded = null, Object? value = null, }) { - return _then(_$DiagnosisImpl( + return _then(_$ProcedureImpl( uuid: null == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable @@ -128,15 +128,15 @@ class __$$DiagnosisImplCopyWithImpl<$Res> /// @nodoc @JsonSerializable() -class _$DiagnosisImpl with DiagnosticableTreeMixin implements _Diagnosis { - const _$DiagnosisImpl( +class _$ProcedureImpl with DiagnosticableTreeMixin implements _Procedure { + const _$ProcedureImpl( {required this.uuid, required this.name, required this.dateRecorded, required this.value}); - factory _$DiagnosisImpl.fromJson(Map json) => - _$$DiagnosisImplFromJson(json); + factory _$ProcedureImpl.fromJson(Map json) => + _$$ProcedureImplFromJson(json); @override final String uuid; @@ -149,14 +149,14 @@ class _$DiagnosisImpl with DiagnosticableTreeMixin implements _Diagnosis { @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'Diagnosis(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, value: $value)'; + return 'Procedure(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, value: $value)'; } @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties - ..add(DiagnosticsProperty('type', 'Diagnosis')) + ..add(DiagnosticsProperty('type', 'Procedure')) ..add(DiagnosticsProperty('uuid', uuid)) ..add(DiagnosticsProperty('name', name)) ..add(DiagnosticsProperty('dateRecorded', dateRecorded)) @@ -167,7 +167,7 @@ class _$DiagnosisImpl with DiagnosticableTreeMixin implements _Diagnosis { bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && - other is _$DiagnosisImpl && + other is _$ProcedureImpl && (identical(other.uuid, uuid) || other.uuid == uuid) && (identical(other.name, name) || other.name == name) && (identical(other.dateRecorded, dateRecorded) || @@ -182,26 +182,26 @@ class _$DiagnosisImpl with DiagnosticableTreeMixin implements _Diagnosis { @JsonKey(ignore: true) @override @pragma('vm:prefer-inline') - _$$DiagnosisImplCopyWith<_$DiagnosisImpl> get copyWith => - __$$DiagnosisImplCopyWithImpl<_$DiagnosisImpl>(this, _$identity); + _$$ProcedureImplCopyWith<_$ProcedureImpl> get copyWith => + __$$ProcedureImplCopyWithImpl<_$ProcedureImpl>(this, _$identity); @override Map toJson() { - return _$$DiagnosisImplToJson( + return _$$ProcedureImplToJson( this, ); } } -abstract class _Diagnosis implements Diagnosis { - const factory _Diagnosis( +abstract class _Procedure implements Procedure { + const factory _Procedure( {required final String uuid, required final String name, required final String dateRecorded, - required final String value}) = _$DiagnosisImpl; + required final String value}) = _$ProcedureImpl; - factory _Diagnosis.fromJson(Map json) = - _$DiagnosisImpl.fromJson; + factory _Procedure.fromJson(Map json) = + _$ProcedureImpl.fromJson; @override String get uuid; @@ -213,6 +213,6 @@ abstract class _Diagnosis implements Diagnosis { String get value; @override @JsonKey(ignore: true) - _$$DiagnosisImplCopyWith<_$DiagnosisImpl> get copyWith => + _$$ProcedureImplCopyWith<_$ProcedureImpl> get copyWith => throw _privateConstructorUsedError; } diff --git a/lib/src/features/visits/data/models/diagnosis.g.dart b/lib/src/features/visits/data/models/procedure.g.dart similarity index 76% rename from lib/src/features/visits/data/models/diagnosis.g.dart rename to lib/src/features/visits/data/models/procedure.g.dart index 0f4c096c..6cdb64c1 100644 --- a/lib/src/features/visits/data/models/diagnosis.g.dart +++ b/lib/src/features/visits/data/models/procedure.g.dart @@ -1,20 +1,20 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'diagnosis.dart'; +part of 'procedure.dart'; // ************************************************************************** // JsonSerializableGenerator // ************************************************************************** -_$DiagnosisImpl _$$DiagnosisImplFromJson(Map json) => - _$DiagnosisImpl( +_$ProcedureImpl _$$ProcedureImplFromJson(Map json) => + _$ProcedureImpl( uuid: json['uuid'] as String, name: json['name'] as String, dateRecorded: json['dateRecorded'] as String, value: json['value'] as String, ); -Map _$$DiagnosisImplToJson(_$DiagnosisImpl instance) => +Map _$$ProcedureImplToJson(_$ProcedureImpl instance) => { 'uuid': instance.uuid, 'name': instance.name, diff --git a/lib/src/features/visits/data/models/visit.dart b/lib/src/features/visits/data/models/visit.dart index 1f3102f0..ec725399 100644 --- a/lib/src/features/visits/data/models/visit.dart +++ b/lib/src/features/visits/data/models/visit.dart @@ -1,9 +1,10 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; import 'package:nishauri/src/features/visits/data/models/allergy.dart'; -import 'package:nishauri/src/features/visits/data/models/complaint.dart'; +import 'package:nishauri/src/features/visits/data/models/medication.dart'; import 'package:nishauri/src/features/visits/data/models/condition.dart'; -import 'package:nishauri/src/features/visits/data/models/diagnosis.dart'; +import 'package:nishauri/src/features/visits/data/models/procedure.dart'; +import 'package:nishauri/src/features/visits/data/models/immunization.dart'; import 'package:nishauri/src/features/visits/data/models/lab_result.dart'; import 'package:nishauri/src/features/visits/data/models/vital.dart'; part 'visit.freezed.dart'; @@ -14,11 +15,13 @@ class Visit with _$Visit { const factory Visit({ required String uuid, @Default([]) List allergies, - @Default([]) List complaints, + @Default([]) List medications, @Default([]) List conditions, - @Default([]) List diagnosis, + @Default([]) List procedures, @Default([]) List labResults, @Default([]) List vitals, + @Default([]) List immunization, + String? facility, required String visitDate, }) = _Visit; diff --git a/lib/src/features/visits/data/models/visit.freezed.dart b/lib/src/features/visits/data/models/visit.freezed.dart index f2371743..5d15707d 100644 --- a/lib/src/features/visits/data/models/visit.freezed.dart +++ b/lib/src/features/visits/data/models/visit.freezed.dart @@ -22,11 +22,13 @@ Visit _$VisitFromJson(Map json) { mixin _$Visit { String get uuid => throw _privateConstructorUsedError; List get allergies => throw _privateConstructorUsedError; - List get complaints => throw _privateConstructorUsedError; + List get medications => throw _privateConstructorUsedError; List get conditions => throw _privateConstructorUsedError; - List get diagnosis => throw _privateConstructorUsedError; + List get procedures => throw _privateConstructorUsedError; List get labResults => throw _privateConstructorUsedError; List get vitals => throw _privateConstructorUsedError; + List get immunization => throw _privateConstructorUsedError; + String? get facility => throw _privateConstructorUsedError; String get visitDate => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @@ -42,11 +44,13 @@ abstract class $VisitCopyWith<$Res> { $Res call( {String uuid, List allergies, - List complaints, + List medications, List conditions, - List diagnosis, + List procedures, List labResults, List vitals, + List immunization, + String? facility, String visitDate}); } @@ -65,11 +69,13 @@ class _$VisitCopyWithImpl<$Res, $Val extends Visit> $Res call({ Object? uuid = null, Object? allergies = null, - Object? complaints = null, + Object? medications = null, Object? conditions = null, - Object? diagnosis = null, + Object? procedures = null, Object? labResults = null, Object? vitals = null, + Object? immunization = null, + Object? facility = freezed, Object? visitDate = null, }) { return _then(_value.copyWith( @@ -81,18 +87,18 @@ class _$VisitCopyWithImpl<$Res, $Val extends Visit> ? _value.allergies : allergies // ignore: cast_nullable_to_non_nullable as List, - complaints: null == complaints - ? _value.complaints - : complaints // ignore: cast_nullable_to_non_nullable - as List, + medications: null == medications + ? _value.medications + : medications // ignore: cast_nullable_to_non_nullable + as List, conditions: null == conditions ? _value.conditions : conditions // ignore: cast_nullable_to_non_nullable as List, - diagnosis: null == diagnosis - ? _value.diagnosis - : diagnosis // ignore: cast_nullable_to_non_nullable - as List, + procedures: null == procedures + ? _value.procedures + : procedures // ignore: cast_nullable_to_non_nullable + as List, labResults: null == labResults ? _value.labResults : labResults // ignore: cast_nullable_to_non_nullable @@ -101,6 +107,14 @@ class _$VisitCopyWithImpl<$Res, $Val extends Visit> ? _value.vitals : vitals // ignore: cast_nullable_to_non_nullable as List, + immunization: null == immunization + ? _value.immunization + : immunization // ignore: cast_nullable_to_non_nullable + as List, + facility: freezed == facility + ? _value.facility + : facility // ignore: cast_nullable_to_non_nullable + as String?, visitDate: null == visitDate ? _value.visitDate : visitDate // ignore: cast_nullable_to_non_nullable @@ -119,11 +133,13 @@ abstract class _$$VisitImplCopyWith<$Res> implements $VisitCopyWith<$Res> { $Res call( {String uuid, List allergies, - List complaints, + List medications, List conditions, - List diagnosis, + List procedures, List labResults, List vitals, + List immunization, + String? facility, String visitDate}); } @@ -140,11 +156,13 @@ class __$$VisitImplCopyWithImpl<$Res> $Res call({ Object? uuid = null, Object? allergies = null, - Object? complaints = null, + Object? medications = null, Object? conditions = null, - Object? diagnosis = null, + Object? procedures = null, Object? labResults = null, Object? vitals = null, + Object? immunization = null, + Object? facility = freezed, Object? visitDate = null, }) { return _then(_$VisitImpl( @@ -156,18 +174,18 @@ class __$$VisitImplCopyWithImpl<$Res> ? _value._allergies : allergies // ignore: cast_nullable_to_non_nullable as List, - complaints: null == complaints - ? _value._complaints - : complaints // ignore: cast_nullable_to_non_nullable - as List, + medications: null == medications + ? _value._medications + : medications // ignore: cast_nullable_to_non_nullable + as List, conditions: null == conditions ? _value._conditions : conditions // ignore: cast_nullable_to_non_nullable as List, - diagnosis: null == diagnosis - ? _value._diagnosis - : diagnosis // ignore: cast_nullable_to_non_nullable - as List, + procedures: null == procedures + ? _value._procedures + : procedures // ignore: cast_nullable_to_non_nullable + as List, labResults: null == labResults ? _value._labResults : labResults // ignore: cast_nullable_to_non_nullable @@ -176,6 +194,14 @@ class __$$VisitImplCopyWithImpl<$Res> ? _value._vitals : vitals // ignore: cast_nullable_to_non_nullable as List, + immunization: null == immunization + ? _value._immunization + : immunization // ignore: cast_nullable_to_non_nullable + as List, + facility: freezed == facility + ? _value.facility + : facility // ignore: cast_nullable_to_non_nullable + as String?, visitDate: null == visitDate ? _value.visitDate : visitDate // ignore: cast_nullable_to_non_nullable @@ -190,18 +216,21 @@ class _$VisitImpl with DiagnosticableTreeMixin implements _Visit { const _$VisitImpl( {required this.uuid, final List allergies = const [], - final List complaints = const [], + final List medications = const [], final List conditions = const [], - final List diagnosis = const [], + final List procedures = const [], final List labResults = const [], final List vitals = const [], + final List immunization = const [], + this.facility, required this.visitDate}) : _allergies = allergies, - _complaints = complaints, + _medications = medications, _conditions = conditions, - _diagnosis = diagnosis, + _procedures = procedures, _labResults = labResults, - _vitals = vitals; + _vitals = vitals, + _immunization = immunization; factory _$VisitImpl.fromJson(Map json) => _$$VisitImplFromJson(json); @@ -217,13 +246,13 @@ class _$VisitImpl with DiagnosticableTreeMixin implements _Visit { return EqualUnmodifiableListView(_allergies); } - final List _complaints; + final List _medications; @override @JsonKey() - List get complaints { - if (_complaints is EqualUnmodifiableListView) return _complaints; + List get medications { + if (_medications is EqualUnmodifiableListView) return _medications; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_complaints); + return EqualUnmodifiableListView(_medications); } final List _conditions; @@ -235,13 +264,13 @@ class _$VisitImpl with DiagnosticableTreeMixin implements _Visit { return EqualUnmodifiableListView(_conditions); } - final List _diagnosis; + final List _procedures; @override @JsonKey() - List get diagnosis { - if (_diagnosis is EqualUnmodifiableListView) return _diagnosis; + List get procedures { + if (_procedures is EqualUnmodifiableListView) return _procedures; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_diagnosis); + return EqualUnmodifiableListView(_procedures); } final List _labResults; @@ -262,12 +291,23 @@ class _$VisitImpl with DiagnosticableTreeMixin implements _Visit { return EqualUnmodifiableListView(_vitals); } + final List _immunization; + @override + @JsonKey() + List get immunization { + if (_immunization is EqualUnmodifiableListView) return _immunization; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_immunization); + } + + @override + final String? facility; @override final String visitDate; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'Visit(uuid: $uuid, allergies: $allergies, complaints: $complaints, conditions: $conditions, diagnosis: $diagnosis, labResults: $labResults, vitals: $vitals, visitDate: $visitDate)'; + return 'Visit(uuid: $uuid, allergies: $allergies, medications: $medications, conditions: $conditions, procedures: $procedures, labResults: $labResults, vitals: $vitals, immunization: $immunization, facility: $facility, visitDate: $visitDate)'; } @override @@ -277,11 +317,13 @@ class _$VisitImpl with DiagnosticableTreeMixin implements _Visit { ..add(DiagnosticsProperty('type', 'Visit')) ..add(DiagnosticsProperty('uuid', uuid)) ..add(DiagnosticsProperty('allergies', allergies)) - ..add(DiagnosticsProperty('complaints', complaints)) + ..add(DiagnosticsProperty('medications', medications)) ..add(DiagnosticsProperty('conditions', conditions)) - ..add(DiagnosticsProperty('diagnosis', diagnosis)) + ..add(DiagnosticsProperty('procedures', procedures)) ..add(DiagnosticsProperty('labResults', labResults)) ..add(DiagnosticsProperty('vitals', vitals)) + ..add(DiagnosticsProperty('immunization', immunization)) + ..add(DiagnosticsProperty('facility', facility)) ..add(DiagnosticsProperty('visitDate', visitDate)); } @@ -294,14 +336,18 @@ class _$VisitImpl with DiagnosticableTreeMixin implements _Visit { const DeepCollectionEquality() .equals(other._allergies, _allergies) && const DeepCollectionEquality() - .equals(other._complaints, _complaints) && + .equals(other._medications, _medications) && const DeepCollectionEquality() .equals(other._conditions, _conditions) && const DeepCollectionEquality() - .equals(other._diagnosis, _diagnosis) && + .equals(other._procedures, _procedures) && const DeepCollectionEquality() .equals(other._labResults, _labResults) && const DeepCollectionEquality().equals(other._vitals, _vitals) && + const DeepCollectionEquality() + .equals(other._immunization, _immunization) && + (identical(other.facility, facility) || + other.facility == facility) && (identical(other.visitDate, visitDate) || other.visitDate == visitDate)); } @@ -312,11 +358,13 @@ class _$VisitImpl with DiagnosticableTreeMixin implements _Visit { runtimeType, uuid, const DeepCollectionEquality().hash(_allergies), - const DeepCollectionEquality().hash(_complaints), + const DeepCollectionEquality().hash(_medications), const DeepCollectionEquality().hash(_conditions), - const DeepCollectionEquality().hash(_diagnosis), + const DeepCollectionEquality().hash(_procedures), const DeepCollectionEquality().hash(_labResults), const DeepCollectionEquality().hash(_vitals), + const DeepCollectionEquality().hash(_immunization), + facility, visitDate); @JsonKey(ignore: true) @@ -337,11 +385,13 @@ abstract class _Visit implements Visit { const factory _Visit( {required final String uuid, final List allergies, - final List complaints, + final List medications, final List conditions, - final List diagnosis, + final List procedures, final List labResults, final List vitals, + final List immunization, + final String? facility, required final String visitDate}) = _$VisitImpl; factory _Visit.fromJson(Map json) = _$VisitImpl.fromJson; @@ -351,16 +401,20 @@ abstract class _Visit implements Visit { @override List get allergies; @override - List get complaints; + List get medications; @override List get conditions; @override - List get diagnosis; + List get procedures; @override List get labResults; @override List get vitals; @override + List get immunization; + @override + String? get facility; + @override String get visitDate; @override @JsonKey(ignore: true) diff --git a/lib/src/features/visits/data/models/visit.g.dart b/lib/src/features/visits/data/models/visit.g.dart index 3bb336e8..42ccd8a2 100644 --- a/lib/src/features/visits/data/models/visit.g.dart +++ b/lib/src/features/visits/data/models/visit.g.dart @@ -12,16 +12,16 @@ _$VisitImpl _$$VisitImplFromJson(Map json) => _$VisitImpl( ?.map((e) => Allergy.fromJson(e as Map)) .toList() ?? const [], - complaints: (json['complaints'] as List?) - ?.map((e) => Complaint.fromJson(e as Map)) + medications: (json['medications'] as List?) + ?.map((e) => Medication.fromJson(e as Map)) .toList() ?? const [], conditions: (json['conditions'] as List?) ?.map((e) => Condition.fromJson(e as Map)) .toList() ?? const [], - diagnosis: (json['diagnosis'] as List?) - ?.map((e) => Diagnosis.fromJson(e as Map)) + procedures: (json['procedures'] as List?) + ?.map((e) => Procedure.fromJson(e as Map)) .toList() ?? const [], labResults: (json['labResults'] as List?) @@ -32,6 +32,11 @@ _$VisitImpl _$$VisitImplFromJson(Map json) => _$VisitImpl( ?.map((e) => Vital.fromJson(e as Map)) .toList() ?? const [], + immunization: (json['immunization'] as List?) + ?.map((e) => Immunization.fromJson(e as Map)) + .toList() ?? + const [], + facility: json['facility'] as String?, visitDate: json['visitDate'] as String, ); @@ -39,10 +44,12 @@ Map _$$VisitImplToJson(_$VisitImpl instance) => { 'uuid': instance.uuid, 'allergies': instance.allergies, - 'complaints': instance.complaints, + 'medications': instance.medications, 'conditions': instance.conditions, - 'diagnosis': instance.diagnosis, + 'procedures': instance.procedures, 'labResults': instance.labResults, 'vitals': instance.vitals, + 'immunization': instance.immunization, + 'facility': instance.facility, 'visitDate': instance.visitDate, }; diff --git a/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart b/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart index 2dd8db10..2d6a9442 100644 --- a/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart +++ b/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart @@ -56,12 +56,12 @@ class FacilityVisitDetailScreen extends HookConsumerWidget { notFoundText: "No Allergies records"), ): AllergiesTab(allergies: visitDetail.allergies), - visitDetail.complaints.isEmpty ? const Center( - child: BackgroundImageWidget( - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No complaints records"), - ): - ComplaintsTab(complaints: visitDetail.complaints), + // visitDetail.complaints.isEmpty ? const Center( + // child: BackgroundImageWidget( + // svgImage: 'assets/images/lab-empty-state.svg', + // notFoundText: "No complaints records"), + // ): + // ComplaintsTab(complaints: visitDetail.complaints), visitDetail.conditions.isEmpty ? const Center( child: BackgroundImageWidget( svgImage: 'assets/images/lab-empty-state.svg', @@ -74,12 +74,12 @@ class FacilityVisitDetailScreen extends HookConsumerWidget { notFoundText: "No Lab result records."), ): LabResultsTab(labResult: visitDetail.labResults), - visitDetail.diagnosis.isEmpty ? const Center( - child: BackgroundImageWidget( - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No Diagnosis records."), - ): - DiagnosisTab(diagnosis: visitDetail.diagnosis), + // visitDetail.diagnosis.isEmpty ? const Center( + // child: BackgroundImageWidget( + // svgImage: 'assets/images/lab-empty-state.svg', + // notFoundText: "No Diagnosis records."), + // ): + // DiagnosisTab(diagnosis: visitDetail.diagnosis), ]; return Scaffold( diff --git a/lib/src/features/visits/presentations/widgets/ComplaintsTab.dart b/lib/src/features/visits/presentations/widgets/ComplaintsTab.dart index 776f714d..c5349f9a 100644 --- a/lib/src/features/visits/presentations/widgets/ComplaintsTab.dart +++ b/lib/src/features/visits/presentations/widgets/ComplaintsTab.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/visits/data/models/complaint.dart'; +import 'package:nishauri/src/features/visits/data/models/medication.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:nishauri/src/utils/constants.dart'; class ComplaintsTab extends StatelessWidget { - final List complaints; + final List complaints; const ComplaintsTab({super.key, this.complaints=const[]}); @override diff --git a/lib/src/features/visits/presentations/widgets/Diagnosis.dart b/lib/src/features/visits/presentations/widgets/Diagnosis.dart index f87265e8..a3466a53 100644 --- a/lib/src/features/visits/presentations/widgets/Diagnosis.dart +++ b/lib/src/features/visits/presentations/widgets/Diagnosis.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/visits/data/models/diagnosis.dart'; +import 'package:nishauri/src/features/visits/data/models/procedure.dart'; import 'package:nishauri/src/shared/display/AppCard.dart'; import 'package:nishauri/src/utils/constants.dart'; class DiagnosisTab extends StatelessWidget { - final List diagnosis; + final List diagnosis; const DiagnosisTab({super.key, this.diagnosis =const[]}); @override diff --git a/lib/src/shared/charts/CustomLineChart.dart b/lib/src/shared/charts/CustomLineChart.dart index 5e102131..0d82aa76 100644 --- a/lib/src/shared/charts/CustomLineChart.dart +++ b/lib/src/shared/charts/CustomLineChart.dart @@ -56,7 +56,7 @@ class CustomLineChart extends StatelessWidget { spots: dataPoints, isCurved: true, color: barColor, - barWidth: 6, + barWidth: 2, belowBarData: BarAreaData( show: true, gradient: LinearGradient( diff --git a/lib/src/shared/display/custom_bottom_nav_bar.dart b/lib/src/shared/display/custom_bottom_nav_bar.dart new file mode 100644 index 00000000..dacd4fdb --- /dev/null +++ b/lib/src/shared/display/custom_bottom_nav_bar.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:nishauri/src/features/common/presentation/pages/chat_feeback_form.dart'; + +class CustomBottomNavigationBar extends StatelessWidget { + final int currentIndex; + final ValueChanged onTap; + final int messagesCount; + + const CustomBottomNavigationBar({ + Key? key, + required this.currentIndex, + required this.onTap, + required this.messagesCount, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return BottomNavigationBar( + elevation: 0, + selectedItemColor: Theme.of(context).colorScheme.primary, + unselectedItemColor: Theme.of(context).disabledColor, + items: [ + BottomNavigationBarItem( + icon: SvgPicture.asset("assets/images/Home.svg"), + label: "Home", + activeIcon: SvgPicture.asset("assets/images/Home-Active.svg"), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset("assets/images/Modules.svg"), + label: "Apps", + activeIcon: SvgPicture.asset("assets/images/Modules-active.svg"), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset("assets/images/Chatbot.svg"), + label: "Ask Nuru", + activeIcon: SvgPicture.asset("assets/images/Chatbot-Active.svg"), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset("assets/images/Settings.svg"), + label: "Settings", + activeIcon: SvgPicture.asset("assets/images/Settings-Active.svg"), + ), + ], + currentIndex: currentIndex, + onTap: (index) async { + if (currentIndex == 2 && index != 2 && messagesCount > 2) { + await showDialog( + context: context, + barrierDismissible: false, + builder: (context) => AlertDialog( + content: Stack( + children: [ + const ChatFeedbackForm(), + Positioned( + right: 0, + top: 0, + child: IconButton( + onPressed: () => Navigator.of(context).pop(), + icon: const FaIcon(FontAwesomeIcons.xmark), + ), + ), + ], + ), + ), + ); + } + // Update current index + onTap(index); + }, + ); + } +} From 06c487cdc5281872f7d61a16f39eeed171060696 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 5 Nov 2024 10:34:44 +0300 Subject: [PATCH 122/140] Add divider on health cards --- assets/images/bmi.svg | 5 +++ assets/images/clinicCardCard.svg | 4 ++ lib/src/app/navigation/menu/menuItems.dart | 20 ++++++--- .../pages/BMICalculatorResultsScreen.dart | 8 ++-- .../pages/self_screening_menu.dart | 10 ++--- .../presentation/widgets/health_card.dart | 45 ++++++++++++------- 6 files changed, 59 insertions(+), 33 deletions(-) create mode 100644 assets/images/bmi.svg create mode 100644 assets/images/clinicCardCard.svg diff --git a/assets/images/bmi.svg b/assets/images/bmi.svg new file mode 100644 index 00000000..450ca468 --- /dev/null +++ b/assets/images/bmi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/clinicCardCard.svg b/assets/images/clinicCardCard.svg new file mode 100644 index 00000000..70644aee --- /dev/null +++ b/assets/images/clinicCardCard.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/src/app/navigation/menu/menuItems.dart b/lib/src/app/navigation/menu/menuItems.dart index 7ce34185..9fa64c10 100644 --- a/lib/src/app/navigation/menu/menuItems.dart +++ b/lib/src/app/navigation/menu/menuItems.dart @@ -204,14 +204,20 @@ List getPatientModules(BuildContext context) { color: Constants.labResultsColor, ), MenuItem( - icon: const FaIcon( - FontAwesomeIcons.addressCard, - size: 50.0, - color: Constants.clinicCardBgColor, + shortcutBackgroundColor: Constants.clinicCardBgColor.withOpacity(0.5), + icon: SvgPicture.asset( + "assets/images/clinicCardCard.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 80, + width: 80, ), - shortcutIcon: const FaIcon( - FontAwesomeIcons.addressCard, - color: Constants.clinicCardBgColor, + shortcutIcon: SvgPicture.asset( + "assets/images/clinicCardCard.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + width: Constants.shortcutIconSize, + height: Constants.shortcutIconSize, ), title: MenuItemNames.MY_CLINIC_CARD, onPressed: () => context.goNamed(RouteNames.MY_CLINIC_CARD), diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart index 35f0be5b..adfef04d 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart @@ -119,11 +119,11 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { decoration: BoxDecoration( gradient: const LinearGradient( colors: [ - Colors.blue, // Malnutrition + Colors.blue, Colors.green, - Colors.red, // Obese + Colors.red, ], - stops: [0.0, 0.5, 0.75], + stops: [0.0, 0.80, 1.0], begin: Alignment.centerLeft, end: Alignment.centerRight, ), @@ -136,7 +136,7 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { value: bmi, onChanged: (value) {}, min: 0, - max: 60, + max: 30, activeColor: Colors.transparent, inactiveColor: Colors.transparent, ), diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index d403c30a..bfeda6d6 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -132,16 +132,16 @@ class _SelfScreeningState extends ConsumerState { context.goNamed(RouteNames.BLOOD_SUGAR); }, ), - HealthCard( - svgAsset: "assets/images/boldDuotoneMedicinePulse.svg", + if (currentBMIEntries != null) HealthCard( + svgAsset: "assets/images/bmi.svg", title: "Body Measurements", - value1: "${currentBMIEntries?.weight ?? 'N/A'}", + value1: "${currentBMIEntries.weight}", text1: "KGS", vName1: "Weight", - value2: "${currentBMIEntries?.height ?? 'N/A'}", + value2: "${currentBMIEntries.height}", text2: "Centimetres", vName2: "Height", - value3: "${currentBMIEntries?.results ?? 'N/A'}", + value3: "${currentBMIEntries.results}", text3: "", vName3: "BMI", onPressed: () { diff --git a/lib/src/features/self_screening/presentation/widgets/health_card.dart b/lib/src/features/self_screening/presentation/widgets/health_card.dart index 6b1f9462..4ce51402 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_card.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_card.dart @@ -60,26 +60,37 @@ class HealthCard extends StatelessWidget { overflow: TextOverflow.ellipsis, ), ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: onPressed, - child: const Icon(Icons.chevron_right), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: onPressed, + child: const Icon(Icons.chevron_right), + ), + ], ), ], ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded(child: _buildColumn(value1, text1, vName1, context)), - const VerticalDivider(thickness: 3, color: Colors.grey), - Expanded(child: _buildColumn(value2, text2, vName2, context)), - const VerticalDivider(thickness: 3, color: Colors.grey), - Expanded(child: _buildColumn(value3, text3, vName3, context)), - ], + // Row( + // mainAxisAlignment: MainAxisAlignment.end, + // children: [ + // TextButton( + // onPressed: onPressed, + // child: const Icon(Icons.chevron_right), + // ), + // ], + // ), + IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: _buildColumn(value1, text1, vName1, context)), + if (value2 != null) const VerticalDivider(), + Expanded(child: _buildColumn(value2, text2, vName2, context)), + if (value3 != null) const VerticalDivider(), + Expanded(child: _buildColumn(value3, text3, vName3, context)), + ], + ), ), ], ), From c31b1a0e8ab20a20b59e6f44b40de0a49188e4f1 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 5 Nov 2024 15:51:10 +0300 Subject: [PATCH 123/140] :construction: Clinic card --- assets/data/visits.json | 302 +++++++++++++++--- assets/images/clinic_menu.svg | 3 + lib/src/app/navigation/app_router.dart | 16 +- .../presentation/pages/ClinicCardScreen.dart | 1 - .../presentation/widgets/health_record.dart | 181 +++++++---- .../features/visits/data/models/allergy.dart | 10 +- .../visits/data/models/allergy.freezed.dart | 130 ++++---- .../visits/data/models/allergy.g.dart | 10 +- .../visits/data/models/condition.dart | 10 +- .../visits/data/models/condition.freezed.dart | 130 ++++---- .../visits/data/models/condition.g.dart | 10 +- .../visits/data/models/immunization.dart | 10 +- .../data/models/immunization.freezed.dart | 167 +++++----- .../visits/data/models/immunization.g.dart | 16 +- .../visits/data/models/lab_result.dart | 10 +- .../data/models/lab_result.freezed.dart | 173 ++++++---- .../visits/data/models/lab_result.g.dart | 16 +- .../visits/data/models/medication.dart | 9 +- .../data/models/medication.freezed.dart | 136 ++++---- .../visits/data/models/medication.g.dart | 10 +- .../visits/data/models/procedure.dart | 10 +- .../visits/data/models/procedure.freezed.dart | 151 ++++++--- .../visits/data/models/procedure.g.dart | 12 +- .../features/visits/data/models/vital.dart | 15 +- .../visits/data/models/vital.freezed.dart | 280 ++++++++++++---- .../features/visits/data/models/vital.g.dart | 24 +- .../pages/FacilityVisitDetailScreen.dart | 222 ++++++------- .../presentations/widgets/AllergiesTab.dart | 116 +++---- .../presentations/widgets/ComplaintsTab.dart | 128 ++++---- .../presentations/widgets/ConditionsTab.dart | 134 ++++---- .../presentations/widgets/Diagnosis.dart | 112 +++---- .../presentations/widgets/LabResultsTab.dart | 110 +++---- .../presentations/widgets/VitalsTab.dart | 118 +++---- 33 files changed, 1698 insertions(+), 1084 deletions(-) create mode 100644 assets/images/clinic_menu.svg diff --git a/assets/data/visits.json b/assets/data/visits.json index 049c872a..a00d3565 100644 --- a/assets/data/visits.json +++ b/assets/data/visits.json @@ -26,7 +26,8 @@ "uuid": "m1", "name": "Levothyroxine", "dateRecorded": "2023-03-06", - "value": "Levothyroxine 50 mcg" + "value": "Levothyroxine 50 mcg", + "indication": "Pain" } ], "allergies": [ @@ -42,91 +43,302 @@ "vitals": [ { "uuid": "v1", - "name": "Weight (kg)", - "dateRecorded": "2023-03-06", - "value": "70.0" + "name": "Vitals", + "weight": "67 Kgs", + "temp": "36.5 C", + "systolic": "120 mm/Hg", + "diastolic": "80 mm/Hg", + "respiratory": "20", + "oxygenSaturation": "", + "height": "180 CM", + "complain": "Abdominal pain" + } + ], + "labResults": [ + { + "uuid": "lb1", + "name": "CD4 Counts Test", + "results": "1200 cells/ul", + "orderedDate": "2019-09-18", + "status": "Viral Suppressed", + "plot": 49 } ], - "labResults": [], - "procedures": [] + "procedures": [ + { + "uuid": "pr1", + "name": "Vasectomy", + "status": "", + "site": "Penis", + "repeat": 0 + } + ], + "immunization": [ + { + "uuid": "imm1", + "name": "HPV Vaccine", + "immunizationDate": "2024-09-18", + "manufacturer": "Johnson & Johnson", + "lot": "LOT-004" + } + ] }, { "uuid": "2", - "visitDate": "2023-03-07", - "facility": "NATIONAL HOSPITAL", - "conditions": [], + "visitDate": "2023-07-15", + "facility": "MOUNT KENYA MEDICAL CENTER", + "conditions": [ + { + "uuid": "c3", + "name": "Type 2 Diabetes", + "onsetDate": "2020-01-10", + "dateRecorded": "2023-07-15", + "status": "ACTIVE", + "value": "Type 2 Diabetes" + }, + { + "uuid": "c4", + "name": "Hypertension", + "onsetDate": "2021-11-25", + "dateRecorded": "2023-07-15", + "status": "ACTIVE", + "value": "Hypertension" + } + ], "medications": [ { "uuid": "m2", "name": "Metformin", - "dateRecorded": "2023-03-07", - "value": "Metformin 500 mg" + "dateRecorded": "2023-07-15", + "value": "Metformin 500 mg", + "indication": "Type 2 Diabetes" + }, + { + "uuid": "m3", + "name": "Lisinopril", + "dateRecorded": "2023-07-15", + "value": "Lisinopril 20 mg", + "indication": "Hypertension" + } + ], + "allergies": [ + { + "uuid": "a2", + "allergen": "Sulfa Drugs", + "reaction": "Hives", + "severity": "MODERATE", + "onsetDate": "", + "dateRecorded": "2023-07-15" } ], - "allergies": [], "vitals": [ { "uuid": "v2", - "name": "Blood Pressure", - "dateRecorded": "2023-03-07", - "value": "130/85" + "name": "Vitals", + "weight": "92 Kgs", + "temp": "37.1 C", + "systolic": "145 mm/Hg", + "diastolic": "90 mm/Hg", + "respiratory": "22", + "oxygenSaturation": "", + "height": "175 CM", + "complain": "Headache" + } + ], + "labResults": [ + { + "uuid": "lb2", + "name": "Blood Glucose Test", + "results": "160 mg/dL", + "orderedDate": "2023-07-15", + "status": "Uncontrolled", + "plot": 75 } ], - "labResults": [], - "procedures": [] + "procedures": [ + { + "uuid": "pr2", + "name": "Electrocardiogram (ECG)", + "status": "Normal", + "site": "Chest", + "repeat": 1 + } + ], + "immunization": [ + { + "uuid": "imm2", + "name": "Influenza Vaccine", + "immunizationDate": "2024-01-10", + "manufacturer": "Pfizer", + "lot": "FLU-123" + } + ] }, { "uuid": "3", - "visitDate": "2023-03-08", - "facility": "CITY HOSPITAL", + "visitDate": "2024-05-25", + "facility": "Nairobi Women's Hospital", "conditions": [ { - "uuid": "c3", - "name": "Chronic Kidney Disease", - "onsetDate": "", - "dateRecorded": "2023-03-08", + "uuid": "c5", + "name": "Asthma", + "onsetDate": "2018-03-12", + "dateRecorded": "2024-05-25", + "status": "ACTIVE", + "value": "Asthma" + }, + { + "uuid": "c6", + "name": "Chronic Sinusitis", + "onsetDate": "2022-08-04", + "dateRecorded": "2024-05-25", "status": "ACTIVE", - "value": "Chronic Kidney Disease" + "value": "Chronic Sinusitis" + } + ], + "medications": [ + { + "uuid": "m4", + "name": "Salbutamol", + "dateRecorded": "2024-05-25", + "value": "Salbutamol 100 mcg", + "indication": "Asthma" + }, + { + "uuid": "m5", + "name": "Fluticasone", + "dateRecorded": "2024-05-25", + "value": "Fluticasone 50 mcg", + "indication": "Asthma" + } + ], + "allergies": [ + { + "uuid": "a3", + "allergen": "Dust", + "reaction": "Sneezing", + "severity": "MODERATE", + "onsetDate": "", + "dateRecorded": "2024-05-25" } ], - "medications": [], - "allergies": [], "vitals": [ { "uuid": "v3", - "name": "Height (cm)", - "dateRecorded": "2023-03-08", - "value": "180.0" + "name": "Vitals", + "weight": "58 Kgs", + "temp": "36.9 C", + "systolic": "110 mm/Hg", + "diastolic": "70 mm/Hg", + "respiratory": "18", + "oxygenSaturation": "", + "height": "165 CM", + "complain": "Breathing difficulty" + } + ], + "labResults": [ + { + "uuid": "lb3", + "name": "Pulmonary Function Test", + "results": "FEV1: 75%", + "orderedDate": "2024-05-25", + "status": "Mild Obstruction", + "plot": 45 } ], - "labResults": [], - "procedures": [] + "procedures": [ + { + "uuid": "pr3", + "name": "CT Scan Sinuses", + "status": "Normal", + "site": "Sinuses", + "repeat": 0 + } + ], + "immunization": [ + { + "uuid": "imm3", + "name": "Pneumococcal Vaccine", + "immunizationDate": "2024-06-10", + "manufacturer": "AstraZeneca", + "lot": "PNEUMO-789" + } + ] }, { "uuid": "4", - "visitDate": "2023-03-09", - "facility": "GENERAL HOSPITAL", - "conditions": [], - "medications": [], + "visitDate": "2024-09-10", + "facility": "Nairobi Hospital", + "conditions": [ + { + "uuid": "c7", + "name": "Gastroesophageal Reflux Disease (GERD)", + "onsetDate": "2021-05-20", + "dateRecorded": "2024-09-10", + "status": "ACTIVE", + "value": "GERD" + } + ], + "medications": [ + { + "uuid": "m6", + "name": "Omeprazole", + "dateRecorded": "2024-09-10", + "value": "Omeprazole 20 mg", + "indication": "GERD" + } + ], "allergies": [ { - "uuid": "a2", - "allergen": "Aspirin", - "reaction": "Nausea", + "uuid": "a4", + "allergen": "Lactose", + "reaction": "Stomach cramps", "severity": "SEVERE", "onsetDate": "", - "dateRecorded": "2023-03-09" + "dateRecorded": "2024-09-10" + } + ], + "vitals": [ + { + "uuid": "v4", + "name": "Vitals", + "weight": "72 Kgs", + "temp": "37.0 C", + "systolic": "130 mm/Hg", + "diastolic": "85 mm/Hg", + "respiratory": "22", + "oxygenSaturation": "", + "height": "170 CM", + "complain": "Heartburn" } ], - "vitals": [], "labResults": [ { - "uuid": "l1", - "name": "Complete Blood Count", - "dateRecorded": "2023-03-09", - "value": "Normal" + "uuid": "lb4", + "name": "Upper Endoscopy", + "results": "Mild Inflammation", + "orderedDate": "2024-09-10", + "status": "Stable", + "plot": 60 } ], - "procedures": [] + "procedures": [ + { + "uuid": "pr4", + "name": "Upper Endoscopy", + "status": "Completed", + "site": "Esophagus", + "repeat": 0 + } + ], + "immunization": [ + { + "uuid": "imm4", + "name": "Hepatitis B Vaccine", + "immunizationDate": "2024-10-10", + "manufacturer": "GSK", + "lot": "HEPB-567" + } + ] } ] diff --git a/assets/images/clinic_menu.svg b/assets/images/clinic_menu.svg new file mode 100644 index 00000000..5fee8409 --- /dev/null +++ b/assets/images/clinic_menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 5f73b7a5..99ebda92 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -397,14 +397,14 @@ final List secureRoutes = [ return const FacilityVisitsScreen(); }, routes: [ - GoRoute( - name: RouteNames.FACILITY_VISIT_DETAIL, - path: ':visitId', - builder: (BuildContext context, GoRouterState state) { - return FacilityVisitDetailScreen( - visitId: state.pathParameters["visitId"]!); - }, - ) + // GoRoute( + // name: RouteNames.FACILITY_VISIT_DETAIL, + // path: ':visitId', + // builder: (BuildContext context, GoRouterState state) { + // return FacilityVisitDetailScreen( + // visitId: state.pathParameters["visitId"]!); + // }, + // ) ]), GoRoute( name: RouteNames.PROVIDER_MAIN_SCREEN, diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 1e6bd26b..885142af 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -81,7 +81,6 @@ class ClinicCardScreen extends HookConsumerWidget { ]; final List paths = [ - RouteNames.BLOOD_PRESSURE, RouteNames.HEALTH_RECORD, ]; diff --git a/lib/src/features/clinic_card/presentation/widgets/health_record.dart b/lib/src/features/clinic_card/presentation/widgets/health_record.dart index 11cbd80b..5baf260d 100644 --- a/lib/src/features/clinic_card/presentation/widgets/health_record.dart +++ b/lib/src/features/clinic_card/presentation/widgets/health_record.dart @@ -26,14 +26,12 @@ class HealthRecord extends StatelessWidget { padding: const EdgeInsets.all(Constants.SPACING), child: Column( children: [ - _buildButtonRow(), const SizedBox(height: Constants.SPACING), _buildDateRow("16 October 2024", theme), const SizedBox(height: Constants.SPACING), _buildHospitalRow("KENYATTA NATIONAL HOSPITAL", theme), const SizedBox(height: Constants.SPACING), const Divider(), - const SizedBox(height: Constants.SPACING), _buildListView(theme), ], ), @@ -44,36 +42,38 @@ class HealthRecord extends StatelessWidget { ); } - Widget _buildButtonRow() { - return Container( - width: double.infinity, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Constants.bgColor, - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.3), - spreadRadius: 2, - blurRadius: 5, - offset: const Offset(0, 3), - ), - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - HealthButton(title: "Last Update", color: Constants.bgColor), - HealthButton(title: "A - Z", color: Constants.bgColor), - ], - ), - ); - } + // Widget _buildButtonRow() { + // return Container( + // width: double.infinity, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(12), + // color: Constants.bgColor, + // boxShadow: [ + // BoxShadow( + // color: Colors.grey.withOpacity(0.3), + // spreadRadius: 2, + // blurRadius: 5, + // offset: const Offset(0, 3), + // ), + // ], + // ), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceEvenly, + // children: [ + // HealthButton(title: "Last Update", color: Constants.bgColor), + // HealthButton(title: "A - Z", color: Constants.bgColor), + // ], + // ), + // ); + // } Widget _buildDateRow(String date, ThemeData theme) { return Row( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(date, style: theme.textTheme.titleMedium), + HealthButton(), ], ); } @@ -89,7 +89,7 @@ class HealthRecord extends StatelessWidget { Widget _buildListView(ThemeData theme) { return ListView.builder( - itemCount: 3, // Adjust item count based on your data + itemCount: 3, shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemBuilder: (context, index) { @@ -97,21 +97,47 @@ class HealthRecord extends StatelessWidget { title: Card( child: Padding( padding: const EdgeInsets.all(Constants.SPACING), - child: Row( + child: ExpansionTile( + title:Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildAllergyRow(theme), + // _buildSeverityRow(theme), + ], + ), + ), + ], + ), children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + ListTile( + title: Column( children: [ - _buildAllergyRow(theme), - _buildSeverityRow(theme), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Reactions", style: theme.textTheme.bodyMedium,), + Text("Headache, Arrythmia", style: theme.textTheme.bodySmall,) + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Onset Date", style: theme.textTheme.bodyMedium,), + Text("25 October, 2024", style: theme.textTheme.bodySmall,) + ], + ), ], ), - ), + ) ], - ), + ) ), ), + ); }, ); @@ -128,36 +154,41 @@ class HealthRecord extends StatelessWidget { const SizedBox(width: Constants.SPACING), Text("Allergies", style: theme.textTheme.titleMedium), Spacer(), - TextButton( - onPressed: () {}, - child: const Icon(Icons.chevron_right), - ), - ], - ); - } - - Widget _buildSeverityRow(ThemeData theme) { - return Row( - children: [ Text("Mild", style: theme.textTheme.bodyMedium), + // TextButton( + // onPressed: () {}, + // child: const Icon(Icons.chevron_right), + // ), ], ); } + + // Widget _buildSeverityRow(ThemeData theme) { + // return Row( + // children: [ + // Text("Mild", style: theme.textTheme.bodyMedium), + // ], + // ); + // } } -class HealthButton extends StatelessWidget { - final String title; - final Color? color; +class HealthButton extends StatefulWidget { + const HealthButton({Key? key}) : super(key: key); - const HealthButton({Key? key, required this.title, this.color}) : super(key: key); + @override + _HealthButtonState createState() => _HealthButtonState(); +} + +class _HealthButtonState extends State { + // Define the selectedMenu variable + SampleItem? selectedMenu; @override Widget build(BuildContext context) { return Container( - width: MediaQuery.of(context).size.width * 0.47, + width: MediaQuery.of(context).size.width * 0.2, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - color: color, boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.3), @@ -167,12 +198,48 @@ class HealthButton extends StatelessWidget { ), ], ), - child: Button( - title: title, - backgroundColor: color, - titleStyle: TextStyle(color: Colors.black54), - onPress: () {}, + child: MenuAnchor( + builder: (BuildContext context, MenuController controller, Widget? child) { + return IconButton( + onPressed: () { + // Open or close the menu on button press + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + icon: SvgPicture.asset( + "assets/images/clinic_menu.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 30, + width: 30, + ), + // icon: const Icon(Icons.more_horiz), + tooltip: 'Show menu', + ); + }, + menuChildren: List.generate( + 3, + (int index) => MenuItemButton( + onPressed: () { + // Update the selectedMenu state when a menu item is pressed + setState(() { + selectedMenu = SampleItem.values[index]; + }); + }, + child: Text('Item ${index + 1}'), + ), + ), ), ); } } + +// Enum to represent sample menu items +enum SampleItem { + item1, + item2, + item3, +} diff --git a/lib/src/features/visits/data/models/allergy.dart b/lib/src/features/visits/data/models/allergy.dart index ba8a2150..5da933bb 100644 --- a/lib/src/features/visits/data/models/allergy.dart +++ b/lib/src/features/visits/data/models/allergy.dart @@ -6,12 +6,12 @@ part 'allergy.g.dart'; @Freezed() class Allergy with _$Allergy { const factory Allergy({ - required String uuid, - required String allergen, - required String reaction, + String? uuid, + String? allergen, + String? reaction, String? onsetDate, - required String dateRecorded, - required String severity, + String? dateRecorded, + String? severity, }) = _Allergy; factory Allergy.fromJson(Map json)=> _$AllergyFromJson(json); diff --git a/lib/src/features/visits/data/models/allergy.freezed.dart b/lib/src/features/visits/data/models/allergy.freezed.dart index 0dd689e7..bf8ca8e5 100644 --- a/lib/src/features/visits/data/models/allergy.freezed.dart +++ b/lib/src/features/visits/data/models/allergy.freezed.dart @@ -20,12 +20,12 @@ Allergy _$AllergyFromJson(Map json) { /// @nodoc mixin _$Allergy { - String get uuid => throw _privateConstructorUsedError; - String get allergen => throw _privateConstructorUsedError; - String get reaction => throw _privateConstructorUsedError; + String? get uuid => throw _privateConstructorUsedError; + String? get allergen => throw _privateConstructorUsedError; + String? get reaction => throw _privateConstructorUsedError; String? get onsetDate => throw _privateConstructorUsedError; - String get dateRecorded => throw _privateConstructorUsedError; - String get severity => throw _privateConstructorUsedError; + String? get dateRecorded => throw _privateConstructorUsedError; + String? get severity => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -38,12 +38,12 @@ abstract class $AllergyCopyWith<$Res> { _$AllergyCopyWithImpl<$Res, Allergy>; @useResult $Res call( - {String uuid, - String allergen, - String reaction, + {String? uuid, + String? allergen, + String? reaction, String? onsetDate, - String dateRecorded, - String severity}); + String? dateRecorded, + String? severity}); } /// @nodoc @@ -59,38 +59,38 @@ class _$AllergyCopyWithImpl<$Res, $Val extends Allergy> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? allergen = null, - Object? reaction = null, + Object? uuid = freezed, + Object? allergen = freezed, + Object? reaction = freezed, Object? onsetDate = freezed, - Object? dateRecorded = null, - Object? severity = null, + Object? dateRecorded = freezed, + Object? severity = freezed, }) { return _then(_value.copyWith( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - allergen: null == allergen + as String?, + allergen: freezed == allergen ? _value.allergen : allergen // ignore: cast_nullable_to_non_nullable - as String, - reaction: null == reaction + as String?, + reaction: freezed == reaction ? _value.reaction : reaction // ignore: cast_nullable_to_non_nullable - as String, + as String?, onsetDate: freezed == onsetDate ? _value.onsetDate : onsetDate // ignore: cast_nullable_to_non_nullable as String?, - dateRecorded: null == dateRecorded + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - severity: null == severity + as String?, + severity: freezed == severity ? _value.severity : severity // ignore: cast_nullable_to_non_nullable - as String, + as String?, ) as $Val); } } @@ -103,12 +103,12 @@ abstract class _$$AllergyImplCopyWith<$Res> implements $AllergyCopyWith<$Res> { @override @useResult $Res call( - {String uuid, - String allergen, - String reaction, + {String? uuid, + String? allergen, + String? reaction, String? onsetDate, - String dateRecorded, - String severity}); + String? dateRecorded, + String? severity}); } /// @nodoc @@ -122,38 +122,38 @@ class __$$AllergyImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? allergen = null, - Object? reaction = null, + Object? uuid = freezed, + Object? allergen = freezed, + Object? reaction = freezed, Object? onsetDate = freezed, - Object? dateRecorded = null, - Object? severity = null, + Object? dateRecorded = freezed, + Object? severity = freezed, }) { return _then(_$AllergyImpl( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - allergen: null == allergen + as String?, + allergen: freezed == allergen ? _value.allergen : allergen // ignore: cast_nullable_to_non_nullable - as String, - reaction: null == reaction + as String?, + reaction: freezed == reaction ? _value.reaction : reaction // ignore: cast_nullable_to_non_nullable - as String, + as String?, onsetDate: freezed == onsetDate ? _value.onsetDate : onsetDate // ignore: cast_nullable_to_non_nullable as String?, - dateRecorded: null == dateRecorded + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - severity: null == severity + as String?, + severity: freezed == severity ? _value.severity : severity // ignore: cast_nullable_to_non_nullable - as String, + as String?, )); } } @@ -162,28 +162,28 @@ class __$$AllergyImplCopyWithImpl<$Res> @JsonSerializable() class _$AllergyImpl with DiagnosticableTreeMixin implements _Allergy { const _$AllergyImpl( - {required this.uuid, - required this.allergen, - required this.reaction, + {this.uuid, + this.allergen, + this.reaction, this.onsetDate, - required this.dateRecorded, - required this.severity}); + this.dateRecorded, + this.severity}); factory _$AllergyImpl.fromJson(Map json) => _$$AllergyImplFromJson(json); @override - final String uuid; + final String? uuid; @override - final String allergen; + final String? allergen; @override - final String reaction; + final String? reaction; @override final String? onsetDate; @override - final String dateRecorded; + final String? dateRecorded; @override - final String severity; + final String? severity; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { @@ -242,27 +242,27 @@ class _$AllergyImpl with DiagnosticableTreeMixin implements _Allergy { abstract class _Allergy implements Allergy { const factory _Allergy( - {required final String uuid, - required final String allergen, - required final String reaction, + {final String? uuid, + final String? allergen, + final String? reaction, final String? onsetDate, - required final String dateRecorded, - required final String severity}) = _$AllergyImpl; + final String? dateRecorded, + final String? severity}) = _$AllergyImpl; factory _Allergy.fromJson(Map json) = _$AllergyImpl.fromJson; @override - String get uuid; + String? get uuid; @override - String get allergen; + String? get allergen; @override - String get reaction; + String? get reaction; @override String? get onsetDate; @override - String get dateRecorded; + String? get dateRecorded; @override - String get severity; + String? get severity; @override @JsonKey(ignore: true) _$$AllergyImplCopyWith<_$AllergyImpl> get copyWith => diff --git a/lib/src/features/visits/data/models/allergy.g.dart b/lib/src/features/visits/data/models/allergy.g.dart index 49ba30c2..79362116 100644 --- a/lib/src/features/visits/data/models/allergy.g.dart +++ b/lib/src/features/visits/data/models/allergy.g.dart @@ -8,12 +8,12 @@ part of 'allergy.dart'; _$AllergyImpl _$$AllergyImplFromJson(Map json) => _$AllergyImpl( - uuid: json['uuid'] as String, - allergen: json['allergen'] as String, - reaction: json['reaction'] as String, + uuid: json['uuid'] as String?, + allergen: json['allergen'] as String?, + reaction: json['reaction'] as String?, onsetDate: json['onsetDate'] as String?, - dateRecorded: json['dateRecorded'] as String, - severity: json['severity'] as String, + dateRecorded: json['dateRecorded'] as String?, + severity: json['severity'] as String?, ); Map _$$AllergyImplToJson(_$AllergyImpl instance) => diff --git a/lib/src/features/visits/data/models/condition.dart b/lib/src/features/visits/data/models/condition.dart index 0ff22a12..f2c3e8a2 100644 --- a/lib/src/features/visits/data/models/condition.dart +++ b/lib/src/features/visits/data/models/condition.dart @@ -6,12 +6,12 @@ part 'condition.g.dart'; @Freezed() class Condition with _$Condition { const factory Condition({ - required String uuid, - required String name, + String? uuid, + String? name, String? onsetDate, - required String dateRecorded, - required String status, - required String value, + String? dateRecorded, + String? status, + String? value, }) = _Condition; factory Condition.fromJson(Map json)=> _$ConditionFromJson(json); diff --git a/lib/src/features/visits/data/models/condition.freezed.dart b/lib/src/features/visits/data/models/condition.freezed.dart index 24dd0e10..bf3f42b9 100644 --- a/lib/src/features/visits/data/models/condition.freezed.dart +++ b/lib/src/features/visits/data/models/condition.freezed.dart @@ -20,12 +20,12 @@ Condition _$ConditionFromJson(Map json) { /// @nodoc mixin _$Condition { - String get uuid => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; + String? get uuid => throw _privateConstructorUsedError; + String? get name => throw _privateConstructorUsedError; String? get onsetDate => throw _privateConstructorUsedError; - String get dateRecorded => throw _privateConstructorUsedError; - String get status => throw _privateConstructorUsedError; - String get value => throw _privateConstructorUsedError; + String? get dateRecorded => throw _privateConstructorUsedError; + String? get status => throw _privateConstructorUsedError; + String? get value => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -39,12 +39,12 @@ abstract class $ConditionCopyWith<$Res> { _$ConditionCopyWithImpl<$Res, Condition>; @useResult $Res call( - {String uuid, - String name, + {String? uuid, + String? name, String? onsetDate, - String dateRecorded, - String status, - String value}); + String? dateRecorded, + String? status, + String? value}); } /// @nodoc @@ -60,38 +60,38 @@ class _$ConditionCopyWithImpl<$Res, $Val extends Condition> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, + Object? uuid = freezed, + Object? name = freezed, Object? onsetDate = freezed, - Object? dateRecorded = null, - Object? status = null, - Object? value = null, + Object? dateRecorded = freezed, + Object? status = freezed, + Object? value = freezed, }) { return _then(_value.copyWith( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, + as String?, onsetDate: freezed == onsetDate ? _value.onsetDate : onsetDate // ignore: cast_nullable_to_non_nullable as String?, - dateRecorded: null == dateRecorded + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - status: null == status + as String?, + status: freezed == status ? _value.status : status // ignore: cast_nullable_to_non_nullable - as String, - value: null == value + as String?, + value: freezed == value ? _value.value : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, ) as $Val); } } @@ -105,12 +105,12 @@ abstract class _$$ConditionImplCopyWith<$Res> @override @useResult $Res call( - {String uuid, - String name, + {String? uuid, + String? name, String? onsetDate, - String dateRecorded, - String status, - String value}); + String? dateRecorded, + String? status, + String? value}); } /// @nodoc @@ -124,38 +124,38 @@ class __$$ConditionImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, + Object? uuid = freezed, + Object? name = freezed, Object? onsetDate = freezed, - Object? dateRecorded = null, - Object? status = null, - Object? value = null, + Object? dateRecorded = freezed, + Object? status = freezed, + Object? value = freezed, }) { return _then(_$ConditionImpl( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, + as String?, onsetDate: freezed == onsetDate ? _value.onsetDate : onsetDate // ignore: cast_nullable_to_non_nullable as String?, - dateRecorded: null == dateRecorded + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - status: null == status + as String?, + status: freezed == status ? _value.status : status // ignore: cast_nullable_to_non_nullable - as String, - value: null == value + as String?, + value: freezed == value ? _value.value : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, )); } } @@ -164,28 +164,28 @@ class __$$ConditionImplCopyWithImpl<$Res> @JsonSerializable() class _$ConditionImpl with DiagnosticableTreeMixin implements _Condition { const _$ConditionImpl( - {required this.uuid, - required this.name, + {this.uuid, + this.name, this.onsetDate, - required this.dateRecorded, - required this.status, - required this.value}); + this.dateRecorded, + this.status, + this.value}); factory _$ConditionImpl.fromJson(Map json) => _$$ConditionImplFromJson(json); @override - final String uuid; + final String? uuid; @override - final String name; + final String? name; @override final String? onsetDate; @override - final String dateRecorded; + final String? dateRecorded; @override - final String status; + final String? status; @override - final String value; + final String? value; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { @@ -241,28 +241,28 @@ class _$ConditionImpl with DiagnosticableTreeMixin implements _Condition { abstract class _Condition implements Condition { const factory _Condition( - {required final String uuid, - required final String name, + {final String? uuid, + final String? name, final String? onsetDate, - required final String dateRecorded, - required final String status, - required final String value}) = _$ConditionImpl; + final String? dateRecorded, + final String? status, + final String? value}) = _$ConditionImpl; factory _Condition.fromJson(Map json) = _$ConditionImpl.fromJson; @override - String get uuid; + String? get uuid; @override - String get name; + String? get name; @override String? get onsetDate; @override - String get dateRecorded; + String? get dateRecorded; @override - String get status; + String? get status; @override - String get value; + String? get value; @override @JsonKey(ignore: true) _$$ConditionImplCopyWith<_$ConditionImpl> get copyWith => diff --git a/lib/src/features/visits/data/models/condition.g.dart b/lib/src/features/visits/data/models/condition.g.dart index 0d80af4a..ff0c0ba3 100644 --- a/lib/src/features/visits/data/models/condition.g.dart +++ b/lib/src/features/visits/data/models/condition.g.dart @@ -8,12 +8,12 @@ part of 'condition.dart'; _$ConditionImpl _$$ConditionImplFromJson(Map json) => _$ConditionImpl( - uuid: json['uuid'] as String, - name: json['name'] as String, + uuid: json['uuid'] as String?, + name: json['name'] as String?, onsetDate: json['onsetDate'] as String?, - dateRecorded: json['dateRecorded'] as String, - status: json['status'] as String, - value: json['value'] as String, + dateRecorded: json['dateRecorded'] as String?, + status: json['status'] as String?, + value: json['value'] as String?, ); Map _$$ConditionImplToJson(_$ConditionImpl instance) => diff --git a/lib/src/features/visits/data/models/immunization.dart b/lib/src/features/visits/data/models/immunization.dart index 46f0c657..a769a67c 100644 --- a/lib/src/features/visits/data/models/immunization.dart +++ b/lib/src/features/visits/data/models/immunization.dart @@ -5,11 +5,11 @@ part 'immunization.g.dart'; @Freezed() class Immunization with _$Immunization { const factory Immunization({ - required String uuid, - required String name, - required String dateRecorded, - required String status, - required String value, + String? uuid, + String? name, + String? immunizationDate, + String? manufacturer, + String? lot, }) = _Immunization; factory Immunization.fromJson(Map json)=> _$ImmunizationFromJson(json); diff --git a/lib/src/features/visits/data/models/immunization.freezed.dart b/lib/src/features/visits/data/models/immunization.freezed.dart index fa371445..3c44a993 100644 --- a/lib/src/features/visits/data/models/immunization.freezed.dart +++ b/lib/src/features/visits/data/models/immunization.freezed.dart @@ -20,11 +20,11 @@ Immunization _$ImmunizationFromJson(Map json) { /// @nodoc mixin _$Immunization { - String get uuid => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get dateRecorded => throw _privateConstructorUsedError; - String get status => throw _privateConstructorUsedError; - String get value => throw _privateConstructorUsedError; + String? get uuid => throw _privateConstructorUsedError; + String? get name => throw _privateConstructorUsedError; + String? get immunizationDate => throw _privateConstructorUsedError; + String? get manufacturer => throw _privateConstructorUsedError; + String? get lot => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -39,11 +39,11 @@ abstract class $ImmunizationCopyWith<$Res> { _$ImmunizationCopyWithImpl<$Res, Immunization>; @useResult $Res call( - {String uuid, - String name, - String dateRecorded, - String status, - String value}); + {String? uuid, + String? name, + String? immunizationDate, + String? manufacturer, + String? lot}); } /// @nodoc @@ -59,33 +59,33 @@ class _$ImmunizationCopyWithImpl<$Res, $Val extends Immunization> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, - Object? dateRecorded = null, - Object? status = null, - Object? value = null, + Object? uuid = freezed, + Object? name = freezed, + Object? immunizationDate = freezed, + Object? manufacturer = freezed, + Object? lot = freezed, }) { return _then(_value.copyWith( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, - dateRecorded: null == dateRecorded - ? _value.dateRecorded - : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - status: null == status - ? _value.status - : status // ignore: cast_nullable_to_non_nullable - as String, - value: null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + immunizationDate: freezed == immunizationDate + ? _value.immunizationDate + : immunizationDate // ignore: cast_nullable_to_non_nullable + as String?, + manufacturer: freezed == manufacturer + ? _value.manufacturer + : manufacturer // ignore: cast_nullable_to_non_nullable + as String?, + lot: freezed == lot + ? _value.lot + : lot // ignore: cast_nullable_to_non_nullable + as String?, ) as $Val); } } @@ -99,11 +99,11 @@ abstract class _$$ImmunizationImplCopyWith<$Res> @override @useResult $Res call( - {String uuid, - String name, - String dateRecorded, - String status, - String value}); + {String? uuid, + String? name, + String? immunizationDate, + String? manufacturer, + String? lot}); } /// @nodoc @@ -117,33 +117,33 @@ class __$$ImmunizationImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, - Object? dateRecorded = null, - Object? status = null, - Object? value = null, + Object? uuid = freezed, + Object? name = freezed, + Object? immunizationDate = freezed, + Object? manufacturer = freezed, + Object? lot = freezed, }) { return _then(_$ImmunizationImpl( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, - dateRecorded: null == dateRecorded - ? _value.dateRecorded - : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - status: null == status - ? _value.status - : status // ignore: cast_nullable_to_non_nullable - as String, - value: null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + immunizationDate: freezed == immunizationDate + ? _value.immunizationDate + : immunizationDate // ignore: cast_nullable_to_non_nullable + as String?, + manufacturer: freezed == manufacturer + ? _value.manufacturer + : manufacturer // ignore: cast_nullable_to_non_nullable + as String?, + lot: freezed == lot + ? _value.lot + : lot // ignore: cast_nullable_to_non_nullable + as String?, )); } } @@ -152,29 +152,29 @@ class __$$ImmunizationImplCopyWithImpl<$Res> @JsonSerializable() class _$ImmunizationImpl implements _Immunization { const _$ImmunizationImpl( - {required this.uuid, - required this.name, - required this.dateRecorded, - required this.status, - required this.value}); + {this.uuid, + this.name, + this.immunizationDate, + this.manufacturer, + this.lot}); factory _$ImmunizationImpl.fromJson(Map json) => _$$ImmunizationImplFromJson(json); @override - final String uuid; + final String? uuid; @override - final String name; + final String? name; @override - final String dateRecorded; + final String? immunizationDate; @override - final String status; + final String? manufacturer; @override - final String value; + final String? lot; @override String toString() { - return 'Immunization(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, status: $status, value: $value)'; + return 'Immunization(uuid: $uuid, name: $name, immunizationDate: $immunizationDate, manufacturer: $manufacturer, lot: $lot)'; } @override @@ -184,16 +184,17 @@ class _$ImmunizationImpl implements _Immunization { other is _$ImmunizationImpl && (identical(other.uuid, uuid) || other.uuid == uuid) && (identical(other.name, name) || other.name == name) && - (identical(other.dateRecorded, dateRecorded) || - other.dateRecorded == dateRecorded) && - (identical(other.status, status) || other.status == status) && - (identical(other.value, value) || other.value == value)); + (identical(other.immunizationDate, immunizationDate) || + other.immunizationDate == immunizationDate) && + (identical(other.manufacturer, manufacturer) || + other.manufacturer == manufacturer) && + (identical(other.lot, lot) || other.lot == lot)); } @JsonKey(ignore: true) @override int get hashCode => - Object.hash(runtimeType, uuid, name, dateRecorded, status, value); + Object.hash(runtimeType, uuid, name, immunizationDate, manufacturer, lot); @JsonKey(ignore: true) @override @@ -211,25 +212,25 @@ class _$ImmunizationImpl implements _Immunization { abstract class _Immunization implements Immunization { const factory _Immunization( - {required final String uuid, - required final String name, - required final String dateRecorded, - required final String status, - required final String value}) = _$ImmunizationImpl; + {final String? uuid, + final String? name, + final String? immunizationDate, + final String? manufacturer, + final String? lot}) = _$ImmunizationImpl; factory _Immunization.fromJson(Map json) = _$ImmunizationImpl.fromJson; @override - String get uuid; + String? get uuid; @override - String get name; + String? get name; @override - String get dateRecorded; + String? get immunizationDate; @override - String get status; + String? get manufacturer; @override - String get value; + String? get lot; @override @JsonKey(ignore: true) _$$ImmunizationImplCopyWith<_$ImmunizationImpl> get copyWith => diff --git a/lib/src/features/visits/data/models/immunization.g.dart b/lib/src/features/visits/data/models/immunization.g.dart index fc7aa739..6ab33153 100644 --- a/lib/src/features/visits/data/models/immunization.g.dart +++ b/lib/src/features/visits/data/models/immunization.g.dart @@ -8,18 +8,18 @@ part of 'immunization.dart'; _$ImmunizationImpl _$$ImmunizationImplFromJson(Map json) => _$ImmunizationImpl( - uuid: json['uuid'] as String, - name: json['name'] as String, - dateRecorded: json['dateRecorded'] as String, - status: json['status'] as String, - value: json['value'] as String, + uuid: json['uuid'] as String?, + name: json['name'] as String?, + immunizationDate: json['immunizationDate'] as String?, + manufacturer: json['manufacturer'] as String?, + lot: json['lot'] as String?, ); Map _$$ImmunizationImplToJson(_$ImmunizationImpl instance) => { 'uuid': instance.uuid, 'name': instance.name, - 'dateRecorded': instance.dateRecorded, - 'status': instance.status, - 'value': instance.value, + 'immunizationDate': instance.immunizationDate, + 'manufacturer': instance.manufacturer, + 'lot': instance.lot, }; diff --git a/lib/src/features/visits/data/models/lab_result.dart b/lib/src/features/visits/data/models/lab_result.dart index 856ff6f0..762f468c 100644 --- a/lib/src/features/visits/data/models/lab_result.dart +++ b/lib/src/features/visits/data/models/lab_result.dart @@ -6,10 +6,12 @@ part 'lab_result.g.dart'; @Freezed() class LabResult with _$LabResult { const factory LabResult({ - required String uuid, - required String name, - required String dateRecorded, - required String value, + String? uuid, + String? name, + String? results, + String? orderedDate, + String? status, + double? plot, }) = _LabResult; factory LabResult.fromJson(Map json)=> _$LabResultFromJson(json); diff --git a/lib/src/features/visits/data/models/lab_result.freezed.dart b/lib/src/features/visits/data/models/lab_result.freezed.dart index 8d2470d2..89bfff68 100644 --- a/lib/src/features/visits/data/models/lab_result.freezed.dart +++ b/lib/src/features/visits/data/models/lab_result.freezed.dart @@ -20,10 +20,12 @@ LabResult _$LabResultFromJson(Map json) { /// @nodoc mixin _$LabResult { - String get uuid => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get dateRecorded => throw _privateConstructorUsedError; - String get value => throw _privateConstructorUsedError; + String? get uuid => throw _privateConstructorUsedError; + String? get name => throw _privateConstructorUsedError; + String? get results => throw _privateConstructorUsedError; + String? get orderedDate => throw _privateConstructorUsedError; + String? get status => throw _privateConstructorUsedError; + double? get plot => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -36,7 +38,13 @@ abstract class $LabResultCopyWith<$Res> { factory $LabResultCopyWith(LabResult value, $Res Function(LabResult) then) = _$LabResultCopyWithImpl<$Res, LabResult>; @useResult - $Res call({String uuid, String name, String dateRecorded, String value}); + $Res call( + {String? uuid, + String? name, + String? results, + String? orderedDate, + String? status, + double? plot}); } /// @nodoc @@ -52,28 +60,38 @@ class _$LabResultCopyWithImpl<$Res, $Val extends LabResult> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, - Object? dateRecorded = null, - Object? value = null, + Object? uuid = freezed, + Object? name = freezed, + Object? results = freezed, + Object? orderedDate = freezed, + Object? status = freezed, + Object? plot = freezed, }) { return _then(_value.copyWith( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, - dateRecorded: null == dateRecorded - ? _value.dateRecorded - : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - value: null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + results: freezed == results + ? _value.results + : results // ignore: cast_nullable_to_non_nullable + as String?, + orderedDate: freezed == orderedDate + ? _value.orderedDate + : orderedDate // ignore: cast_nullable_to_non_nullable + as String?, + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String?, + plot: freezed == plot + ? _value.plot + : plot // ignore: cast_nullable_to_non_nullable + as double?, ) as $Val); } } @@ -86,7 +104,13 @@ abstract class _$$LabResultImplCopyWith<$Res> __$$LabResultImplCopyWithImpl<$Res>; @override @useResult - $Res call({String uuid, String name, String dateRecorded, String value}); + $Res call( + {String? uuid, + String? name, + String? results, + String? orderedDate, + String? status, + double? plot}); } /// @nodoc @@ -100,28 +124,38 @@ class __$$LabResultImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, - Object? dateRecorded = null, - Object? value = null, + Object? uuid = freezed, + Object? name = freezed, + Object? results = freezed, + Object? orderedDate = freezed, + Object? status = freezed, + Object? plot = freezed, }) { return _then(_$LabResultImpl( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, - dateRecorded: null == dateRecorded - ? _value.dateRecorded - : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - value: null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + results: freezed == results + ? _value.results + : results // ignore: cast_nullable_to_non_nullable + as String?, + orderedDate: freezed == orderedDate + ? _value.orderedDate + : orderedDate // ignore: cast_nullable_to_non_nullable + as String?, + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as String?, + plot: freezed == plot + ? _value.plot + : plot // ignore: cast_nullable_to_non_nullable + as double?, )); } } @@ -130,26 +164,32 @@ class __$$LabResultImplCopyWithImpl<$Res> @JsonSerializable() class _$LabResultImpl with DiagnosticableTreeMixin implements _LabResult { const _$LabResultImpl( - {required this.uuid, - required this.name, - required this.dateRecorded, - required this.value}); + {this.uuid, + this.name, + this.results, + this.orderedDate, + this.status, + this.plot}); factory _$LabResultImpl.fromJson(Map json) => _$$LabResultImplFromJson(json); @override - final String uuid; + final String? uuid; @override - final String name; + final String? name; @override - final String dateRecorded; + final String? results; @override - final String value; + final String? orderedDate; + @override + final String? status; + @override + final double? plot; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'LabResult(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, value: $value)'; + return 'LabResult(uuid: $uuid, name: $name, results: $results, orderedDate: $orderedDate, status: $status, plot: $plot)'; } @override @@ -159,8 +199,10 @@ class _$LabResultImpl with DiagnosticableTreeMixin implements _LabResult { ..add(DiagnosticsProperty('type', 'LabResult')) ..add(DiagnosticsProperty('uuid', uuid)) ..add(DiagnosticsProperty('name', name)) - ..add(DiagnosticsProperty('dateRecorded', dateRecorded)) - ..add(DiagnosticsProperty('value', value)); + ..add(DiagnosticsProperty('results', results)) + ..add(DiagnosticsProperty('orderedDate', orderedDate)) + ..add(DiagnosticsProperty('status', status)) + ..add(DiagnosticsProperty('plot', plot)); } @override @@ -170,14 +212,17 @@ class _$LabResultImpl with DiagnosticableTreeMixin implements _LabResult { other is _$LabResultImpl && (identical(other.uuid, uuid) || other.uuid == uuid) && (identical(other.name, name) || other.name == name) && - (identical(other.dateRecorded, dateRecorded) || - other.dateRecorded == dateRecorded) && - (identical(other.value, value) || other.value == value)); + (identical(other.results, results) || other.results == results) && + (identical(other.orderedDate, orderedDate) || + other.orderedDate == orderedDate) && + (identical(other.status, status) || other.status == status) && + (identical(other.plot, plot) || other.plot == plot)); } @JsonKey(ignore: true) @override - int get hashCode => Object.hash(runtimeType, uuid, name, dateRecorded, value); + int get hashCode => + Object.hash(runtimeType, uuid, name, results, orderedDate, status, plot); @JsonKey(ignore: true) @override @@ -195,22 +240,28 @@ class _$LabResultImpl with DiagnosticableTreeMixin implements _LabResult { abstract class _LabResult implements LabResult { const factory _LabResult( - {required final String uuid, - required final String name, - required final String dateRecorded, - required final String value}) = _$LabResultImpl; + {final String? uuid, + final String? name, + final String? results, + final String? orderedDate, + final String? status, + final double? plot}) = _$LabResultImpl; factory _LabResult.fromJson(Map json) = _$LabResultImpl.fromJson; @override - String get uuid; + String? get uuid; + @override + String? get name; + @override + String? get results; @override - String get name; + String? get orderedDate; @override - String get dateRecorded; + String? get status; @override - String get value; + double? get plot; @override @JsonKey(ignore: true) _$$LabResultImplCopyWith<_$LabResultImpl> get copyWith => diff --git a/lib/src/features/visits/data/models/lab_result.g.dart b/lib/src/features/visits/data/models/lab_result.g.dart index ec6d475f..3c875bf9 100644 --- a/lib/src/features/visits/data/models/lab_result.g.dart +++ b/lib/src/features/visits/data/models/lab_result.g.dart @@ -8,16 +8,20 @@ part of 'lab_result.dart'; _$LabResultImpl _$$LabResultImplFromJson(Map json) => _$LabResultImpl( - uuid: json['uuid'] as String, - name: json['name'] as String, - dateRecorded: json['dateRecorded'] as String, - value: json['value'] as String, + uuid: json['uuid'] as String?, + name: json['name'] as String?, + results: json['results'] as String?, + orderedDate: json['orderedDate'] as String?, + status: json['status'] as String?, + plot: (json['plot'] as num?)?.toDouble(), ); Map _$$LabResultImplToJson(_$LabResultImpl instance) => { 'uuid': instance.uuid, 'name': instance.name, - 'dateRecorded': instance.dateRecorded, - 'value': instance.value, + 'results': instance.results, + 'orderedDate': instance.orderedDate, + 'status': instance.status, + 'plot': instance.plot, }; diff --git a/lib/src/features/visits/data/models/medication.dart b/lib/src/features/visits/data/models/medication.dart index 0e593e1d..a8235ee5 100644 --- a/lib/src/features/visits/data/models/medication.dart +++ b/lib/src/features/visits/data/models/medication.dart @@ -6,11 +6,12 @@ part 'medication.g.dart'; @Freezed() class Medication with _$Medication { const factory Medication({ - required String uuid, - required String name, + String? uuid, + String? name, String? onsetDate, - required String dateRecorded, - required String value, + String? dateRecorded, + String? value, + String? indication, }) = _Medication; factory Medication.fromJson(Map json)=> _$MedicationFromJson(json); diff --git a/lib/src/features/visits/data/models/medication.freezed.dart b/lib/src/features/visits/data/models/medication.freezed.dart index 3e509f57..e62a29a4 100644 --- a/lib/src/features/visits/data/models/medication.freezed.dart +++ b/lib/src/features/visits/data/models/medication.freezed.dart @@ -20,11 +20,12 @@ Medication _$MedicationFromJson(Map json) { /// @nodoc mixin _$Medication { - String get uuid => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; + String? get uuid => throw _privateConstructorUsedError; + String? get name => throw _privateConstructorUsedError; String? get onsetDate => throw _privateConstructorUsedError; - String get dateRecorded => throw _privateConstructorUsedError; - String get value => throw _privateConstructorUsedError; + String? get dateRecorded => throw _privateConstructorUsedError; + String? get value => throw _privateConstructorUsedError; + String? get indication => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -39,11 +40,12 @@ abstract class $MedicationCopyWith<$Res> { _$MedicationCopyWithImpl<$Res, Medication>; @useResult $Res call( - {String uuid, - String name, + {String? uuid, + String? name, String? onsetDate, - String dateRecorded, - String value}); + String? dateRecorded, + String? value, + String? indication}); } /// @nodoc @@ -59,33 +61,38 @@ class _$MedicationCopyWithImpl<$Res, $Val extends Medication> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, + Object? uuid = freezed, + Object? name = freezed, Object? onsetDate = freezed, - Object? dateRecorded = null, - Object? value = null, + Object? dateRecorded = freezed, + Object? value = freezed, + Object? indication = freezed, }) { return _then(_value.copyWith( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, + as String?, onsetDate: freezed == onsetDate ? _value.onsetDate : onsetDate // ignore: cast_nullable_to_non_nullable as String?, - dateRecorded: null == dateRecorded + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - value: null == value + as String?, + value: freezed == value ? _value.value : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + indication: freezed == indication + ? _value.indication + : indication // ignore: cast_nullable_to_non_nullable + as String?, ) as $Val); } } @@ -99,11 +106,12 @@ abstract class _$$MedicationImplCopyWith<$Res> @override @useResult $Res call( - {String uuid, - String name, + {String? uuid, + String? name, String? onsetDate, - String dateRecorded, - String value}); + String? dateRecorded, + String? value, + String? indication}); } /// @nodoc @@ -117,33 +125,38 @@ class __$$MedicationImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, + Object? uuid = freezed, + Object? name = freezed, Object? onsetDate = freezed, - Object? dateRecorded = null, - Object? value = null, + Object? dateRecorded = freezed, + Object? value = freezed, + Object? indication = freezed, }) { return _then(_$MedicationImpl( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, + as String?, onsetDate: freezed == onsetDate ? _value.onsetDate : onsetDate // ignore: cast_nullable_to_non_nullable as String?, - dateRecorded: null == dateRecorded + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - value: null == value + as String?, + value: freezed == value ? _value.value : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + indication: freezed == indication + ? _value.indication + : indication // ignore: cast_nullable_to_non_nullable + as String?, )); } } @@ -152,29 +165,32 @@ class __$$MedicationImplCopyWithImpl<$Res> @JsonSerializable() class _$MedicationImpl with DiagnosticableTreeMixin implements _Medication { const _$MedicationImpl( - {required this.uuid, - required this.name, + {this.uuid, + this.name, this.onsetDate, - required this.dateRecorded, - required this.value}); + this.dateRecorded, + this.value, + this.indication}); factory _$MedicationImpl.fromJson(Map json) => _$$MedicationImplFromJson(json); @override - final String uuid; + final String? uuid; @override - final String name; + final String? name; @override final String? onsetDate; @override - final String dateRecorded; + final String? dateRecorded; + @override + final String? value; @override - final String value; + final String? indication; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'Medication(uuid: $uuid, name: $name, onsetDate: $onsetDate, dateRecorded: $dateRecorded, value: $value)'; + return 'Medication(uuid: $uuid, name: $name, onsetDate: $onsetDate, dateRecorded: $dateRecorded, value: $value, indication: $indication)'; } @override @@ -186,7 +202,8 @@ class _$MedicationImpl with DiagnosticableTreeMixin implements _Medication { ..add(DiagnosticsProperty('name', name)) ..add(DiagnosticsProperty('onsetDate', onsetDate)) ..add(DiagnosticsProperty('dateRecorded', dateRecorded)) - ..add(DiagnosticsProperty('value', value)); + ..add(DiagnosticsProperty('value', value)) + ..add(DiagnosticsProperty('indication', indication)); } @override @@ -200,13 +217,15 @@ class _$MedicationImpl with DiagnosticableTreeMixin implements _Medication { other.onsetDate == onsetDate) && (identical(other.dateRecorded, dateRecorded) || other.dateRecorded == dateRecorded) && - (identical(other.value, value) || other.value == value)); + (identical(other.value, value) || other.value == value) && + (identical(other.indication, indication) || + other.indication == indication)); } @JsonKey(ignore: true) @override - int get hashCode => - Object.hash(runtimeType, uuid, name, onsetDate, dateRecorded, value); + int get hashCode => Object.hash( + runtimeType, uuid, name, onsetDate, dateRecorded, value, indication); @JsonKey(ignore: true) @override @@ -224,25 +243,28 @@ class _$MedicationImpl with DiagnosticableTreeMixin implements _Medication { abstract class _Medication implements Medication { const factory _Medication( - {required final String uuid, - required final String name, + {final String? uuid, + final String? name, final String? onsetDate, - required final String dateRecorded, - required final String value}) = _$MedicationImpl; + final String? dateRecorded, + final String? value, + final String? indication}) = _$MedicationImpl; factory _Medication.fromJson(Map json) = _$MedicationImpl.fromJson; @override - String get uuid; + String? get uuid; @override - String get name; + String? get name; @override String? get onsetDate; @override - String get dateRecorded; + String? get dateRecorded; + @override + String? get value; @override - String get value; + String? get indication; @override @JsonKey(ignore: true) _$$MedicationImplCopyWith<_$MedicationImpl> get copyWith => diff --git a/lib/src/features/visits/data/models/medication.g.dart b/lib/src/features/visits/data/models/medication.g.dart index 19a1f53f..77d4418c 100644 --- a/lib/src/features/visits/data/models/medication.g.dart +++ b/lib/src/features/visits/data/models/medication.g.dart @@ -8,11 +8,12 @@ part of 'medication.dart'; _$MedicationImpl _$$MedicationImplFromJson(Map json) => _$MedicationImpl( - uuid: json['uuid'] as String, - name: json['name'] as String, + uuid: json['uuid'] as String?, + name: json['name'] as String?, onsetDate: json['onsetDate'] as String?, - dateRecorded: json['dateRecorded'] as String, - value: json['value'] as String, + dateRecorded: json['dateRecorded'] as String?, + value: json['value'] as String?, + indication: json['indication'] as String?, ); Map _$$MedicationImplToJson(_$MedicationImpl instance) => @@ -22,4 +23,5 @@ Map _$$MedicationImplToJson(_$MedicationImpl instance) => 'onsetDate': instance.onsetDate, 'dateRecorded': instance.dateRecorded, 'value': instance.value, + 'indication': instance.indication, }; diff --git a/lib/src/features/visits/data/models/procedure.dart b/lib/src/features/visits/data/models/procedure.dart index 530641ce..a726280c 100644 --- a/lib/src/features/visits/data/models/procedure.dart +++ b/lib/src/features/visits/data/models/procedure.dart @@ -6,10 +6,12 @@ part 'procedure.g.dart'; @Freezed() class Procedure with _$Procedure { const factory Procedure({ - required String uuid, - required String name, - required String dateRecorded, - required String value, + String? uuid, + String? name, + String? dateRecorded, + String? value, + String? site, + double? repeat, }) = _Procedure; factory Procedure.fromJson(Map json)=> _$ProcedureFromJson(json); diff --git a/lib/src/features/visits/data/models/procedure.freezed.dart b/lib/src/features/visits/data/models/procedure.freezed.dart index dbba61b9..516eae41 100644 --- a/lib/src/features/visits/data/models/procedure.freezed.dart +++ b/lib/src/features/visits/data/models/procedure.freezed.dart @@ -20,10 +20,12 @@ Procedure _$ProcedureFromJson(Map json) { /// @nodoc mixin _$Procedure { - String get uuid => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get dateRecorded => throw _privateConstructorUsedError; - String get value => throw _privateConstructorUsedError; + String? get uuid => throw _privateConstructorUsedError; + String? get name => throw _privateConstructorUsedError; + String? get dateRecorded => throw _privateConstructorUsedError; + String? get value => throw _privateConstructorUsedError; + String? get site => throw _privateConstructorUsedError; + double? get repeat => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -36,7 +38,13 @@ abstract class $ProcedureCopyWith<$Res> { factory $ProcedureCopyWith(Procedure value, $Res Function(Procedure) then) = _$ProcedureCopyWithImpl<$Res, Procedure>; @useResult - $Res call({String uuid, String name, String dateRecorded, String value}); + $Res call( + {String? uuid, + String? name, + String? dateRecorded, + String? value, + String? site, + double? repeat}); } /// @nodoc @@ -52,28 +60,38 @@ class _$ProcedureCopyWithImpl<$Res, $Val extends Procedure> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, - Object? dateRecorded = null, - Object? value = null, + Object? uuid = freezed, + Object? name = freezed, + Object? dateRecorded = freezed, + Object? value = freezed, + Object? site = freezed, + Object? repeat = freezed, }) { return _then(_value.copyWith( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, - dateRecorded: null == dateRecorded + as String?, + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - value: null == value + as String?, + value: freezed == value ? _value.value : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + site: freezed == site + ? _value.site + : site // ignore: cast_nullable_to_non_nullable + as String?, + repeat: freezed == repeat + ? _value.repeat + : repeat // ignore: cast_nullable_to_non_nullable + as double?, ) as $Val); } } @@ -86,7 +104,13 @@ abstract class _$$ProcedureImplCopyWith<$Res> __$$ProcedureImplCopyWithImpl<$Res>; @override @useResult - $Res call({String uuid, String name, String dateRecorded, String value}); + $Res call( + {String? uuid, + String? name, + String? dateRecorded, + String? value, + String? site, + double? repeat}); } /// @nodoc @@ -100,28 +124,38 @@ class __$$ProcedureImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, - Object? dateRecorded = null, - Object? value = null, + Object? uuid = freezed, + Object? name = freezed, + Object? dateRecorded = freezed, + Object? value = freezed, + Object? site = freezed, + Object? repeat = freezed, }) { return _then(_$ProcedureImpl( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, - dateRecorded: null == dateRecorded + as String?, + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - value: null == value + as String?, + value: freezed == value ? _value.value : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + site: freezed == site + ? _value.site + : site // ignore: cast_nullable_to_non_nullable + as String?, + repeat: freezed == repeat + ? _value.repeat + : repeat // ignore: cast_nullable_to_non_nullable + as double?, )); } } @@ -130,26 +164,32 @@ class __$$ProcedureImplCopyWithImpl<$Res> @JsonSerializable() class _$ProcedureImpl with DiagnosticableTreeMixin implements _Procedure { const _$ProcedureImpl( - {required this.uuid, - required this.name, - required this.dateRecorded, - required this.value}); + {this.uuid, + this.name, + this.dateRecorded, + this.value, + this.site, + this.repeat}); factory _$ProcedureImpl.fromJson(Map json) => _$$ProcedureImplFromJson(json); @override - final String uuid; + final String? uuid; @override - final String name; + final String? name; @override - final String dateRecorded; + final String? dateRecorded; @override - final String value; + final String? value; + @override + final String? site; + @override + final double? repeat; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'Procedure(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, value: $value)'; + return 'Procedure(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, value: $value, site: $site, repeat: $repeat)'; } @override @@ -160,7 +200,9 @@ class _$ProcedureImpl with DiagnosticableTreeMixin implements _Procedure { ..add(DiagnosticsProperty('uuid', uuid)) ..add(DiagnosticsProperty('name', name)) ..add(DiagnosticsProperty('dateRecorded', dateRecorded)) - ..add(DiagnosticsProperty('value', value)); + ..add(DiagnosticsProperty('value', value)) + ..add(DiagnosticsProperty('site', site)) + ..add(DiagnosticsProperty('repeat', repeat)); } @override @@ -172,12 +214,15 @@ class _$ProcedureImpl with DiagnosticableTreeMixin implements _Procedure { (identical(other.name, name) || other.name == name) && (identical(other.dateRecorded, dateRecorded) || other.dateRecorded == dateRecorded) && - (identical(other.value, value) || other.value == value)); + (identical(other.value, value) || other.value == value) && + (identical(other.site, site) || other.site == site) && + (identical(other.repeat, repeat) || other.repeat == repeat)); } @JsonKey(ignore: true) @override - int get hashCode => Object.hash(runtimeType, uuid, name, dateRecorded, value); + int get hashCode => + Object.hash(runtimeType, uuid, name, dateRecorded, value, site, repeat); @JsonKey(ignore: true) @override @@ -195,22 +240,28 @@ class _$ProcedureImpl with DiagnosticableTreeMixin implements _Procedure { abstract class _Procedure implements Procedure { const factory _Procedure( - {required final String uuid, - required final String name, - required final String dateRecorded, - required final String value}) = _$ProcedureImpl; + {final String? uuid, + final String? name, + final String? dateRecorded, + final String? value, + final String? site, + final double? repeat}) = _$ProcedureImpl; factory _Procedure.fromJson(Map json) = _$ProcedureImpl.fromJson; @override - String get uuid; + String? get uuid; + @override + String? get name; + @override + String? get dateRecorded; @override - String get name; + String? get value; @override - String get dateRecorded; + String? get site; @override - String get value; + double? get repeat; @override @JsonKey(ignore: true) _$$ProcedureImplCopyWith<_$ProcedureImpl> get copyWith => diff --git a/lib/src/features/visits/data/models/procedure.g.dart b/lib/src/features/visits/data/models/procedure.g.dart index 6cdb64c1..85b7c6ba 100644 --- a/lib/src/features/visits/data/models/procedure.g.dart +++ b/lib/src/features/visits/data/models/procedure.g.dart @@ -8,10 +8,12 @@ part of 'procedure.dart'; _$ProcedureImpl _$$ProcedureImplFromJson(Map json) => _$ProcedureImpl( - uuid: json['uuid'] as String, - name: json['name'] as String, - dateRecorded: json['dateRecorded'] as String, - value: json['value'] as String, + uuid: json['uuid'] as String?, + name: json['name'] as String?, + dateRecorded: json['dateRecorded'] as String?, + value: json['value'] as String?, + site: json['site'] as String?, + repeat: (json['repeat'] as num?)?.toDouble(), ); Map _$$ProcedureImplToJson(_$ProcedureImpl instance) => @@ -20,4 +22,6 @@ Map _$$ProcedureImplToJson(_$ProcedureImpl instance) => 'name': instance.name, 'dateRecorded': instance.dateRecorded, 'value': instance.value, + 'site': instance.site, + 'repeat': instance.repeat, }; diff --git a/lib/src/features/visits/data/models/vital.dart b/lib/src/features/visits/data/models/vital.dart index 2ce83093..c989e313 100644 --- a/lib/src/features/visits/data/models/vital.dart +++ b/lib/src/features/visits/data/models/vital.dart @@ -6,10 +6,17 @@ part 'vital.g.dart'; @Freezed() class Vital with _$Vital { const factory Vital({ - required String uuid, - required String name, - required String dateRecorded, - required String value, + String? uuid, + String? name, + String? dateRecorded, + String? weight, + String? temp, + String? systolic, + String? diastolic, + String? respiratory, + String? oxygenSaturation, + String? height, + String? complain, }) = _Vital; factory Vital.fromJson(Map json)=> _$VitalFromJson(json); diff --git a/lib/src/features/visits/data/models/vital.freezed.dart b/lib/src/features/visits/data/models/vital.freezed.dart index 0d4c6b14..777aa940 100644 --- a/lib/src/features/visits/data/models/vital.freezed.dart +++ b/lib/src/features/visits/data/models/vital.freezed.dart @@ -20,10 +20,17 @@ Vital _$VitalFromJson(Map json) { /// @nodoc mixin _$Vital { - String get uuid => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get dateRecorded => throw _privateConstructorUsedError; - String get value => throw _privateConstructorUsedError; + String? get uuid => throw _privateConstructorUsedError; + String? get name => throw _privateConstructorUsedError; + String? get dateRecorded => throw _privateConstructorUsedError; + String? get weight => throw _privateConstructorUsedError; + String? get temp => throw _privateConstructorUsedError; + String? get systolic => throw _privateConstructorUsedError; + String? get diastolic => throw _privateConstructorUsedError; + String? get respiratory => throw _privateConstructorUsedError; + String? get oxygenSaturation => throw _privateConstructorUsedError; + String? get height => throw _privateConstructorUsedError; + String? get complain => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -35,7 +42,18 @@ abstract class $VitalCopyWith<$Res> { factory $VitalCopyWith(Vital value, $Res Function(Vital) then) = _$VitalCopyWithImpl<$Res, Vital>; @useResult - $Res call({String uuid, String name, String dateRecorded, String value}); + $Res call( + {String? uuid, + String? name, + String? dateRecorded, + String? weight, + String? temp, + String? systolic, + String? diastolic, + String? respiratory, + String? oxygenSaturation, + String? height, + String? complain}); } /// @nodoc @@ -51,28 +69,63 @@ class _$VitalCopyWithImpl<$Res, $Val extends Vital> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, - Object? dateRecorded = null, - Object? value = null, + Object? uuid = freezed, + Object? name = freezed, + Object? dateRecorded = freezed, + Object? weight = freezed, + Object? temp = freezed, + Object? systolic = freezed, + Object? diastolic = freezed, + Object? respiratory = freezed, + Object? oxygenSaturation = freezed, + Object? height = freezed, + Object? complain = freezed, }) { return _then(_value.copyWith( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, - dateRecorded: null == dateRecorded + as String?, + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - value: null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + weight: freezed == weight + ? _value.weight + : weight // ignore: cast_nullable_to_non_nullable + as String?, + temp: freezed == temp + ? _value.temp + : temp // ignore: cast_nullable_to_non_nullable + as String?, + systolic: freezed == systolic + ? _value.systolic + : systolic // ignore: cast_nullable_to_non_nullable + as String?, + diastolic: freezed == diastolic + ? _value.diastolic + : diastolic // ignore: cast_nullable_to_non_nullable + as String?, + respiratory: freezed == respiratory + ? _value.respiratory + : respiratory // ignore: cast_nullable_to_non_nullable + as String?, + oxygenSaturation: freezed == oxygenSaturation + ? _value.oxygenSaturation + : oxygenSaturation // ignore: cast_nullable_to_non_nullable + as String?, + height: freezed == height + ? _value.height + : height // ignore: cast_nullable_to_non_nullable + as String?, + complain: freezed == complain + ? _value.complain + : complain // ignore: cast_nullable_to_non_nullable + as String?, ) as $Val); } } @@ -84,7 +137,18 @@ abstract class _$$VitalImplCopyWith<$Res> implements $VitalCopyWith<$Res> { __$$VitalImplCopyWithImpl<$Res>; @override @useResult - $Res call({String uuid, String name, String dateRecorded, String value}); + $Res call( + {String? uuid, + String? name, + String? dateRecorded, + String? weight, + String? temp, + String? systolic, + String? diastolic, + String? respiratory, + String? oxygenSaturation, + String? height, + String? complain}); } /// @nodoc @@ -98,28 +162,63 @@ class __$$VitalImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? uuid = null, - Object? name = null, - Object? dateRecorded = null, - Object? value = null, + Object? uuid = freezed, + Object? name = freezed, + Object? dateRecorded = freezed, + Object? weight = freezed, + Object? temp = freezed, + Object? systolic = freezed, + Object? diastolic = freezed, + Object? respiratory = freezed, + Object? oxygenSaturation = freezed, + Object? height = freezed, + Object? complain = freezed, }) { return _then(_$VitalImpl( - uuid: null == uuid + uuid: freezed == uuid ? _value.uuid : uuid // ignore: cast_nullable_to_non_nullable - as String, - name: null == name + as String?, + name: freezed == name ? _value.name : name // ignore: cast_nullable_to_non_nullable - as String, - dateRecorded: null == dateRecorded + as String?, + dateRecorded: freezed == dateRecorded ? _value.dateRecorded : dateRecorded // ignore: cast_nullable_to_non_nullable - as String, - value: null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as String, + as String?, + weight: freezed == weight + ? _value.weight + : weight // ignore: cast_nullable_to_non_nullable + as String?, + temp: freezed == temp + ? _value.temp + : temp // ignore: cast_nullable_to_non_nullable + as String?, + systolic: freezed == systolic + ? _value.systolic + : systolic // ignore: cast_nullable_to_non_nullable + as String?, + diastolic: freezed == diastolic + ? _value.diastolic + : diastolic // ignore: cast_nullable_to_non_nullable + as String?, + respiratory: freezed == respiratory + ? _value.respiratory + : respiratory // ignore: cast_nullable_to_non_nullable + as String?, + oxygenSaturation: freezed == oxygenSaturation + ? _value.oxygenSaturation + : oxygenSaturation // ignore: cast_nullable_to_non_nullable + as String?, + height: freezed == height + ? _value.height + : height // ignore: cast_nullable_to_non_nullable + as String?, + complain: freezed == complain + ? _value.complain + : complain // ignore: cast_nullable_to_non_nullable + as String?, )); } } @@ -128,26 +227,47 @@ class __$$VitalImplCopyWithImpl<$Res> @JsonSerializable() class _$VitalImpl with DiagnosticableTreeMixin implements _Vital { const _$VitalImpl( - {required this.uuid, - required this.name, - required this.dateRecorded, - required this.value}); + {this.uuid, + this.name, + this.dateRecorded, + this.weight, + this.temp, + this.systolic, + this.diastolic, + this.respiratory, + this.oxygenSaturation, + this.height, + this.complain}); factory _$VitalImpl.fromJson(Map json) => _$$VitalImplFromJson(json); @override - final String uuid; + final String? uuid; @override - final String name; + final String? name; @override - final String dateRecorded; + final String? dateRecorded; @override - final String value; + final String? weight; + @override + final String? temp; + @override + final String? systolic; + @override + final String? diastolic; + @override + final String? respiratory; + @override + final String? oxygenSaturation; + @override + final String? height; + @override + final String? complain; @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'Vital(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, value: $value)'; + return 'Vital(uuid: $uuid, name: $name, dateRecorded: $dateRecorded, weight: $weight, temp: $temp, systolic: $systolic, diastolic: $diastolic, respiratory: $respiratory, oxygenSaturation: $oxygenSaturation, height: $height, complain: $complain)'; } @override @@ -158,7 +278,14 @@ class _$VitalImpl with DiagnosticableTreeMixin implements _Vital { ..add(DiagnosticsProperty('uuid', uuid)) ..add(DiagnosticsProperty('name', name)) ..add(DiagnosticsProperty('dateRecorded', dateRecorded)) - ..add(DiagnosticsProperty('value', value)); + ..add(DiagnosticsProperty('weight', weight)) + ..add(DiagnosticsProperty('temp', temp)) + ..add(DiagnosticsProperty('systolic', systolic)) + ..add(DiagnosticsProperty('diastolic', diastolic)) + ..add(DiagnosticsProperty('respiratory', respiratory)) + ..add(DiagnosticsProperty('oxygenSaturation', oxygenSaturation)) + ..add(DiagnosticsProperty('height', height)) + ..add(DiagnosticsProperty('complain', complain)); } @override @@ -170,12 +297,36 @@ class _$VitalImpl with DiagnosticableTreeMixin implements _Vital { (identical(other.name, name) || other.name == name) && (identical(other.dateRecorded, dateRecorded) || other.dateRecorded == dateRecorded) && - (identical(other.value, value) || other.value == value)); + (identical(other.weight, weight) || other.weight == weight) && + (identical(other.temp, temp) || other.temp == temp) && + (identical(other.systolic, systolic) || + other.systolic == systolic) && + (identical(other.diastolic, diastolic) || + other.diastolic == diastolic) && + (identical(other.respiratory, respiratory) || + other.respiratory == respiratory) && + (identical(other.oxygenSaturation, oxygenSaturation) || + other.oxygenSaturation == oxygenSaturation) && + (identical(other.height, height) || other.height == height) && + (identical(other.complain, complain) || + other.complain == complain)); } @JsonKey(ignore: true) @override - int get hashCode => Object.hash(runtimeType, uuid, name, dateRecorded, value); + int get hashCode => Object.hash( + runtimeType, + uuid, + name, + dateRecorded, + weight, + temp, + systolic, + diastolic, + respiratory, + oxygenSaturation, + height, + complain); @JsonKey(ignore: true) @override @@ -193,21 +344,42 @@ class _$VitalImpl with DiagnosticableTreeMixin implements _Vital { abstract class _Vital implements Vital { const factory _Vital( - {required final String uuid, - required final String name, - required final String dateRecorded, - required final String value}) = _$VitalImpl; + {final String? uuid, + final String? name, + final String? dateRecorded, + final String? weight, + final String? temp, + final String? systolic, + final String? diastolic, + final String? respiratory, + final String? oxygenSaturation, + final String? height, + final String? complain}) = _$VitalImpl; factory _Vital.fromJson(Map json) = _$VitalImpl.fromJson; @override - String get uuid; + String? get uuid; + @override + String? get name; + @override + String? get dateRecorded; + @override + String? get weight; + @override + String? get temp; + @override + String? get systolic; + @override + String? get diastolic; + @override + String? get respiratory; @override - String get name; + String? get oxygenSaturation; @override - String get dateRecorded; + String? get height; @override - String get value; + String? get complain; @override @JsonKey(ignore: true) _$$VitalImplCopyWith<_$VitalImpl> get copyWith => diff --git a/lib/src/features/visits/data/models/vital.g.dart b/lib/src/features/visits/data/models/vital.g.dart index f526f08d..dac7db85 100644 --- a/lib/src/features/visits/data/models/vital.g.dart +++ b/lib/src/features/visits/data/models/vital.g.dart @@ -7,10 +7,17 @@ part of 'vital.dart'; // ************************************************************************** _$VitalImpl _$$VitalImplFromJson(Map json) => _$VitalImpl( - uuid: json['uuid'] as String, - name: json['name'] as String, - dateRecorded: json['dateRecorded'] as String, - value: json['value'] as String, + uuid: json['uuid'] as String?, + name: json['name'] as String?, + dateRecorded: json['dateRecorded'] as String?, + weight: json['weight'] as String?, + temp: json['temp'] as String?, + systolic: json['systolic'] as String?, + diastolic: json['diastolic'] as String?, + respiratory: json['respiratory'] as String?, + oxygenSaturation: json['oxygenSaturation'] as String?, + height: json['height'] as String?, + complain: json['complain'] as String?, ); Map _$$VitalImplToJson(_$VitalImpl instance) => @@ -18,5 +25,12 @@ Map _$$VitalImplToJson(_$VitalImpl instance) => 'uuid': instance.uuid, 'name': instance.name, 'dateRecorded': instance.dateRecorded, - 'value': instance.value, + 'weight': instance.weight, + 'temp': instance.temp, + 'systolic': instance.systolic, + 'diastolic': instance.diastolic, + 'respiratory': instance.respiratory, + 'oxygenSaturation': instance.oxygenSaturation, + 'height': instance.height, + 'complain': instance.complain, }; diff --git a/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart b/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart index 2d6a9442..1165c745 100644 --- a/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart +++ b/lib/src/features/visits/presentations/pages/FacilityVisitDetailScreen.dart @@ -1,111 +1,111 @@ -import 'dart:ffi'; - -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:nishauri/src/features/visits/data/providers/visits_provider.dart'; -import 'package:nishauri/src/features/visits/presentations/widgets/AllergiesTab.dart'; -import 'package:nishauri/src/features/visits/presentations/widgets/ComplaintsTab.dart'; -import 'package:nishauri/src/features/visits/presentations/widgets/ConditionsTab.dart'; -import 'package:nishauri/src/features/visits/presentations/widgets/Diagnosis.dart'; -import 'package:nishauri/src/features/visits/presentations/widgets/LabResultsTab.dart'; -import 'package:nishauri/src/features/visits/presentations/widgets/VitalsTab.dart'; -import 'package:nishauri/src/shared/display/CustomAppBar.dart'; -import 'package:nishauri/src/shared/display/CustomTabBar.dart'; -import 'package:nishauri/src/shared/display/background_image_widget.dart'; - -class FacilityVisitDetailScreen extends HookConsumerWidget { - final String visitId; - - const FacilityVisitDetailScreen({super.key, required this.visitId}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final visitsAsync = ref.watch(visitProvider); - final theme = Theme.of(context); - final currentIndex = useState(0); - - final tabItems = [ - CustomTabBarItem(title: "Vitals"), - CustomTabBarItem(title: "Allergies"), - CustomTabBarItem(title: "Complaints"), - CustomTabBarItem(title: "Conditions"), - CustomTabBarItem(title: "Lab Results"), - CustomTabBarItem(title: "Diagnosis"), - ]; - - return visitsAsync.when( - data: (data) { - final visitDetail = - data.where((element) => element.uuid == visitId).first; - - final screen = [ - visitDetail.allergies.isEmpty ? - const Center( - child: BackgroundImageWidget( - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No vital records"), - ) : - - VitalsTab(vitals: visitDetail.vitals), - - visitDetail.allergies.isEmpty ? const Center( - child: BackgroundImageWidget( - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No Allergies records"), - ): - AllergiesTab(allergies: visitDetail.allergies), - // visitDetail.complaints.isEmpty ? const Center( - // child: BackgroundImageWidget( - // svgImage: 'assets/images/lab-empty-state.svg', - // notFoundText: "No complaints records"), - // ): - // ComplaintsTab(complaints: visitDetail.complaints), - visitDetail.conditions.isEmpty ? const Center( - child: BackgroundImageWidget( - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No condition records."), - ): - ConditionsTab(conditions: visitDetail.conditions), - visitDetail.labResults.isEmpty ? const Center( - child: BackgroundImageWidget( - svgImage: 'assets/images/lab-empty-state.svg', - notFoundText: "No Lab result records."), - ): - LabResultsTab(labResult: visitDetail.labResults), - // visitDetail.diagnosis.isEmpty ? const Center( - // child: BackgroundImageWidget( - // svgImage: 'assets/images/lab-empty-state.svg', - // notFoundText: "No Diagnosis records."), - // ): - // DiagnosisTab(diagnosis: visitDetail.diagnosis), - ]; - - return Scaffold( - body: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - CustomAppBar( - title: "Shared Health Records", - color: theme.primaryColor, - ), - CustomTabBar(onTap: (item, index){ - currentIndex.value = index; - }, - activeColor: theme.primaryColor, - activeIndex: currentIndex.value, - items: tabItems, - ), - Expanded(child: screen[currentIndex.value]), - ], - ), - ); - }, - error: (error, _) => Center(child: Text(error.toString())), - loading: () => const Center( - child: CircularProgressIndicator(), - ), - ); - } -} +// import 'dart:ffi'; +// +// import 'package:flutter/material.dart'; +// import 'package:flutter_hooks/flutter_hooks.dart'; +// import 'package:flutter_riverpod/flutter_riverpod.dart'; +// import 'package:hooks_riverpod/hooks_riverpod.dart'; +// import 'package:nishauri/src/features/visits/data/providers/visits_provider.dart'; +// import 'package:nishauri/src/features/visits/presentations/widgets/AllergiesTab.dart'; +// import 'package:nishauri/src/features/visits/presentations/widgets/ComplaintsTab.dart'; +// import 'package:nishauri/src/features/visits/presentations/widgets/ConditionsTab.dart'; +// import 'package:nishauri/src/features/visits/presentations/widgets/Diagnosis.dart'; +// import 'package:nishauri/src/features/visits/presentations/widgets/LabResultsTab.dart'; +// import 'package:nishauri/src/features/visits/presentations/widgets/VitalsTab.dart'; +// import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +// import 'package:nishauri/src/shared/display/CustomTabBar.dart'; +// import 'package:nishauri/src/shared/display/background_image_widget.dart'; +// +// class FacilityVisitDetailScreen extends HookConsumerWidget { +// final String visitId; +// +// const FacilityVisitDetailScreen({super.key, required this.visitId}); +// +// @override +// Widget build(BuildContext context, WidgetRef ref) { +// final visitsAsync = ref.watch(visitProvider); +// final theme = Theme.of(context); +// final currentIndex = useState(0); +// +// final tabItems = [ +// CustomTabBarItem(title: "Vitals"), +// CustomTabBarItem(title: "Allergies"), +// CustomTabBarItem(title: "Complaints"), +// CustomTabBarItem(title: "Conditions"), +// CustomTabBarItem(title: "Lab Results"), +// CustomTabBarItem(title: "Diagnosis"), +// ]; +// +// return visitsAsync.when( +// data: (data) { +// final visitDetail = +// data.where((element) => element.uuid == visitId).first; +// +// final screen = [ +// visitDetail.allergies.isEmpty ? +// const Center( +// child: BackgroundImageWidget( +// svgImage: 'assets/images/lab-empty-state.svg', +// notFoundText: "No vital records"), +// ) : +// +// VitalsTab(vitals: visitDetail.vitals), +// +// visitDetail.allergies.isEmpty ? const Center( +// child: BackgroundImageWidget( +// svgImage: 'assets/images/lab-empty-state.svg', +// notFoundText: "No Allergies records"), +// ): +// AllergiesTab(allergies: visitDetail.allergies), +// // visitDetail.complaints.isEmpty ? const Center( +// // child: BackgroundImageWidget( +// // svgImage: 'assets/images/lab-empty-state.svg', +// // notFoundText: "No complaints records"), +// // ): +// // ComplaintsTab(complaints: visitDetail.complaints), +// visitDetail.conditions.isEmpty ? const Center( +// child: BackgroundImageWidget( +// svgImage: 'assets/images/lab-empty-state.svg', +// notFoundText: "No condition records."), +// ): +// ConditionsTab(conditions: visitDetail.conditions), +// visitDetail.labResults.isEmpty ? const Center( +// child: BackgroundImageWidget( +// svgImage: 'assets/images/lab-empty-state.svg', +// notFoundText: "No Lab result records."), +// ): +// LabResultsTab(labResult: visitDetail.labResults), +// // visitDetail.diagnosis.isEmpty ? const Center( +// // child: BackgroundImageWidget( +// // svgImage: 'assets/images/lab-empty-state.svg', +// // notFoundText: "No Diagnosis records."), +// // ): +// // DiagnosisTab(diagnosis: visitDetail.diagnosis), +// ]; +// +// return Scaffold( +// body: Column( +// mainAxisAlignment: MainAxisAlignment.start, +// children: [ +// CustomAppBar( +// title: "Shared Health Records", +// color: theme.primaryColor, +// ), +// CustomTabBar(onTap: (item, index){ +// currentIndex.value = index; +// }, +// activeColor: theme.primaryColor, +// activeIndex: currentIndex.value, +// items: tabItems, +// ), +// Expanded(child: screen[currentIndex.value]), +// ], +// ), +// ); +// }, +// error: (error, _) => Center(child: Text(error.toString())), +// loading: () => const Center( +// child: CircularProgressIndicator(), +// ), +// ); +// } +// } diff --git a/lib/src/features/visits/presentations/widgets/AllergiesTab.dart b/lib/src/features/visits/presentations/widgets/AllergiesTab.dart index 913c428f..98df0d43 100644 --- a/lib/src/features/visits/presentations/widgets/AllergiesTab.dart +++ b/lib/src/features/visits/presentations/widgets/AllergiesTab.dart @@ -1,58 +1,58 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/visits/data/models/allergy.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class AllergiesTab extends StatelessWidget { - final List allergies; - - const AllergiesTab({super.key, this.allergies = const []}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - children: [ - Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Text( - "Allergies", - style: theme.textTheme.headlineMedium, - ), - ), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: AppCard( - child: DataTable( - columns: [ - DataColumn(label: Text("Allergen", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Reaction", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Severity", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) - ], - rows: allergies - .map( - (e) => DataRow( - cells: [ - DataCell(Text(e.allergen)), - DataCell(Text(e.reaction)), - DataCell(Text(e.severity)), - DataCell( - Text( - DateFormat("dd MMM yyy").format( - DateTime.parse(e.dateRecorded), - ), - ), - ), - ], - ), - ) - .toList(), - ), - ), - ), - ], - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:intl/intl.dart'; +// import 'package:nishauri/src/features/visits/data/models/allergy.dart'; +// import 'package:nishauri/src/shared/display/AppCard.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// +// class AllergiesTab extends StatelessWidget { +// final List allergies; +// +// const AllergiesTab({super.key, this.allergies = const []}); +// +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return Column( +// children: [ +// Padding( +// padding: const EdgeInsets.all(Constants.SPACING), +// child: Text( +// "Allergies", +// style: theme.textTheme.headlineMedium, +// ), +// ), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: AppCard( +// child: DataTable( +// columns: [ +// DataColumn(label: Text("Allergen", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Reaction", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Severity", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) +// ], +// rows: allergies +// .map( +// (e) => DataRow( +// cells: [ +// DataCell(Text(e.allergen)), +// DataCell(Text(e.reaction)), +// DataCell(Text(e.severity)), +// DataCell( +// Text( +// DateFormat("dd MMM yyy").format( +// DateTime.parse(e.dateRecorded), +// ), +// ), +// ), +// ], +// ), +// ) +// .toList(), +// ), +// ), +// ), +// ], +// ); +// } +// } diff --git a/lib/src/features/visits/presentations/widgets/ComplaintsTab.dart b/lib/src/features/visits/presentations/widgets/ComplaintsTab.dart index c5349f9a..5ebd3b2e 100644 --- a/lib/src/features/visits/presentations/widgets/ComplaintsTab.dart +++ b/lib/src/features/visits/presentations/widgets/ComplaintsTab.dart @@ -1,64 +1,64 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/visits/data/models/medication.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class ComplaintsTab extends StatelessWidget { - final List complaints; - const ComplaintsTab({super.key, this.complaints=const[]}); - - @override - Widget build(BuildContext context) { - final theme= Theme.of(context); - return Column( - children: [ - Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Text( - "Complaints", - style: theme.textTheme.headlineMedium, - ), - ), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: AppCard( - variant: CardVariant.OUTLINED, - child: DataTable( - columns: [ - DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("On set Date", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) - ], - rows: complaints - .map( - (e) => DataRow( - cells: [ - DataCell(Text(e.name)), - DataCell(Text(e.value)), - DataCell( - e.onsetDate != null && e.onsetDate?.isNotEmpty == true? Text( - DateFormat("dd MMM yyy").format( - DateTime.parse(e.onsetDate!), - ), - ): const Text("-"), - ), - DataCell( - Text( - DateFormat("dd MMM yyy").format( - DateTime.parse(e.dateRecorded), - ), - ), - ), - ], - ), - ) - .toList(), - ), - ), - ), - ], - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:intl/intl.dart'; +// import 'package:nishauri/src/features/visits/data/models/medication.dart'; +// import 'package:nishauri/src/shared/display/AppCard.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// +// class ComplaintsTab extends StatelessWidget { +// final List complaints; +// const ComplaintsTab({super.key, this.complaints=const[]}); +// +// @override +// Widget build(BuildContext context) { +// final theme= Theme.of(context); +// return Column( +// children: [ +// Padding( +// padding: const EdgeInsets.all(Constants.SPACING), +// child: Text( +// "Complaints", +// style: theme.textTheme.headlineMedium, +// ), +// ), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: AppCard( +// variant: CardVariant.OUTLINED, +// child: DataTable( +// columns: [ +// DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("On set Date", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) +// ], +// rows: complaints +// .map( +// (e) => DataRow( +// cells: [ +// DataCell(Text(e.name)), +// DataCell(Text(e.value)), +// DataCell( +// e.onsetDate != null && e.onsetDate?.isNotEmpty == true? Text( +// DateFormat("dd MMM yyy").format( +// DateTime.parse(e.onsetDate!), +// ), +// ): const Text("-"), +// ), +// DataCell( +// Text( +// DateFormat("dd MMM yyy").format( +// DateTime.parse(e.dateRecorded), +// ), +// ), +// ), +// ], +// ), +// ) +// .toList(), +// ), +// ), +// ), +// ], +// ); +// } +// } diff --git a/lib/src/features/visits/presentations/widgets/ConditionsTab.dart b/lib/src/features/visits/presentations/widgets/ConditionsTab.dart index 9b0e6338..e4bb448b 100644 --- a/lib/src/features/visits/presentations/widgets/ConditionsTab.dart +++ b/lib/src/features/visits/presentations/widgets/ConditionsTab.dart @@ -1,67 +1,67 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/visits/data/models/condition.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class ConditionsTab extends StatelessWidget { - final List conditions; - - const ConditionsTab({super.key, this.conditions = const []}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - children: [ - Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Text( - "Conditions", - style: theme.textTheme.headlineMedium, - ), - ), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: AppCard( - variant: CardVariant.ELEVETED, - child: DataTable( - columns: [ - DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Status", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("On set Date", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) - ], - rows: conditions - .map( - (e) => DataRow( - cells: [ - DataCell(Text(e.name)), - DataCell(Text(e.value)), - DataCell(Text(e.status)), - DataCell( - e.onsetDate != null && e.onsetDate?.isNotEmpty == true? Text( - DateFormat("dd MMM yyy").format( - DateTime.parse(e.onsetDate!), - ), - ): const Text("-"), - ), - DataCell( - Text( - DateFormat("dd MMM yyy").format( - DateTime.parse(e.dateRecorded), - ), - ), - ), - ], - ), - ) - .toList(), - ), - ), - ), - ], - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:intl/intl.dart'; +// import 'package:nishauri/src/features/visits/data/models/condition.dart'; +// import 'package:nishauri/src/shared/display/AppCard.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// +// class ConditionsTab extends StatelessWidget { +// final List conditions; +// +// const ConditionsTab({super.key, this.conditions = const []}); +// +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return Column( +// children: [ +// Padding( +// padding: const EdgeInsets.all(Constants.SPACING), +// child: Text( +// "Conditions", +// style: theme.textTheme.headlineMedium, +// ), +// ), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: AppCard( +// variant: CardVariant.ELEVETED, +// child: DataTable( +// columns: [ +// DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Status", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("On set Date", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) +// ], +// rows: conditions +// .map( +// (e) => DataRow( +// cells: [ +// DataCell(Text(e.name)), +// DataCell(Text(e.value)), +// DataCell(Text(e.status)), +// DataCell( +// e.onsetDate != null && e.onsetDate?.isNotEmpty == true? Text( +// DateFormat("dd MMM yyy").format( +// DateTime.parse(e.onsetDate!), +// ), +// ): const Text("-"), +// ), +// DataCell( +// Text( +// DateFormat("dd MMM yyy").format( +// DateTime.parse(e.dateRecorded), +// ), +// ), +// ), +// ], +// ), +// ) +// .toList(), +// ), +// ), +// ), +// ], +// ); +// } +// } diff --git a/lib/src/features/visits/presentations/widgets/Diagnosis.dart b/lib/src/features/visits/presentations/widgets/Diagnosis.dart index a3466a53..ea9db140 100644 --- a/lib/src/features/visits/presentations/widgets/Diagnosis.dart +++ b/lib/src/features/visits/presentations/widgets/Diagnosis.dart @@ -1,56 +1,56 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/visits/data/models/procedure.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class DiagnosisTab extends StatelessWidget { - final List diagnosis; - const DiagnosisTab({super.key, this.diagnosis =const[]}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - children: [ - Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Text( - "Diagnosis", - style: theme.textTheme.headlineMedium, - ), - ), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: AppCard( - variant: CardVariant.OUTLINED, - child: DataTable( - columns: [ - DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) - ], - rows: diagnosis - .map( - (e) => DataRow( - cells: [ - DataCell(Text(e.name)), - DataCell(Text(e.value)), - DataCell( - Text( - DateFormat("dd MMM yyy").format( - DateTime.parse(e.dateRecorded), - ), - ), - ), - ], - ), - ) - .toList(), - ), - ), - ), - ], - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:intl/intl.dart'; +// import 'package:nishauri/src/features/visits/data/models/procedure.dart'; +// import 'package:nishauri/src/shared/display/AppCard.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// +// class DiagnosisTab extends StatelessWidget { +// final List diagnosis; +// const DiagnosisTab({super.key, this.diagnosis =const[]}); +// +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return Column( +// children: [ +// Padding( +// padding: const EdgeInsets.all(Constants.SPACING), +// child: Text( +// "Diagnosis", +// style: theme.textTheme.headlineMedium, +// ), +// ), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: AppCard( +// variant: CardVariant.OUTLINED, +// child: DataTable( +// columns: [ +// DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) +// ], +// rows: diagnosis +// .map( +// (e) => DataRow( +// cells: [ +// DataCell(Text(e.name)), +// DataCell(Text(e.value)), +// DataCell( +// Text( +// DateFormat("dd MMM yyy").format( +// DateTime.parse(e.dateRecorded), +// ), +// ), +// ), +// ], +// ), +// ) +// .toList(), +// ), +// ), +// ), +// ], +// ); +// } +// } diff --git a/lib/src/features/visits/presentations/widgets/LabResultsTab.dart b/lib/src/features/visits/presentations/widgets/LabResultsTab.dart index 5a85c651..c88ec8e9 100644 --- a/lib/src/features/visits/presentations/widgets/LabResultsTab.dart +++ b/lib/src/features/visits/presentations/widgets/LabResultsTab.dart @@ -1,55 +1,55 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/visits/data/models/lab_result.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class LabResultsTab extends StatelessWidget { - final List labResult; - const LabResultsTab({super.key, this.labResult=const[]}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Column( - children: [ - Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Text( - "Lab results", - style: theme.textTheme.headlineMedium, - ), - ), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: AppCard( - child: DataTable( - columns: [ - DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) - ], - rows: labResult - .map( - (e) => DataRow( - cells: [ - DataCell(Text(e.name)), - DataCell(Text(e.value)), - DataCell( - Text( - DateFormat("dd MMM yyy").format( - DateTime.parse(e.dateRecorded), - ), - ), - ), - ], - ), - ) - .toList(), - ), - ), - ), - ], - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:intl/intl.dart'; +// import 'package:nishauri/src/features/visits/data/models/lab_result.dart'; +// import 'package:nishauri/src/shared/display/AppCard.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// +// class LabResultsTab extends StatelessWidget { +// final List labResult; +// const LabResultsTab({super.key, this.labResult=const[]}); +// +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return Column( +// children: [ +// Padding( +// padding: const EdgeInsets.all(Constants.SPACING), +// child: Text( +// "Lab results", +// style: theme.textTheme.headlineMedium, +// ), +// ), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: AppCard( +// child: DataTable( +// columns: [ +// DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) +// ], +// rows: labResult +// .map( +// (e) => DataRow( +// cells: [ +// DataCell(Text(e.name)), +// DataCell(Text(e.value)), +// DataCell( +// Text( +// DateFormat("dd MMM yyy").format( +// DateTime.parse(e.dateRecorded), +// ), +// ), +// ), +// ], +// ), +// ) +// .toList(), +// ), +// ), +// ), +// ], +// ); +// } +// } diff --git a/lib/src/features/visits/presentations/widgets/VitalsTab.dart b/lib/src/features/visits/presentations/widgets/VitalsTab.dart index 4b56e424..5b353a34 100644 --- a/lib/src/features/visits/presentations/widgets/VitalsTab.dart +++ b/lib/src/features/visits/presentations/widgets/VitalsTab.dart @@ -1,59 +1,59 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:nishauri/src/features/visits/data/models/vital.dart'; -import 'package:nishauri/src/shared/display/AppCard.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class VitalsTab extends StatelessWidget { - final List vitals; - - const VitalsTab({super.key, this.vitals = const []}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return SingleChildScrollView( - child: Column( - children: [ - Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: Text( - "Vitals", - style: theme.textTheme.headlineMedium, - ), - ), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: AppCard( - variant: CardVariant.OUTLINED, - child: DataTable( - columns: [ - DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), - DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) - ], - rows: vitals - .map( - (e) => DataRow( - cells: [ - DataCell(Text(e.name)), - DataCell(Text(e.value)), - DataCell( - Text( - DateFormat("dd MMM yyy").format( - DateTime.parse(e.dateRecorded), - ), - ), - ), - ], - ), - ) - .toList(), - ), - ), - ), - ], - ), - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:intl/intl.dart'; +// import 'package:nishauri/src/features/visits/data/models/vital.dart'; +// import 'package:nishauri/src/shared/display/AppCard.dart'; +// import 'package:nishauri/src/utils/constants.dart'; +// +// class VitalsTab extends StatelessWidget { +// final List vitals; +// +// const VitalsTab({super.key, this.vitals = const []}); +// +// @override +// Widget build(BuildContext context) { +// final theme = Theme.of(context); +// return SingleChildScrollView( +// child: Column( +// children: [ +// Padding( +// padding: const EdgeInsets.all(Constants.SPACING), +// child: Text( +// "Vitals", +// style: theme.textTheme.headlineMedium, +// ), +// ), +// SingleChildScrollView( +// scrollDirection: Axis.horizontal, +// child: AppCard( +// variant: CardVariant.OUTLINED, +// child: DataTable( +// columns: [ +// DataColumn(label: Text("Name", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Value", style: theme.textTheme.titleMedium)), +// DataColumn(label: Text("Date Recorded", style: theme.textTheme.titleMedium)) +// ], +// rows: vitals +// .map( +// (e) => DataRow( +// cells: [ +// DataCell(Text(e.name)), +// DataCell(Text(e.value)), +// DataCell( +// Text( +// DateFormat("dd MMM yyy").format( +// DateTime.parse(e.dateRecorded), +// ), +// ), +// ), +// ], +// ), +// ) +// .toList(), +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } From 040744373f72508736e9bb7c757e591a623219f8 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Thu, 7 Nov 2024 15:25:35 +0300 Subject: [PATCH 124/140] :construction: Add date filter --- lib/src/app/navigation/app_router.dart | 3 +- .../clinic_card/data/models/health_test.dart | 85 +++++ .../presentation/pages/ClinicCardScreen.dart | 2 +- .../presentation/widgets/health.dart | 354 ++++++++++++++++++ .../presentation/widgets/health_record.dart | 71 ++-- 5 files changed, 463 insertions(+), 52 deletions(-) create mode 100644 lib/src/features/clinic_card/data/models/health_test.dart create mode 100644 lib/src/features/clinic_card/presentation/widgets/health.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 99ebda92..8f9e78aa 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -19,6 +19,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerificationScreen import 'package:nishauri/src/features/auth/presentation/pages/VerifiedResetPassword.dart'; import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswordScreen.dart'; import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; +import 'package:nishauri/src/features/clinic_card/presentation/widgets/health.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart'; import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; @@ -364,7 +365,7 @@ final List secureRoutes = [ name: RouteNames.HEALTH_RECORD, path: 'health-record', builder: (BuildContext context, GoRouterState state) { - return const HealthRecord(); + return HealthRecordTest(); }, ), ] diff --git a/lib/src/features/clinic_card/data/models/health_test.dart b/lib/src/features/clinic_card/data/models/health_test.dart new file mode 100644 index 00000000..8c428787 --- /dev/null +++ b/lib/src/features/clinic_card/data/models/health_test.dart @@ -0,0 +1,85 @@ +class HealthRecordModel { + final String uuid; + final String visitDate; + final String facility; + final List conditions; + // final List medications; + // final List allergies; + // final List vitals; + // final List labResults; + // final List procedures; + // final List immunizations; + + HealthRecordModel({ + required this.uuid, + required this.visitDate, + required this.facility, + required this.conditions, + // required this.medications, + // required this.allergies, + // required this.vitals, + // required this.labResults, + // required this.procedures, + // required this.immunizations, + }); + + factory HealthRecordModel.fromJson(Map json) { + return HealthRecordModel( + uuid: json['uuid'], + visitDate: json['visitDate'], + facility: json['facility'], + conditions: (json['conditions'] as List) + .map((condition) => Condition.fromJson(condition)) + .toList(), + // medications: (json['medications'] as List) + // .map((medication) => Medication.fromJson(medication)) + // .toList(), + // allergies: (json['allergies'] as List) + // .map((allergy) => Allergy.fromJson(allergy)) + // .toList(), + // vitals: (json['vitals'] as List) + // .map((vital) => Vital.fromJson(vital)) + // .toList(), + // labResults: (json['labResults'] as List) + // .map((labResult) => LabResult.fromJson(labResult)) + // .toList(), + // procedures: (json['procedures'] as List) + // .map((procedure) => Procedure.fromJson(procedure)) + // .toList(), + // immunizations: (json['immunization'] as List) + // .map((immunization) => Immunization.fromJson(immunization)) + // .toList(), + ); + } +} + +class Condition { + final String uuid; + final String name; + final String onsetDate; + final String dateRecorded; + final String status; + final String value; + + Condition({ + required this.uuid, + required this.name, + required this.onsetDate, + required this.dateRecorded, + required this.status, + required this.value, + }); + + factory Condition.fromJson(Map json) { + return Condition( + uuid: json['uuid'], + name: json['name'], + onsetDate: json['onsetDate'], + dateRecorded: json['dateRecorded'], + status: json['status'], + value: json['value'], + ); + } +} + +// Define similar models for Medication, Allergy, Vital, LabResult, Procedure, and Immunization. diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 885142af..55f4692b 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -70,7 +70,7 @@ class ClinicCardScreen extends HookConsumerWidget { ]; final List icons = [ - "assets/images/boldDuotoneFoldersFolderPathConnect.svg", + // "assets/images/boldDuotoneFoldersFolderPathConnect.svg", "assets/images/boldDuotoneMedicineVirus.svg", "assets/images/boldDuotoneMedicineStethoscope.svg", "assets/images/boldDuotoneMedicineSyringe.svg", diff --git a/lib/src/features/clinic_card/presentation/widgets/health.dart b/lib/src/features/clinic_card/presentation/widgets/health.dart new file mode 100644 index 00000000..bb199983 --- /dev/null +++ b/lib/src/features/clinic_card/presentation/widgets/health.dart @@ -0,0 +1,354 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class HealthRecordTest extends StatefulWidget { + const HealthRecordTest({Key? key}) : super(key: key); + + @override + _HealthRecordTestState createState() => _HealthRecordTestState(); +} + +class _HealthRecordTestState extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + // Load health records from a JSON file + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString('assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + // Apply the selected filter to the health records + Future> _applyFilter(List records) async { + if (selectedFilter == null || selectedFilter == DateFilter.all) { + return records; // Return all records if no filter or 'All Data' is selected + } + + DateTime now = DateTime.now(); + List filteredRecords = []; + + switch (selectedFilter) { + case DateFilter.today: + filteredRecords = records.where((record) { + return DateTime.parse(record.visitDate).isAtSameMomentAs(now); + }).toList(); + break; + case DateFilter.currentWeek: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAfter(now.subtract(Duration(days: now.weekday - 1))) && + visitDate.isBefore(now.add(Duration(days: 7 - now.weekday))); + }).toList(); + break; + case DateFilter.currentMonth: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.month == now.month && visitDate.year == now.year; + }).toList(); + break; + case DateFilter.dateRange: + if (selectedDateRange != null) { + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAfter(selectedDateRange!.start) && + visitDate.isBefore(selectedDateRange!.end); + }).toList(); + } + break; + default: + filteredRecords = records; + break; + } + + return filteredRecords; + } + + // Function to handle date range selection + Future _selectDateRange(BuildContext context) async { + final DateTime now = DateTime.now(); + DateTimeRange? picked = await showDateRangePicker( + context: context, + firstDate: DateTime(now.year - 5), + lastDate: DateTime(now.year + 1), + initialDateRange: selectedDateRange, + saveText: 'Done', + barrierColor: Constants.bmiCalculatorColor, + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.light().copyWith( + primaryColor: Constants.bmiCalculatorColor, + // accentColor: Constants.programsColor, + colorScheme: ColorScheme.light(primary: Constants.bmiCalculatorColor), + buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), + ), + child: child!, + ); + }, + ); + + if (picked != null && picked != selectedDateRange) { + setState(() { + selectedDateRange = picked; + selectedFilter = DateFilter.dateRange; // Automatically switch to 'dateRange' filter + }); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: 120, + smallTitle: "Conditions", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text('Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center(child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildConditionList(record.conditions, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Text(date, style: theme.textTheme.titleMedium), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Text(hospital, style: theme.textTheme.titleLarge), + ], + ); + } + + Widget _buildConditionList(List conditions, ThemeData theme) { + if (conditions.isEmpty) { + return const Center( + child:Text('No conditions recorded.') + ); + } + + return Column( + children: conditions.map((condition) => _buildConditionRow(condition, theme)).toList(), + ); + } + + Widget _buildConditionRow(Condition condition, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildConditionsRow(condition, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Recorded", style: theme.textTheme.bodySmall), + Text(condition.dateRecorded, style: theme.textTheme.bodySmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildConditionsRow(Condition condition, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineStethoscope.svg", + width: 20, + height: 20, + ), + const SizedBox(width: Constants.SPACING), + Text(condition.name, style: theme.textTheme.titleMedium), + const Spacer(), + Text(condition.status, style: theme.textTheme.bodyMedium?.copyWith(color: getStatusColor(condition.status))), + ], + ); + } + + Color getStatusColor(String status) { + if (status == 'ACTIVE') { + return Constants.programsColor; + } else if (status == 'INACTIVE') { + return Constants.facilityDirectoryColor; + } else { + return Constants.selfScreeningBgColor; + } + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + // if (selectedDateRange != null) + // Padding( + // padding: const EdgeInsets.only(left: Constants.SPACING), + // child: Text( + // 'From ${selectedDateRange!.start.toLocal()} - ${selectedDateRange!.end.toLocal()}', + // style: theme.textTheme.bodyMedium, + // ), + // ), + ], + ); + } +} + +class HealthButton extends StatefulWidget { + final Function(DateFilter) onFilterSelected; + + const HealthButton({Key? key, required this.onFilterSelected}) : super(key: key); + + @override + _HealthButtonState createState() => _HealthButtonState(); +} + +class _HealthButtonState extends State { + DateFilter? selectedMenu; + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width * 0.1, + child: MenuAnchor( + builder: (BuildContext context, MenuController controller, Widget? child) { + return IconButton( + onPressed: () { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + icon: SvgPicture.asset( + "assets/images/clinic_menu.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 40, + width: 40, + ), + tooltip: 'Show menu', + ); + }, + menuChildren: List.generate( + DateFilter.values.length, + (int index) => MenuItemButton( + onPressed: () { + widget.onFilterSelected(DateFilter.values[index]); + }, + child: Text(DateFilter.values[index].toString().split('.').last), + ), + ), + ), + ); + } +} + +enum DateFilter { all, today, currentWeek, currentMonth, dateRange } diff --git a/lib/src/features/clinic_card/presentation/widgets/health_record.dart b/lib/src/features/clinic_card/presentation/widgets/health_record.dart index 5baf260d..a38904d7 100644 --- a/lib/src/features/clinic_card/presentation/widgets/health_record.dart +++ b/lib/src/features/clinic_card/presentation/widgets/health_record.dart @@ -26,13 +26,20 @@ class HealthRecord extends StatelessWidget { padding: const EdgeInsets.all(Constants.SPACING), child: Column( children: [ - const SizedBox(height: Constants.SPACING), + _buildFilterMenu(theme), _buildDateRow("16 October 2024", theme), const SizedBox(height: Constants.SPACING), _buildHospitalRow("KENYATTA NATIONAL HOSPITAL", theme), const SizedBox(height: Constants.SPACING), const Divider(), _buildListView(theme), + const Divider(), + const SizedBox(height: Constants.SPACING), + _buildDateRow("25 October 2024", theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow("KENYATTA NATIONAL HOSPITAL", theme), + const SizedBox(height: Constants.SPACING), + _buildListView(theme), ], ), ), @@ -42,30 +49,15 @@ class HealthRecord extends StatelessWidget { ); } - // Widget _buildButtonRow() { - // return Container( - // width: double.infinity, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(12), - // color: Constants.bgColor, - // boxShadow: [ - // BoxShadow( - // color: Colors.grey.withOpacity(0.3), - // spreadRadius: 2, - // blurRadius: 5, - // offset: const Offset(0, 3), - // ), - // ], - // ), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.spaceEvenly, - // children: [ - // HealthButton(title: "Last Update", color: Constants.bgColor), - // HealthButton(title: "A - Z", color: Constants.bgColor), - // ], - // ), - // ); - // } + Widget _buildFilterMenu(ThemeData theme) { + return const Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton(), + ], + ); + } Widget _buildDateRow(String date, ThemeData theme) { return Row( @@ -73,7 +65,6 @@ class HealthRecord extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(date, style: theme.textTheme.titleMedium), - HealthButton(), ], ); } @@ -147,7 +138,7 @@ class HealthRecord extends StatelessWidget { return Row( children: [ SvgPicture.asset( - "assets/images/boldDuotoneFoldersFolderPathConnect.svg", + "assets/images/boldDuotoneMedicineVirus.svg", width: 20, height: 20, ), @@ -162,14 +153,6 @@ class HealthRecord extends StatelessWidget { ], ); } - - // Widget _buildSeverityRow(ThemeData theme) { - // return Row( - // children: [ - // Text("Mild", style: theme.textTheme.bodyMedium), - // ], - // ); - // } } class HealthButton extends StatefulWidget { @@ -186,18 +169,7 @@ class _HealthButtonState extends State { @override Widget build(BuildContext context) { return Container( - width: MediaQuery.of(context).size.width * 0.2, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.3), - spreadRadius: 2, - blurRadius: 5, - offset: const Offset(0, 3), - ), - ], - ), + width: MediaQuery.of(context).size.width * 0.1, child: MenuAnchor( builder: (BuildContext context, MenuController controller, Widget? child) { return IconButton( @@ -213,10 +185,9 @@ class _HealthButtonState extends State { "assets/images/clinic_menu.svg", semanticsLabel: "Doctors", fit: BoxFit.contain, - height: 30, - width: 30, + height: 40, + width: 40, ), - // icon: const Icon(Icons.more_horiz), tooltip: 'Show menu', ); }, From 3534595d0b539bdbffda55e2bd22120a905bda1b Mon Sep 17 00:00:00 2001 From: Ogollah Date: Mon, 11 Nov 2024 22:25:13 +0300 Subject: [PATCH 125/140] :construction: (feat) add dependant --- assets/images/group_clinic_card.svg | 3 + lib/src/app/navigation/app_router.dart | 8 + .../presentation/pages/ClinicCardScreen.dart | 4 +- .../presentation/pages/dependant_profile.dart | 201 ++++++++++++++++++ .../presentation/widgets/health_list.dart | 1 + lib/src/shared/display/profile_app_bar.dart | 135 ++++++++++++ lib/src/utils/routes.dart | 1 + 7 files changed, 351 insertions(+), 2 deletions(-) create mode 100644 assets/images/group_clinic_card.svg create mode 100644 lib/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart create mode 100644 lib/src/shared/display/profile_app_bar.dart diff --git a/assets/images/group_clinic_card.svg b/assets/images/group_clinic_card.svg new file mode 100644 index 00000000..f0499eb0 --- /dev/null +++ b/assets/images/group_clinic_card.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 8f9e78aa..8d253867 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -21,6 +21,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswor import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; +import 'package:nishauri/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart'; import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart'; @@ -368,6 +369,13 @@ final List secureRoutes = [ return HealthRecordTest(); }, ), + GoRoute( + name: RouteNames.DEPENDANT_PROFILE, + path: 'dependant-profile', + builder: (BuildContext context, GoRouterState state) { + return DependantProfileScreen(); + }, + ), ] ), GoRoute( diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 55f4692b..349733cf 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -128,10 +128,10 @@ class ClinicCardScreen extends HookConsumerWidget { ItemList(items: items, path: paths, svgAsset: icons), const SizedBox(height: 10), Row( - children: [Text("Programs", style: theme.textTheme.titleMedium), + children: [Text("Shared With Me", style: theme.textTheme.titleMedium), ] ), - ItemList(items: items, path: paths), + const ItemList(items: ["Eric Muthomi"], svgAsset: ["assets/images/clinicCardCard.svg"],path: [RouteNames.DEPENDANT_PROFILE], backgroundColor: Constants.selfScreeningBgColor,), ], ), ), diff --git a/lib/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart b/lib/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart new file mode 100644 index 00000000..7e44760e --- /dev/null +++ b/lib/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart @@ -0,0 +1,201 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/clinic_card/data/providers/programProvider.dart'; +import 'package:nishauri/src/features/self_screening/presentation/widgets/health_list.dart'; +import 'package:nishauri/src/features/user_programs/data/providers/program_provider.dart'; +import 'package:nishauri/src/features/visits/data/providers/visits_provider.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/background_image_widget.dart'; +import 'package:nishauri/src/shared/display/profile_app_bar.dart'; +import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; + +class DependantProfileScreen extends HookConsumerWidget { + const DependantProfileScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final programAsync = ref.watch(programProvider); + final userPrograms = ref.watch(userProgramProvider); + final visitAsync = ref.watch(visitProvider); + + final visits = visitAsync.when( + data: (data) { + return data; // This is a List + }, + error: (error, _) { + print("Error occurred: $error"); + return []; + }, + loading: () { + return []; + }, + ); + +// Check if visits is not empty before accessing properties + if (visits.isNotEmpty) { + // Print labResults for each visit + for (var visit in visits) { + print(visit.labResults); + } + + // Alternatively, if you only want the labResults from the first visit: + print(visits.first.labResults); + } else { + print("No visit data available."); + } + + + final Map svgMapping = { + "allergies": "assets/images/boldDuotoneMedicineVirus.svg", + "conditions": "assets/images/boldDuotoneMedicineStethoscope.svg", + "immunization": "assets/images/boldDuotoneMedicineSyringe.svg", + "labResults": "assets/images/boldDuotoneMedicineTestTube.svg", + "medications": "assets/images/boldDuotoneMedicineJarOfPills2.svg", + "procedures": "assets/images/boldDuotoneMedicineBone.svg", + "vitals": "assets/images/boldDuotoneMedicineHeartPulse2.svg" + }; + + final List items = [ + "Allergies", + "Conditions", + "Immunizations", + "Lab Results", + "Medications", + "Procedures", + "Vitals" + ]; + + final List icons = [ + "assets/images/boldDuotoneMedicineVirus.svg", + "assets/images/boldDuotoneMedicineStethoscope.svg", + "assets/images/boldDuotoneMedicineSyringe.svg", + "assets/images/boldDuotoneMedicineTestTube.svg", + "assets/images/boldDuotoneMedicineJarOfPills2.svg", + "assets/images/boldDuotoneMedicineBone.svg", + "assets/images/boldDuotoneMedicineHeartPulse2.svg" + ]; + + final List paths = [ + RouteNames.HEALTH_RECORD, + ]; + + void _reloadData() { + ref.refresh(programProvider); + ref.refresh(userProgramProvider); + } + + return programAsync.when( + data: (data) { + final activePrograms = data.where((program) { + return userPrograms.hasValue && userPrograms.value!.any( + (userProgram) => userProgram.program_name == program.name && userProgram.isActive + ); + }); + + if (activePrograms.isEmpty) { + return _buildEmptyState(context, _reloadData); + } + + return Scaffold( + body: Column( + children: [ + const ProfileAppBar( + title: "👨🏾‍ Eric Muthomi", + color: Constants.clinicCardBgColor, + subTitle: "Relationship: Child", + age: "Age: 8 Years", + address: "Address: Ole Dume Road", + svgPathGroup: "assets/images/group_clinic_card.svg", + ), + Expanded( + child: SingleChildScrollView( + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + children: [Text("Health Records", style: theme.textTheme.titleMedium), + ] + ), + const SizedBox(height: 10), + ItemList(items: items, path: paths, svgAsset: icons), + const SizedBox(height: 10), + ], + ), + ), + ], + ) + ), + ), + ], + ), + floatingActionButton: FloatingActionButton( + onPressed: _reloadData, + child: const Icon(Icons.refresh), + tooltip: 'Refresh Data', + ), + ); + }, + error: (error, _) => _buildErrorState(context, error.toString(), _reloadData), + loading: () => _buildLoadingState(context, theme), + ); + } + + Widget _buildEmptyState(BuildContext context, VoidCallback reload) { + return BackgroundImageWidget( + customAppBar: const CustomAppBar( + title: "My Clinic Card 👨🏾‍💼", + color: Constants.clinicCardBgColor, + subTitle: "Access all your medical details", + ), + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: "No programs available", + floatingButtonIcon1: Icons.refresh, + floatingButtonAction1: reload, + ); + } + + Widget _buildErrorState(BuildContext context, String error, VoidCallback reload) { + return BackgroundImageWidget( + customAppBar: const CustomAppBar( + title: "My Clinic Card 👨🏾‍💼", + color: Constants.clinicCardBgColor, + subTitle: "Access all your medical details", + ), + svgImage: 'assets/images/lab-empty-state.svg', + notFoundText: error, + floatingButtonIcon1: Icons.refresh, + floatingButtonAction1: reload, + ); + } + + Widget _buildLoadingState(BuildContext context, ThemeData theme) { + return Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const CustomAppBar( + title: "My Clinic Card 👨🏾‍💼", + color: Constants.clinicCardBgColor, + subTitle: "Access all your medical details", + ), + Text( + "Loading Programs", + style: theme.textTheme.headline6, + ), + const SizedBox(height: Constants.SPACING * 2), + const CircularProgressIndicator(), + ], + ), + ); + } +} diff --git a/lib/src/features/self_screening/presentation/widgets/health_list.dart b/lib/src/features/self_screening/presentation/widgets/health_list.dart index 8021c253..970ea9fd 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_list.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_list.dart @@ -37,6 +37,7 @@ class ItemList extends StatelessWidget { svgAsset![index], width: 20, height: 20, + color: backgroundColor, ) : null, title: Text(items[index]), diff --git a/lib/src/shared/display/profile_app_bar.dart b/lib/src/shared/display/profile_app_bar.dart new file mode 100644 index 00000000..a4dbc5ed --- /dev/null +++ b/lib/src/shared/display/profile_app_bar.dart @@ -0,0 +1,135 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class ProfileAppBar extends StatelessWidget { + final String? title; + final String? subTitle; + final IconData? icon; + final String? age; + final String? address; + final Color? color; + final Widget? bottom; + final double? height; + final String? smallTitle; + final String? rightBtTitle; + final String? path; + final String? svgPath; + final String? svgPathGroup; + + const ProfileAppBar({ + super.key, + this.title, + this.subTitle, + this.icon, + this.bottom, + this.color, + this.height, + this.smallTitle, + this.rightBtTitle, + this.path, + this.age, + this.address, + this.svgPath, + this.svgPathGroup, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Container( + height: height, + width: double.infinity, // Use double.infinity for responsive width + padding: const EdgeInsets.symmetric( + horizontal: Constants.SPACING, + vertical: Constants.SPACING * 3, + ), + decoration: BoxDecoration( + color: color ?? theme.colorScheme.primary, + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(Constants.SPACING), + bottomRight: Radius.circular(Constants.SPACING), + ), + ), + child: Stack( + children: [ + // SVG Image positioned at the top-right corner + Positioned( + top: 0, + right: 0, + child: SvgPicture.asset( + svgPathGroup ?? '', + semanticsLabel: "Background SVG", + fit: BoxFit.contain, + width: 180, + height: 180, + ), + ), + // Main content + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: Constants.SPACING), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + child: SvgPicture.asset( + "assets/images/reply.svg", + semanticsLabel: "Back", + fit: BoxFit.contain, + width: 25, + height: 25, + ), + onTap: () => context.pop(), + ), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: Constants.SPACING), + SvgPicture.asset( + svgPath ?? '', + semanticsLabel: "Profile", + fit: BoxFit.contain, + width: 25, + height: 25, + ), + const SizedBox(width: 4), + Text( + title ?? '', + style: theme.textTheme.headlineMedium?.copyWith(color: Colors.white), + ), + const SizedBox(width: Constants.SPACING), + if (icon != null) + Icon( + icon, + color: theme.canvasColor, + ), + ], + ), + const SizedBox(height: Constants.SPACING * 2), + Text( + subTitle!, + style: theme.textTheme.titleLarge?.copyWith(color: Colors.white), + ), + const SizedBox(height: Constants.SPACING * 2), + Text( + age!, + style: theme.textTheme.titleLarge?.copyWith(color: Colors.white), + ), + const SizedBox(height: Constants.SPACING * 2), + Text( + address!, + style: theme.textTheme.titleLarge?.copyWith(color: Colors.white), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 3a8888ae..f4a5e8e9 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -48,6 +48,7 @@ class RouteNames { static const HEALTH_RECORD = "health-record"; static const CHAT_BOT = "chat-bot"; static const SETTINGS = "settings"; + static const DEPENDANT_PROFILE = "dependant-profile"; static const Facility_Directory = "facility-directory"; static const PROGRAM_MENU = "program-menu"; From 556216fd251de9e669d7426f3f8a28b53db447c1 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 12 Nov 2024 09:48:44 +0300 Subject: [PATCH 126/140] dependant --- .../presentation/pages/ClinicCardScreen.dart | 2 +- .../presentation/widgets/health_list.dart | 33 +++++++++++++++++-- lib/src/utils/constants.dart | 1 + 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 349733cf..9e98dbdf 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -131,7 +131,7 @@ class ClinicCardScreen extends HookConsumerWidget { children: [Text("Shared With Me", style: theme.textTheme.titleMedium), ] ), - const ItemList(items: ["Eric Muthomi"], svgAsset: ["assets/images/clinicCardCard.svg"],path: [RouteNames.DEPENDANT_PROFILE], backgroundColor: Constants.selfScreeningBgColor,), + const ItemList(items: ["Eric Muthomi"], svgAsset: ["assets/images/clinicCardCard.svg"],path: [RouteNames.DEPENDANT_PROFILE], color: Constants.clinicCardBgColor, relationship: ["Next of Kin"],), ], ), ), diff --git a/lib/src/features/self_screening/presentation/widgets/health_list.dart b/lib/src/features/self_screening/presentation/widgets/health_list.dart index 970ea9fd..9f5553ff 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_list.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_list.dart @@ -6,14 +6,18 @@ import 'package:nishauri/src/utils/constants.dart'; class ItemList extends StatelessWidget { final List items; final Color backgroundColor; + final Color? color; final List path; final List? svgAsset; + final List? relationship; const ItemList({ Key? key, required this.items, required this.path, this.svgAsset, this.backgroundColor = Constants.bgColor, + this.color, + this.relationship }) : super(key: key); @override @@ -37,11 +41,34 @@ class ItemList extends StatelessWidget { svgAsset![index], width: 20, height: 20, - color: backgroundColor, + color: color, ) : null, - title: Text(items[index]), - onTap: () { + title: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(right: Constants.SPACING), + child: Text(items[index]), + ), + if (relationship != null) + Padding( + padding: const EdgeInsets.only(left: Constants.SPACING), + child: Card( + color: Constants.clinicCardKinColor, + child: Padding( + padding: const EdgeInsets.all(Constants.SMALL_SPACING), + child: Text( + relationship![index], + style: const TextStyle(color: Constants.programsColor), + ), + ), + ), + ), + ], + ), + onTap: () { context.goNamed(path[index]); }, trailing: const Icon(Icons.chevron_right), diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index 271c8403..ac6d76aa 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -51,4 +51,5 @@ class Constants { static const barColor = Color.fromARGB(255, 4, 191, 218); static const white = Color.fromARGB(255, 255, 255, 255); static const clinicCardBgColor = Color.fromARGB(255, 0, 122, 141); + static const clinicCardKinColor = Color.fromARGB(255, 167, 240, 186); } From f28a7bec82b9f2c246a418cecf3349e7157d7fb5 Mon Sep 17 00:00:00 2001 From: vicky-ogutu Date: Tue, 12 Nov 2024 10:33:20 +0300 Subject: [PATCH 127/140] font-size --- .../presentation/widgets/health.dart | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/src/features/clinic_card/presentation/widgets/health.dart b/lib/src/features/clinic_card/presentation/widgets/health.dart index bb199983..448ecb8b 100644 --- a/lib/src/features/clinic_card/presentation/widgets/health.dart +++ b/lib/src/features/clinic_card/presentation/widgets/health.dart @@ -187,7 +187,11 @@ class _HealthRecordTestState extends State { Widget _buildDateRow(String date, ThemeData theme) { return Row( children: [ - Text(date, style: theme.textTheme.titleMedium), + Expanded( + child: Text( + date, + style: theme.textTheme.titleMedium), + ), ], ); } @@ -195,7 +199,13 @@ class _HealthRecordTestState extends State { Widget _buildHospitalRow(String hospital, ThemeData theme) { return Row( children: [ - Text(hospital, style: theme.textTheme.titleLarge), + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleLarge, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), ], ); } @@ -254,9 +264,14 @@ class _HealthRecordTestState extends State { height: 20, ), const SizedBox(width: Constants.SPACING), - Text(condition.name, style: theme.textTheme.titleMedium), + Expanded( + child:Text(condition.name, + style: theme.textTheme.titleMedium?.copyWith(fontSize: 8), // Reduce font size + overflow: TextOverflow.ellipsis, // Truncate if too long + maxLines: 1, + ),), const Spacer(), - Text(condition.status, style: theme.textTheme.bodyMedium?.copyWith(color: getStatusColor(condition.status))), + Text(condition.status, style: theme.textTheme.bodyMedium?.copyWith(fontSize: 6, color: getStatusColor(condition.status))), ], ); } From 74041ca5646322713769994534f7ad5a6a123399 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 12 Nov 2024 13:17:05 +0300 Subject: [PATCH 128/140] (fix) fix nav bar widget --- .../presentation/pages/ClinicCardScreen.dart | 4 + .../pages/BMICalculatorResultsScreen.dart | 1 + .../pages/BMICalculatorScreen.dart | 1 + .../pages/self_screening_menu.dart | 3 +- lib/src/shared/display/CustomAppBar.dart | 157 ++++++++++-------- 5 files changed, 95 insertions(+), 71 deletions(-) diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 9e98dbdf..3a5d4e03 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -108,6 +108,7 @@ class ClinicCardScreen extends HookConsumerWidget { title: "My Clinic Card 👨🏾‍💼", color: Constants.clinicCardBgColor, subTitle: "Access all your medical details", + svgPathGroup: "assets/images/group_clinic_card.svg", ), Expanded( child: SingleChildScrollView( @@ -159,6 +160,7 @@ class ClinicCardScreen extends HookConsumerWidget { title: "My Clinic Card 👨🏾‍💼", color: Constants.clinicCardBgColor, subTitle: "Access all your medical details", + svgPathGroup: "assets/images/group_clinic_card.svg", ), svgImage: 'assets/images/lab-empty-state.svg', notFoundText: "No programs available", @@ -173,6 +175,7 @@ class ClinicCardScreen extends HookConsumerWidget { title: "My Clinic Card 👨🏾‍💼", color: Constants.clinicCardBgColor, subTitle: "Access all your medical details", + svgPathGroup: "assets/images/group_clinic_card.svg", ), svgImage: 'assets/images/lab-empty-state.svg', notFoundText: error, @@ -190,6 +193,7 @@ class ClinicCardScreen extends HookConsumerWidget { title: "My Clinic Card 👨🏾‍💼", color: Constants.clinicCardBgColor, subTitle: "Access all your medical details", + svgPathGroup: "assets/images/group_clinic_card.svg", ), Text( "Loading Programs", diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart index adfef04d..fa061502 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart @@ -69,6 +69,7 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { title: "BMI Calculator ⚖️", color: Constants.selfScreeningBgColor, subTitle: "Empower Your Health Journey with BMI Insights", + svgPathGroup: "assets/images/group_clinic_card.svg", ), Expanded( child: SingleChildScrollView( diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart index 1370b91a..0902ce3d 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart @@ -73,6 +73,7 @@ class BMICalculatorScreen extends HookConsumerWidget { title: "BMI Calculator ⚖️", subTitle: "Empower Your Health Journey \nWith BMI Insights", color: Constants.selfScreeningBgColor, + svgPathGroup: "assets/images/group_clinic_card.svg", ), Expanded( child: SingleChildScrollView( diff --git a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart index bfeda6d6..d9760d6d 100644 --- a/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart +++ b/lib/src/features/self_screening/presentation/pages/self_screening_menu.dart @@ -92,8 +92,9 @@ class _SelfScreeningState extends ConsumerState { children: [ const CustomAppBar( title: "Self Screening", - subTitle: "Easily track your health. Stay informed and take control of well-being.", + subTitle: "Easily track your health. Stay informed \nand take control of well-being.", color: Constants.selfScreeningBgColor, + svgPathGroup: "assets/images/group_clinic_card.svg", ), Expanded( child: SingleChildScrollView( diff --git a/lib/src/shared/display/CustomAppBar.dart b/lib/src/shared/display/CustomAppBar.dart index e7d5a3cf..f8a227bf 100644 --- a/lib/src/shared/display/CustomAppBar.dart +++ b/lib/src/shared/display/CustomAppBar.dart @@ -16,6 +16,7 @@ class CustomAppBar extends StatelessWidget { final String? smallTitle; final String? rightBtTitle; final String? path; + final String? svgPathGroup; const CustomAppBar({ super.key, @@ -27,7 +28,8 @@ class CustomAppBar extends StatelessWidget { this.height, this.smallTitle, this.rightBtTitle, - this.path + this.path, + this.svgPathGroup, }); @override @@ -47,81 +49,96 @@ class CustomAppBar extends StatelessWidget { bottomLeft: Radius.circular(Constants.SPACING), bottomRight: Radius.circular(Constants.SPACING), ), - image: const DecorationImage( - image: AssetImage("assets/images/contours.png"), - opacity: 0.1, - fit: BoxFit.cover, - ), + // image: const DecorationImage( + // image: AssetImage("assets/images/contours.png"), + // opacity: 0.1, + // fit: BoxFit.cover, + // ), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: Stack( children: [ - const SizedBox(height: Constants.SPACING), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - InkWell( - child: SvgPicture.asset( - "assets/images/reply.svg", - semanticsLabel: "Back", - fit: BoxFit.contain, - width: 25, - height: 25, + Positioned( + top: 0, + right: 0, + child: SvgPicture.asset( + svgPathGroup ?? '', + semanticsLabel: "Background SVG", + fit: BoxFit.contain, + width: 110, + height: 110, + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: Constants.SPACING), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + child: SvgPicture.asset( + "assets/images/reply.svg", + semanticsLabel: "Back", + fit: BoxFit.contain, + width: 25, + height: 25, + ), + onTap: () => context.pop(), ), - onTap: () => context.pop(), + if (smallTitle != null) + Text( + smallTitle ?? '', + style: theme.textTheme.titleMedium?.copyWith(color: Colors.white), + ), + if (rightBtTitle != null) + TextButton( + onPressed: (){ + context.goNamed(path??''); + }, + child: Text(rightBtTitle??'', style: theme.textTheme.titleSmall!.copyWith(color: Constants.bgColor),) + // Container( + // height: 10, + // width: 150, + // child: Button( + // backgroundColor: color, + // textColor: Constants.bgColor, + // title: rightBtTitle ?? '', + // onPress: () { + // // Add your onPress logic here + // }, + // ), + ) + ], + ), + if (title != null) + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: Constants.SPACING), + Text( + title ?? '', + style: theme.textTheme.headlineMedium?.copyWith(color: Colors.white), + ), + const SizedBox(width: Constants.SPACING), + if (icon != null) + Icon( + icon, + color: theme.canvasColor, + ), + ], ), - if (smallTitle != null) - Text( - smallTitle ?? '', - style: theme.textTheme.titleMedium?.copyWith(color: Colors.white), - ), - if (rightBtTitle != null) - TextButton( - onPressed: (){ - context.goNamed(path??''); - }, - child: Text(rightBtTitle??'', style: theme.textTheme.titleSmall!.copyWith(color: Constants.bgColor),) - // Container( - // height: 10, - // width: 150, - // child: Button( - // backgroundColor: color, - // textColor: Constants.bgColor, - // title: rightBtTitle ?? '', - // onPress: () { - // // Add your onPress logic here - // }, - // ), - ) - ], - ), - if (title != null) - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const SizedBox(height: Constants.SPACING), + if (subTitle != null) + const SizedBox(height: Constants.SPACING * 2), + if (subTitle != null) Text( - title ?? '', - style: theme.textTheme.headlineMedium?.copyWith(color: Colors.white), + subTitle!, + style: theme.textTheme.titleLarge?.copyWith(color: Colors.white), ), - const SizedBox(width: Constants.SPACING), - if (icon != null) - Icon( - icon, - color: theme.canvasColor, - ), - ], - ), - if (subTitle != null) - const SizedBox(height: Constants.SPACING * 2), - if (subTitle != null) - Text( - subTitle!, - style: theme.textTheme.titleLarge?.copyWith(color: Colors.white), - ), - // if (bottom != null) - // const SizedBox(height: Constants.SPACING * 2), - // bottom!, + // if (bottom != null) + // const SizedBox(height: Constants.SPACING * 2), + // bottom!, + ], + ), ], ), ); From 93e0ae28981f4599f5accf236a69c0842f2d04f7 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 12 Nov 2024 15:59:55 +0300 Subject: [PATCH 129/140] (feat) Add vitals records screen --- lib/src/app/navigation/app_router.dart | 43 ++- .../clinic_card/data/models/health_test.dart | 51 ++- .../presentation/pages/ClinicCardScreen.dart | 6 + .../presentation/widgets/vital_records.dart | 322 ++++++++++++++++++ .../shared/display/heath_filter_button.dart | 54 +++ .../shared/helper/health_record_filter.dart | 53 +++ lib/src/utils/routes.dart | 1 + 7 files changed, 509 insertions(+), 21 deletions(-) create mode 100644 lib/src/features/clinic_card/presentation/widgets/vital_records.dart create mode 100644 lib/src/shared/display/heath_filter_button.dart create mode 100644 lib/src/shared/helper/health_record_filter.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 8d253867..99412137 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -21,6 +21,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswor import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; +import 'package:nishauri/src/features/clinic_card/presentation/widgets/vital_records.dart'; import 'package:nishauri/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart'; import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; @@ -361,22 +362,7 @@ final List secureRoutes = [ builder: (BuildContext context, GoRouterState state) { return const ClinicCardScreen(); }, - routes: [ - GoRoute( - name: RouteNames.HEALTH_RECORD, - path: 'health-record', - builder: (BuildContext context, GoRouterState state) { - return HealthRecordTest(); - }, - ), - GoRoute( - name: RouteNames.DEPENDANT_PROFILE, - path: 'dependant-profile', - builder: (BuildContext context, GoRouterState state) { - return DependantProfileScreen(); - }, - ), - ] + routes: clinicCardRoutes, ), GoRoute( name: RouteNames.DAWA_DROP, @@ -858,3 +844,28 @@ final List programMenu = [ routes: hivProgramRoutes, ), ]; + +final List clinicCardRoutes = [ + GoRoute( + name: RouteNames.HEALTH_RECORD, + path: 'health-record', + builder: (BuildContext context, GoRouterState state) { + return HealthRecordTest(); + }, + ), + GoRoute( + name: RouteNames.DEPENDANT_PROFILE, + path: 'dependant-profile', + builder: (BuildContext context, GoRouterState state) { + return DependantProfileScreen(); + }, + ), + + GoRoute( + name: RouteNames.VITAL_HEALTH_RECORD, + path: 'vital-health-record', + builder: (BuildContext context, GoRouterState state) { + return VisitHealthRecord(); + }, + ), +]; diff --git a/lib/src/features/clinic_card/data/models/health_test.dart b/lib/src/features/clinic_card/data/models/health_test.dart index 8c428787..818c03a7 100644 --- a/lib/src/features/clinic_card/data/models/health_test.dart +++ b/lib/src/features/clinic_card/data/models/health_test.dart @@ -5,7 +5,7 @@ class HealthRecordModel { final List conditions; // final List medications; // final List allergies; - // final List vitals; + final List vitals; // final List labResults; // final List procedures; // final List immunizations; @@ -17,7 +17,7 @@ class HealthRecordModel { required this.conditions, // required this.medications, // required this.allergies, - // required this.vitals, + required this.vitals, // required this.labResults, // required this.procedures, // required this.immunizations, @@ -37,9 +37,9 @@ class HealthRecordModel { // allergies: (json['allergies'] as List) // .map((allergy) => Allergy.fromJson(allergy)) // .toList(), - // vitals: (json['vitals'] as List) - // .map((vital) => Vital.fromJson(vital)) - // .toList(), + vitals: (json['vitals'] as List) + .map((vital) => Vital.fromJson(vital)) + .toList(), // labResults: (json['labResults'] as List) // .map((labResult) => LabResult.fromJson(labResult)) // .toList(), @@ -82,4 +82,45 @@ class Condition { } } +class Vital { + final String uuid; + final String name; + final String weight; + final String temp; + final String systolic; + final String diastolic; + final String respiratory; + final String oxygenSaturation; + final String height; + final String complain; + + Vital({ + required this.uuid, + required this.name, + required this.weight, + required this.temp, + required this.systolic, + required this.diastolic, + required this.respiratory, + required this.oxygenSaturation, + required this.height, + required this.complain, + }); + + factory Vital.fromJson(Map json) { + return Vital( + uuid: json['uuid'], + name: json['name'], + weight: json['weight'], + temp: json['temp'], + systolic: json['systolic'], + diastolic: json['diastolic'], + respiratory: json['respiratory'], + oxygenSaturation: json['oxygenSaturation'], + height: json['height'], + complain: json['complain'], + ); + } +} + // Define similar models for Medication, Allergy, Vital, LabResult, Procedure, and Immunization. diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 3a5d4e03..6f2ba2c3 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -81,7 +81,13 @@ class ClinicCardScreen extends HookConsumerWidget { ]; final List paths = [ + "", RouteNames.HEALTH_RECORD, + "", + "", + "", + "", + RouteNames.VITAL_HEALTH_RECORD, ]; void _reloadData() { diff --git a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart new file mode 100644 index 00000000..f90fd085 --- /dev/null +++ b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart @@ -0,0 +1,322 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +import '../../../../shared/display/heath_filter_button.dart'; + +class VisitHealthRecord extends StatefulWidget { + const VisitHealthRecord({Key? key}) : super(key: key); + + @override + _VisitHealthRecord createState() => _VisitHealthRecord(); +} + +class _VisitHealthRecord extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString('assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + // Function to handle date range selection + Future _selectDateRange(BuildContext context) async { + final DateTime now = DateTime.now(); + DateTimeRange? picked = await showDateRangePicker( + context: context, + firstDate: DateTime(now.year - 5), + lastDate: DateTime(now.year + 1), + initialDateRange: selectedDateRange, + saveText: 'Done', + barrierColor: Constants.bmiCalculatorColor, + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.light().copyWith( + primaryColor: Constants.bmiCalculatorColor, + // accentColor: Constants.programsColor, + colorScheme: ColorScheme.light(primary: Constants.bmiCalculatorColor), + buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), + ), + child: child!, + ); + }, + ); + + if (picked != null && picked != selectedDateRange) { + setState(() { + selectedDateRange = picked; + selectedFilter = DateFilter.dateRange; // Automatically switch to 'dateRange' filter + }); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: 120, + smallTitle: "Vitals", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text('Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center(child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildConditionList(record.vitals, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleSmall), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildConditionList(List vitals, ThemeData theme) { + if (vitals.isEmpty) { + return const Center( + child:Text('No Vitals recorded.') + ); + } + + return Column( + children: vitals.map((vital) => _buildConditionRow(vital, theme)).toList(), + ); + } + + Widget _buildConditionRow(Vital vital, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildVitalsRow(vital, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Temperature", style: theme.textTheme.bodySmall), + Text(vital.temp, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Systolic B.P", style: theme.textTheme.bodySmall), + Text(vital.systolic, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Diastolic B.P", style: theme.textTheme.bodySmall), + Text(vital.diastolic, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Respiratory Rate", style: theme.textTheme.bodySmall), + Text(vital.respiratory, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Oxygen Saturation", style: theme.textTheme.bodySmall), + Text(vital.oxygenSaturation, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Weight", style: theme.textTheme.bodySmall), + Text(vital.weight, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Height", style: theme.textTheme.bodySmall), + Text(vital.height, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Presenting Complaints", style: theme.textTheme.bodySmall), + Text(vital.complain, style: theme.textTheme.bodySmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildVitalsRow(Vital vital, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineStethoscope.svg", + width: 20, + height: 20, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child:Text(vital.name, + style: theme.textTheme.titleSmall, + overflow: TextOverflow.ellipsis, // Truncate if too long + maxLines: 1, + ), + ), + ], + ); + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/src/shared/display/heath_filter_button.dart b/lib/src/shared/display/heath_filter_button.dart new file mode 100644 index 00000000..9a2fc8b4 --- /dev/null +++ b/lib/src/shared/display/heath_filter_button.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class HealthButton extends StatefulWidget { + final Function(DateFilter) onFilterSelected; + + const HealthButton({Key? key, required this.onFilterSelected}) : super(key: key); + + @override + _HealthButtonState createState() => _HealthButtonState(); +} + +class _HealthButtonState extends State { + DateFilter? selectedMenu; + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width * 0.1, + child: MenuAnchor( + builder: (BuildContext context, MenuController controller, Widget? child) { + return IconButton( + onPressed: () { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + icon: SvgPicture.asset( + "assets/images/clinic_menu.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 40, + width: 40, + ), + tooltip: 'Show menu', + ); + }, + menuChildren: List.generate( + DateFilter.values.length, + (int index) => MenuItemButton( + onPressed: () { + widget.onFilterSelected(DateFilter.values[index]); + }, + child: Text(DateFilter.values[index].toString().split('.').last), + ), + ), + ), + ); + } +} + +enum DateFilter { all, today, currentWeek, currentMonth, dateRange } diff --git a/lib/src/shared/helper/health_record_filter.dart b/lib/src/shared/helper/health_record_filter.dart new file mode 100644 index 00000000..18c72a40 --- /dev/null +++ b/lib/src/shared/helper/health_record_filter.dart @@ -0,0 +1,53 @@ + +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/heath_filter_button.dart'; + +DateFilter? selectedFilter; + +// Helper function for applying filters +List applyFilter( + List records, + DateFilter selectedFilter, + DateTime? selectedDateRangeStart, + DateTime? selectedDateRangeEnd) { + + DateTime now = DateTime.now(); + List filteredRecords = []; + + switch (selectedFilter) { + case DateFilter.today: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAtSameMomentAs(now); + }).toList(); + break; + case DateFilter.currentWeek: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAfter(now.subtract(Duration(days: now.weekday - 1))) && + visitDate.isBefore(now.add(Duration(days: 7 - now.weekday))); + }).toList(); + break; + case DateFilter.currentMonth: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.month == now.month && visitDate.year == now.year; + }).toList(); + break; + case DateFilter.dateRange: + if (selectedDateRangeStart != null && selectedDateRangeEnd != null) { + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAfter(selectedDateRangeStart) && + visitDate.isBefore(selectedDateRangeEnd); + }).toList(); + } + break; + case DateFilter.all: + default: + filteredRecords = records; + break; + } + + return filteredRecords; +} diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index f4a5e8e9..e4964f3a 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -49,6 +49,7 @@ class RouteNames { static const CHAT_BOT = "chat-bot"; static const SETTINGS = "settings"; static const DEPENDANT_PROFILE = "dependant-profile"; + static const VITAL_HEALTH_RECORD= "vital-health-record"; static const Facility_Directory = "facility-directory"; static const PROGRAM_MENU = "program-menu"; From cff5b81965b76f7018fc0d0987ba2b5e108d89b9 Mon Sep 17 00:00:00 2001 From: vicky-ogutu Date: Tue, 12 Nov 2024 21:52:17 +0300 Subject: [PATCH 130/140] Immunization --- assets/images/Calculator.svg | 12 +- assets/images/Calendar.svg | 13 +- assets/images/Pills.svg | 6 +- assets/images/Syringe.svg | 16 +- lib/src/app/navigation/app_router.dart | 312 +++++++------- .../clinic_card/data/models/health_test.dart | 39 +- .../presentation/pages/ClinicCardScreen.dart | 4 +- .../presentation/widgets/immunization.dart | 391 ++++++++++++++++++ lib/src/utils/routes.dart | 1 + 9 files changed, 606 insertions(+), 188 deletions(-) create mode 100644 lib/src/features/clinic_card/presentation/widgets/immunization.dart diff --git a/assets/images/Calculator.svg b/assets/images/Calculator.svg index 2f563a93..d7f523bf 100644 --- a/assets/images/Calculator.svg +++ b/assets/images/Calculator.svg @@ -1,10 +1,4 @@ - - - - - - - - - + + + diff --git a/assets/images/Calendar.svg b/assets/images/Calendar.svg index 6281ead0..6f88f68c 100644 --- a/assets/images/Calendar.svg +++ b/assets/images/Calendar.svg @@ -1,10 +1,5 @@ - - - - - - - - - + + + + diff --git a/assets/images/Pills.svg b/assets/images/Pills.svg index 0f94ebe8..8584e52b 100644 --- a/assets/images/Pills.svg +++ b/assets/images/Pills.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/assets/images/Syringe.svg b/assets/images/Syringe.svg index 64db1e08..8cc81f84 100644 --- a/assets/images/Syringe.svg +++ b/assets/images/Syringe.svg @@ -1,11 +1,7 @@ - - - - - - - - - - + + + + + + diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 99412137..c9793edc 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -92,6 +92,8 @@ import 'package:nishauri/src/features/visits/presentations/pages/FacilityVisitDe import 'package:nishauri/src/features/visits/presentations/pages/FacilityVisitsScreen.dart'; import 'package:nishauri/src/utils/routes.dart'; +import '../../features/clinic_card/presentation/widgets/immunization.dart'; + final routesProvider = Provider((ref) { final router = RouterNotifier(ref); return GoRouter( @@ -108,7 +110,7 @@ class RouterNotifier extends ChangeNotifier { RouterNotifier(this._ref) { _ref.listen>( authStateProvider, - (_, __) => notifyListeners(), + (_, __) => notifyListeners(), ); } @@ -153,66 +155,66 @@ class RouterNotifier extends ChangeNotifier { } List get routes => [ - GoRoute( - name: RouteNames.SPLASH_SCREEN, - path: '/splash', - builder: (BuildContext context, GoRouterState state) { - return const SplashScreen(); - }, - ), - GoRoute( - name: RouteNames.WELCOME_SCREEN, - path: '/auth', - builder: (BuildContext context, GoRouterState state) { - return const WelcomeScreen(); - }, - routes: openRoutes, - ), - GoRoute( - name: RouteNames.LANDING_SCREEN, - path: '/', - builder: (context, state) => const MainScreen(), - routes: secureRoutes, - ), - // GoRoute( - // name: RouteNames.VERIFY_ACCOUNT, - // path: '/account-verify', - // builder: (BuildContext context, GoRouterState state) { - // final extras = getPhone() as String; - // print("this is extras $extras"); - // return VerificationScreen(username: extras); - // }, - // ), - GoRoute( - name: RouteNames.VERIFY_ACCOUNT, - path: '/account-verify', - builder: (BuildContext context, GoRouterState state) { - return FutureBuilder( - future: getPhone(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } else if (snapshot.hasError) { - return Center(child: Text('Error: ${snapshot.error}')); - } else if (snapshot.hasData) { - final extras = snapshot.data!; - return VerificationScreen(username: extras); - } else { - return const Center(child: Text('No data available')); - } - }, - ); + GoRoute( + name: RouteNames.SPLASH_SCREEN, + path: '/splash', + builder: (BuildContext context, GoRouterState state) { + return const SplashScreen(); + }, + ), + GoRoute( + name: RouteNames.WELCOME_SCREEN, + path: '/auth', + builder: (BuildContext context, GoRouterState state) { + return const WelcomeScreen(); + }, + routes: openRoutes, + ), + GoRoute( + name: RouteNames.LANDING_SCREEN, + path: '/', + builder: (context, state) => const MainScreen(), + routes: secureRoutes, + ), + // GoRoute( + // name: RouteNames.VERIFY_ACCOUNT, + // path: '/account-verify', + // builder: (BuildContext context, GoRouterState state) { + // final extras = getPhone() as String; + // print("this is extras $extras"); + // return VerificationScreen(username: extras); + // }, + // ), + GoRoute( + name: RouteNames.VERIFY_ACCOUNT, + path: '/account-verify', + builder: (BuildContext context, GoRouterState state) { + return FutureBuilder( + future: getPhone(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final extras = snapshot.data!; + return VerificationScreen(username: extras); + } else { + return const Center(child: Text('No data available')); + } }, - ), + ); + }, + ), - GoRoute( - name: RouteNames.PROFILE_EDIT_FORM, - path: '/profile-edit', - builder: (BuildContext context, GoRouterState state) { - return const ProfileWizardFormScreen(); - }, - ), - ]; + GoRoute( + name: RouteNames.PROFILE_EDIT_FORM, + path: '/profile-edit', + builder: (BuildContext context, GoRouterState state) { + return const ProfileWizardFormScreen(); + }, + ), + ]; } final List secureRoutes = [ @@ -478,104 +480,104 @@ final List selfScreeningRoutes = [ ); } }, - routes: [ - GoRoute( - name: RouteNames.BMI_CALCULATOR, - path: 'bmi-calculator', + routes: [ + GoRoute( + name: RouteNames.BMI_CALCULATOR, + path: 'bmi-calculator', + builder: (BuildContext context, GoRouterState state) { + return const BMICalculatorScreen(); + }, + ), + GoRoute( + name: RouteNames.BMI_HISTORY, + path: "bmi-history", + builder: (BuildContext context, GoRouterState state) { + return BMIHistoryScreen(); + } + ), + ] + ), + GoRoute( + name: RouteNames.BLOOD_PRESSURE, + path: 'blood-pressure', + builder: (BuildContext context, GoRouterState state) { + return BPMonitorScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.BLOOD_PRESSURE_INSIGHT, + path: 'blood-pressure-insight', + builder: (BuildContext context, GoRouterState state) { + return BpInsightScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.BLOOD_PRESSURE_POSTS, + path: 'blood-pressure-posts', builder: (BuildContext context, GoRouterState state) { - return const BMICalculatorScreen(); + dynamic ann = state.extra; + return BloodPressurePostScreen(announcement: ann,); }, - ), - GoRoute( - name: RouteNames.BMI_HISTORY, - path: "bmi-history", - builder: (BuildContext context, GoRouterState state) { - return BMIHistoryScreen(); - } - ), - ] + ) + ] ), - GoRoute( - name: RouteNames.BLOOD_PRESSURE, - path: 'blood-pressure', - builder: (BuildContext context, GoRouterState state) { - return BPMonitorScreen(); - }, - routes: [ - GoRoute( - name: RouteNames.BLOOD_PRESSURE_INSIGHT, - path: 'blood-pressure-insight', - builder: (BuildContext context, GoRouterState state) { - return BpInsightScreen(); + GoRoute( + name: RouteNames.BLOOD_PRESSURE_RECORDS, + path: 'blood-pressure-records', + builder: (context, state) { + dynamic extras = state.extra; + return BloodPressureRecords(data: extras); }, - routes: [ - GoRoute( - name: RouteNames.BLOOD_PRESSURE_POSTS, - path: 'blood-pressure-posts', - builder: (BuildContext context, GoRouterState state) { - dynamic ann = state.extra; - return BloodPressurePostScreen(announcement: ann,); - }, - ) - ] - ), - GoRoute( - name: RouteNames.BLOOD_PRESSURE_RECORDS, - path: 'blood-pressure-records', - builder: (context, state) { - dynamic extras = state.extra; - return BloodPressureRecords(data: extras); - }, - ), - GoRoute( - name: RouteNames.BLOOD_PRESSURE_INPUT, - path: 'blood-pressure-input', - builder: (context, state) { - return BloodPressureInputs(); - }, - ), - ] + ), + GoRoute( + name: RouteNames.BLOOD_PRESSURE_INPUT, + path: 'blood-pressure-input', + builder: (context, state) { + return BloodPressureInputs(); + }, + ), + ] ), GoRoute( - name: RouteNames.BLOOD_SUGAR, - path: 'blood-sugar', - builder: (BuildContext context, GoRouterState state) { - return BloodSugarScreen(); - }, - routes: [ - GoRoute( - name: RouteNames.BLOOD_SUGAR_INSIGHT, - path: 'blood-sugar-insight', - builder: (BuildContext context, GoRouterState state) { - return BsInsightScreen(); - }, - routes: [ - GoRoute( - name: RouteNames.BLOOD_SUGAR_POSTS, - path: 'blood-sugar-posts', - builder: (BuildContext context, GoRouterState state) { - dynamic ann = state.extra; - return BloodSugarPostScreen(announcement: ann,); - }, - ) - ] - ), - GoRoute( - name: RouteNames.BLOOD_SUGAR_RECORDS, - path: 'blood-sugar-records', - builder: (context, state) { - dynamic extras = state.extra; - return BloodSugarRecords(data: extras); - }, - ), - GoRoute( - name: RouteNames.BLOOD_SUGAR_INPUT, - path: 'blood-sugar-input', - builder: (context, state) { - return BloodSugarInputs(); - }, - ), - ] + name: RouteNames.BLOOD_SUGAR, + path: 'blood-sugar', + builder: (BuildContext context, GoRouterState state) { + return BloodSugarScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.BLOOD_SUGAR_INSIGHT, + path: 'blood-sugar-insight', + builder: (BuildContext context, GoRouterState state) { + return BsInsightScreen(); + }, + routes: [ + GoRoute( + name: RouteNames.BLOOD_SUGAR_POSTS, + path: 'blood-sugar-posts', + builder: (BuildContext context, GoRouterState state) { + dynamic ann = state.extra; + return BloodSugarPostScreen(announcement: ann,); + }, + ) + ] + ), + GoRoute( + name: RouteNames.BLOOD_SUGAR_RECORDS, + path: 'blood-sugar-records', + builder: (context, state) { + dynamic extras = state.extra; + return BloodSugarRecords(data: extras); + }, + ), + GoRoute( + name: RouteNames.BLOOD_SUGAR_INPUT, + path: 'blood-sugar-input', + builder: (context, state) { + return BloodSugarInputs(); + }, + ), + ] ), //Routes for the Period Planner GoRoute( @@ -853,6 +855,14 @@ final List clinicCardRoutes = [ return HealthRecordTest(); }, ), + + GoRoute( + name: RouteNames.IMMUNIZATION_RECORD, + path: 'immunization-record', + builder: (BuildContext context, GoRouterState state) { + return ImmunizationTest(); + }, + ), GoRoute( name: RouteNames.DEPENDANT_PROFILE, path: 'dependant-profile', diff --git a/lib/src/features/clinic_card/data/models/health_test.dart b/lib/src/features/clinic_card/data/models/health_test.dart index 818c03a7..e588f3b6 100644 --- a/lib/src/features/clinic_card/data/models/health_test.dart +++ b/lib/src/features/clinic_card/data/models/health_test.dart @@ -8,7 +8,7 @@ class HealthRecordModel { final List vitals; // final List labResults; // final List procedures; - // final List immunizations; + final List immunizations; HealthRecordModel({ required this.uuid, @@ -20,7 +20,7 @@ class HealthRecordModel { required this.vitals, // required this.labResults, // required this.procedures, - // required this.immunizations, + required this.immunizations, }); factory HealthRecordModel.fromJson(Map json) { @@ -46,9 +46,9 @@ class HealthRecordModel { // procedures: (json['procedures'] as List) // .map((procedure) => Procedure.fromJson(procedure)) // .toList(), - // immunizations: (json['immunization'] as List) - // .map((immunization) => Immunization.fromJson(immunization)) - // .toList(), + immunizations: (json['immunization'] as List) + .map((immunization) => Immunization.fromJson(immunization)) + .toList(), ); } } @@ -124,3 +124,32 @@ class Vital { } // Define similar models for Medication, Allergy, Vital, LabResult, Procedure, and Immunization. +//Immunization +class Immunization{ + final String uuuid; + final String name; + final String immunizationDate; + final String manufacturer; + final String lot; + + + Immunization({ + required this.uuuid, + required this.name, + required this.immunizationDate, + required this.manufacturer, + required this.lot, +}); + + factory Immunization.fromJson(Map json){ + return Immunization( + uuuid: json['uuid'], + name: json['name'], + immunizationDate: json['immunizationDate'], + manufacturer: json['manufacturer'], + lot: json['lot'] + ); + } + +} + diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 6f2ba2c3..334aa1ea 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -51,8 +51,8 @@ class ClinicCardScreen extends HookConsumerWidget { final Map svgMapping = { "allergies": "assets/images/boldDuotoneMedicineVirus.svg", - "conditions": "assets/images/boldDuotoneMedicineStethoscope.svg", "immunization": "assets/images/boldDuotoneMedicineSyringe.svg", + "conditions": "assets/images/boldDuotoneMedicineStethoscope.svg", "labResults": "assets/images/boldDuotoneMedicineTestTube.svg", "medications": "assets/images/boldDuotoneMedicineJarOfPills2.svg", "procedures": "assets/images/boldDuotoneMedicineBone.svg", @@ -83,11 +83,13 @@ class ClinicCardScreen extends HookConsumerWidget { final List paths = [ "", RouteNames.HEALTH_RECORD, + RouteNames.IMMUNIZATION_RECORD, "", "", "", "", RouteNames.VITAL_HEALTH_RECORD, + ]; void _reloadData() { diff --git a/lib/src/features/clinic_card/presentation/widgets/immunization.dart b/lib/src/features/clinic_card/presentation/widgets/immunization.dart new file mode 100644 index 00000000..4b972e6c --- /dev/null +++ b/lib/src/features/clinic_card/presentation/widgets/immunization.dart @@ -0,0 +1,391 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +import 'health.dart'; + + + + +class ImmunizationTest extends StatefulWidget { + const ImmunizationTest({super.key}); + + @override + State createState() => _ImmunizationTestState(); +} + +class _ImmunizationTestState extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + // Load health records from a JSON file + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString( + 'assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + // Apply the selected filter to the health records + Future> _applyFilter( + List records) async { + if (selectedFilter == null || selectedFilter == DateFilter.all) { + return records; // Return all records if no filter or 'All Data' is selected + } + + DateTime now = DateTime.now(); + List filteredRecords = []; + + switch (selectedFilter) { + case DateFilter.today: + filteredRecords = records.where((record) { + return DateTime.parse(record.visitDate).isAtSameMomentAs(now); + }).toList(); + break; + case DateFilter.currentWeek: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAfter( + now.subtract(Duration(days: now.weekday - 1))) && + visitDate.isBefore(now.add(Duration(days: 7 - now.weekday))); + }).toList(); + break; + case DateFilter.currentMonth: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.month == now.month && visitDate.year == now.year; + }).toList(); + break; + case DateFilter.dateRange: + if (selectedDateRange != null) { + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAfter(selectedDateRange!.start) && + visitDate.isBefore(selectedDateRange!.end); + }).toList(); + } + break; + default: + filteredRecords = records; + break; + } + + return filteredRecords; + } + + // Function to handle date range selection + Future _selectDateRange(BuildContext context) async { + final DateTime now = DateTime.now(); + DateTimeRange? picked = await showDateRangePicker( + context: context, + firstDate: DateTime(now.year - 5), + lastDate: DateTime(now.year + 1), + initialDateRange: selectedDateRange, + saveText: 'Done', + barrierColor: Constants.bmiCalculatorColor, + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.light().copyWith( + primaryColor: Constants.bmiCalculatorColor, + // accentColor: Constants.programsColor, + colorScheme: ColorScheme.light( + primary: Constants.bmiCalculatorColor), + buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), + ), + child: child!, + ); + }, + ); + + if (picked != null && picked != selectedDateRange) { + setState(() { + selectedDateRange = picked; + selectedFilter = + DateFilter.dateRange; // Automatically switch to 'dateRange' filter + }); + } + } + + + @override + Widget build(BuildContext context) { + //return const Placeholder(); + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: 120, + smallTitle: "Immunizations", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == + ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text( + 'Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center( + child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => + _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center( + child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildConditionList(record.immunizations, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleMedium), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleLarge, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildConditionList(List immunizations, ThemeData theme) { + if (immunizations.isEmpty) { + return const Center( + child: Text('No immunizations recorded.') + ); + } + + return Column( + children: immunizations.map((immunization) => + _buildImmunizationRow(immunization, theme)).toList(), + ); + } + + + Widget _buildImmunizationRow(Immunization immunization, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildImmunizationsRow(immunization, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Recorded", style: theme.textTheme.bodySmall), + Text(immunization.immunizationDate, + style: theme.textTheme.bodySmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildImmunizationsRow(Immunization immunization, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineStethoscope.svg", + width: 20, + height: 20, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child: Text(immunization.name, + style: theme.textTheme.titleMedium?.copyWith(fontSize: 8), + // Reduce font size + overflow: TextOverflow.ellipsis, + // Truncate if too long + maxLines: 1, + ),), + ], + ); + } + + Color getStatusColor(String status) { + if (status == 'ACTIVE') { + return Constants.programsColor; + } else if (status == 'INACTIVE') { + return Constants.facilityDirectoryColor; + } else { + return Constants.selfScreeningBgColor; + } + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + // if (selectedDateRange != null) + // Padding( + // padding: const EdgeInsets.only(left: Constants.SPACING), + // child: Text( + // 'From ${selectedDateRange!.start.toLocal()} - ${selectedDateRange!.end.toLocal()}', + // style: theme.textTheme.bodyMedium, + // ), + // ), + ], + ); + } +} + + +class HealthButton extends StatefulWidget { + final Function(DateFilter) onFilterSelected; + + const HealthButton({Key? key, required this.onFilterSelected}) : super(key: key); + + @override + _HealthButtonState createState() => _HealthButtonState(); +} + +class _HealthButtonState extends State { + DateFilter? selectedMenu; + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width * 0.1, + child: MenuAnchor( + builder: (BuildContext context, MenuController controller, Widget? child) { + return IconButton( + onPressed: () { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + icon: SvgPicture.asset( + "assets/images/clinic_menu.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 40, + width: 40, + ), + tooltip: 'Show menu', + ); + }, + menuChildren: List.generate( + DateFilter.values.length, + (int index) => MenuItemButton( + onPressed: () { + widget.onFilterSelected(DateFilter.values[index]); + }, + child: Text(DateFilter.values[index].toString().split('.').last), + ), + ), + ), + ); + } +} + +enum DateFilter { all, today, currentWeek, currentMonth, dateRange } diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index e4964f3a..8fdf8d69 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -46,6 +46,7 @@ class RouteNames { static const LAB_RESULTS = "lab-results"; static const MY_CLINIC_CARD = "clinic-card"; static const HEALTH_RECORD = "health-record"; + static const IMMUNIZATION_RECORD = "immunization-record"; static const CHAT_BOT = "chat-bot"; static const SETTINGS = "settings"; static const DEPENDANT_PROFILE = "dependant-profile"; From efbf4c47c2187975e0bc3197ee9060eec5f3759f Mon Sep 17 00:00:00 2001 From: vicky-ogutu Date: Tue, 12 Nov 2024 22:05:18 +0300 Subject: [PATCH 131/140] paths-range --- .../clinic_card/presentation/pages/ClinicCardScreen.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 334aa1ea..fab466b5 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -87,7 +87,6 @@ class ClinicCardScreen extends HookConsumerWidget { "", "", "", - "", RouteNames.VITAL_HEALTH_RECORD, ]; From 73a4fb89368f4f398cb8d0ad8e8cc479e058d875 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 13 Nov 2024 10:10:39 +0300 Subject: [PATCH 132/140] (cho) Refactor selected date range function --- lib/src/app/navigation/app_router.dart | 4 +- .../{health.dart => condition_records.dart} | 139 +++------------- .../presentation/widgets/immunization.dart | 152 ++---------------- .../presentation/widgets/vital_records.dart | 25 +-- .../shared/helper/health_record_filter.dart | 39 +++++ 5 files changed, 84 insertions(+), 275 deletions(-) rename lib/src/features/clinic_card/presentation/widgets/{health.dart => condition_records.dart} (64%) diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index c9793edc..cd92f87f 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -19,7 +19,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerificationScreen import 'package:nishauri/src/features/auth/presentation/pages/VerifiedResetPassword.dart'; import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswordScreen.dart'; import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; -import 'package:nishauri/src/features/clinic_card/presentation/widgets/health.dart'; +import 'package:nishauri/src/features/clinic_card/presentation/widgets/condition_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/vital_records.dart'; import 'package:nishauri/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart'; @@ -852,7 +852,7 @@ final List clinicCardRoutes = [ name: RouteNames.HEALTH_RECORD, path: 'health-record', builder: (BuildContext context, GoRouterState state) { - return HealthRecordTest(); + return ConditionHealthRecord(); }, ), diff --git a/lib/src/features/clinic_card/presentation/widgets/health.dart b/lib/src/features/clinic_card/presentation/widgets/condition_records.dart similarity index 64% rename from lib/src/features/clinic_card/presentation/widgets/health.dart rename to lib/src/features/clinic_card/presentation/widgets/condition_records.dart index 448ecb8b..005824b3 100644 --- a/lib/src/features/clinic_card/presentation/widgets/health.dart +++ b/lib/src/features/clinic_card/presentation/widgets/condition_records.dart @@ -4,16 +4,18 @@ import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/heath_filter_button.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; import 'package:nishauri/src/utils/constants.dart'; -class HealthRecordTest extends StatefulWidget { - const HealthRecordTest({Key? key}) : super(key: key); +class ConditionHealthRecord extends StatefulWidget { + const ConditionHealthRecord({Key? key}) : super(key: key); @override - _HealthRecordTestState createState() => _HealthRecordTestState(); + _ConditionHealthRecordState createState() => _ConditionHealthRecordState(); } -class _HealthRecordTestState extends State { +class _ConditionHealthRecordState extends State { // Store the selected filter DateFilter? selectedFilter; DateTimeRange? selectedDateRange; @@ -27,76 +29,29 @@ class _HealthRecordTestState extends State { // Apply the selected filter to the health records Future> _applyFilter(List records) async { - if (selectedFilter == null || selectedFilter == DateFilter.all) { - return records; // Return all records if no filter or 'All Data' is selected - } - - DateTime now = DateTime.now(); - List filteredRecords = []; - - switch (selectedFilter) { - case DateFilter.today: - filteredRecords = records.where((record) { - return DateTime.parse(record.visitDate).isAtSameMomentAs(now); - }).toList(); - break; - case DateFilter.currentWeek: - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.isAfter(now.subtract(Duration(days: now.weekday - 1))) && - visitDate.isBefore(now.add(Duration(days: 7 - now.weekday))); - }).toList(); - break; - case DateFilter.currentMonth: - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.month == now.month && visitDate.year == now.year; - }).toList(); - break; - case DateFilter.dateRange: - if (selectedDateRange != null) { - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.isAfter(selectedDateRange!.start) && - visitDate.isBefore(selectedDateRange!.end); - }).toList(); - } - break; - default: - filteredRecords = records; - break; - } + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); return filteredRecords; } // Function to handle date range selection Future _selectDateRange(BuildContext context) async { - final DateTime now = DateTime.now(); - DateTimeRange? picked = await showDateRangePicker( + DateTimeRange? pickedRange = await selectDateRange( context: context, - firstDate: DateTime(now.year - 5), - lastDate: DateTime(now.year + 1), initialDateRange: selectedDateRange, - saveText: 'Done', + primaryColor: Constants.bmiCalculatorColor, barrierColor: Constants.bmiCalculatorColor, - builder: (BuildContext context, Widget? child) { - return Theme( - data: ThemeData.light().copyWith( - primaryColor: Constants.bmiCalculatorColor, - // accentColor: Constants.programsColor, - colorScheme: ColorScheme.light(primary: Constants.bmiCalculatorColor), - buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), - ), - child: child!, - ); - }, ); - if (picked != null && picked != selectedDateRange) { + if (pickedRange != null && pickedRange != selectedDateRange) { setState(() { - selectedDateRange = picked; - selectedFilter = DateFilter.dateRange; // Automatically switch to 'dateRange' filter + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; }); } } @@ -190,7 +145,7 @@ class _HealthRecordTestState extends State { Expanded( child: Text( date, - style: theme.textTheme.titleMedium), + style: theme.textTheme.titleSmall), ), ], ); @@ -202,7 +157,7 @@ class _HealthRecordTestState extends State { Expanded( // Wrap the Text widget in Expanded child: Text( hospital, - style: theme.textTheme.titleLarge, + style: theme.textTheme.titleMedium, overflow: TextOverflow.ellipsis, // Truncate if too long ), ), @@ -266,12 +221,12 @@ class _HealthRecordTestState extends State { const SizedBox(width: Constants.SPACING), Expanded( child:Text(condition.name, - style: theme.textTheme.titleMedium?.copyWith(fontSize: 8), // Reduce font size + style: theme.textTheme.titleSmall, overflow: TextOverflow.ellipsis, // Truncate if too long maxLines: 1, ),), const Spacer(), - Text(condition.status, style: theme.textTheme.bodyMedium?.copyWith(fontSize: 6, color: getStatusColor(condition.status))), + Text(condition.status, style: theme.textTheme.bodySmall?.copyWith(color: getStatusColor(condition.status))), ], ); } @@ -315,55 +270,3 @@ class _HealthRecordTestState extends State { ); } } - -class HealthButton extends StatefulWidget { - final Function(DateFilter) onFilterSelected; - - const HealthButton({Key? key, required this.onFilterSelected}) : super(key: key); - - @override - _HealthButtonState createState() => _HealthButtonState(); -} - -class _HealthButtonState extends State { - DateFilter? selectedMenu; - - @override - Widget build(BuildContext context) { - return Container( - width: MediaQuery.of(context).size.width * 0.1, - child: MenuAnchor( - builder: (BuildContext context, MenuController controller, Widget? child) { - return IconButton( - onPressed: () { - if (controller.isOpen) { - controller.close(); - } else { - controller.open(); - } - }, - icon: SvgPicture.asset( - "assets/images/clinic_menu.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 40, - width: 40, - ), - tooltip: 'Show menu', - ); - }, - menuChildren: List.generate( - DateFilter.values.length, - (int index) => MenuItemButton( - onPressed: () { - widget.onFilterSelected(DateFilter.values[index]); - }, - child: Text(DateFilter.values[index].toString().split('.').last), - ), - ), - ), - ); - } -} - -enum DateFilter { all, today, currentWeek, currentMonth, dateRange } diff --git a/lib/src/features/clinic_card/presentation/widgets/immunization.dart b/lib/src/features/clinic_card/presentation/widgets/immunization.dart index 4b972e6c..3fedc89a 100644 --- a/lib/src/features/clinic_card/presentation/widgets/immunization.dart +++ b/lib/src/features/clinic_card/presentation/widgets/immunization.dart @@ -4,13 +4,10 @@ import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/heath_filter_button.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; import 'package:nishauri/src/utils/constants.dart'; -import 'health.dart'; - - - - class ImmunizationTest extends StatefulWidget { const ImmunizationTest({super.key}); @@ -32,86 +29,34 @@ class _ImmunizationTestState extends State { } // Apply the selected filter to the health records - Future> _applyFilter( - List records) async { - if (selectedFilter == null || selectedFilter == DateFilter.all) { - return records; // Return all records if no filter or 'All Data' is selected - } - - DateTime now = DateTime.now(); - List filteredRecords = []; - - switch (selectedFilter) { - case DateFilter.today: - filteredRecords = records.where((record) { - return DateTime.parse(record.visitDate).isAtSameMomentAs(now); - }).toList(); - break; - case DateFilter.currentWeek: - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.isAfter( - now.subtract(Duration(days: now.weekday - 1))) && - visitDate.isBefore(now.add(Duration(days: 7 - now.weekday))); - }).toList(); - break; - case DateFilter.currentMonth: - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.month == now.month && visitDate.year == now.year; - }).toList(); - break; - case DateFilter.dateRange: - if (selectedDateRange != null) { - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.isAfter(selectedDateRange!.start) && - visitDate.isBefore(selectedDateRange!.end); - }).toList(); - } - break; - default: - filteredRecords = records; - break; - } + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); return filteredRecords; } // Function to handle date range selection Future _selectDateRange(BuildContext context) async { - final DateTime now = DateTime.now(); - DateTimeRange? picked = await showDateRangePicker( + DateTimeRange? pickedRange = await selectDateRange( context: context, - firstDate: DateTime(now.year - 5), - lastDate: DateTime(now.year + 1), initialDateRange: selectedDateRange, - saveText: 'Done', + primaryColor: Constants.bmiCalculatorColor, barrierColor: Constants.bmiCalculatorColor, - builder: (BuildContext context, Widget? child) { - return Theme( - data: ThemeData.light().copyWith( - primaryColor: Constants.bmiCalculatorColor, - // accentColor: Constants.programsColor, - colorScheme: ColorScheme.light( - primary: Constants.bmiCalculatorColor), - buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), - ), - child: child!, - ); - }, ); - if (picked != null && picked != selectedDateRange) { + if (pickedRange != null && pickedRange != selectedDateRange) { setState(() { - selectedDateRange = picked; - selectedFilter = - DateFilter.dateRange; // Automatically switch to 'dateRange' filter + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; }); } } - @override Widget build(BuildContext context) { //return const Placeholder(); @@ -208,7 +153,7 @@ class _ImmunizationTestState extends State { Expanded( child: Text( date, - style: theme.textTheme.titleMedium), + style: theme.textTheme.titleSmall), ), ], ); @@ -220,7 +165,7 @@ class _ImmunizationTestState extends State { Expanded( // Wrap the Text widget in Expanded child: Text( hospital, - style: theme.textTheme.titleLarge, + style: theme.textTheme.titleMedium, overflow: TextOverflow.ellipsis, // Truncate if too long ), ), @@ -287,7 +232,7 @@ class _ImmunizationTestState extends State { const SizedBox(width: Constants.SPACING), Expanded( child: Text(immunization.name, - style: theme.textTheme.titleMedium?.copyWith(fontSize: 8), + style: theme.textTheme.titleSmall, // Reduce font size overflow: TextOverflow.ellipsis, // Truncate if too long @@ -297,16 +242,6 @@ class _ImmunizationTestState extends State { ); } - Color getStatusColor(String status) { - if (status == 'ACTIVE') { - return Constants.programsColor; - } else if (status == 'INACTIVE') { - return Constants.facilityDirectoryColor; - } else { - return Constants.selfScreeningBgColor; - } - } - // Build the filter menu with the date range option Widget _buildFilterMenu(ThemeData theme) { return Row( @@ -336,56 +271,3 @@ class _ImmunizationTestState extends State { ); } } - - -class HealthButton extends StatefulWidget { - final Function(DateFilter) onFilterSelected; - - const HealthButton({Key? key, required this.onFilterSelected}) : super(key: key); - - @override - _HealthButtonState createState() => _HealthButtonState(); -} - -class _HealthButtonState extends State { - DateFilter? selectedMenu; - - @override - Widget build(BuildContext context) { - return Container( - width: MediaQuery.of(context).size.width * 0.1, - child: MenuAnchor( - builder: (BuildContext context, MenuController controller, Widget? child) { - return IconButton( - onPressed: () { - if (controller.isOpen) { - controller.close(); - } else { - controller.open(); - } - }, - icon: SvgPicture.asset( - "assets/images/clinic_menu.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 40, - width: 40, - ), - tooltip: 'Show menu', - ); - }, - menuChildren: List.generate( - DateFilter.values.length, - (int index) => MenuItemButton( - onPressed: () { - widget.onFilterSelected(DateFilter.values[index]); - }, - child: Text(DateFilter.values[index].toString().split('.').last), - ), - ), - ), - ); - } -} - -enum DateFilter { all, today, currentWeek, currentMonth, dateRange } diff --git a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart index f90fd085..80fd630e 100644 --- a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart @@ -38,33 +38,18 @@ class _VisitHealthRecord extends State { return filteredRecords; } - // Function to handle date range selection Future _selectDateRange(BuildContext context) async { - final DateTime now = DateTime.now(); - DateTimeRange? picked = await showDateRangePicker( + DateTimeRange? pickedRange = await selectDateRange( context: context, - firstDate: DateTime(now.year - 5), - lastDate: DateTime(now.year + 1), initialDateRange: selectedDateRange, - saveText: 'Done', + primaryColor: Constants.bmiCalculatorColor, barrierColor: Constants.bmiCalculatorColor, - builder: (BuildContext context, Widget? child) { - return Theme( - data: ThemeData.light().copyWith( - primaryColor: Constants.bmiCalculatorColor, - // accentColor: Constants.programsColor, - colorScheme: ColorScheme.light(primary: Constants.bmiCalculatorColor), - buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), - ), - child: child!, - ); - }, ); - if (picked != null && picked != selectedDateRange) { + if (pickedRange != null && pickedRange != selectedDateRange) { setState(() { - selectedDateRange = picked; - selectedFilter = DateFilter.dateRange; // Automatically switch to 'dateRange' filter + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; }); } } diff --git a/lib/src/shared/helper/health_record_filter.dart b/lib/src/shared/helper/health_record_filter.dart index 18c72a40..64595589 100644 --- a/lib/src/shared/helper/health_record_filter.dart +++ b/lib/src/shared/helper/health_record_filter.dart @@ -1,4 +1,5 @@ +import 'package:flutter/material.dart'; import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; import 'package:nishauri/src/shared/display/heath_filter_button.dart'; @@ -51,3 +52,41 @@ List applyFilter( return filteredRecords; } + +Future selectDateRange({ + required BuildContext context, + DateTimeRange? initialDateRange, + DateTime? firstDate, + String? saveText, + Color? primaryColor, + Color? barrierColor, +}) async { + final DateTime now = DateTime.now(); + + DateTime effectiveLastDate = now; + + DateTime effectiveFirstDate = firstDate ?? DateTime(now.year - 5); // Default to 5 years ago + + DateTimeRange? picked = await showDateRangePicker( + context: context, + firstDate: effectiveFirstDate, // Prevent selecting dates earlier than 5 years ago + lastDate: effectiveLastDate, // Prevent selecting dates in the future + initialDateRange: initialDateRange, + saveText: saveText ?? 'Done', // Default save text 'Done' + barrierColor: barrierColor ?? Colors.black45, // Default barrier color + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.light().copyWith( + primaryColor: primaryColor ?? Colors.blue, // Default to blue if not provided + colorScheme: ColorScheme.light(primary: primaryColor ?? Colors.blue), + buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), + ), + child: child!, + ); + }, + ); + + return picked; +} + + From 6296c7d93f6b8cc2cc2f8dded1248fd9c60240ab Mon Sep 17 00:00:00 2001 From: vicky-ogutu Date: Wed, 13 Nov 2024 11:06:34 +0300 Subject: [PATCH 133/140] medication --- lib/src/app/navigation/app_router.dart | 11 + .../clinic_card/data/models/health_test.dart | 46 ++- .../presentation/pages/ClinicCardScreen.dart | 2 +- .../presentation/widgets/immunization.dart | 2 +- .../presentation/widgets/medication.dart | 391 ++++++++++++++++++ lib/src/utils/routes.dart | 1 + 6 files changed, 445 insertions(+), 8 deletions(-) create mode 100644 lib/src/features/clinic_card/presentation/widgets/medication.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index cd92f87f..d8151c68 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -21,6 +21,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswor import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/condition_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; +import 'package:nishauri/src/features/clinic_card/presentation/widgets/medication.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/vital_records.dart'; import 'package:nishauri/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart'; @@ -863,6 +864,16 @@ final List clinicCardRoutes = [ return ImmunizationTest(); }, ), + + //Medication + + GoRoute( + name: RouteNames.MEDICATION_RECORD, + path: 'Medication-record', + builder: (BuildContext context, GoRouterState state) { + return MedicationTest(); + }, + ), GoRoute( name: RouteNames.DEPENDANT_PROFILE, path: 'dependant-profile', diff --git a/lib/src/features/clinic_card/data/models/health_test.dart b/lib/src/features/clinic_card/data/models/health_test.dart index e588f3b6..2e7565b4 100644 --- a/lib/src/features/clinic_card/data/models/health_test.dart +++ b/lib/src/features/clinic_card/data/models/health_test.dart @@ -3,7 +3,7 @@ class HealthRecordModel { final String visitDate; final String facility; final List conditions; - // final List medications; + final List medications; // final List allergies; final List vitals; // final List labResults; @@ -15,7 +15,7 @@ class HealthRecordModel { required this.visitDate, required this.facility, required this.conditions, - // required this.medications, + required this.medications, // required this.allergies, required this.vitals, // required this.labResults, @@ -31,9 +31,9 @@ class HealthRecordModel { conditions: (json['conditions'] as List) .map((condition) => Condition.fromJson(condition)) .toList(), - // medications: (json['medications'] as List) - // .map((medication) => Medication.fromJson(medication)) - // .toList(), + medications: (json['medications'] as List) + .map((medication) => Medication.fromJson(medication)) + .toList(), // allergies: (json['allergies'] as List) // .map((allergy) => Allergy.fromJson(allergy)) // .toList(), @@ -149,7 +149,41 @@ class Immunization{ manufacturer: json['manufacturer'], lot: json['lot'] ); + }} + +//Medication +class Medication{ + final String uuid; + final String name; + final String dateRecorded; + final String value; + final String indication; + + Medication({ + required this.uuid, + required this.name, + required this.dateRecorded, + required this.value, + required this. indication, + }); + + factory Medication.fromJson(Map json){ + return Medication( + uuid: json['uuid'], + name: json['name'], + dateRecorded: json['dateRecorded'], + value: json['value'], + indication: json['indication'] + ); + + + } } -} + + + + + + diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index fab466b5..c6c5bdf4 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -85,7 +85,7 @@ class ClinicCardScreen extends HookConsumerWidget { RouteNames.HEALTH_RECORD, RouteNames.IMMUNIZATION_RECORD, "", - "", + RouteNames.MEDICATION_RECORD, "", RouteNames.VITAL_HEALTH_RECORD, diff --git a/lib/src/features/clinic_card/presentation/widgets/immunization.dart b/lib/src/features/clinic_card/presentation/widgets/immunization.dart index 3fedc89a..5614dbba 100644 --- a/lib/src/features/clinic_card/presentation/widgets/immunization.dart +++ b/lib/src/features/clinic_card/presentation/widgets/immunization.dart @@ -208,7 +208,7 @@ class _ImmunizationTestState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Recorded", style: theme.textTheme.bodySmall), + Text("Vaccination Date", style: theme.textTheme.bodySmall), Text(immunization.immunizationDate, style: theme.textTheme.bodySmall), ], diff --git a/lib/src/features/clinic_card/presentation/widgets/medication.dart b/lib/src/features/clinic_card/presentation/widgets/medication.dart new file mode 100644 index 00000000..fec4dace --- /dev/null +++ b/lib/src/features/clinic_card/presentation/widgets/medication.dart @@ -0,0 +1,391 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +import '../../../../shared/display/heath_filter_button.dart'; + + +class MedicationTest extends StatefulWidget { + const MedicationTest({super.key}); + + @override + State createState() => _MedicationTestState(); +} + +class _MedicationTestState extends State { + + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + // Load health records from a JSON file + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString( + 'assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + // Apply the selected filter to the health records + Future> _applyFilter( + List records) async { + if (selectedFilter == null || selectedFilter == DateFilter.all) { + return records; // Return all records if no filter or 'All Data' is selected + } + + DateTime now = DateTime.now(); + List filteredRecords = []; + + switch (selectedFilter) { + case DateFilter.today: + filteredRecords = records.where((record) { + return DateTime.parse(record.visitDate).isAtSameMomentAs(now); + }).toList(); + break; + case DateFilter.currentWeek: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAfter( + now.subtract(Duration(days: now.weekday - 1))) && + visitDate.isBefore(now.add(Duration(days: 7 - now.weekday))); + }).toList(); + break; + case DateFilter.currentMonth: + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.month == now.month && visitDate.year == now.year; + }).toList(); + break; + case DateFilter.dateRange: + if (selectedDateRange != null) { + filteredRecords = records.where((record) { + DateTime visitDate = DateTime.parse(record.visitDate); + return visitDate.isAfter(selectedDateRange!.start) && + visitDate.isBefore(selectedDateRange!.end); + }).toList(); + } + break; + default: + filteredRecords = records; + break; + } + + return filteredRecords; + } + + // Function to handle date range selection + Future _selectDateRange(BuildContext context) async { + final DateTime now = DateTime.now(); + DateTimeRange? picked = await showDateRangePicker( + context: context, + firstDate: DateTime(now.year - 5), + lastDate: DateTime(now.year + 1), + initialDateRange: selectedDateRange, + saveText: 'Done', + barrierColor: Constants.bmiCalculatorColor, + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.light().copyWith( + primaryColor: Constants.bmiCalculatorColor, + // accentColor: Constants.programsColor, + colorScheme: ColorScheme.light( + primary: Constants.bmiCalculatorColor), + buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), + ), + child: child!, + ); + }, + ); + + if (picked != null && picked != selectedDateRange) { + setState(() { + selectedDateRange = picked; + selectedFilter = + DateFilter.dateRange; // Automatically switch to 'dateRange' filter + }); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: 120, + smallTitle: "Medications", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == + ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text( + 'Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center( + child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => + _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center( + child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildConditionList(record.medications, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleMedium), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleLarge, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildConditionList(List medications, ThemeData theme) { + if (medications.isEmpty) { + return const Center( + child: Text('No Medications recorded.') + ); + } + + return Column( + children: medications.map((medication) => + _buildImmunizationRow(medication, theme)).toList(), + ); + } + + + Widget _buildImmunizationRow(Medication medication, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildImmunizationsRow(medication, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Dose", style: theme.textTheme.titleSmall,), + Text(medication.value, + style: theme.textTheme.titleSmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildImmunizationsRow(Medication medication, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineStethoscope.svg", + width: 20, + height: 20, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child: Text(medication.name, + // style: theme.textTheme.titleMedium?.copyWith(fontSize: 8), + style: theme.textTheme.titleSmall, + // Reduce font size + overflow: TextOverflow.ellipsis, + // Truncate if too long + maxLines: 1, + ),), + ], + ); + } + + Color getStatusColor(String status) { + if (status == 'ACTIVE') { + return Constants.programsColor; + } else if (status == 'INACTIVE') { + return Constants.facilityDirectoryColor; + } else { + return Constants.selfScreeningBgColor; + } + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + // if (selectedDateRange != null) + // Padding( + // padding: const EdgeInsets.only(left: Constants.SPACING), + // child: Text( + // 'From ${selectedDateRange!.start.toLocal()} - ${selectedDateRange!.end.toLocal()}', + // style: theme.textTheme.bodyMedium, + // ), + // ), + ], + ); + } +} + + +class HealthButton extends StatefulWidget { + final Function(DateFilter) onFilterSelected; + + const HealthButton({Key? key, required this.onFilterSelected}) : super(key: key); + + @override + _HealthButtonState createState() => _HealthButtonState(); +} + +class _HealthButtonState extends State { + DateFilter? selectedMenu; + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width * 0.1, + child: MenuAnchor( + builder: (BuildContext context, MenuController controller, Widget? child) { + return IconButton( + onPressed: () { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + icon: SvgPicture.asset( + "assets/images/clinic_menu.svg", + semanticsLabel: "Doctors", + fit: BoxFit.contain, + height: 40, + width: 40, + ), + tooltip: 'Show menu', + ); + }, + menuChildren: List.generate( + DateFilter.values.length, + (int index) => MenuItemButton( + onPressed: () { + widget.onFilterSelected(DateFilter.values[index]); + }, + child: Text(DateFilter.values[index].toString().split('.').last), + ), + ), + ), + ); + } +} + +enum DateFilter { all, today, currentWeek, currentMonth, dateRange } + + diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 8fdf8d69..18fd859b 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -47,6 +47,7 @@ class RouteNames { static const MY_CLINIC_CARD = "clinic-card"; static const HEALTH_RECORD = "health-record"; static const IMMUNIZATION_RECORD = "immunization-record"; + static const MEDICATION_RECORD = "medication-record"; static const CHAT_BOT = "chat-bot"; static const SETTINGS = "settings"; static const DEPENDANT_PROFILE = "dependant-profile"; From 926d9092fb71574c647f7393bad4eb0508b1ae89 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 13 Nov 2024 11:16:17 +0300 Subject: [PATCH 134/140] (feat) add allergy screen --- lib/src/app/navigation/app_router.dart | 11 +- .../clinic_card/data/models/health_test.dart | 40 ++- .../presentation/pages/ClinicCardScreen.dart | 2 +- .../presentation/widgets/allergy_records.dart | 274 ++++++++++++++++++ .../presentation/widgets/vital_records.dart | 6 +- lib/src/shared/display/CustomAppBar.dart | 2 +- lib/src/utils/routes.dart | 1 + 7 files changed, 324 insertions(+), 12 deletions(-) create mode 100644 lib/src/features/clinic_card/presentation/widgets/allergy_records.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index d8151c68..7e581148 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -19,6 +19,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerificationScreen import 'package:nishauri/src/features/auth/presentation/pages/VerifiedResetPassword.dart'; import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswordScreen.dart'; import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; +import 'package:nishauri/src/features/clinic_card/presentation/widgets/allergy_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/condition_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/medication.dart'; @@ -881,12 +882,18 @@ final List clinicCardRoutes = [ return DependantProfileScreen(); }, ), - GoRoute( name: RouteNames.VITAL_HEALTH_RECORD, path: 'vital-health-record', builder: (BuildContext context, GoRouterState state) { - return VisitHealthRecord(); + return VitalHealthRecord(); + }, + ), + GoRoute( + name: RouteNames.ALLERGY_HEALTH_RECORD, + path: 'allergy-health-record', + builder: (BuildContext context, GoRouterState state) { + return AllergyHealthRecord(); }, ), ]; diff --git a/lib/src/features/clinic_card/data/models/health_test.dart b/lib/src/features/clinic_card/data/models/health_test.dart index 2e7565b4..f71af3ff 100644 --- a/lib/src/features/clinic_card/data/models/health_test.dart +++ b/lib/src/features/clinic_card/data/models/health_test.dart @@ -4,7 +4,8 @@ class HealthRecordModel { final String facility; final List conditions; final List medications; - // final List allergies; + // final List medications; + final List allergies; final List vitals; // final List labResults; // final List procedures; @@ -16,7 +17,7 @@ class HealthRecordModel { required this.facility, required this.conditions, required this.medications, - // required this.allergies, + required this.allergies, required this.vitals, // required this.labResults, // required this.procedures, @@ -34,9 +35,9 @@ class HealthRecordModel { medications: (json['medications'] as List) .map((medication) => Medication.fromJson(medication)) .toList(), - // allergies: (json['allergies'] as List) - // .map((allergy) => Allergy.fromJson(allergy)) - // .toList(), + allergies: (json['allergies'] as List) + .map((allergy) => Allergy.fromJson(allergy)) + .toList(), vitals: (json['vitals'] as List) .map((vital) => Vital.fromJson(vital)) .toList(), @@ -123,6 +124,35 @@ class Vital { } } +class Allergy { + final String uuid; + final String allergen; + final String reaction; + final String severity; + final String onsetDate; + final String dateRecorded; + + Allergy({ + required this.uuid, + required this.allergen, + required this.reaction, + required this.severity, + required this.onsetDate, + required this.dateRecorded, + }); + + factory Allergy.fromJson(Map json) { + return Allergy( + uuid: json['uuid'], + allergen: json['allergen'], + reaction: json['reaction'], + severity: json['severity'], + onsetDate: json['onsetDate'], + dateRecorded: json['dateRecorded'], + ); + } +} + // Define similar models for Medication, Allergy, Vital, LabResult, Procedure, and Immunization. //Immunization class Immunization{ diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index c6c5bdf4..223ea11d 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -81,7 +81,7 @@ class ClinicCardScreen extends HookConsumerWidget { ]; final List paths = [ - "", + RouteNames.ALLERGY_HEALTH_RECORD, RouteNames.HEALTH_RECORD, RouteNames.IMMUNIZATION_RECORD, "", diff --git a/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart b/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart new file mode 100644 index 00000000..f97d655c --- /dev/null +++ b/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart @@ -0,0 +1,274 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/extensions/extensions.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +import '../../../../shared/display/heath_filter_button.dart'; + +class AllergyHealthRecord extends StatefulWidget { + const AllergyHealthRecord({Key? key}) : super(key: key); + + @override + _VisitHealthRecord createState() => _VisitHealthRecord(); +} + +class _VisitHealthRecord extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString('assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + Future _selectDateRange(BuildContext context) async { + DateTimeRange? pickedRange = await selectDateRange( + context: context, + initialDateRange: selectedDateRange, + primaryColor: Constants.bmiCalculatorColor, + barrierColor: Constants.bmiCalculatorColor, + ); + + if (pickedRange != null && pickedRange != selectedDateRange) { + setState(() { + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; + }); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: 120, + smallTitle: "Allergies", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text('Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center(child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildConditionList(record.allergies, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleSmall), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildConditionList(List allergies, ThemeData theme) { + if (allergies.isEmpty) { + return const Center( + child:Text('No Vitals recorded.') + ); + } + + return Column( + children: allergies.map((allergy) => _buildConditionRow(allergy, theme)).toList(), + ); + } + + Widget _buildConditionRow(Allergy allergy, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildVitalsRow(allergy, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Reactions", style: theme.textTheme.bodySmall), + Text(allergy.reaction, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Onset Date", style: theme.textTheme.bodySmall), + Text(allergy.onsetDate, style: theme.textTheme.titleSmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildVitalsRow(Allergy allergy, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineVirus.svg", + width: 20, + height: 20, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child:Text(allergy.allergen, + style: theme.textTheme.titleSmall, + overflow: TextOverflow.ellipsis, // Truncate if too long + maxLines: 1, + ), + ), + const Spacer(), + Text(allergy.severity.titleCase, style: theme.textTheme.bodySmall?.copyWith(color: getSeverityColor(allergy.severity), )), + ], + ); + } + + Color getSeverityColor(String severity) { + if (severity == 'MILD') { + return Constants.programsColor; + } else if (severity == 'MODERATE') { + return Constants.facilityDirectoryColor; + } else if (severity == 'SEVERE') { + return Constants.selfScreeningBgColor; + } else { + return Constants.selfScreeningBgColor; + } + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + ], + ); + } +} diff --git a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart index 80fd630e..335227e6 100644 --- a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart @@ -9,14 +9,14 @@ import 'package:nishauri/src/utils/constants.dart'; import '../../../../shared/display/heath_filter_button.dart'; -class VisitHealthRecord extends StatefulWidget { - const VisitHealthRecord({Key? key}) : super(key: key); +class VitalHealthRecord extends StatefulWidget { + const VitalHealthRecord({Key? key}) : super(key: key); @override _VisitHealthRecord createState() => _VisitHealthRecord(); } -class _VisitHealthRecord extends State { +class _VisitHealthRecord extends State { // Store the selected filter DateFilter? selectedFilter; DateTimeRange? selectedDateRange; diff --git a/lib/src/shared/display/CustomAppBar.dart b/lib/src/shared/display/CustomAppBar.dart index f8a227bf..4801fefd 100644 --- a/lib/src/shared/display/CustomAppBar.dart +++ b/lib/src/shared/display/CustomAppBar.dart @@ -88,7 +88,7 @@ class CustomAppBar extends StatelessWidget { if (smallTitle != null) Text( smallTitle ?? '', - style: theme.textTheme.titleMedium?.copyWith(color: Colors.white), + style: theme.textTheme.headlineSmall?.copyWith(color: Colors.white), ), if (rightBtTitle != null) TextButton( diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index 18fd859b..c1af8f3b 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -52,6 +52,7 @@ class RouteNames { static const SETTINGS = "settings"; static const DEPENDANT_PROFILE = "dependant-profile"; static const VITAL_HEALTH_RECORD= "vital-health-record"; + static const ALLERGY_HEALTH_RECORD= "allergy-health-record"; static const Facility_Directory = "facility-directory"; static const PROGRAM_MENU = "program-menu"; From 88f79192c954dfb4af5110ff70b6f85542ca1888 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 13 Nov 2024 12:49:29 +0300 Subject: [PATCH 135/140] (feat) Add lab results screen --- lib/src/app/navigation/app_router.dart | 10 +- .../clinic_card/data/models/health_test.dart | 41 ++- .../presentation/pages/ClinicCardScreen.dart | 2 +- .../presentation/widgets/allergy_records.dart | 12 +- .../widgets/condition_records.dart | 3 +- .../widgets/lab_result_records.dart | 260 ++++++++++++++++++ .../presentation/widgets/medication.dart | 149 ++-------- .../presentation/widgets/vital_records.dart | 12 +- lib/src/utils/routes.dart | 1 + 9 files changed, 342 insertions(+), 148 deletions(-) create mode 100644 lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 7e581148..b2fcbb09 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -22,6 +22,7 @@ import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart import 'package:nishauri/src/features/clinic_card/presentation/widgets/allergy_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/condition_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; +import 'package:nishauri/src/features/clinic_card/presentation/widgets/lab_result_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/medication.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/vital_records.dart'; import 'package:nishauri/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart'; @@ -872,7 +873,7 @@ final List clinicCardRoutes = [ name: RouteNames.MEDICATION_RECORD, path: 'Medication-record', builder: (BuildContext context, GoRouterState state) { - return MedicationTest(); + return MedicationRecord(); }, ), GoRoute( @@ -896,4 +897,11 @@ final List clinicCardRoutes = [ return AllergyHealthRecord(); }, ), + GoRoute( + name: RouteNames.LAB_RESULTS_HEALTH_RECORD, + path: 'blood-result-health-record', + builder: (BuildContext context, GoRouterState state) { + return LabResultHealthRecord(); + }, + ), ]; diff --git a/lib/src/features/clinic_card/data/models/health_test.dart b/lib/src/features/clinic_card/data/models/health_test.dart index f71af3ff..0212c3f9 100644 --- a/lib/src/features/clinic_card/data/models/health_test.dart +++ b/lib/src/features/clinic_card/data/models/health_test.dart @@ -1,3 +1,5 @@ +import 'dart:ffi'; + class HealthRecordModel { final String uuid; final String visitDate; @@ -7,7 +9,7 @@ class HealthRecordModel { // final List medications; final List allergies; final List vitals; - // final List labResults; + final List labResults; // final List procedures; final List immunizations; @@ -19,7 +21,7 @@ class HealthRecordModel { required this.medications, required this.allergies, required this.vitals, - // required this.labResults, + required this.labResults, // required this.procedures, required this.immunizations, }); @@ -41,9 +43,9 @@ class HealthRecordModel { vitals: (json['vitals'] as List) .map((vital) => Vital.fromJson(vital)) .toList(), - // labResults: (json['labResults'] as List) - // .map((labResult) => LabResult.fromJson(labResult)) - // .toList(), + labResults: (json['labResults'] as List) + .map((labResult) => LabResult.fromJson(labResult)) + .toList(), // procedures: (json['procedures'] as List) // .map((procedure) => Procedure.fromJson(procedure)) // .toList(), @@ -153,6 +155,35 @@ class Allergy { } } +class LabResult { + final String uuid; + final String name; + final String results; + final String orderedDate; + final String status; + final int plot; + + LabResult({ + required this.uuid, + required this.name, + required this.results, + required this.orderedDate, + required this.status, + required this.plot, + }); + + factory LabResult.fromJson(Map json) { + return LabResult( + uuid: json['uuid'], + name: json['name'], + results: json['results'], + orderedDate: json['orderedDate'], + status: json['status'], + plot: json['plot'], + ); + } +} + // Define similar models for Medication, Allergy, Vital, LabResult, Procedure, and Immunization. //Immunization class Immunization{ diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 223ea11d..251d8908 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -84,7 +84,7 @@ class ClinicCardScreen extends HookConsumerWidget { RouteNames.ALLERGY_HEALTH_RECORD, RouteNames.HEALTH_RECORD, RouteNames.IMMUNIZATION_RECORD, - "", + RouteNames.LAB_RESULTS_HEALTH_RECORD, RouteNames.MEDICATION_RECORD, "", RouteNames.VITAL_HEALTH_RECORD, diff --git a/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart b/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart index f97d655c..acdf1ea5 100644 --- a/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart @@ -131,7 +131,7 @@ class _VisitHealthRecord extends State { _buildHospitalRow(record.facility, theme), const SizedBox(height: Constants.SPACING), const Divider(), - _buildConditionList(record.allergies, theme), + _buildAllergyList(record.allergies, theme), const SizedBox(height: Constants.SPACING), const Divider(), ], @@ -164,7 +164,7 @@ class _VisitHealthRecord extends State { ); } - Widget _buildConditionList(List allergies, ThemeData theme) { + Widget _buildAllergyList(List allergies, ThemeData theme) { if (allergies.isEmpty) { return const Center( child:Text('No Vitals recorded.') @@ -172,11 +172,11 @@ class _VisitHealthRecord extends State { } return Column( - children: allergies.map((allergy) => _buildConditionRow(allergy, theme)).toList(), + children: allergies.map((allergy) => _buildAllergyRow(allergy, theme)).toList(), ); } - Widget _buildConditionRow(Allergy allergy, ThemeData theme) { + Widget _buildAllergyRow(Allergy allergy, ThemeData theme) { return ListTile( title: ExpansionTile( title: Row( @@ -184,7 +184,7 @@ class _VisitHealthRecord extends State { Expanded(child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildVitalsRow(allergy, theme), + _buildAllergiesRow(allergy, theme), ], )), ], @@ -217,7 +217,7 @@ class _VisitHealthRecord extends State { ); } - Widget _buildVitalsRow(Allergy allergy, ThemeData theme) { + Widget _buildAllergiesRow(Allergy allergy, ThemeData theme) { return Row( children: [ SvgPicture.asset( diff --git a/lib/src/features/clinic_card/presentation/widgets/condition_records.dart b/lib/src/features/clinic_card/presentation/widgets/condition_records.dart index 005824b3..93cff474 100644 --- a/lib/src/features/clinic_card/presentation/widgets/condition_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/condition_records.dart @@ -5,6 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/heath_filter_button.dart'; +import 'package:nishauri/src/shared/extensions/extensions.dart'; import 'package:nishauri/src/shared/helper/health_record_filter.dart'; import 'package:nishauri/src/utils/constants.dart'; @@ -226,7 +227,7 @@ class _ConditionHealthRecordState extends State { maxLines: 1, ),), const Spacer(), - Text(condition.status, style: theme.textTheme.bodySmall?.copyWith(color: getStatusColor(condition.status))), + Text(condition.status.titleCase, style: theme.textTheme.bodySmall?.copyWith(color: getStatusColor(condition.status))), ], ); } diff --git a/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart b/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart new file mode 100644 index 00000000..90d38489 --- /dev/null +++ b/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart @@ -0,0 +1,260 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/extensions/extensions.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +import '../../../../shared/display/heath_filter_button.dart'; + +class LabResultHealthRecord extends StatefulWidget { + const LabResultHealthRecord({Key? key}) : super(key: key); + + @override + _LabResultHealthRecord createState() => _LabResultHealthRecord(); +} + +class _LabResultHealthRecord extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString('assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + Future _selectDateRange(BuildContext context) async { + DateTimeRange? pickedRange = await selectDateRange( + context: context, + initialDateRange: selectedDateRange, + primaryColor: Constants.bmiCalculatorColor, + barrierColor: Constants.bmiCalculatorColor, + ); + + if (pickedRange != null && pickedRange != selectedDateRange) { + setState(() { + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; + }); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: 120, + smallTitle: "Lab Results", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text('Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center(child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildConditionList(record.labResults, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleSmall), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildConditionList(List labResults, ThemeData theme) { + if (labResults.isEmpty) { + return const Center( + child:Text('No Vitals recorded.') + ); + } + + return Column( + children: labResults.map((labResult) => _buildLabResultRow(labResult, theme)).toList(), + ); + } + + Widget _buildLabResultRow(LabResult labResult, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildLabResultsRow(labResult, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Reactions", style: theme.textTheme.bodySmall), + Text(labResult.results, style: theme.textTheme.titleSmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Date Ordered", style: theme.textTheme.bodySmall), + Text(labResult.orderedDate, style: theme.textTheme.titleSmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildLabResultsRow(LabResult labResult, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineTestTube.svg", + width: 20, + height: 20, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child:Text(labResult.name, + style: theme.textTheme.titleSmall, + overflow: TextOverflow.ellipsis, // Truncate if too long + maxLines: 1, + ), + ), + ], + ); + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + ], + ); + } +} diff --git a/lib/src/features/clinic_card/presentation/widgets/medication.dart b/lib/src/features/clinic_card/presentation/widgets/medication.dart index fec4dace..64ee37b8 100644 --- a/lib/src/features/clinic_card/presentation/widgets/medication.dart +++ b/lib/src/features/clinic_card/presentation/widgets/medication.dart @@ -4,19 +4,19 @@ import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/heath_filter_button.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; import 'package:nishauri/src/utils/constants.dart'; -import '../../../../shared/display/heath_filter_button.dart'; - -class MedicationTest extends StatefulWidget { - const MedicationTest({super.key}); +class MedicationRecord extends StatefulWidget { + const MedicationRecord({super.key}); @override - State createState() => _MedicationTestState(); + State createState() => _MedicationRecordState(); } -class _MedicationTestState extends State { +class _MedicationRecordState extends State { // Store the selected filter DateFilter? selectedFilter; @@ -31,81 +31,29 @@ class _MedicationTestState extends State { } // Apply the selected filter to the health records - Future> _applyFilter( - List records) async { - if (selectedFilter == null || selectedFilter == DateFilter.all) { - return records; // Return all records if no filter or 'All Data' is selected - } - - DateTime now = DateTime.now(); - List filteredRecords = []; - - switch (selectedFilter) { - case DateFilter.today: - filteredRecords = records.where((record) { - return DateTime.parse(record.visitDate).isAtSameMomentAs(now); - }).toList(); - break; - case DateFilter.currentWeek: - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.isAfter( - now.subtract(Duration(days: now.weekday - 1))) && - visitDate.isBefore(now.add(Duration(days: 7 - now.weekday))); - }).toList(); - break; - case DateFilter.currentMonth: - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.month == now.month && visitDate.year == now.year; - }).toList(); - break; - case DateFilter.dateRange: - if (selectedDateRange != null) { - filteredRecords = records.where((record) { - DateTime visitDate = DateTime.parse(record.visitDate); - return visitDate.isAfter(selectedDateRange!.start) && - visitDate.isBefore(selectedDateRange!.end); - }).toList(); - } - break; - default: - filteredRecords = records; - break; - } + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); return filteredRecords; } - // Function to handle date range selection Future _selectDateRange(BuildContext context) async { - final DateTime now = DateTime.now(); - DateTimeRange? picked = await showDateRangePicker( + DateTimeRange? pickedRange = await selectDateRange( context: context, - firstDate: DateTime(now.year - 5), - lastDate: DateTime(now.year + 1), initialDateRange: selectedDateRange, - saveText: 'Done', + primaryColor: Constants.bmiCalculatorColor, barrierColor: Constants.bmiCalculatorColor, - builder: (BuildContext context, Widget? child) { - return Theme( - data: ThemeData.light().copyWith( - primaryColor: Constants.bmiCalculatorColor, - // accentColor: Constants.programsColor, - colorScheme: ColorScheme.light( - primary: Constants.bmiCalculatorColor), - buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.normal), - ), - child: child!, - ); - }, ); - if (picked != null && picked != selectedDateRange) { + if (pickedRange != null && pickedRange != selectedDateRange) { setState(() { - selectedDateRange = picked; - selectedFilter = - DateFilter.dateRange; // Automatically switch to 'dateRange' filter + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; }); } } @@ -192,7 +140,7 @@ class _MedicationTestState extends State { _buildHospitalRow(record.facility, theme), const SizedBox(height: Constants.SPACING), const Divider(), - _buildConditionList(record.medications, theme), + _buildMedicationList(record.medications, theme), const SizedBox(height: Constants.SPACING), const Divider(), ], @@ -217,7 +165,7 @@ class _MedicationTestState extends State { Expanded( // Wrap the Text widget in Expanded child: Text( hospital, - style: theme.textTheme.titleLarge, + style: theme.textTheme.titleMedium, overflow: TextOverflow.ellipsis, // Truncate if too long ), ), @@ -225,7 +173,7 @@ class _MedicationTestState extends State { ); } - Widget _buildConditionList(List medications, ThemeData theme) { + Widget _buildMedicationList(List medications, ThemeData theme) { if (medications.isEmpty) { return const Center( child: Text('No Medications recorded.') @@ -334,58 +282,3 @@ class _MedicationTestState extends State { ); } } - - -class HealthButton extends StatefulWidget { - final Function(DateFilter) onFilterSelected; - - const HealthButton({Key? key, required this.onFilterSelected}) : super(key: key); - - @override - _HealthButtonState createState() => _HealthButtonState(); -} - -class _HealthButtonState extends State { - DateFilter? selectedMenu; - - @override - Widget build(BuildContext context) { - return Container( - width: MediaQuery.of(context).size.width * 0.1, - child: MenuAnchor( - builder: (BuildContext context, MenuController controller, Widget? child) { - return IconButton( - onPressed: () { - if (controller.isOpen) { - controller.close(); - } else { - controller.open(); - } - }, - icon: SvgPicture.asset( - "assets/images/clinic_menu.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 40, - width: 40, - ), - tooltip: 'Show menu', - ); - }, - menuChildren: List.generate( - DateFilter.values.length, - (int index) => MenuItemButton( - onPressed: () { - widget.onFilterSelected(DateFilter.values[index]); - }, - child: Text(DateFilter.values[index].toString().split('.').last), - ), - ), - ), - ); - } -} - -enum DateFilter { all, today, currentWeek, currentMonth, dateRange } - - diff --git a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart index 335227e6..580e1ab7 100644 --- a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart @@ -13,10 +13,10 @@ class VitalHealthRecord extends StatefulWidget { const VitalHealthRecord({Key? key}) : super(key: key); @override - _VisitHealthRecord createState() => _VisitHealthRecord(); + _VitalHealthRecord createState() => _VitalHealthRecord(); } -class _VisitHealthRecord extends State { +class _VitalHealthRecord extends State { // Store the selected filter DateFilter? selectedFilter; DateTimeRange? selectedDateRange; @@ -130,7 +130,7 @@ class _VisitHealthRecord extends State { _buildHospitalRow(record.facility, theme), const SizedBox(height: Constants.SPACING), const Divider(), - _buildConditionList(record.vitals, theme), + _buildVitalList(record.vitals, theme), const SizedBox(height: Constants.SPACING), const Divider(), ], @@ -163,7 +163,7 @@ class _VisitHealthRecord extends State { ); } - Widget _buildConditionList(List vitals, ThemeData theme) { + Widget _buildVitalList(List vitals, ThemeData theme) { if (vitals.isEmpty) { return const Center( child:Text('No Vitals recorded.') @@ -171,11 +171,11 @@ class _VisitHealthRecord extends State { } return Column( - children: vitals.map((vital) => _buildConditionRow(vital, theme)).toList(), + children: vitals.map((vital) => _buildVitalRow(vital, theme)).toList(), ); } - Widget _buildConditionRow(Vital vital, ThemeData theme) { + Widget _buildVitalRow(Vital vital, ThemeData theme) { return ListTile( title: ExpansionTile( title: Row( diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index c1af8f3b..c7631c29 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -53,6 +53,7 @@ class RouteNames { static const DEPENDANT_PROFILE = "dependant-profile"; static const VITAL_HEALTH_RECORD= "vital-health-record"; static const ALLERGY_HEALTH_RECORD= "allergy-health-record"; + static const LAB_RESULTS_HEALTH_RECORD= "blood-result-health-record"; static const Facility_Directory = "facility-directory"; static const PROGRAM_MENU = "program-menu"; From 08bf755107c1bf1ec24f1783f70eae2b5e623b76 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Wed, 13 Nov 2024 14:59:35 +0300 Subject: [PATCH 136/140] (cho) Add icons on item filter --- .../shared/display/heath_filter_button.dart | 53 ++++++++++++++++--- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/lib/src/shared/display/heath_filter_button.dart b/lib/src/shared/display/heath_filter_button.dart index 9a2fc8b4..3ecf709e 100644 --- a/lib/src/shared/display/heath_filter_button.dart +++ b/lib/src/shared/display/heath_filter_button.dart @@ -1,5 +1,7 @@ + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/utils/constants.dart'; class HealthButton extends StatefulWidget { final Function(DateFilter) onFilterSelected; @@ -15,6 +17,7 @@ class _HealthButtonState extends State { @override Widget build(BuildContext context) { + final theme = Theme.of(context); return Container( width: MediaQuery.of(context).size.width * 0.1, child: MenuAnchor( @@ -39,12 +42,49 @@ class _HealthButtonState extends State { }, menuChildren: List.generate( DateFilter.values.length, - (int index) => MenuItemButton( - onPressed: () { - widget.onFilterSelected(DateFilter.values[index]); - }, - child: Text(DateFilter.values[index].toString().split('.').last), - ), + (int index) { + IconData iconData; + String label; + + switch (DateFilter.values[index]) { + case DateFilter.all: + iconData = Icons.calendar_today; + label = 'All'; + break; + case DateFilter.today: + iconData = Icons.today; + label = 'Today'; + break; + case DateFilter.currentWeek: + iconData = Icons.calendar_view_week; + label = 'This Week'; + break; + case DateFilter.currentMonth: + iconData = Icons.calendar_view_month; + label = 'This Month'; + break; + case DateFilter.dateRange: + iconData = Icons.date_range; + label = 'Date Range'; + break; + default: + iconData = Icons.help; + label = 'Unknown'; + } + + return MenuItemButton( + onPressed: () { + widget.onFilterSelected(DateFilter.values[index]); + }, + child: Row( + children: [ + Icon(iconData, size: Constants.BUTTON_FONT_SIZE, color: Constants.clinicCardBgColor), + SizedBox(width: Constants.SPACING), + Text(label, style: theme.textTheme.bodyMedium,), + ], + ), + ); + }, ), ), ); @@ -52,3 +92,4 @@ class _HealthButtonState extends State { } enum DateFilter { all, today, currentWeek, currentMonth, dateRange } + From 7b45b3f3fbbdf9c8bb12a92e76bdcfe5416eb586 Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 15 Nov 2024 10:02:57 +0300 Subject: [PATCH 137/140] (cho) Add values to constants --- lib/src/app/navigation/app_router.dart | 1 - .../presentation/widgets/allergy_records.dart | 6 +- .../widgets/condition_records.dart | 6 +- .../presentation/widgets/health_record.dart | 216 ------------------ .../presentation/widgets/immunization.dart | 6 +- .../widgets/lab_result_records.dart | 6 +- .../presentation/widgets/medication.dart | 6 +- .../presentation/widgets/vital_records.dart | 6 +- lib/src/utils/constants.dart | 2 + 9 files changed, 20 insertions(+), 235 deletions(-) delete mode 100644 lib/src/features/clinic_card/presentation/widgets/health_record.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index b2fcbb09..509d5b15 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -21,7 +21,6 @@ import 'package:nishauri/src/features/auth/presentation/pages/VerifyResetPasswor import 'package:nishauri/src/features/auth/presentation/pages/WelcomeScreen.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/allergy_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/condition_records.dart'; -import 'package:nishauri/src/features/clinic_card/presentation/widgets/health_record.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/lab_result_records.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/medication.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/vital_records.dart'; diff --git a/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart b/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart index acdf1ea5..2d29ae8a 100644 --- a/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart @@ -64,7 +64,7 @@ class _VisitHealthRecord extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: 120, + height: Constants.APP_BAR_HEIGHT, smallTitle: "Allergies", rightBtTitle: "", ), @@ -222,8 +222,8 @@ class _VisitHealthRecord extends State { children: [ SvgPicture.asset( "assets/images/boldDuotoneMedicineVirus.svg", - width: 20, - height: 20, + width: Constants.TWENTY, + height: Constants.TWENTY, ), const SizedBox(width: Constants.SPACING), Expanded( diff --git a/lib/src/features/clinic_card/presentation/widgets/condition_records.dart b/lib/src/features/clinic_card/presentation/widgets/condition_records.dart index 93cff474..764a51e1 100644 --- a/lib/src/features/clinic_card/presentation/widgets/condition_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/condition_records.dart @@ -66,7 +66,7 @@ class _ConditionHealthRecordState extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: 120, + height: Constants.APP_BAR_HEIGHT, smallTitle: "Conditions", rightBtTitle: "", ), @@ -216,8 +216,8 @@ class _ConditionHealthRecordState extends State { children: [ SvgPicture.asset( "assets/images/boldDuotoneMedicineStethoscope.svg", - width: 20, - height: 20, + width: Constants.TWENTY, + height: Constants.TWENTY, ), const SizedBox(width: Constants.SPACING), Expanded( diff --git a/lib/src/features/clinic_card/presentation/widgets/health_record.dart b/lib/src/features/clinic_card/presentation/widgets/health_record.dart deleted file mode 100644 index a38904d7..00000000 --- a/lib/src/features/clinic_card/presentation/widgets/health_record.dart +++ /dev/null @@ -1,216 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:nishauri/src/shared/display/CustomAppBar.dart'; -import 'package:nishauri/src/shared/display/daily_card.dart'; -import 'package:nishauri/src/shared/input/Button.dart'; -import 'package:nishauri/src/utils/constants.dart'; - -class HealthRecord extends StatelessWidget { - const HealthRecord({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Scaffold( - body: Column( - children: [ - const CustomAppBar( - color: Constants.clinicCardBgColor, - height: 120, - smallTitle: "Allergies", - rightBtTitle: "", - ), - Expanded( - child: SingleChildScrollView( - padding: const EdgeInsets.all(Constants.SPACING), - child: Column( - children: [ - _buildFilterMenu(theme), - _buildDateRow("16 October 2024", theme), - const SizedBox(height: Constants.SPACING), - _buildHospitalRow("KENYATTA NATIONAL HOSPITAL", theme), - const SizedBox(height: Constants.SPACING), - const Divider(), - _buildListView(theme), - const Divider(), - const SizedBox(height: Constants.SPACING), - _buildDateRow("25 October 2024", theme), - const SizedBox(height: Constants.SPACING), - _buildHospitalRow("KENYATTA NATIONAL HOSPITAL", theme), - const SizedBox(height: Constants.SPACING), - _buildListView(theme), - ], - ), - ), - ), - ], - ), - ); - } - - Widget _buildFilterMenu(ThemeData theme) { - return const Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.end, - children: [ - HealthButton(), - ], - ); - } - - Widget _buildDateRow(String date, ThemeData theme) { - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(date, style: theme.textTheme.titleMedium), - ], - ); - } - - Widget _buildHospitalRow(String hospital, ThemeData theme) { - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(hospital, style: theme.textTheme.titleLarge), - ], - ); - } - - Widget _buildListView(ThemeData theme) { - return ListView.builder( - itemCount: 3, - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { - return ListTile( - title: Card( - child: Padding( - padding: const EdgeInsets.all(Constants.SPACING), - child: ExpansionTile( - title:Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildAllergyRow(theme), - // _buildSeverityRow(theme), - ], - ), - ), - ], - ), - children: [ - ListTile( - title: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("Reactions", style: theme.textTheme.bodyMedium,), - Text("Headache, Arrythmia", style: theme.textTheme.bodySmall,) - ], - ), - const Divider(), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("Onset Date", style: theme.textTheme.bodyMedium,), - Text("25 October, 2024", style: theme.textTheme.bodySmall,) - ], - ), - ], - ), - ) - ], - ) - ), - ), - - ); - }, - ); - } - - Widget _buildAllergyRow(ThemeData theme) { - return Row( - children: [ - SvgPicture.asset( - "assets/images/boldDuotoneMedicineVirus.svg", - width: 20, - height: 20, - ), - const SizedBox(width: Constants.SPACING), - Text("Allergies", style: theme.textTheme.titleMedium), - Spacer(), - Text("Mild", style: theme.textTheme.bodyMedium), - // TextButton( - // onPressed: () {}, - // child: const Icon(Icons.chevron_right), - // ), - ], - ); - } -} - -class HealthButton extends StatefulWidget { - const HealthButton({Key? key}) : super(key: key); - - @override - _HealthButtonState createState() => _HealthButtonState(); -} - -class _HealthButtonState extends State { - // Define the selectedMenu variable - SampleItem? selectedMenu; - - @override - Widget build(BuildContext context) { - return Container( - width: MediaQuery.of(context).size.width * 0.1, - child: MenuAnchor( - builder: (BuildContext context, MenuController controller, Widget? child) { - return IconButton( - onPressed: () { - // Open or close the menu on button press - if (controller.isOpen) { - controller.close(); - } else { - controller.open(); - } - }, - icon: SvgPicture.asset( - "assets/images/clinic_menu.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - height: 40, - width: 40, - ), - tooltip: 'Show menu', - ); - }, - menuChildren: List.generate( - 3, - (int index) => MenuItemButton( - onPressed: () { - // Update the selectedMenu state when a menu item is pressed - setState(() { - selectedMenu = SampleItem.values[index]; - }); - }, - child: Text('Item ${index + 1}'), - ), - ), - ), - ); - } -} - -// Enum to represent sample menu items -enum SampleItem { - item1, - item2, - item3, -} diff --git a/lib/src/features/clinic_card/presentation/widgets/immunization.dart b/lib/src/features/clinic_card/presentation/widgets/immunization.dart index 5614dbba..9c360606 100644 --- a/lib/src/features/clinic_card/presentation/widgets/immunization.dart +++ b/lib/src/features/clinic_card/presentation/widgets/immunization.dart @@ -67,7 +67,7 @@ class _ImmunizationTestState extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: 120, + height: Constants.APP_BAR_HEIGHT, smallTitle: "Immunizations", rightBtTitle: "", ), @@ -226,8 +226,8 @@ class _ImmunizationTestState extends State { children: [ SvgPicture.asset( "assets/images/boldDuotoneMedicineStethoscope.svg", - width: 20, - height: 20, + width: Constants.TWENTY, + height: Constants.TWENTY, ), const SizedBox(width: Constants.SPACING), Expanded( diff --git a/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart b/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart index 90d38489..d9213793 100644 --- a/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart @@ -64,7 +64,7 @@ class _LabResultHealthRecord extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: 120, + height: Constants.APP_BAR_HEIGHT, smallTitle: "Lab Results", rightBtTitle: "", ), @@ -222,8 +222,8 @@ class _LabResultHealthRecord extends State { children: [ SvgPicture.asset( "assets/images/boldDuotoneMedicineTestTube.svg", - width: 20, - height: 20, + width: Constants.TWENTY, + height: Constants.TWENTY, ), const SizedBox(width: Constants.SPACING), Expanded( diff --git a/lib/src/features/clinic_card/presentation/widgets/medication.dart b/lib/src/features/clinic_card/presentation/widgets/medication.dart index 64ee37b8..a3eede85 100644 --- a/lib/src/features/clinic_card/presentation/widgets/medication.dart +++ b/lib/src/features/clinic_card/presentation/widgets/medication.dart @@ -67,7 +67,7 @@ class _MedicationRecordState extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: 120, + height: Constants.APP_BAR_HEIGHT, smallTitle: "Medications", rightBtTitle: "", ), @@ -226,8 +226,8 @@ class _MedicationRecordState extends State { children: [ SvgPicture.asset( "assets/images/boldDuotoneMedicineStethoscope.svg", - width: 20, - height: 20, + width: Constants.TWENTY, + height: Constants.TWENTY, ), const SizedBox(width: Constants.SPACING), Expanded( diff --git a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart index 580e1ab7..2faf7398 100644 --- a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart @@ -63,7 +63,7 @@ class _VitalHealthRecord extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: 120, + height: Constants.APP_BAR_HEIGHT, smallTitle: "Vitals", rightBtTitle: "", ), @@ -269,8 +269,8 @@ class _VitalHealthRecord extends State { children: [ SvgPicture.asset( "assets/images/boldDuotoneMedicineStethoscope.svg", - width: 20, - height: 20, + width: Constants.TWENTY, + height: Constants.TWENTY, ), const SizedBox(width: Constants.SPACING), Expanded( diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index ac6d76aa..9d22cf4f 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -23,8 +23,10 @@ class Constants { static const SPACING = 10.0; static const MEDIUM_SCREEN_WIDTH = 600.00; static const BUTTON_FONT_SIZE = 20.0; + static const TWENTY = 20.0; static const SIDE_SPACE = 0.0; static const TIME_OUT = 300; + static const APP_BAR_HEIGHT = 120.0; static const facilityDirectoryColor = Color.fromARGB(255, 106, 121, 141); static const labResultsColor = Color.fromARGB(255, 31, 37, 94); static const appointmentsColor = Color.fromARGB(255, 75, 127, 117); From ffb2e5a4ba4f1e30f20c3e03ce2b8a1d6d6337bf Mon Sep 17 00:00:00 2001 From: Ogollah Date: Fri, 15 Nov 2024 16:06:51 +0300 Subject: [PATCH 138/140] (feat) Add BMI graphs --- .../pages/BMICalculatorResultsScreen.dart | 167 +++++++++++++----- .../presentation/pages/bpMonitorScreen.dart | 18 +- .../presentation/widgets/health_card.dart | 8 +- lib/src/shared/display/daily_card.dart | 34 ++-- lib/src/utils/constants.dart | 4 + 5 files changed, 159 insertions(+), 72 deletions(-) diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart index fa061502..d199d432 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart @@ -5,7 +5,9 @@ import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_status_nutrition_provider.dart'; +import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart'; import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/daily_card.dart'; import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/helpers.dart'; @@ -30,11 +32,11 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { // Function to get color for the BMI segment Color getSliderColor(double bmi) { if (bmi < 18.5) { - return Colors.blue; // Malnutrition + return Colors.blue; } else if (bmi < 24.9) { - return Colors.green; // Normal + return Colors.green; } else { - return Colors.red; // Obese + return Colors.red; } } @@ -61,8 +63,6 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { final bmiCategory = getBMICategory(bmi!); final sliderColor = getSliderColor(bmi); - print("this self : $isForSelf"); - return Scaffold( body: Column(children: [ const CustomAppBar( @@ -78,6 +78,18 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Wrap( + spacing: Constants.SIXTEEN, + runSpacing: Constants.SIXTEEN, + children: [ + FilterCard( + onPressed: (){ + + }, + ), + ], + ), + const SizedBox(height: Constants.SPACING,), Text( "Results ${isForSelf != true ? ' for others' : ''}", style: theme.textTheme.headlineLarge?.copyWith( @@ -110,7 +122,7 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { ), ), Container( - height: 20, + height: Constants.TWENTY, child: Stack( alignment: Alignment.center, children: [ @@ -153,43 +165,37 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { data: (data) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - bmiCategory, - style: theme.textTheme.titleLarge?.copyWith( - color: sliderColor, fontWeight: FontWeight.bold - ), - ), const SizedBox(height: Constants.SPACING), - Text( - "Diet & Nutrition", - style: theme.textTheme.titleLarge?.copyWith( - color: Constants.labResultsColor, - ), - ), - const SizedBox(height: Constants.SPACING), - Markdown( - data: data - .where((element) => - element.status == bmiCategory) - .first - .description ?? - "", - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - ), - const SizedBox(height: Constants.SPACING), - Button( - title: "Re-Calculate", - surfixIcon: SvgPicture.asset( - "assets/images/refresh-circle.svg", - semanticsLabel: "Doctors", - fit: BoxFit.contain, - ), - backgroundColor: Constants.selfScreeningBgColor, - textColor: Colors.white, - onPress: () { - context.goNamed(RouteNames.BMI_CALCULATOR); - }, + ExpansionTile( + collapsedBackgroundColor: Constants.bgColor, + backgroundColor: Constants.bgColor, + collapsedIconColor: sliderColor, + title: Text( + "Diet & Nutrition", + style: theme.textTheme.titleLarge?.copyWith( + color: Constants.labResultsColor, + ), + ), + children: [ + const SizedBox(height: Constants.SPACING), + Text( + ' Your BMI is ($bmiCategory)', + style: theme.textTheme.titleLarge?.copyWith( + color: sliderColor, fontWeight: FontWeight.bold + ), + ), + const SizedBox(height: Constants.SPACING), + Markdown( + data: data + .where((element) => + element.status == bmiCategory) + .first + .description ?? + "", + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + ), + ], ), ], ), @@ -200,6 +206,58 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { child: CircularProgressIndicator(), ), ), + const SizedBox(height: Constants.SPACING), + if (isForSelf == true) + SizedBox( + height: Constants.GRAPH_HEIGHT, + child: Padding( + padding: EdgeInsets.all(8.0), + child: Column( + children: [ + Expanded( + child: bmiListAsync.when( + data: (bmiData) { + final displayedData = bmiData.length > 5 ? bmiData.sublist(bmiData.length - 5) : bmiData; + return BMILineGraph(data: displayedData); + }, + + loading: () => Center(child: CircularProgressIndicator()), + error: (error, _) => Center(child: Text("No BMI Data")), + ), + ), + ], + ), + ), + ), + + // Wrap( + // spacing: 1, + // runSpacing: Constants.SIXTEEN, + // children: [ + // bmiListAsync.when( + // data: (data) { + // return BMILineGraph(data: data); + // }, + // loading: () => Center(child: CircularProgressIndicator()), + // error: (error, _) => Center(child: Text("No BMI Data")), + // )] + // ), + // const SizedBox(height: Constants.SPACING), + // Button( + // title: "Calculate BMI", + // surfixIcon: SvgPicture.asset( + // "assets/images/refresh-circle.svg", + // semanticsLabel: "Doctors", + // fit: BoxFit.contain, + // ), + // backgroundColor: Constants.selfScreeningBgColor, + // textColor: Colors.white, + // onPress: () { + // context.goNamed(RouteNames.BMI_CALCULATOR); + // }, + // ), + const SizedBox(height: Constants.SPACING), + ], ), ), @@ -207,6 +265,31 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { ), ] ), + floatingActionButton: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + SizedBox( + width: Constants.TWO_HUNDRED, + child: FloatingActionButton( + backgroundColor: Constants.selfScreeningBgColor, + onPressed: () { + context.goNamed(RouteNames.BMI_CALCULATOR); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: Constants.SMALL_SPACING), + child: Text( + "Calculate BMI", + style: theme.textTheme.bodyLarge?.copyWith(color: Colors.white) + ), + ), + heroTag: null, + elevation: Constants.SMALL_SPACING, + ), + ), + ], + ), + + // bottomNavigationBar: , ); } diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index 7eedc6a7..2eaacc3c 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -90,7 +90,7 @@ class _BPMonitorScreenState extends ConsumerState { const CustomAppBar( // title: "Blood Pressure", color: Constants.selfScreeningBgColor, - height: 120, + height: Constants.APP_BAR_HEIGHT, smallTitle: "Blood Pressure", rightBtTitle: "Add Data", path: RouteNames.BLOOD_PRESSURE_INPUT, @@ -105,8 +105,8 @@ class _BPMonitorScreenState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Wrap( - spacing: 16, - runSpacing: 16, + spacing: Constants.SIXTEEN, + runSpacing: Constants.SIXTEEN, children: [ FilterCard( onPressed: (){ @@ -119,7 +119,7 @@ class _BPMonitorScreenState extends ConsumerState { Row( children: [ Text("Last Record Date:", style: theme.textTheme.bodyLarge), - const SizedBox(width: 4), + const SizedBox(width: Constants.FOUR), Text(DateFormat('dd MMM yyyy').format(displayedData!.created_at), style: theme.textTheme.bodyLarge!.copyWith(color: Colors.grey, fontWeight: FontWeight.bold)), ], ), @@ -127,16 +127,16 @@ class _BPMonitorScreenState extends ConsumerState { Row( children: [ Text("${displayedData.systolic}/${displayedData.diastolic}", style: theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold)), - const SizedBox(width: 4), + const SizedBox(width: Constants.FOUR), Text("mmHG", style: theme.textTheme.bodyMedium), - const SizedBox(width: 4,), + const SizedBox(width: Constants.FOUR,), Text(status, style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status,), ),) ], ), const SizedBox(height: Constants.SPACING,), Wrap( spacing: 1, - runSpacing: 16, + runSpacing: Constants.SIXTEEN, children: [ TrendChartScreen(data: chatData,) ], @@ -156,7 +156,7 @@ class _BPMonitorScreenState extends ConsumerState { Container( decoration: BoxDecoration( color: Constants.bgColor, - borderRadius: BorderRadius.circular(10), + borderRadius: BorderRadius.circular(Constants.SPACING), border: Border.all(color: Constants.bgColor), ), // color: Constants.bgColor, @@ -174,7 +174,7 @@ class _BPMonitorScreenState extends ConsumerState { 'Your Blood Pressure is ', style: theme.textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), ), - const SizedBox(width: 4,), + const SizedBox(width: Constants.FOUR,), Text("($status)", style: theme.textTheme.bodyLarge!.copyWith(color: _getStatusColor(status,), ),) ], ), diff --git a/lib/src/features/self_screening/presentation/widgets/health_card.dart b/lib/src/features/self_screening/presentation/widgets/health_card.dart index 4ce51402..e486f193 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_card.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_card.dart @@ -48,8 +48,8 @@ class HealthCard extends StatelessWidget { if (svgAsset != null) ...[ SvgPicture.asset( svgAsset!, - width: 20, - height: 20, + width: Constants.TWENTY, + height: Constants.TWENTY, ), const SizedBox(width: 10), ], @@ -104,7 +104,7 @@ class HealthCard extends StatelessWidget { return const SizedBox.shrink(); } return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), + padding: const EdgeInsets.symmetric(vertical: Constants.SMALL_SPACING), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -112,7 +112,7 @@ class HealthCard extends StatelessWidget { Row( children: [ Text(value, style: theme.textTheme.titleLarge), - const SizedBox(width: 4), + const SizedBox(width: Constants.FOUR), Text(text, style: theme.textTheme.bodyMedium), ], ), diff --git a/lib/src/shared/display/daily_card.dart b/lib/src/shared/display/daily_card.dart index 7c25f2fb..ab019d65 100644 --- a/lib/src/shared/display/daily_card.dart +++ b/lib/src/shared/display/daily_card.dart @@ -15,26 +15,26 @@ class FilterCard extends StatelessWidget { return Card( color: Constants.bgColor, - elevation: 4, + elevation: Constants.FOUR, child: Padding( - padding: const EdgeInsets.all(10.0), + padding: const EdgeInsets.all(Constants.SPACING), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded(child: _buildColumn("Daily", context)), - const VerticalDivider(thickness: 3, color: Colors.grey), - Expanded(child: _buildColumn("Weekly", context)), - const VerticalDivider(thickness: 3, color: Colors.grey), - Expanded(child: _buildColumn("Monthly", context)), - const VerticalDivider(thickness: 3, color: Colors.grey), - Expanded(child: _buildColumn("6Months", context)), - const VerticalDivider(thickness: 3, color: Colors.grey), - Expanded(child: _buildColumn("Yearly", context)), - ], - ), + IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: _buildColumn("Day", context)), + const VerticalDivider(thickness: 1, color: Colors.grey), + Expanded(child: _buildColumn("Week", context)), + const VerticalDivider(thickness: 1, color: Colors.grey), + Expanded(child: _buildColumn("Month", context)), + const VerticalDivider(thickness: 1, color: Colors.grey), + Expanded(child: _buildColumn("6Months", context)), + ], + ), + ), ], ), ), @@ -44,7 +44,7 @@ class FilterCard extends StatelessWidget { Widget _buildColumn(String day, BuildContext context) { final theme = Theme.of(context); return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), + padding: const EdgeInsets.symmetric(vertical: Constants.SMALL_SPACING), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index 9d22cf4f..0afb7411 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -26,7 +26,11 @@ class Constants { static const TWENTY = 20.0; static const SIDE_SPACE = 0.0; static const TIME_OUT = 300; + static const TWO_HUNDRED = 200.0; + static const GRAPH_HEIGHT = 350.0; static const APP_BAR_HEIGHT = 120.0; + static const FOUR = 4.0; + static const SIXTEEN = 16.0; static const facilityDirectoryColor = Color.fromARGB(255, 106, 121, 141); static const labResultsColor = Color.fromARGB(255, 31, 37, 94); static const appointmentsColor = Color.fromARGB(255, 75, 127, 117); From 8326560814864b7dac097aeacb1d4b9c840b973b Mon Sep 17 00:00:00 2001 From: Ogollah Date: Tue, 26 Nov 2024 16:23:40 +0300 Subject: [PATCH 139/140] :construction: consume bmi filter end point --- .../presentation/widgets/allergy_records.dart | 2 +- .../widgets/condition_records.dart | 2 +- .../presentation/widgets/immunization.dart | 2 +- .../widgets/lab_result_records.dart | 2 +- .../presentation/widgets/medication.dart | 2 +- .../presentation/widgets/vital_records.dart | 2 +- .../widgets/GeneralDashboard.dart | 6 +- .../presentation/pages/BloodSugarScreen.dart | 2 +- .../pages/bs_line_list_Screen.dart | 6 +- .../bmi/data/model/filter_data.dart | 19 ++ .../bmi/data/model/filter_data.freezed.dart | 208 ++++++++++++++++ .../bmi/data/model/filter_data.g.dart | 25 ++ .../bmi/data/model/six_months.dart | 18 ++ .../bmi/data/model/six_months.freezed.dart | 212 ++++++++++++++++ .../bmi/data/model/six_months.g.dart | 23 ++ .../self_screening/bmi/data/model/week.dart | 19 ++ .../bmi/data/model/week.freezed.dart | 231 ++++++++++++++++++ .../self_screening/bmi/data/model/week.g.dart | 24 ++ .../data/providers/bmi_filter_provider.dart | 15 ++ .../repositories/bmi_filter_repository.dart | 14 ++ .../bmi/data/services/bmi_filter_service.dart | 59 +++++ .../bmi/data/services/bmi_log_service.dart | 1 - .../pages/BMICalculatorResultsScreen.dart | 145 ++++++----- .../presentation/pages/BMIHistoryScreen.dart | 25 +- .../presentation/widgets/BMILineGraph.dart | 33 ++- .../presentation/pages/bpMonitorScreen.dart | 6 +- .../presentation/widgets/health_list.dart | 4 +- .../user/data/services/UserService.dart | 1 - .../shared/display/custome_filter_chart.dart | 4 +- lib/src/shared/display/daily_card.dart | 79 +++--- lib/src/utils/constants.dart | 3 +- 31 files changed, 1048 insertions(+), 146 deletions(-) create mode 100644 lib/src/features/self_screening/bmi/data/model/filter_data.dart create mode 100644 lib/src/features/self_screening/bmi/data/model/filter_data.freezed.dart create mode 100644 lib/src/features/self_screening/bmi/data/model/filter_data.g.dart create mode 100644 lib/src/features/self_screening/bmi/data/model/six_months.dart create mode 100644 lib/src/features/self_screening/bmi/data/model/six_months.freezed.dart create mode 100644 lib/src/features/self_screening/bmi/data/model/six_months.g.dart create mode 100644 lib/src/features/self_screening/bmi/data/model/week.dart create mode 100644 lib/src/features/self_screening/bmi/data/model/week.freezed.dart create mode 100644 lib/src/features/self_screening/bmi/data/model/week.g.dart create mode 100644 lib/src/features/self_screening/bmi/data/providers/bmi_filter_provider.dart create mode 100644 lib/src/features/self_screening/bmi/data/repositories/bmi_filter_repository.dart create mode 100644 lib/src/features/self_screening/bmi/data/services/bmi_filter_service.dart diff --git a/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart b/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart index 2d29ae8a..28b13f9e 100644 --- a/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/allergy_records.dart @@ -64,7 +64,7 @@ class _VisitHealthRecord extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: Constants.APP_BAR_HEIGHT, + height: Constants.SMALL_APP_BAR_HEIGHT, smallTitle: "Allergies", rightBtTitle: "", ), diff --git a/lib/src/features/clinic_card/presentation/widgets/condition_records.dart b/lib/src/features/clinic_card/presentation/widgets/condition_records.dart index 764a51e1..292cf6e8 100644 --- a/lib/src/features/clinic_card/presentation/widgets/condition_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/condition_records.dart @@ -66,7 +66,7 @@ class _ConditionHealthRecordState extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: Constants.APP_BAR_HEIGHT, + height: Constants.SMALL_APP_BAR_HEIGHT, smallTitle: "Conditions", rightBtTitle: "", ), diff --git a/lib/src/features/clinic_card/presentation/widgets/immunization.dart b/lib/src/features/clinic_card/presentation/widgets/immunization.dart index 9c360606..82f73d02 100644 --- a/lib/src/features/clinic_card/presentation/widgets/immunization.dart +++ b/lib/src/features/clinic_card/presentation/widgets/immunization.dart @@ -67,7 +67,7 @@ class _ImmunizationTestState extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: Constants.APP_BAR_HEIGHT, + height: Constants.SMALL_APP_BAR_HEIGHT, smallTitle: "Immunizations", rightBtTitle: "", ), diff --git a/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart b/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart index d9213793..d54d62c6 100644 --- a/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/lab_result_records.dart @@ -64,7 +64,7 @@ class _LabResultHealthRecord extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: Constants.APP_BAR_HEIGHT, + height: Constants.SMALL_APP_BAR_HEIGHT, smallTitle: "Lab Results", rightBtTitle: "", ), diff --git a/lib/src/features/clinic_card/presentation/widgets/medication.dart b/lib/src/features/clinic_card/presentation/widgets/medication.dart index a3eede85..f6eccf12 100644 --- a/lib/src/features/clinic_card/presentation/widgets/medication.dart +++ b/lib/src/features/clinic_card/presentation/widgets/medication.dart @@ -67,7 +67,7 @@ class _MedicationRecordState extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: Constants.APP_BAR_HEIGHT, + height: Constants.SMALL_APP_BAR_HEIGHT, smallTitle: "Medications", rightBtTitle: "", ), diff --git a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart index 2faf7398..6af108a9 100644 --- a/lib/src/features/clinic_card/presentation/widgets/vital_records.dart +++ b/lib/src/features/clinic_card/presentation/widgets/vital_records.dart @@ -63,7 +63,7 @@ class _VitalHealthRecord extends State { children: [ const CustomAppBar( color: Constants.clinicCardBgColor, - height: Constants.APP_BAR_HEIGHT, + height: Constants.SMALL_APP_BAR_HEIGHT, smallTitle: "Vitals", rightBtTitle: "", ), diff --git a/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart b/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart index 3f40ef98..f4e52a51 100644 --- a/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart +++ b/lib/src/features/dashboard/presentation/widgets/GeneralDashboard.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_filter_provider.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart'; import 'package:nishauri/src/features/self_screening/bp/data/providers/blood_pressure_provider.dart'; @@ -12,7 +13,7 @@ class GeneralDashboard extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final bmiAsync = ref.watch(bmiListProvider); + final bmiAsync = ref.watch(bmiFilterProvider); final bloodPressureAsync = ref.watch(bloodPressureListProvider); final bloodSugarAsync = ref.watch(bloodSugarEntriesProvider); final theme = Theme.of(context); @@ -31,8 +32,7 @@ class GeneralDashboard extends ConsumerWidget { Expanded( child: bmiAsync.when( data: (bmiData) { - final displayedData = bmiData.length > 5 ? bmiData.sublist(bmiData.length - 5) : bmiData; - return BMILineGraph(data: displayedData); + return BMILineGraph(data: bmiData,); }, loading: () => Center(child: CircularProgressIndicator()), diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart index 7642617d..ae7da6d1 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart @@ -126,7 +126,7 @@ class _BloodSugarScreenState extends ConsumerState { Wrap( spacing: 16, runSpacing: 16, - children: [FilterCard(onPressed: _changeColor)], + children: [FilterCard(columnTitles: ["Day", "Week", "6 Months"],)], ), const SizedBox(height: Constants.SPACING), _buildLastRecordRow(displayedData, theme), diff --git a/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart index 740face7..9933b47e 100644 --- a/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart +++ b/lib/src/features/self_screening/blood_sugar/presentation/pages/bs_line_list_Screen.dart @@ -20,10 +20,10 @@ class BloodSugarRecords extends StatelessWidget { final theme = Theme.of(context); if (data.isEmpty) { - BackgroundImageWidget( - customAppBar: const CustomAppBar( + const BackgroundImageWidget( + customAppBar: CustomAppBar( color: Constants.selfScreeningBgColor, - height: 120, + height: Constants.SMALL_APP_BAR_HEIGHT, smallTitle: "All Record Data", rightBtTitle: "", ), svgImage: 'assets/images/emptyself_screening.svg', diff --git a/lib/src/features/self_screening/bmi/data/model/filter_data.dart b/lib/src/features/self_screening/bmi/data/model/filter_data.dart new file mode 100644 index 00000000..3cffd1e4 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/filter_data.dart @@ -0,0 +1,19 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/six_months.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/week.dart'; + +part 'filter_data.freezed.dart'; +part 'filter_data.g.dart'; + +@Freezed() +class FilterData with _$FilterData { + + const factory FilterData({ + required List week, + required List sixMonths, + String? user_id, + }) = _FilterData; + + factory FilterData.fromJson(Map json) + => _$FilterDataFromJson(json); +} diff --git a/lib/src/features/self_screening/bmi/data/model/filter_data.freezed.dart b/lib/src/features/self_screening/bmi/data/model/filter_data.freezed.dart new file mode 100644 index 00000000..2aa0aa37 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/filter_data.freezed.dart @@ -0,0 +1,208 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'filter_data.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +FilterData _$FilterDataFromJson(Map json) { + return _FilterData.fromJson(json); +} + +/// @nodoc +mixin _$FilterData { + List get week => throw _privateConstructorUsedError; + List get sixMonths => throw _privateConstructorUsedError; + String? get user_id => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $FilterDataCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $FilterDataCopyWith<$Res> { + factory $FilterDataCopyWith( + FilterData value, $Res Function(FilterData) then) = + _$FilterDataCopyWithImpl<$Res, FilterData>; + @useResult + $Res call({List week, List sixMonths, String? user_id}); +} + +/// @nodoc +class _$FilterDataCopyWithImpl<$Res, $Val extends FilterData> + implements $FilterDataCopyWith<$Res> { + _$FilterDataCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? week = null, + Object? sixMonths = null, + Object? user_id = freezed, + }) { + return _then(_value.copyWith( + week: null == week + ? _value.week + : week // ignore: cast_nullable_to_non_nullable + as List, + sixMonths: null == sixMonths + ? _value.sixMonths + : sixMonths // ignore: cast_nullable_to_non_nullable + as List, + user_id: freezed == user_id + ? _value.user_id + : user_id // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$FilterDataImplCopyWith<$Res> + implements $FilterDataCopyWith<$Res> { + factory _$$FilterDataImplCopyWith( + _$FilterDataImpl value, $Res Function(_$FilterDataImpl) then) = + __$$FilterDataImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({List week, List sixMonths, String? user_id}); +} + +/// @nodoc +class __$$FilterDataImplCopyWithImpl<$Res> + extends _$FilterDataCopyWithImpl<$Res, _$FilterDataImpl> + implements _$$FilterDataImplCopyWith<$Res> { + __$$FilterDataImplCopyWithImpl( + _$FilterDataImpl _value, $Res Function(_$FilterDataImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? week = null, + Object? sixMonths = null, + Object? user_id = freezed, + }) { + return _then(_$FilterDataImpl( + week: null == week + ? _value._week + : week // ignore: cast_nullable_to_non_nullable + as List, + sixMonths: null == sixMonths + ? _value._sixMonths + : sixMonths // ignore: cast_nullable_to_non_nullable + as List, + user_id: freezed == user_id + ? _value.user_id + : user_id // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$FilterDataImpl implements _FilterData { + const _$FilterDataImpl( + {required final List week, + required final List sixMonths, + this.user_id}) + : _week = week, + _sixMonths = sixMonths; + + factory _$FilterDataImpl.fromJson(Map json) => + _$$FilterDataImplFromJson(json); + + final List _week; + @override + List get week { + if (_week is EqualUnmodifiableListView) return _week; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_week); + } + + final List _sixMonths; + @override + List get sixMonths { + if (_sixMonths is EqualUnmodifiableListView) return _sixMonths; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_sixMonths); + } + + @override + final String? user_id; + + @override + String toString() { + return 'FilterData(week: $week, sixMonths: $sixMonths, user_id: $user_id)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$FilterDataImpl && + const DeepCollectionEquality().equals(other._week, _week) && + const DeepCollectionEquality() + .equals(other._sixMonths, _sixMonths) && + (identical(other.user_id, user_id) || other.user_id == user_id)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash( + runtimeType, + const DeepCollectionEquality().hash(_week), + const DeepCollectionEquality().hash(_sixMonths), + user_id); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$FilterDataImplCopyWith<_$FilterDataImpl> get copyWith => + __$$FilterDataImplCopyWithImpl<_$FilterDataImpl>(this, _$identity); + + @override + Map toJson() { + return _$$FilterDataImplToJson( + this, + ); + } +} + +abstract class _FilterData implements FilterData { + const factory _FilterData( + {required final List week, + required final List sixMonths, + final String? user_id}) = _$FilterDataImpl; + + factory _FilterData.fromJson(Map json) = + _$FilterDataImpl.fromJson; + + @override + List get week; + @override + List get sixMonths; + @override + String? get user_id; + @override + @JsonKey(ignore: true) + _$$FilterDataImplCopyWith<_$FilterDataImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/self_screening/bmi/data/model/filter_data.g.dart b/lib/src/features/self_screening/bmi/data/model/filter_data.g.dart new file mode 100644 index 00000000..fb1fe538 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/filter_data.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'filter_data.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$FilterDataImpl _$$FilterDataImplFromJson(Map json) => + _$FilterDataImpl( + week: (json['week'] as List) + .map((e) => Week.fromJson(e as Map)) + .toList(), + sixMonths: (json['sixMonths'] as List) + .map((e) => SixMonths.fromJson(e as Map)) + .toList(), + user_id: json['user_id'] as String?, + ); + +Map _$$FilterDataImplToJson(_$FilterDataImpl instance) => + { + 'week': instance.week, + 'sixMonths': instance.sixMonths, + 'user_id': instance.user_id, + }; diff --git a/lib/src/features/self_screening/bmi/data/model/six_months.dart b/lib/src/features/self_screening/bmi/data/model/six_months.dart new file mode 100644 index 00000000..9a292268 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/six_months.dart @@ -0,0 +1,18 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'six_months.freezed.dart'; +part 'six_months.g.dart'; + +@Freezed() +class SixMonths with _$SixMonths { + + const factory SixMonths({ + required String month, + double? avgWeight, + double? avgHeight, + required double avgResults, + }) = _SixMonths; + + factory SixMonths.fromJson(Map json) + => _$SixMonthsFromJson(json); +} diff --git a/lib/src/features/self_screening/bmi/data/model/six_months.freezed.dart b/lib/src/features/self_screening/bmi/data/model/six_months.freezed.dart new file mode 100644 index 00000000..32042d0c --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/six_months.freezed.dart @@ -0,0 +1,212 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'six_months.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SixMonths _$SixMonthsFromJson(Map json) { + return _SixMonths.fromJson(json); +} + +/// @nodoc +mixin _$SixMonths { + String get month => throw _privateConstructorUsedError; + double? get avgWeight => throw _privateConstructorUsedError; + double? get avgHeight => throw _privateConstructorUsedError; + double get avgResults => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $SixMonthsCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SixMonthsCopyWith<$Res> { + factory $SixMonthsCopyWith(SixMonths value, $Res Function(SixMonths) then) = + _$SixMonthsCopyWithImpl<$Res, SixMonths>; + @useResult + $Res call( + {String month, double? avgWeight, double? avgHeight, double avgResults}); +} + +/// @nodoc +class _$SixMonthsCopyWithImpl<$Res, $Val extends SixMonths> + implements $SixMonthsCopyWith<$Res> { + _$SixMonthsCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? month = null, + Object? avgWeight = freezed, + Object? avgHeight = freezed, + Object? avgResults = null, + }) { + return _then(_value.copyWith( + month: null == month + ? _value.month + : month // ignore: cast_nullable_to_non_nullable + as String, + avgWeight: freezed == avgWeight + ? _value.avgWeight + : avgWeight // ignore: cast_nullable_to_non_nullable + as double?, + avgHeight: freezed == avgHeight + ? _value.avgHeight + : avgHeight // ignore: cast_nullable_to_non_nullable + as double?, + avgResults: null == avgResults + ? _value.avgResults + : avgResults // ignore: cast_nullable_to_non_nullable + as double, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SixMonthsImplCopyWith<$Res> + implements $SixMonthsCopyWith<$Res> { + factory _$$SixMonthsImplCopyWith( + _$SixMonthsImpl value, $Res Function(_$SixMonthsImpl) then) = + __$$SixMonthsImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String month, double? avgWeight, double? avgHeight, double avgResults}); +} + +/// @nodoc +class __$$SixMonthsImplCopyWithImpl<$Res> + extends _$SixMonthsCopyWithImpl<$Res, _$SixMonthsImpl> + implements _$$SixMonthsImplCopyWith<$Res> { + __$$SixMonthsImplCopyWithImpl( + _$SixMonthsImpl _value, $Res Function(_$SixMonthsImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? month = null, + Object? avgWeight = freezed, + Object? avgHeight = freezed, + Object? avgResults = null, + }) { + return _then(_$SixMonthsImpl( + month: null == month + ? _value.month + : month // ignore: cast_nullable_to_non_nullable + as String, + avgWeight: freezed == avgWeight + ? _value.avgWeight + : avgWeight // ignore: cast_nullable_to_non_nullable + as double?, + avgHeight: freezed == avgHeight + ? _value.avgHeight + : avgHeight // ignore: cast_nullable_to_non_nullable + as double?, + avgResults: null == avgResults + ? _value.avgResults + : avgResults // ignore: cast_nullable_to_non_nullable + as double, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SixMonthsImpl implements _SixMonths { + const _$SixMonthsImpl( + {required this.month, + this.avgWeight, + this.avgHeight, + required this.avgResults}); + + factory _$SixMonthsImpl.fromJson(Map json) => + _$$SixMonthsImplFromJson(json); + + @override + final String month; + @override + final double? avgWeight; + @override + final double? avgHeight; + @override + final double avgResults; + + @override + String toString() { + return 'SixMonths(month: $month, avgWeight: $avgWeight, avgHeight: $avgHeight, avgResults: $avgResults)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SixMonthsImpl && + (identical(other.month, month) || other.month == month) && + (identical(other.avgWeight, avgWeight) || + other.avgWeight == avgWeight) && + (identical(other.avgHeight, avgHeight) || + other.avgHeight == avgHeight) && + (identical(other.avgResults, avgResults) || + other.avgResults == avgResults)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => + Object.hash(runtimeType, month, avgWeight, avgHeight, avgResults); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$SixMonthsImplCopyWith<_$SixMonthsImpl> get copyWith => + __$$SixMonthsImplCopyWithImpl<_$SixMonthsImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SixMonthsImplToJson( + this, + ); + } +} + +abstract class _SixMonths implements SixMonths { + const factory _SixMonths( + {required final String month, + final double? avgWeight, + final double? avgHeight, + required final double avgResults}) = _$SixMonthsImpl; + + factory _SixMonths.fromJson(Map json) = + _$SixMonthsImpl.fromJson; + + @override + String get month; + @override + double? get avgWeight; + @override + double? get avgHeight; + @override + double get avgResults; + @override + @JsonKey(ignore: true) + _$$SixMonthsImplCopyWith<_$SixMonthsImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/self_screening/bmi/data/model/six_months.g.dart b/lib/src/features/self_screening/bmi/data/model/six_months.g.dart new file mode 100644 index 00000000..bfbd9ccd --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/six_months.g.dart @@ -0,0 +1,23 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'six_months.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SixMonthsImpl _$$SixMonthsImplFromJson(Map json) => + _$SixMonthsImpl( + month: json['month'] as String, + avgWeight: (json['avgWeight'] as num?)?.toDouble(), + avgHeight: (json['avgHeight'] as num?)?.toDouble(), + avgResults: (json['avgResults'] as num).toDouble(), + ); + +Map _$$SixMonthsImplToJson(_$SixMonthsImpl instance) => + { + 'month': instance.month, + 'avgWeight': instance.avgWeight, + 'avgHeight': instance.avgHeight, + 'avgResults': instance.avgResults, + }; diff --git a/lib/src/features/self_screening/bmi/data/model/week.dart b/lib/src/features/self_screening/bmi/data/model/week.dart new file mode 100644 index 00000000..fd59d8e0 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/week.dart @@ -0,0 +1,19 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'week.freezed.dart'; +part 'week.g.dart'; + +@Freezed() +class Week with _$Week { + + const factory Week({ + required String dayName, + String? date, + double? weight, + double? height, + required double results, + }) = _Week; + + factory Week.fromJson(Map json) + => _$WeekFromJson(json); +} diff --git a/lib/src/features/self_screening/bmi/data/model/week.freezed.dart b/lib/src/features/self_screening/bmi/data/model/week.freezed.dart new file mode 100644 index 00000000..e3f5f109 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/week.freezed.dart @@ -0,0 +1,231 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'week.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Week _$WeekFromJson(Map json) { + return _Week.fromJson(json); +} + +/// @nodoc +mixin _$Week { + String get dayName => throw _privateConstructorUsedError; + String? get date => throw _privateConstructorUsedError; + double? get weight => throw _privateConstructorUsedError; + double? get height => throw _privateConstructorUsedError; + double get results => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $WeekCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $WeekCopyWith<$Res> { + factory $WeekCopyWith(Week value, $Res Function(Week) then) = + _$WeekCopyWithImpl<$Res, Week>; + @useResult + $Res call( + {String dayName, + String? date, + double? weight, + double? height, + double results}); +} + +/// @nodoc +class _$WeekCopyWithImpl<$Res, $Val extends Week> + implements $WeekCopyWith<$Res> { + _$WeekCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? dayName = null, + Object? date = freezed, + Object? weight = freezed, + Object? height = freezed, + Object? results = null, + }) { + return _then(_value.copyWith( + dayName: null == dayName + ? _value.dayName + : dayName // ignore: cast_nullable_to_non_nullable + as String, + date: freezed == date + ? _value.date + : date // ignore: cast_nullable_to_non_nullable + as String?, + weight: freezed == weight + ? _value.weight + : weight // ignore: cast_nullable_to_non_nullable + as double?, + height: freezed == height + ? _value.height + : height // ignore: cast_nullable_to_non_nullable + as double?, + results: null == results + ? _value.results + : results // ignore: cast_nullable_to_non_nullable + as double, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$WeekImplCopyWith<$Res> implements $WeekCopyWith<$Res> { + factory _$$WeekImplCopyWith( + _$WeekImpl value, $Res Function(_$WeekImpl) then) = + __$$WeekImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String dayName, + String? date, + double? weight, + double? height, + double results}); +} + +/// @nodoc +class __$$WeekImplCopyWithImpl<$Res> + extends _$WeekCopyWithImpl<$Res, _$WeekImpl> + implements _$$WeekImplCopyWith<$Res> { + __$$WeekImplCopyWithImpl(_$WeekImpl _value, $Res Function(_$WeekImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? dayName = null, + Object? date = freezed, + Object? weight = freezed, + Object? height = freezed, + Object? results = null, + }) { + return _then(_$WeekImpl( + dayName: null == dayName + ? _value.dayName + : dayName // ignore: cast_nullable_to_non_nullable + as String, + date: freezed == date + ? _value.date + : date // ignore: cast_nullable_to_non_nullable + as String?, + weight: freezed == weight + ? _value.weight + : weight // ignore: cast_nullable_to_non_nullable + as double?, + height: freezed == height + ? _value.height + : height // ignore: cast_nullable_to_non_nullable + as double?, + results: null == results + ? _value.results + : results // ignore: cast_nullable_to_non_nullable + as double, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$WeekImpl implements _Week { + const _$WeekImpl( + {required this.dayName, + this.date, + this.weight, + this.height, + required this.results}); + + factory _$WeekImpl.fromJson(Map json) => + _$$WeekImplFromJson(json); + + @override + final String dayName; + @override + final String? date; + @override + final double? weight; + @override + final double? height; + @override + final double results; + + @override + String toString() { + return 'Week(dayName: $dayName, date: $date, weight: $weight, height: $height, results: $results)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$WeekImpl && + (identical(other.dayName, dayName) || other.dayName == dayName) && + (identical(other.date, date) || other.date == date) && + (identical(other.weight, weight) || other.weight == weight) && + (identical(other.height, height) || other.height == height) && + (identical(other.results, results) || other.results == results)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => + Object.hash(runtimeType, dayName, date, weight, height, results); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$WeekImplCopyWith<_$WeekImpl> get copyWith => + __$$WeekImplCopyWithImpl<_$WeekImpl>(this, _$identity); + + @override + Map toJson() { + return _$$WeekImplToJson( + this, + ); + } +} + +abstract class _Week implements Week { + const factory _Week( + {required final String dayName, + final String? date, + final double? weight, + final double? height, + required final double results}) = _$WeekImpl; + + factory _Week.fromJson(Map json) = _$WeekImpl.fromJson; + + @override + String get dayName; + @override + String? get date; + @override + double? get weight; + @override + double? get height; + @override + double get results; + @override + @JsonKey(ignore: true) + _$$WeekImplCopyWith<_$WeekImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/features/self_screening/bmi/data/model/week.g.dart b/lib/src/features/self_screening/bmi/data/model/week.g.dart new file mode 100644 index 00000000..45f2f944 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/model/week.g.dart @@ -0,0 +1,24 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'week.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$WeekImpl _$$WeekImplFromJson(Map json) => _$WeekImpl( + dayName: json['dayName'] as String, + date: json['date'] as String?, + weight: (json['weight'] as num?)?.toDouble(), + height: (json['height'] as num?)?.toDouble(), + results: (json['results'] as num).toDouble(), + ); + +Map _$$WeekImplToJson(_$WeekImpl instance) => + { + 'dayName': instance.dayName, + 'date': instance.date, + 'weight': instance.weight, + 'height': instance.height, + 'results': instance.results, + }; diff --git a/lib/src/features/self_screening/bmi/data/providers/bmi_filter_provider.dart b/lib/src/features/self_screening/bmi/data/providers/bmi_filter_provider.dart new file mode 100644 index 00000000..883f7f57 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/providers/bmi_filter_provider.dart @@ -0,0 +1,15 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/filter_data.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/repositories/bmi_filter_repository.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/services/bmi_filter_service.dart'; + +final bmiFilterRepositoryProvider = Provider((ref) { + return BMIFilterRepository(BMIFilterService()); +}); + +final bmiFilterProvider = FutureProvider((ref) async { + final repository = ref.watch(bmiFilterRepositoryProvider); + return await repository.fetchBMIFilter(); +}); + +final selectedIndexProvider = StateProvider((ref) => 0); \ No newline at end of file diff --git a/lib/src/features/self_screening/bmi/data/repositories/bmi_filter_repository.dart b/lib/src/features/self_screening/bmi/data/repositories/bmi_filter_repository.dart new file mode 100644 index 00000000..b8256333 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/repositories/bmi_filter_repository.dart @@ -0,0 +1,14 @@ +import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_log.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/filter_data.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/services/bmi_filter_service.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/services/bmi_log_service.dart'; + +class BMIFilterRepository { + final BMIFilterService _service; + + BMIFilterRepository(this._service); + + Future fetchBMIFilter() async { + return await _service.fetchBMIFilter(); + } +} diff --git a/lib/src/features/self_screening/bmi/data/services/bmi_filter_service.dart b/lib/src/features/self_screening/bmi/data/services/bmi_filter_service.dart new file mode 100644 index 00000000..32d89c42 --- /dev/null +++ b/lib/src/features/self_screening/bmi/data/services/bmi_filter_service.dart @@ -0,0 +1,59 @@ +import 'dart:convert'; +import 'package:http/http.dart'; +import 'package:nishauri/src/features/auth/data/respositories/auth_repository.dart'; +import 'package:nishauri/src/features/auth/data/services/AuthApiService.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/filter_data.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/six_months.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/week.dart'; +import 'package:nishauri/src/shared/interfaces/HTTPService.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class BMIFilterService extends HTTPService{ + final AuthRepository _repository = AuthRepository(AuthApiService()); + + Future fetchBMIFilter_(dynamic args) async { + final id = await _repository.getUserId(); + final tokenPair = await getCachedToken(); + var headers = {'Authorization': 'Bearer ${tokenPair.accessToken}'}; + var url = '${Constants.BASE_URL_NEW}get_bmi_filter?user_id=$id'; + final response = request( + url: url, + token: tokenPair, + method: 'GET', + requestHeaders: headers, + userId: id); + return response; + } + + Future fetchBMIFilter() async { + final response = await call(fetchBMIFilter_, null); + + if (response.statusCode == 200) { + final responseString = await response.stream.bytesToString(); + final Map responseData = json.decode(responseString); + + if (responseData["success"] == true) { + final Map data = responseData["data"]; + + final List week = []; + final List sixMonths = []; + + final List weekly = data['weekly']; + week.addAll(weekly.map((wk) => Week.fromJson(wk))); + + final List sixMonthly = data['sixMonthly']; + sixMonths.addAll(sixMonthly.map((mn) => SixMonths.fromJson(mn))); + return FilterData.fromJson({ + "week" : week, + "sixMonths" : sixMonths, + "user_id" : data["user_id"] + }); + } else { + throw Exception(responseData["message"]); + } + } else { + throw Exception("Failed to fetch data! Status code: ${response.statusCode}"); + } + } + +} diff --git a/lib/src/features/self_screening/bmi/data/services/bmi_log_service.dart b/lib/src/features/self_screening/bmi/data/services/bmi_log_service.dart index bfcbc483..a70922b7 100644 --- a/lib/src/features/self_screening/bmi/data/services/bmi_log_service.dart +++ b/lib/src/features/self_screening/bmi/data/services/bmi_log_service.dart @@ -81,7 +81,6 @@ class BMILogService extends HTTPService{ final response = await call(fetchBMI_, null); if (response.statusCode == 200) { final responseString = await response.stream.bytesToString(); - // final String responseString = await rootBundle.loadString('assets/data/bmi_log.json'); final Map responseData = json.decode(responseString); if (responseData["success"] == true){ final List jsonList = responseData["data"]["bmi_log"]; diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart index d199d432..59bf2d9e 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart @@ -3,6 +3,8 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/filter_data.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_filter_provider.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_log_provider.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/providers/bmi_status_nutrition_provider.dart'; import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart'; @@ -13,6 +15,8 @@ import 'package:nishauri/src/utils/constants.dart'; import 'package:nishauri/src/utils/helpers.dart'; import 'package:nishauri/src/utils/routes.dart'; +final selectedIndexProvider = StateProvider((ref) => 1); + class BMICalculatorResultsScreen extends HookConsumerWidget { final double? otherBMI; final bool? isForSelf; @@ -45,6 +49,9 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { final theme = Theme.of(context); final bmiStatusNutritionAsync = ref.watch(bmiNutritionProvider); final bmiListAsync = ref.watch(bmiListProvider); + final bmiFilter = ref.watch(bmiFilterProvider); + final selectedIndex = ref.watch(selectedIndexProvider); + final filterData = selectedIndex == 0 ? "Week" : "6 Months"; final currentBMIEntries = bmiListAsync.when( data: (data) { @@ -66,8 +73,8 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { return Scaffold( body: Column(children: [ const CustomAppBar( - title: "BMI Calculator ⚖️", - color: Constants.selfScreeningBgColor, + title: "BMI Calculator ⚖️", + color: Constants.selfScreeningBgColor, subTitle: "Empower Your Health Journey with BMI Insights", svgPathGroup: "assets/images/group_clinic_card.svg", ), @@ -78,18 +85,19 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Wrap( - spacing: Constants.SIXTEEN, - runSpacing: Constants.SIXTEEN, - children: [ - FilterCard( - onPressed: (){ - - }, - ), - ], - ), - const SizedBox(height: Constants.SPACING,), + Wrap( + spacing: Constants.SIXTEEN, + runSpacing: Constants.SIXTEEN, + children: [ + FilterCard( + columnTitles: ["Week", "6 Months"], + onPressed: (index) { + ref.read(selectedIndexProvider.notifier).state = index; + } + ), + ], + ), + const SizedBox(height: Constants.SPACING,), Text( "Results ${isForSelf != true ? ' for others' : ''}", style: theme.textTheme.headlineLarge?.copyWith( @@ -108,7 +116,7 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { Text( bmiCategory, style: theme.textTheme.titleMedium?.copyWith( - color: sliderColor + color: sliderColor ), ), ], @@ -166,16 +174,40 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: Constants.SPACING), + if (isForSelf == true) + SizedBox( + height: Constants.GRAPH_HEIGHT, + child: Padding( + padding: EdgeInsets.all(8.0), + child: Column( + children: [ + Expanded( + child: bmiFilter.when( + data: (bmiData) { + print(selectedIndex); + print("BMI Filtered: ${bmiData}"); + return BMILineGraph(data: bmiData, filter: filterData,); + }, + + loading: () => Center(child: CircularProgressIndicator()), + error: (error, _) => Center(child: Text("No BMI Data")), + ), + ), + ], + ), + ), + ), + const SizedBox(height: Constants.SPACING), ExpansionTile( collapsedBackgroundColor: Constants.bgColor, backgroundColor: Constants.bgColor, - collapsedIconColor: sliderColor, - title: Text( - "Diet & Nutrition", - style: theme.textTheme.titleLarge?.copyWith( - color: Constants.labResultsColor, - ), + collapsedIconColor: sliderColor, + title: Text( + "Diet & Nutrition", + style: theme.textTheme.titleLarge?.copyWith( + color: Constants.labResultsColor, ), + ), children: [ const SizedBox(height: Constants.SPACING), Text( @@ -197,6 +229,18 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { ), ], ), + const SizedBox(height: Constants.SPACING), + Card( + color: Constants.bgColor, + child: ListTile( + title: Text("Show All Data", style: theme.textTheme.titleSmall!.copyWith(fontWeight: FontWeight.bold),), + trailing: const Icon(Icons.arrow_forward_ios_outlined), + onTap: (){ + ref.refresh(bmiListProvider); + context.goNamed(RouteNames.BMI_HISTORY, extra: data); + }, + ), + ), ], ), error: (e, stackTrace) => Align( @@ -207,57 +251,6 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { ), ), const SizedBox(height: Constants.SPACING), - if (isForSelf == true) - SizedBox( - height: Constants.GRAPH_HEIGHT, - child: Padding( - padding: EdgeInsets.all(8.0), - child: Column( - children: [ - Expanded( - child: bmiListAsync.when( - data: (bmiData) { - final displayedData = bmiData.length > 5 ? bmiData.sublist(bmiData.length - 5) : bmiData; - return BMILineGraph(data: displayedData); - }, - - loading: () => Center(child: CircularProgressIndicator()), - error: (error, _) => Center(child: Text("No BMI Data")), - ), - ), - ], - ), - ), - ), - - // Wrap( - // spacing: 1, - // runSpacing: Constants.SIXTEEN, - // children: [ - // bmiListAsync.when( - // data: (data) { - // return BMILineGraph(data: data); - // }, - // loading: () => Center(child: CircularProgressIndicator()), - // error: (error, _) => Center(child: Text("No BMI Data")), - // )] - // ), - // const SizedBox(height: Constants.SPACING), - // Button( - // title: "Calculate BMI", - // surfixIcon: SvgPicture.asset( - // "assets/images/refresh-circle.svg", - // semanticsLabel: "Doctors", - // fit: BoxFit.contain, - // ), - // backgroundColor: Constants.selfScreeningBgColor, - // textColor: Colors.white, - // onPress: () { - // context.goNamed(RouteNames.BMI_CALCULATOR); - // }, - // ), - const SizedBox(height: Constants.SPACING), - ], ), ), @@ -275,15 +268,15 @@ class BMICalculatorResultsScreen extends HookConsumerWidget { onPressed: () { context.goNamed(RouteNames.BMI_CALCULATOR); }, + heroTag: null, + elevation: Constants.SMALL_SPACING, child: Padding( padding: const EdgeInsets.symmetric(horizontal: Constants.SMALL_SPACING), child: Text( - "Calculate BMI", - style: theme.textTheme.bodyLarge?.copyWith(color: Colors.white) + "Calculate BMI", + style: theme.textTheme.bodyLarge?.copyWith(color: Colors.white) ), ), - heroTag: null, - elevation: Constants.SMALL_SPACING, ), ), ], diff --git a/lib/src/features/self_screening/bmi/presentation/pages/BMIHistoryScreen.dart b/lib/src/features/self_screening/bmi/presentation/pages/BMIHistoryScreen.dart index 7e09562f..47bd0544 100644 --- a/lib/src/features/self_screening/bmi/presentation/pages/BMIHistoryScreen.dart +++ b/lib/src/features/self_screening/bmi/presentation/pages/BMIHistoryScreen.dart @@ -8,6 +8,7 @@ import 'package:nishauri/src/features/self_screening/bmi/presentation/widgets/BM import 'package:nishauri/src/shared/display/CustomAppBar.dart'; import 'package:nishauri/src/shared/display/background_image_widget.dart'; import 'package:nishauri/src/utils/constants.dart'; +import 'package:nishauri/src/utils/routes.dart'; class BMIHistoryScreen extends HookWidget { @override @@ -24,9 +25,11 @@ class BMIHistoryScreen extends HookWidget { return Column( children: [ const CustomAppBar( - title: "BMI Monitor 📈", - // icon: Icons.trending_up, - color: Constants.bmiCalculatorColor, + smallTitle: "All Record Data", + height: Constants.SMALL_APP_BAR_HEIGHT, + rightBtTitle: "Record BMI", + path: RouteNames.BMI_CALCULATOR, + color: Constants.selfScreeningBgColor, ), Expanded( child: Center( @@ -38,10 +41,10 @@ class BMIHistoryScreen extends HookWidget { flex: 1, child: BMILinelist(data: data), ), - Expanded( - flex: 1, - child: BMILineGraph(data: displayedData), - ), + // Expanded( + // flex: 1, + // child: BMILineGraph(data: displayedData), + // ), ], ), ), @@ -53,11 +56,13 @@ class BMIHistoryScreen extends HookWidget { loading: () => const Center(child: CircularProgressIndicator()), error: (error, _) => BackgroundImageWidget( customAppBar: const CustomAppBar( - title: "BMI Monitor 📈", + smallTitle: "All Record Data", + height: Constants.SMALL_APP_BAR_HEIGHT, + rightBtTitle: "Record BMI", // icon: Icons.trending_up, - color: Constants.bmiCalculatorColor, + color: Constants.selfScreeningBgColor, ), - svgImage: 'assets/images/lab-empty-state.svg', + svgImage: 'assets/images/lab-eBLOOD_SUGAR_INPUTmpty-state.svg', notFoundText: "No BMI Data", floatingButtonIcon1: Icons.refresh, floatingButtonAction1: () { diff --git a/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart index 0417b01c..ea80c79c 100644 --- a/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart +++ b/lib/src/features/self_screening/bmi/presentation/widgets/BMILineGraph.dart @@ -1,30 +1,47 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:nishauri/src/features/self_screening/bmi/data/model/bmi_log.dart'; +import 'package:nishauri/src/features/self_screening/bmi/data/model/filter_data.dart'; import 'package:nishauri/src/shared/charts/CustomLineChart.dart'; import 'package:nishauri/src/shared/display/custome_filter_chart.dart'; import 'package:nishauri/src/utils/constants.dart'; class BMILineGraph extends StatelessWidget { - final List data; -const BMILineGraph({required this.data, Key? key}): super(key: key); + final FilterData data; + final String? filter; +const BMILineGraph({required this.data, this.filter, Key? key}): super(key: key); @override Widget build(BuildContext context) { + final List fData = []; + fData.add(data); + print(" filter : $data"); final List gradientColors = [ Constants.bmiCalculatorColor.withOpacity(0.3), Constants.bmiCalculatorShortcutBgColor.withOpacity(0), ]; - data.sort((a, b) => b.created_at.compareTo(a.created_at)); - final dataPoints = data.asMap().entries.map((entry) { + final dataPoints = fData.asMap().entries.map((entry) { final index = entry.key.toDouble(); - final bmi = entry.value.results; - return FlSpot(index, bmi); + final double bmiFilter ; + if (filter == "6 Months") { + bmiFilter = entry.value.sixMonths.first.avgResults; + } + else { + bmiFilter = entry.value.week.first.results; + } + return FlSpot(index, bmiFilter); }).toList(); - final date = data.asMap().entries.map((e) { - return e.value.created_at.toString(); + final date = fData.asMap().entries.map((e) { + final String dateFilter; + if (filter == "6 Months") { + dateFilter = e.value.sixMonths.first.month; + } + else { + dateFilter = e.value.week.first.dayName; + } + return dateFilter; }).toList(); return Scaffold( diff --git a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart index 2eaacc3c..2131f935 100644 --- a/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart +++ b/lib/src/features/self_screening/bp/presentation/pages/bpMonitorScreen.dart @@ -90,7 +90,7 @@ class _BPMonitorScreenState extends ConsumerState { const CustomAppBar( // title: "Blood Pressure", color: Constants.selfScreeningBgColor, - height: Constants.APP_BAR_HEIGHT, + height: Constants.SMALL_APP_BAR_HEIGHT, smallTitle: "Blood Pressure", rightBtTitle: "Add Data", path: RouteNames.BLOOD_PRESSURE_INPUT, @@ -109,9 +109,7 @@ class _BPMonitorScreenState extends ConsumerState { runSpacing: Constants.SIXTEEN, children: [ FilterCard( - onPressed: (){ - - }, + columnTitles: ["Day", "Week", "6 Months"] ), ], ), diff --git a/lib/src/features/self_screening/presentation/widgets/health_list.dart b/lib/src/features/self_screening/presentation/widgets/health_list.dart index 9f5553ff..beefb58b 100644 --- a/lib/src/features/self_screening/presentation/widgets/health_list.dart +++ b/lib/src/features/self_screening/presentation/widgets/health_list.dart @@ -39,8 +39,8 @@ class ItemList extends StatelessWidget { leading: svgAsset != null ? SvgPicture.asset( svgAsset![index], - width: 20, - height: 20, + width: Constants.TWENTY, + height: Constants.TWENTY, color: color, ) : null, diff --git a/lib/src/features/user/data/services/UserService.dart b/lib/src/features/user/data/services/UserService.dart index caed9857..d52897a0 100644 --- a/lib/src/features/user/data/services/UserService.dart +++ b/lib/src/features/user/data/services/UserService.dart @@ -72,7 +72,6 @@ class UserService extends HTTPService { Future getUser() async { final response = await call(getUser_, null); - print(response.statusCode); final responseString = await response.stream.bytesToString(); final userData = json.decode(responseString); final Map person = userData["data"]; diff --git a/lib/src/shared/display/custome_filter_chart.dart b/lib/src/shared/display/custome_filter_chart.dart index c7d2368a..8f12ab94 100644 --- a/lib/src/shared/display/custome_filter_chart.dart +++ b/lib/src/shared/display/custome_filter_chart.dart @@ -69,8 +69,8 @@ class CustomFilterLineChart extends StatelessWidget { // Determine the label based on the filter switch (filter) { case 'Daily': - DateTime date = DateTime.parse(dateTimes[index]); - label = DateFormat('E').format(date); + // DateTime date = DateTime.parse(dateTimes[index]); + label = dateTimes[index]; break; case 'Weekly': label = 'Week ${index + 1}'; // Week number diff --git a/lib/src/shared/display/daily_card.dart b/lib/src/shared/display/daily_card.dart index ab019d65..5dfee7f5 100644 --- a/lib/src/shared/display/daily_card.dart +++ b/lib/src/shared/display/daily_card.dart @@ -1,18 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:nishauri/src/shared/input/Button.dart'; import 'package:nishauri/src/utils/constants.dart'; -class FilterCard extends StatelessWidget { - final VoidCallback? onPressed; +final selectedIndexProvider = StateProvider((ref) => 1); +class FilterCard extends HookConsumerWidget { + final List? columnTitles; + final Function(int selectedIndex)? onPressed; const FilterCard({ Key? key, - this.onPressed + this.columnTitles, + this.onPressed, }) : super(key: key); @override - Widget build(BuildContext context) { - + Widget build(BuildContext context, WidgetRef ref) { return Card( color: Constants.bgColor, elevation: Constants.FOUR, @@ -21,28 +24,42 @@ class FilterCard extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - IntrinsicHeight( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded(child: _buildColumn("Day", context)), - const VerticalDivider(thickness: 1, color: Colors.grey), - Expanded(child: _buildColumn("Week", context)), - const VerticalDivider(thickness: 1, color: Colors.grey), - Expanded(child: _buildColumn("Month", context)), - const VerticalDivider(thickness: 1, color: Colors.grey), - Expanded(child: _buildColumn("6Months", context)), - ], - ), - ), + IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: _buildColumns(context, ref), + ), + ), ], ), ), ); } - Widget _buildColumn(String day, BuildContext context) { + List _buildColumns(BuildContext context, WidgetRef ref) { + if (columnTitles!.isEmpty) { + return []; + } + + List columns = []; + for (int i = 0; i < columnTitles!.length; i++) { + String title = columnTitles![i]; + columns.add( + Expanded( + child: _buildColumn(title, i, context, ref), + ), + ); + if (i < columnTitles!.length - 1) { + columns.add(const VerticalDivider(thickness: 1, color: Colors.grey)); + } + } + return columns; + } + + // Build a column and highlight the selected one + Widget _buildColumn(String title, int index, BuildContext context, WidgetRef ref) { final theme = Theme.of(context); + // final bool isSelected = index == _selectedIndex; return Padding( padding: const EdgeInsets.symmetric(vertical: Constants.SMALL_SPACING), child: Row( @@ -50,13 +67,19 @@ class FilterCard extends StatelessWidget { children: [ Row( children: [ - TextButton( - onPressed: onPressed, - child: Text(day, style: theme.textTheme.titleLarge), - ) - - // const SizedBox(width: 4), - // Text("TUE", style: theme.textTheme.titleLarge), + SizedBox( + width: Constants.SMALL_APP_BAR_HEIGHT, + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: index == ref.watch(selectedIndexProvider) ? Constants.white : null, + ), + onPressed: () => onPressed!(index), + child: Text( + title, + style: theme.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold), + ), + ), + ), ], ), ], diff --git a/lib/src/utils/constants.dart b/lib/src/utils/constants.dart index 0afb7411..bb429b05 100644 --- a/lib/src/utils/constants.dart +++ b/lib/src/utils/constants.dart @@ -28,7 +28,7 @@ class Constants { static const TIME_OUT = 300; static const TWO_HUNDRED = 200.0; static const GRAPH_HEIGHT = 350.0; - static const APP_BAR_HEIGHT = 120.0; + static const SMALL_APP_BAR_HEIGHT = 120.0; static const FOUR = 4.0; static const SIXTEEN = 16.0; static const facilityDirectoryColor = Color.fromARGB(255, 106, 121, 141); @@ -58,4 +58,5 @@ class Constants { static const white = Color.fromARGB(255, 255, 255, 255); static const clinicCardBgColor = Color.fromARGB(255, 0, 122, 141); static const clinicCardKinColor = Color.fromARGB(255, 167, 240, 186); + static const backgroundGray = Color.fromARGB(255, 238, 238, 240); } From 3e39b2be7072b0b3ffc67a030a518d34fdc33fae Mon Sep 17 00:00:00 2001 From: vicky-ogutu Date: Thu, 12 Dec 2024 03:18:27 +0300 Subject: [PATCH 140/140] dependent-screens --- lib/src/app/navigation/app_router.dart | 82 +++++ .../presentation/pages/ClinicCardScreen.dart | 2 +- .../presentation/widgets/immunization.dart | 6 +- .../presentation/pages/dependant_profile.dart | 9 +- .../widgets/allergy_rship_records.dart | 275 ++++++++++++++++ .../relationship/widgets/condition_rship.dart | 273 ++++++++++++++++ .../widgets/immunization_rship.dart | 279 ++++++++++++++++ .../relationship/widgets/lab_rship.dart | 259 +++++++++++++++ .../widgets/medication_rship.dart | 282 ++++++++++++++++ .../widgets/procedures_rship.dart | 68 ++++ .../widgets/vital_rship_records.dart | 306 ++++++++++++++++++ lib/src/utils/routes.dart | 9 + 12 files changed, 1845 insertions(+), 5 deletions(-) create mode 100644 lib/src/features/clinic_card/relationship/widgets/allergy_rship_records.dart create mode 100644 lib/src/features/clinic_card/relationship/widgets/condition_rship.dart create mode 100644 lib/src/features/clinic_card/relationship/widgets/immunization_rship.dart create mode 100644 lib/src/features/clinic_card/relationship/widgets/lab_rship.dart create mode 100644 lib/src/features/clinic_card/relationship/widgets/medication_rship.dart create mode 100644 lib/src/features/clinic_card/relationship/widgets/procedures_rship.dart create mode 100644 lib/src/features/clinic_card/relationship/widgets/vital_rship_records.dart diff --git a/lib/src/app/navigation/app_router.dart b/lib/src/app/navigation/app_router.dart index 509d5b15..9c179103 100644 --- a/lib/src/app/navigation/app_router.dart +++ b/lib/src/app/navigation/app_router.dart @@ -25,6 +25,13 @@ import 'package:nishauri/src/features/clinic_card/presentation/widgets/lab_resul import 'package:nishauri/src/features/clinic_card/presentation/widgets/medication.dart'; import 'package:nishauri/src/features/clinic_card/presentation/widgets/vital_records.dart'; import 'package:nishauri/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart'; +import 'package:nishauri/src/features/clinic_card/relationship/widgets/allergy_rship_records.dart'; +import 'package:nishauri/src/features/clinic_card/relationship/widgets/condition_rship.dart'; +import 'package:nishauri/src/features/clinic_card/relationship/widgets/immunization_rship.dart'; +import 'package:nishauri/src/features/clinic_card/relationship/widgets/lab_rship.dart'; +import 'package:nishauri/src/features/clinic_card/relationship/widgets/medication_rship.dart'; +import 'package:nishauri/src/features/clinic_card/relationship/widgets/procedures_rship.dart'; +import 'package:nishauri/src/features/clinic_card/relationship/widgets/vital_rship_records.dart'; import 'package:nishauri/src/features/self_screening/blood_sugar/presentation/pages/BloodSugarScreen.dart'; import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMICalculatorResultsScreen.dart'; import 'package:nishauri/src/features/self_screening/bmi/presentation/pages/BMICalculatorScreen.dart'; @@ -368,6 +375,17 @@ final List secureRoutes = [ }, routes: clinicCardRoutes, ), + + + GoRoute( + name: RouteNames.MY_DEPENDANT_CLINIC_CARD, + path: 'dependent-clinic-card', + builder: (BuildContext context, GoRouterState state) { + return const DependantProfileScreen(); + }, + routes: dependentclinicCardRoutes, + ), + GoRoute( name: RouteNames.DAWA_DROP, path: 'dawa-drop', @@ -866,6 +884,7 @@ final List clinicCardRoutes = [ }, ), + //Medication GoRoute( @@ -904,3 +923,66 @@ final List clinicCardRoutes = [ }, ), ]; + +final List dependentclinicCardRoutes =[ + //immunization_rship + GoRoute( + name: RouteNames.IMMUNIZATION_RSHIP_RECORD, + path: 'immunization-rship-record', + builder: (BuildContext context, GoRouterState state) { + return ImmunizationRship(); + }, + ), + + //allergy_rship + GoRoute( + name: RouteNames.ALLERGY_HEALTH_RSHIP_RECORD, + path: 'allergy-health-rship-record', + builder: (BuildContext context, GoRouterState state) { + return AllergyRshipRecord(); + }, + ), + + //procedure_rship + // GoRoute( + // name: RouteNames.PROCEDURE_RSHIP_RECORD, + // path: 'procedure-rship-record', + // builder: (BuildContext context, GoRouterState state) { + // return ClinicRshipDetails(); + // }, + // ), + //lab + GoRoute( + name: RouteNames.LAB_RESULTS_HEALTH_RSHIP_RECORD, + path: 'lab-result-rship-record', + builder: (BuildContext context, GoRouterState state) { + return LabRshpRecord(); + }, + ), + + //Medication + GoRoute( + name: RouteNames.MEDICATION_RSHIP_RECORD, + path: 'medication-rship-record', + builder: (BuildContext context, GoRouterState state) { + return MedicationRship(); + }, + ), + + GoRoute( + name: RouteNames.HEALTH_RSHIP_RECORD, + path: 'health-rship-record', + builder: (BuildContext context, GoRouterState state) { + return ConditionRship(); + }, + ), + + GoRoute( + name: RouteNames.VITAL_HEALTH_RSHIP_RECORD, + path: 'vital-health-rship-record', + builder: (BuildContext context, GoRouterState state) { + return VitalHealthRshipRecord(); + }, + ), + +]; diff --git a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart index 251d8908..b58a1ae2 100644 --- a/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart +++ b/lib/src/features/clinic_card/presentation/pages/ClinicCardScreen.dart @@ -139,7 +139,7 @@ class ClinicCardScreen extends HookConsumerWidget { children: [Text("Shared With Me", style: theme.textTheme.titleMedium), ] ), - const ItemList(items: ["Eric Muthomi"], svgAsset: ["assets/images/clinicCardCard.svg"],path: [RouteNames.DEPENDANT_PROFILE], color: Constants.clinicCardBgColor, relationship: ["Next of Kin"],), + const ItemList(items: ["Eric Muthomi"], svgAsset: ["assets/images/clinicCardCard.svg"],path: [RouteNames.MY_DEPENDANT_CLINIC_CARD], color: Constants.clinicCardBgColor, relationship: ["Next of Kin"],), ], ), ), diff --git a/lib/src/features/clinic_card/presentation/widgets/immunization.dart b/lib/src/features/clinic_card/presentation/widgets/immunization.dart index 82f73d02..882e9aff 100644 --- a/lib/src/features/clinic_card/presentation/widgets/immunization.dart +++ b/lib/src/features/clinic_card/presentation/widgets/immunization.dart @@ -136,10 +136,10 @@ class _ImmunizationTestState extends State { return Column( children: [ _buildDateRow(record.visitDate, theme), + // const SizedBox(height: Constants.SPACING), + //_buildHospitalRow(record.facility, theme), const SizedBox(height: Constants.SPACING), - _buildHospitalRow(record.facility, theme), - const SizedBox(height: Constants.SPACING), - const Divider(), + //const Divider(), _buildConditionList(record.immunizations, theme), const SizedBox(height: Constants.SPACING), const Divider(), diff --git a/lib/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart b/lib/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart index 7e44760e..bbd2cb8e 100644 --- a/lib/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart +++ b/lib/src/features/clinic_card/relationship/presentation/pages/dependant_profile.dart @@ -80,7 +80,14 @@ class DependantProfileScreen extends HookConsumerWidget { ]; final List paths = [ - RouteNames.HEALTH_RECORD, + RouteNames.ALLERGY_HEALTH_RSHIP_RECORD, + RouteNames.HEALTH_RSHIP_RECORD, + RouteNames.IMMUNIZATION_RSHIP_RECORD, + RouteNames.LAB_RESULTS_HEALTH_RSHIP_RECORD, + RouteNames.MEDICATION_RSHIP_RECORD, + RouteNames.PROCEDURE_RSHIP_RECORD, + RouteNames.VITAL_HEALTH_RSHIP_RECORD, + ]; void _reloadData() { diff --git a/lib/src/features/clinic_card/relationship/widgets/allergy_rship_records.dart b/lib/src/features/clinic_card/relationship/widgets/allergy_rship_records.dart new file mode 100644 index 00000000..e2caafad --- /dev/null +++ b/lib/src/features/clinic_card/relationship/widgets/allergy_rship_records.dart @@ -0,0 +1,275 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/extensions/extensions.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +import '../../../../shared/display/heath_filter_button.dart'; +class AllergyRshipRecord extends StatefulWidget { + const AllergyRshipRecord({super.key}); + + @override + State createState() => _AllergyRshipRecordState(); +} + +class _AllergyRshipRecordState extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString('assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + Future _selectDateRange(BuildContext context) async { + DateTimeRange? pickedRange = await selectDateRange( + context: context, + initialDateRange: selectedDateRange, + primaryColor: Constants.bmiCalculatorColor, + barrierColor: Constants.bmiCalculatorColor, + ); + + if (pickedRange != null && pickedRange != selectedDateRange) { + setState(() { + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; + }); + } + } + + + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: Constants.SMALL_APP_BAR_HEIGHT, + smallTitle: "Allergies", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text('Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center(child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildAllergyList(record.allergies, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleSmall), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildAllergyList(List allergies, ThemeData theme) { + if (allergies.isEmpty) { + return const Center( + child:Text('No Vitals recorded.') + ); + } + + return Column( + children: allergies.map((allergy) => _buildAllergyRow(allergy, theme)).toList(), + ); + } + + Widget _buildAllergyRow(Allergy allergy, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildAllergiesRow(allergy, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Reactions", style: theme.textTheme.bodySmall), + Text(allergy.reaction, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Onset Date", style: theme.textTheme.bodySmall), + Text(allergy.onsetDate, style: theme.textTheme.titleSmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildAllergiesRow(Allergy allergy, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineVirus.svg", + width: Constants.TWENTY, + height: Constants.TWENTY, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child:Text(allergy.allergen, + style: theme.textTheme.titleSmall, + overflow: TextOverflow.ellipsis, // Truncate if too long + maxLines: 1, + ), + ), + const Spacer(), + Text(allergy.severity.titleCase, style: theme.textTheme.bodySmall?.copyWith(color: getSeverityColor(allergy.severity), )), + ], + ); + } + + Color getSeverityColor(String severity) { + if (severity == 'MILD') { + return Constants.programsColor; + } else if (severity == 'MODERATE') { + return Constants.facilityDirectoryColor; + } else if (severity == 'SEVERE') { + return Constants.selfScreeningBgColor; + } else { + return Constants.selfScreeningBgColor; + } + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + ], + ); + } +} diff --git a/lib/src/features/clinic_card/relationship/widgets/condition_rship.dart b/lib/src/features/clinic_card/relationship/widgets/condition_rship.dart new file mode 100644 index 00000000..d642c2cc --- /dev/null +++ b/lib/src/features/clinic_card/relationship/widgets/condition_rship.dart @@ -0,0 +1,273 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/heath_filter_button.dart'; +import 'package:nishauri/src/shared/extensions/extensions.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; +import 'package:nishauri/src/utils/constants.dart'; + + +class ConditionRship extends StatefulWidget { + const ConditionRship({super.key}); + + @override + State createState() => _ConditionRshipState(); +} + +class _ConditionRshipState extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + // Load health records from a JSON file + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString('assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + // Apply the selected filter to the health records + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + // Function to handle date range selection + Future _selectDateRange(BuildContext context) async { + DateTimeRange? pickedRange = await selectDateRange( + context: context, + initialDateRange: selectedDateRange, + primaryColor: Constants.bmiCalculatorColor, + barrierColor: Constants.bmiCalculatorColor, + ); + + if (pickedRange != null && pickedRange != selectedDateRange) { + setState(() { + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; + }); + } + } + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: Constants.SMALL_APP_BAR_HEIGHT, + smallTitle: "Conditions", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text('Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center(child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildConditionList(record.conditions, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleSmall), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildConditionList(List conditions, ThemeData theme) { + if (conditions.isEmpty) { + return const Center( + child:Text('No conditions recorded.') + ); + } + + return Column( + children: conditions.map((condition) => _buildConditionRow(condition, theme)).toList(), + ); + } + + Widget _buildConditionRow(Condition condition, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildConditionsRow(condition, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Recorded", style: theme.textTheme.bodySmall), + Text(condition.dateRecorded, style: theme.textTheme.bodySmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildConditionsRow(Condition condition, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineStethoscope.svg", + width: Constants.TWENTY, + height: Constants.TWENTY, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child:Text(condition.name, + style: theme.textTheme.titleSmall, + overflow: TextOverflow.ellipsis, // Truncate if too long + maxLines: 1, + ),), + const Spacer(), + Text(condition.status.titleCase, style: theme.textTheme.bodySmall?.copyWith(color: getStatusColor(condition.status))), + ], + ); + } + + Color getStatusColor(String status) { + if (status == 'ACTIVE') { + return Constants.programsColor; + } else if (status == 'INACTIVE') { + return Constants.facilityDirectoryColor; + } else { + return Constants.selfScreeningBgColor; + } + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + // if (selectedDateRange != null) + // Padding( + // padding: const EdgeInsets.only(left: Constants.SPACING), + // child: Text( + // 'From ${selectedDateRange!.start.toLocal()} - ${selectedDateRange!.end.toLocal()}', + // style: theme.textTheme.bodyMedium, + // ), + // ), + ], + ); + } +} diff --git a/lib/src/features/clinic_card/relationship/widgets/immunization_rship.dart b/lib/src/features/clinic_card/relationship/widgets/immunization_rship.dart new file mode 100644 index 00000000..25da1e3f --- /dev/null +++ b/lib/src/features/clinic_card/relationship/widgets/immunization_rship.dart @@ -0,0 +1,279 @@ + +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../../../shared/display/CustomAppBar.dart'; +import '../../../../shared/display/heath_filter_button.dart'; +import '../../../../utils/constants.dart'; +import '../../data/models/health_test.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; + +class ImmunizationRship extends StatefulWidget { + const ImmunizationRship ({super.key}); + + @override + State createState() => _ImmunizationRshipState(); +} + +class _ImmunizationRshipState extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + + + + // Load health records from a JSON file + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString( + 'assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + // Apply the selected filter to the health records + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + // Function to handle date range selection + Future _selectDateRange(BuildContext context) async { + DateTimeRange? pickedRange = await selectDateRange( + context: context, + initialDateRange: selectedDateRange, + primaryColor: Constants.bmiCalculatorColor, + barrierColor: Constants.bmiCalculatorColor, + ); + + if (pickedRange != null && pickedRange != selectedDateRange) { + setState(() { + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; + }); + } + } + + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: Constants.SMALL_APP_BAR_HEIGHT, + smallTitle: "Immunizations", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == + ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text( + 'Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center( + child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => + _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center( + child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + // const SizedBox(height: Constants.SPACING), + //_buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + //const Divider(), + _buildConditionList(record.immunizations, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleSmall), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildConditionList(List immunizations, ThemeData theme) { + if (immunizations.isEmpty) { + return const Center( + child: Text('No immunizations recorded.') + ); + } + + return Column( + children: immunizations.map((immunization) => + _buildImmunizationRow(immunization, theme)).toList(), + ); + } + + + Widget _buildImmunizationRow(Immunization immunization, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildImmunizationsRow(immunization, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Vaccination Date", style: theme.textTheme.bodySmall), + Text(immunization.immunizationDate, + style: theme.textTheme.bodySmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildImmunizationsRow(Immunization immunization, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineStethoscope.svg", + width: Constants.TWENTY, + height: Constants.TWENTY, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child: Text(immunization.name, + style: theme.textTheme.titleSmall, + // Reduce font size + overflow: TextOverflow.ellipsis, + // Truncate if too long + maxLines: 1, + ),), + ], + ); + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + // if (selectedDateRange != null) + // Padding( + // padding: const EdgeInsets.only(left: Constants.SPACING), + // child: Text( + // 'From ${selectedDateRange!.start.toLocal()} - ${selectedDateRange!.end.toLocal()}', + // style: theme.textTheme.bodyMedium, + // ), + // ), + ], + ); + } +} diff --git a/lib/src/features/clinic_card/relationship/widgets/lab_rship.dart b/lib/src/features/clinic_card/relationship/widgets/lab_rship.dart new file mode 100644 index 00000000..6a21d6a6 --- /dev/null +++ b/lib/src/features/clinic_card/relationship/widgets/lab_rship.dart @@ -0,0 +1,259 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/extensions/extensions.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +import '../../../../shared/display/heath_filter_button.dart'; +class LabRshpRecord extends StatefulWidget { + const LabRshpRecord({super.key}); + + @override + State createState() => _LabRshpRecordState(); +} + +class _LabRshpRecordState extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString('assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + Future _selectDateRange(BuildContext context) async { + DateTimeRange? pickedRange = await selectDateRange( + context: context, + initialDateRange: selectedDateRange, + primaryColor: Constants.bmiCalculatorColor, + barrierColor: Constants.bmiCalculatorColor, + ); + + if (pickedRange != null && pickedRange != selectedDateRange) { + setState(() { + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; + }); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: Constants.SMALL_APP_BAR_HEIGHT, + smallTitle: "Lab Results", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text('Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center(child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildConditionList(record.labResults, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleSmall), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildConditionList(List labResults, ThemeData theme) { + if (labResults.isEmpty) { + return const Center( + child:Text('No Vitals recorded.') + ); + } + + return Column( + children: labResults.map((labResult) => _buildLabResultRow(labResult, theme)).toList(), + ); + } + + Widget _buildLabResultRow(LabResult labResult, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildLabResultsRow(labResult, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Reactions", style: theme.textTheme.bodySmall), + Text(labResult.results, style: theme.textTheme.titleSmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Date Ordered", style: theme.textTheme.bodySmall), + Text(labResult.orderedDate, style: theme.textTheme.titleSmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildLabResultsRow(LabResult labResult, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineTestTube.svg", + width: Constants.TWENTY, + height: Constants.TWENTY, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child:Text(labResult.name, + style: theme.textTheme.titleSmall, + overflow: TextOverflow.ellipsis, // Truncate if too long + maxLines: 1, + ), + ), + ], + ); + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + ], + ); + } +} diff --git a/lib/src/features/clinic_card/relationship/widgets/medication_rship.dart b/lib/src/features/clinic_card/relationship/widgets/medication_rship.dart new file mode 100644 index 00000000..204329fd --- /dev/null +++ b/lib/src/features/clinic_card/relationship/widgets/medication_rship.dart @@ -0,0 +1,282 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/display/heath_filter_button.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class MedicationRship extends StatefulWidget { + const MedicationRship({super.key}); + + @override + State createState() => _MedicationRshipState(); +} + +class _MedicationRshipState extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + // Load health records from a JSON file + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString( + 'assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + // Apply the selected filter to the health records + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + Future _selectDateRange(BuildContext context) async { + DateTimeRange? pickedRange = await selectDateRange( + context: context, + initialDateRange: selectedDateRange, + primaryColor: Constants.bmiCalculatorColor, + barrierColor: Constants.bmiCalculatorColor, + ); + + if (pickedRange != null && pickedRange != selectedDateRange) { + setState(() { + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; + }); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: Constants.SMALL_APP_BAR_HEIGHT, + smallTitle: "Medications", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == + ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text( + 'Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center( + child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => + _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center( + child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildMedicationList(record.medications, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleMedium), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildMedicationList(List medications, ThemeData theme) { + if (medications.isEmpty) { + return const Center( + child: Text('No Medications recorded.') + ); + } + + return Column( + children: medications.map((medication) => + _buildImmunizationRow(medication, theme)).toList(), + ); + } + + + Widget _buildImmunizationRow(Medication medication, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildImmunizationsRow(medication, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Dose", style: theme.textTheme.titleSmall,), + Text(medication.value, + style: theme.textTheme.titleSmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildImmunizationsRow(Medication medication, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineStethoscope.svg", + width: Constants.TWENTY, + height: Constants.TWENTY, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child: Text(medication.name, + // style: theme.textTheme.titleMedium?.copyWith(fontSize: 8), + style: theme.textTheme.titleSmall, + // Reduce font size + overflow: TextOverflow.ellipsis, + // Truncate if too long + maxLines: 1, + ),), + ], + ); + } + + Color getStatusColor(String status) { + if (status == 'ACTIVE') { + return Constants.programsColor; + } else if (status == 'INACTIVE') { + return Constants.facilityDirectoryColor; + } else { + return Constants.selfScreeningBgColor; + } + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + // if (selectedDateRange != null) + // Padding( + // padding: const EdgeInsets.only(left: Constants.SPACING), + // child: Text( + // 'From ${selectedDateRange!.start.toLocal()} - ${selectedDateRange!.end.toLocal()}', + // style: theme.textTheme.bodyMedium, + // ), + // ), + ], + ); + } +} diff --git a/lib/src/features/clinic_card/relationship/widgets/procedures_rship.dart b/lib/src/features/clinic_card/relationship/widgets/procedures_rship.dart new file mode 100644 index 00000000..6ef1d9bb --- /dev/null +++ b/lib/src/features/clinic_card/relationship/widgets/procedures_rship.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/program.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +class ClinicRshipDetails extends StatelessWidget { + final Program program; + const ClinicRshipDetails({Key? key, required this.program}) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Column( + children: [ + ListTile( + title: Text(program.name), + subtitle: Text('Facility Name: ${program.facility_name}'), + ), + Expanded( + child: ListView.builder( + itemCount: program.obs.length, + itemBuilder: (BuildContext context, int index) { + final observations = program.obs[index]; + return Column( + children: [ + const Divider(), + ListTile( + title: Card( + child: Padding( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + observations.label, + style: theme.textTheme.headline6, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: Constants.SPACING), + Row( + children: [ + Icon( + Icons.diamond_outlined, + color: theme.colorScheme.primary, + ), + const SizedBox(width: Constants.SPACING), + Text(observations.value?? "",), + ], + ), + ], + ), + ), + ), + // title: Text(observations.label, style: theme.textTheme.titleMedium,), + // subtitle: Text(observations.value?? "",style:TextStyle( + // color: theme.primaryColor, + // + // ),), + ), + ], + ); + }, + ), + ), + ], + ); + } +} diff --git a/lib/src/features/clinic_card/relationship/widgets/vital_rship_records.dart b/lib/src/features/clinic_card/relationship/widgets/vital_rship_records.dart new file mode 100644 index 00000000..3fc542b2 --- /dev/null +++ b/lib/src/features/clinic_card/relationship/widgets/vital_rship_records.dart @@ -0,0 +1,306 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:nishauri/src/features/clinic_card/data/models/health_test.dart'; +import 'package:nishauri/src/shared/display/CustomAppBar.dart'; +import 'package:nishauri/src/shared/helper/health_record_filter.dart'; +import 'package:nishauri/src/utils/constants.dart'; + +import '../../../../shared/display/heath_filter_button.dart'; + +class VitalHealthRshipRecord extends StatefulWidget { + const VitalHealthRshipRecord({super.key}); + + @override + State createState() => _VitalHealthRshipRecordState(); +} + +class _VitalHealthRshipRecordState extends State { + // Store the selected filter + DateFilter? selectedFilter; + DateTimeRange? selectedDateRange; + + Future> _loadHealthRecords() async { + final responseString = await rootBundle.loadString('assets/data/visits.json'); + final List json = jsonDecode(responseString); + return json.map((e) => HealthRecordModel.fromJson(e)).toList(); + } + + Future> _applyFilter(List records) async { + List filteredRecords = applyFilter( + records, + selectedFilter ?? DateFilter.all, + selectedDateRange?.start, + selectedDateRange?.end, + ); + + return filteredRecords; + } + + Future _selectDateRange(BuildContext context) async { + DateTimeRange? pickedRange = await selectDateRange( + context: context, + initialDateRange: selectedDateRange, + primaryColor: Constants.bmiCalculatorColor, + barrierColor: Constants.bmiCalculatorColor, + ); + + if (pickedRange != null && pickedRange != selectedDateRange) { + setState(() { + selectedDateRange = pickedRange; + selectedFilter = DateFilter.dateRange; + }); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + body: Column( + children: [ + const CustomAppBar( + color: Constants.clinicCardBgColor, + height: Constants.SMALL_APP_BAR_HEIGHT, + smallTitle: "Vitals", + rightBtTitle: "", + ), + Expanded( + child: FutureBuilder>( + future: _loadHealthRecords(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + final healthRecords = snapshot.data!; + return SingleChildScrollView( + padding: const EdgeInsets.all(Constants.SPACING), + child: Column( + children: [ + _buildFilterMenu(theme), + FutureBuilder>( + future: _applyFilter(healthRecords), + builder: (context, filteredSnapshot) { + if (filteredSnapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (filteredSnapshot.hasError) { + return Center(child: Text('Error: ${filteredSnapshot.error}')); + } else if (filteredSnapshot.hasData) { + final filteredRecords = filteredSnapshot.data!; + + // Check if the filtered list is empty and show 'No Data' text + if (filteredRecords.isEmpty) { + return const Center(child: Text('No data available.')); + } + + return Column( + children: filteredRecords + .map((record) => _buildRecordView(record, theme)) + .toList(), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ], + ), + ); + } else { + return const Center(child: Text('No data available.')); + } + }, + ), + ), + ], + ), + ); + } + + // Record View Widgets and Helpers (No changes here, same as before) + Widget _buildRecordView(HealthRecordModel record, ThemeData theme) { + return Column( + children: [ + _buildDateRow(record.visitDate, theme), + const SizedBox(height: Constants.SPACING), + _buildHospitalRow(record.facility, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + _buildVitalList(record.vitals, theme), + const SizedBox(height: Constants.SPACING), + const Divider(), + ], + ); + } + + Widget _buildDateRow(String date, ThemeData theme) { + return Row( + children: [ + Expanded( + child: Text( + date, + style: theme.textTheme.titleSmall), + ), + ], + ); + } + + Widget _buildHospitalRow(String hospital, ThemeData theme) { + return Row( + children: [ + Expanded( // Wrap the Text widget in Expanded + child: Text( + hospital, + style: theme.textTheme.titleMedium, + overflow: TextOverflow.ellipsis, // Truncate if too long + ), + ), + ], + ); + } + + Widget _buildVitalList(List vitals, ThemeData theme) { + if (vitals.isEmpty) { + return const Center( + child:Text('No Vitals recorded.') + ); + } + + return Column( + children: vitals.map((vital) => _buildVitalRow(vital, theme)).toList(), + ); + } + + Widget _buildVitalRow(Vital vital, ThemeData theme) { + return ListTile( + title: ExpansionTile( + title: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildVitalsRow(vital, theme), + ], + )), + ], + ), + children: [ + ListTile( + title: Column( + children: [ + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Temperature", style: theme.textTheme.bodySmall), + Text(vital.temp, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Systolic B.P", style: theme.textTheme.bodySmall), + Text(vital.systolic, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Diastolic B.P", style: theme.textTheme.bodySmall), + Text(vital.diastolic, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Respiratory Rate", style: theme.textTheme.bodySmall), + Text(vital.respiratory, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Oxygen Saturation", style: theme.textTheme.bodySmall), + Text(vital.oxygenSaturation, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Weight", style: theme.textTheme.bodySmall), + Text(vital.weight, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Height", style: theme.textTheme.bodySmall), + Text(vital.height, style: theme.textTheme.bodySmall), + ], + ), + const Divider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Presenting Complaints", style: theme.textTheme.bodySmall), + Text(vital.complain, style: theme.textTheme.bodySmall), + ], + ), + ], + ), + ) + ], + ), + ); + } + + Widget _buildVitalsRow(Vital vital, ThemeData theme) { + return Row( + children: [ + SvgPicture.asset( + "assets/images/boldDuotoneMedicineStethoscope.svg", + width: Constants.TWENTY, + height: Constants.TWENTY, + ), + const SizedBox(width: Constants.SPACING), + Expanded( + child:Text(vital.name, + style: theme.textTheme.titleSmall, + overflow: TextOverflow.ellipsis, // Truncate if too long + maxLines: 1, + ), + ), + ], + ); + } + + // Build the filter menu with the date range option + Widget _buildFilterMenu(ThemeData theme) { + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + HealthButton( + onFilterSelected: (filter) { + setState(() { + selectedFilter = filter; + if (filter == DateFilter.dateRange) { + // Trigger the date range picker when the date range filter is selected + _selectDateRange(context); + } + }); + }, + ), + ], + ); + }} \ No newline at end of file diff --git a/lib/src/utils/routes.dart b/lib/src/utils/routes.dart index c7631c29..e146dff5 100644 --- a/lib/src/utils/routes.dart +++ b/lib/src/utils/routes.dart @@ -45,15 +45,24 @@ class RouteNames { static const LAB_RESULTS = "lab-results"; static const MY_CLINIC_CARD = "clinic-card"; + static const MY_DEPENDANT_CLINIC_CARD = "dependant-clinic-card"; static const HEALTH_RECORD = "health-record"; + static const HEALTH_RSHIP_RECORD = "health-rship-record"; static const IMMUNIZATION_RECORD = "immunization-record"; + static const IMMUNIZATION_RSHIP_RECORD = "immunization-rship-record"; + static const PROCEDURE_RSHIP_RECORD = "procedure-rship-record"; + static const MEDICATION_RECORD = "medication-record"; + static const MEDICATION_RSHIP_RECORD = "medication-rship-record"; static const CHAT_BOT = "chat-bot"; static const SETTINGS = "settings"; static const DEPENDANT_PROFILE = "dependant-profile"; static const VITAL_HEALTH_RECORD= "vital-health-record"; + static const VITAL_HEALTH_RSHIP_RECORD= "vital-health-rship-record"; static const ALLERGY_HEALTH_RECORD= "allergy-health-record"; + static const ALLERGY_HEALTH_RSHIP_RECORD= "allergy-health-rship-record"; static const LAB_RESULTS_HEALTH_RECORD= "blood-result-health-record"; + static const LAB_RESULTS_HEALTH_RSHIP_RECORD= "lab-result-rship-record"; static const Facility_Directory = "facility-directory"; static const PROGRAM_MENU = "program-menu";

    pf;Ly42w)IQt0bWolJ~}A3rnL?5# zl$Hotn>5w*R#8wz-SKgAibO#WG<{6b*&S9_d9>`}pa8yMyciPOl^Wd&NMlKmG$UGS zR4Sy;tB+ky6)dKvFB4L=Ub=viE~Xe#0>&tQ5KtZ;#@8u&`}=XK0^=>rWHdDr$C1Uc z+Vs9>geZ*Z>gu4qqr+{B2q1N86_Ms?HmcCu)5ZUO{X2Z~Ti>U@udkuJCEcp;v(x@q zL>3b_imE!Fnga(8@P~i+Dt`8}Zvg#khFrlR0)+OSjl@Y=4hYaJNl0p%2Ph`UCnenx zps2=RJV>6~@O*KL2ShRS^t2~ri>19Shvy4m5f2b``xl@{S$qSm>7=cA51nJzgI55Q z)dB&q3L@;-+zW&VhGsBIje_r8rOnF)Yt?-g z{kFFvE_#PzijbUP{!uoA}oO|+mpo9s0 z!ni~fmeR6jP^;;?2*Ni}Wfj@fh=KvBHeTyn{hoQk# z>u*2vJ@RM0f?r*82i^%A@iHEaS9sjRj|V)gLKK!Eu3*HpEbcde+K3?NKtxy(D1dNy zvbaFijAyOuVnHWtlAl0T8)8N z-2}kTWQgOqWuk(rp}o+?|6cZODwQ%pV8B6|rdt?K7#$ts?tAX%#v5jJ~VE1aD04%QgO_!wAMj|rGg%{6;_Wz zdoLQt4FpN+RZ<#mXQ|6ie{c|tCkV{5%@-Eq2SlY2!r}<{0ag{QEfI=^vVyBjl|qcLtPntEBVwe1AZXk#0(Im{V`>n! z3YL^)At6D)n3Q;N{X;dZz~ml!2G$W)E13GZ^_+b!j2aZh6VI8;ssf~>j7#0lF5IMroMO5)TfGu>#nsio?jsF@~E}RfkG50` zMxmvry93V%ab(Hl^AsLzRxQ3s2rR%DGn-U(iCc^{IWqAu1H+dC-s%iBwF;hL`^Fw1 z24O~&D=~;PPFf?&I;UU(%gVzug4z)gYv(%Gm z&9UEUq0rHq^Jk)FA0o^dkyXI(_=g<_)v)0U>>_LXIyiL0o&50Uch0LkKtu>UgQ})- zy_2^M@zFQ@HaoxdUM~CKE6MmCr~KwSc+3C$7;G8lbvg5|g!+o+bS7*7^eTWt^= zJVC{v#-M^zfEe*+UB&W@n*g{d(C*$ISA#3!HT47lrM}_EQMHtcCC0}msa8V7nFnSGeBb@PiTY+ilY#E;9!JuA-~<1Vq&5lZYl)(|gx@n2 zmL3tHboOj?WlqNPntK8?C{YZEY39k&+M6Y5Y79scUuy)_qo`g{@G^O-WC|Ssm2kWnciPAx8@1f zTC#;~LS|@948C#xDT9N3^bhn=twtCxRh~_2rtww;6`|0Ub^Yi+e&}P|b?3co7#hSN zSe=>1GGfS>3^tDEQx4?%>-Fo`k z+MpDg$=k}RB`|r6pGUC>f@*{zz#47#9M?pQ`+INQ)`#aA;wZwU2?YUa6%h|j`ZzHL z5m}xFU~-6oz9TBv&8#uyQfCe$h$*LCs3tAE8A&weLAzjbG#?)UJGam}Tu0w4eKmE3ykPFFeE`U;`UpOs8)-3A}E5QfJL#15w5VDP{b_cPob7uh%LYpc%v#P?YZ2#j$1GGf$+|>vb^tLpu27B3fHz}2g;m7_8BkUR7Qiq*Rffqb1ZItJerpH< zc+>CLgN^egmz1>|@%Z~VH=?P$r zasDpf`1*GVqbN!D(bntMn%;BI^*lc*5pv~BZX0nElm#a!_4f9lYI*Hz-@v|ow~)(s z5yuJ%WKBpG6eDfq+Iq3EZR!ayd!%UNF)~BykRWJHr0i0AuGGDx5jTOYjNDHYl~Chh zZH)+-@FM0`I{Nl%ec0}5-c5RU>0ID&Nqq}ztD5&ThRDYzmMoAU}I#7kg zofbquTPu)^5vHah&N_XQo48iPm`pb3NUP*?#Ht0g2rN@m)C*9PqyO-a2rB!*Yg@%* zKMNjg80Z8nvr6#9G@rD_mZ9Db+@`YPh^iLwc)?T8pgb~l)RpXE7_)w`i=W+aFOPfK zKLU^mywpoFveva~7^Mkg@BhU2$Yy;oICx21^XbPA(bnEY6h;^mP%V#Rl^TelZvhlb zM}(Pia6u7P#t>CP{Gfv!r)-2$1znW4 z>tA^X=U#FK92z6K{{YdRL++L%i17{9 zYKypL0UP0axfLrBQWWqRn=HXp8GIjmOv18sFn}syHA+8k5rd6G^7(#xx;t^v-o`B0 zSkZU}P#_{*KtnOc&|WBDZ9MC0mM`K4);+yFboX?-ZO?1%2@uChS7!(J-M5QR{paWC z?(9TFT6zN1Pw*RKnT>H|%e)8f$?V!u|LE5|N>%=drb`x62hVK$(v2 zO?Y?+I)f*G%%oOn;R(?CIZ+I4?b+mf(1oms&e6BRL)9{M@J>un0Bb=~U#e8a5=Itm zavx2TffPUi>eVXNg4)(s6KP_wsttz=JX8&D4QQ+sOA)?jSQZHNkQRo+Qg=WdSprQ| zD{0bNP1z5U5`g$veU8SjFTD#5Pf|^tS^sMi)}UYaop2?rTd^gbXVOV+>(brMIVthn=>b z$*C&7Z;s{yIo(|aCML=}`uF~Uho8O;&o_?n0}yE(mjPUM`7OAzHs2?KyFLfL;nIh1 z2g+`NtXP^ri6Mmr)x=wh<%Y-nV2h;#9)N{g5diF>OO!@1`}Pwb7y(tBF=tZdfK}pM`(bpP-+S4UdBTOKLAlDqPT2@# z+=MzTPaq1$v{JC7NkVDq!m>jX1z;)l*72rYYi$Kcfv`CZ-}j3 zR2E}uREMb_=&4X>>%gjF#GCmwj3KO6oqDDF!B(k8fSJ(~Koz=sy7=1vew%N8???3Y z^om?KB-L1X~cnCY;qI-Z#{f~2Q! z8;GE)GkO9*^CmExCqTnzA68?wZ0yBP%Ci>axgxVSQ7mbI+NTwlBNDMmvqit zml7!8ni1F1`<~|%bt4bl3>L)m7upXeX)!rGF(~zq8zYn|5f@%?EN;tyo|qvA zMir+T?Cb60$5;N0zk17ix$IltcV1WP)(z0z-RUOoA_9<*F5vlYQeQX8%VaXnymsTp zjT}CFgv&1b7Jv3vC;0qi3JHbKbFJCap>lCs;2DKIpD+b>PP~^9scsiL(Kq<5wO^Bxip2r`) z`@i|)=RcBbzV~i!{_>l7*y&r-a}dEHy$=kJPw~LM5em5gYe|)E;`=<|5yt^#d}FAV zi#0Y33TnWT5}C^c1wgI0P*TLG_ahVlpT)s~pi0*<50<6+!y4LXju-@mBfwp2EI~*B zJVOTpfX+l9h1KjYXCaUj0O7zw&L=OarG3gpCqdwmNLo|Gt`p61`7iFA%UPYOUtaN? zi#YiS4}g-1~rcxcn+8B^&2R>c$L#D6z>RG+Vu5&P`EL>8yZN zi!nk+M*+1l;?3fdCz7aEU}&H>Nx7KW696$7->0Lqi%)#wKe_pqTUozukT|xpSz9(d zW|K&1MCNR~*w@$RJXb#Sp?~EAA9yohF~)uOntt!qnpGRoEMibC69j#;|Z$j47w2ks8#>jxc)-qqDjXJ-ehmalx}8@&3}ujLi5cqJeF;G4Pq_G^J|JZ}JC z&H1e~o?s>NZCmK++d&vtK>Sw5-_2Eju6bCsWKso7glY^jT{W2Ym5#idD#xrF>SDvX zE=uJp;t6V%w)O%TgQN<+^n5u=3PKR$Vf}Wxk6b~1{6_FQSPQTKDh&1(z(E(7Mg)kV zyQ>}4uGmyogv91RdD_J%0iZTIs`2FcOonT3*~!x%eHtHp({FR=uD$HoJiv9IeWe)~2%=8%CVtl7tGBs}{sM9~NUgP)Lq)*YahBfM*u;kH!FE zyzhc8mgf*4Mht4{I;LP*B3Nu&i_gdcAm +ejRx?4dYHE;U;r(XyYMV#rV^M&x34PwN_&N@t0 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 Nq?9A^_OtmDbGd};;@Ps12Wh5FReTQ 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∨EzY`J}V~Eb%bYXU@*s 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

-Q0pI(`xLfMgfuQdx^qLaO^ME;(9eZj$ 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�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 Ptk+P}QT?g>D)9dRZ(#%Q literal 0 HcmV?d00001 diff --git a/assets/images/chat/userImage2.png b/assets/images/chat/userImage2.png new file mode 100644 index 0000000000000000000000000000000000000000..19d19cd6df314fbcf8b7dfd5b8ac0d8d91f02f8e GIT binary patch literal 260587 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%0DaEd19py!#dJw)$rvDO4f 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