Merge pull request #135 from yaso-meth/NEW--MIH-Floating-Menu

NEW--MIH-Floating-Menu
This commit is contained in:
yaso-meth
2025-04-11 11:01:48 +02:00
committed by GitHub
17 changed files with 1017 additions and 388 deletions

View File

@@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
class MihFloatingMenu extends StatefulWidget {
final IconData? icon;
final AnimatedIconData? animatedIcon;
final List<SpeedDialChild> children;
const MihFloatingMenu({
super.key,
this.icon,
this.animatedIcon,
required this.children,
});
@override
State<MihFloatingMenu> createState() => _MihFloatingMenuState();
}
class _MihFloatingMenuState extends State<MihFloatingMenu> {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(
right: 5.0,
bottom: 5.0,
),
child: SpeedDial(
icon: widget.icon,
animatedIcon: widget.animatedIcon,
activeIcon: Icons.close,
backgroundColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
activeBackgroundColor:
MzanziInnovationHub.of(context)!.theme.errorColor(),
foregroundColor: MzanziInnovationHub.of(context)!.theme.primaryColor(),
overlayColor: Colors.black,
overlayOpacity: 0.5,
children: widget.children,
onOpen: () => debugPrint('OPENING DIAL'),
onClose: () => debugPrint('DIAL CLOSED'),
),
);
}
}

View File

@@ -1,3 +1,4 @@
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app.dart';
@@ -6,6 +7,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_tools.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_objects/arguments.dart';
import 'package:flutter/material.dart';
@@ -183,6 +185,25 @@ class _PackageTestState extends State<PackageTest> {
),
),
const SizedBox(height: 10),
MihFloatingMenu(children: [
SpeedDialChild(
child: Icon(
Icons.add,
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Add",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
labelStyle: TextStyle(
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
onTap: () {},
)
]),
Container(
color: Colors.black,
width: 200,

View File

@@ -0,0 +1,60 @@
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart';
class PackageToolOne extends StatefulWidget {
const PackageToolOne({super.key});
@override
State<PackageToolOne> createState() => _PackageToolOneState();
}
class _PackageToolOneState extends State<PackageToolOne> {
@override
Widget build(BuildContext context) {
return MihAppToolBody(
borderOn: true,
bodyItem: getBody(),
);
}
Widget getBody() {
return MihAppToolBody(
borderOn: true,
bodyItem: MihSingleChildScroll(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: [
Text(
"Hello",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MzanziInnovationHub.of(context)!.theme.secondaryColor(),
),
),
const SizedBox(height: 10),
Container(
color: Colors.black,
width: 200,
height: 200,
padding: EdgeInsets.zero,
alignment: Alignment.center,
child: IconButton.filled(
onPressed: () {},
icon: Icon(
MihIcons.mihLogo,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
),
)
],
),
),
);
}
}

View File

@@ -1,3 +1,4 @@
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart';
@@ -6,9 +7,11 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart';
import "package:universal_html/js.dart" as js;
import 'package:url_launcher/url_launcher.dart';
import 'package:share_plus/share_plus.dart';
class MihInfo extends StatefulWidget {
const MihInfo({super.key});
@@ -581,6 +584,13 @@ class _MihInfoState extends State<MihInfo> {
}
}
void shareMIHLink(BuildContext context, String message, String link) {
String shareText = "$message: $link";
Share.share(
shareText,
);
}
@override
Widget build(BuildContext context) {
return MihAppToolBody(
@@ -590,112 +600,196 @@ class _MihInfoState extends State<MihInfo> {
}
Widget getBody() {
return MihSingleChildScroll(
child: Column(
children: [
SizedBox(
width: 165,
child: FittedBox(
child: Icon(
MihIcons.mihLogo,
color: MzanziInnovationHub.of(context)!.theme.secondaryColor(),
return Stack(
children: [
MihSingleChildScroll(
child: Column(
children: [
SizedBox(
width: 165,
child: FittedBox(
child: Icon(
MihIcons.mihLogo,
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
),
),
),
),
),
const SizedBox(
height: 10,
),
const Text(
"Mzansi Innovation Hub",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 30,
),
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 10.0),
child: Divider(),
),
// const SizedBox(
// height: 10,
// ),
Wrap(
alignment: WrapAlignment.start,
crossAxisAlignment: WrapCrossAlignment.start,
spacing: 10,
runSpacing: 10,
children: [
ourVision(),
ourMission(),
const SizedBox(
height: 10,
),
const Text(
"Mzansi Innovation Hub",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 30,
),
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 10.0),
child: Divider(),
),
// const SizedBox(
// height: 10,
// ),
Wrap(
alignment: WrapAlignment.start,
crossAxisAlignment: WrapCrossAlignment.start,
spacing: 10,
runSpacing: 10,
children: [
ourVision(),
ourMission(),
],
),
const SizedBox(
height: 10,
),
Wrap(
alignment: WrapAlignment.start,
crossAxisAlignment: WrapCrossAlignment.start,
spacing: 10,
runSpacing: 10,
children: [
SizedBox(
width: 300,
height: 50,
child: MIHButton(
onTap: () {
installMihTrigger();
},
buttonText: getInstallButtonText(),
buttonColor: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
textColor: MzanziInnovationHub.of(context)!
.theme
.primaryColor(),
),
),
SizedBox(
width: 300,
height: 50,
child: MIHButton(
onTap: () {
launchSocialUrl(
Uri.parse(
"https://www.youtube.com/playlist?list=PLuT35kJIui0H5kXjxNOZlHoOPZbQLr4qh",
),
);
},
buttonText: "MIH Beginners Guide",
buttonColor: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
textColor: MzanziInnovationHub.of(context)!
.theme
.primaryColor(),
),
),
]),
const SizedBox(
height: 10,
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 10.0),
child: Divider(),
),
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
// spacing: 10,
// runSpacing: 10,
children: [
founderTitle(),
founderBio(),
],
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 10.0),
child: Divider(),
),
mihSocials(),
],
),
const SizedBox(
height: 10,
),
Wrap(
alignment: WrapAlignment.start,
crossAxisAlignment: WrapCrossAlignment.start,
spacing: 10,
runSpacing: 10,
children: [
SizedBox(
width: 300,
height: 50,
child: MIHButton(
onTap: () {
installMihTrigger();
},
buttonText: getInstallButtonText(),
buttonColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
textColor:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
),
SizedBox(
width: 300,
height: 50,
child: MIHButton(
onTap: () {
launchSocialUrl(
Uri.parse(
"https://www.youtube.com/playlist?list=PLuT35kJIui0H5kXjxNOZlHoOPZbQLr4qh",
),
);
},
buttonText: "MIH Beginners Guide",
buttonColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
textColor:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
),
]),
const SizedBox(
height: 10,
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 10.0),
child: Divider(),
),
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
// spacing: 10,
// runSpacing: 10,
),
Positioned(
right: 0,
bottom: 0,
child: MihFloatingMenu(
icon: Icons.share,
children: [
founderTitle(),
founderBio(),
SpeedDialChild(
child: Icon(
Icons.vpn_lock,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "MIH - Web",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
shareMIHLink(
context,
"Check out the MIH app on the Web",
"https://app.mzansi-innovation-hub.co.za/",
);
},
),
SpeedDialChild(
child: Icon(
Icons.apple,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "MIH - iOS",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
shareMIHLink(
context,
"Check out the MIH app on the App Store",
"https://apps.apple.com/za/app/mzansi-innovation-hub/id6743310890",
);
},
),
SpeedDialChild(
child: Icon(
Icons.android,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "MIH - Android",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
shareMIHLink(
context,
"Check out the MIH app on the Play Store",
"https://play.google.com/store/apps/details?id=za.co.mzansiinnovationhub.mih",
);
},
),
],
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 10.0),
child: Divider(),
),
mihSocials(),
],
),
)
],
);
}
}

View File

@@ -1,3 +1,4 @@
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/mih_apis/mih_mzansi_calendar_apis.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_date_input.dart';
@@ -7,6 +8,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_objects/appointment.dart';
import 'package:mzansi_innovation_hub/mih_objects/business.dart';
@@ -300,24 +302,33 @@ class _PatientAccessRequestState extends State<Appointments> {
),
),
Positioned(
right: 0,
bottom: 0,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
color: MzanziInnovationHub.of(context)!.theme.secondaryColor(),
),
child: IconButton(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
onPressed: () {
right: 0,
bottom: 0,
child: MihFloatingMenu(
icon: Icons.add,
animatedIcon: AnimatedIcons.menu_close,
children: [
SpeedDialChild(
child: Icon(
Icons.add,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Add Card",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
addAppointmentWindow();
},
icon: const Icon(
Icons.add,
size: 50,
),
),
))
)
],
),
),
],
);
}

View File

@@ -128,27 +128,29 @@ class _MihPersonalHomeState extends State<MihPersonalHome> {
//=============== About MIH ===============
temp.add({"About MIH": AboutMihTile(packageSize: packageSize)});
//=============== Dev ===============
temp.add({
"test": MihAppTile(
onTap: () {
Navigator.of(context).pushNamed(
'/package-dev',
//arguments: widget.signedInUser,
);
},
appName: "Test",
appIcon: Container(
padding: const EdgeInsets.all(0.5),
child: Icon(
Icons.warning_amber_rounded,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
if (widget.isDevActive) {
temp.add({
"test": MihAppTile(
onTap: () {
Navigator.of(context).pushNamed(
'/package-dev',
//arguments: widget.signedInUser,
);
},
appName: "Test",
appIcon: Container(
padding: const EdgeInsets.all(0.5),
child: Icon(
Icons.warning_amber_rounded,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
),
),
iconSize: packageSize,
primaryColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(),
secondaryColor: MzanziInnovationHub.of(context)!.theme.primaryColor(),
)
});
iconSize: packageSize,
primaryColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(),
secondaryColor: MzanziInnovationHub.of(context)!.theme.primaryColor(),
)
});
}
return temp;
}

View File

@@ -1,11 +1,13 @@
import 'dart:async';
import 'dart:convert';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_env/env.dart';
import 'package:mzansi_innovation_hub/mih_objects/app_user.dart';
@@ -69,6 +71,7 @@ class _AiChatState extends State<AiChat> {
}
void _handleSendPressed(types.PartialText message) {
FocusScope.of(context).unfocus();
final textMessage = types.TextMessage(
author: _user,
createdAt: DateTime.now().millisecondsSinceEpoch,
@@ -349,7 +352,7 @@ class _AiChatState extends State<AiChat> {
return Visibility(
visible: value,
child: Padding(
padding: const EdgeInsets.all(5.0),
padding: const EdgeInsets.all(10.0),
child: Align(
alignment: Alignment.centerLeft,
child: FittedBox(
@@ -615,95 +618,169 @@ class _AiChatState extends State<AiChat> {
Widget build(BuildContext context) {
return MihAppToolBody(
borderOn: false,
bodyItem: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
bodyItem: getBody(),
);
}
Widget getBody() {
return Stack(
children: [
Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Visibility(
// visible: _showModelOptions.value == true,
// child: IconButton.filled(
// iconSize: 20,
// onPressed: () {
// if (_showModelOptions.value == true) {
// setState(() {
// _showModelOptions.value = false;
// });
// } else {
// setState(() {
// _showModelOptions.value = true;
// });
// }
// },
// icon: const Icon(
// Icons.settings,
// ),
// ),
// ),
Expanded(
child: Text(
"Mzansi AI",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
),
),
),
// Expanded(
// child: Container(
// alignment: Alignment.centerRight,
// child: IconButton(
// onPressed: () {
// _resetChat();
// },
// icon: const Icon(Icons.refresh),
// ),
// ),
// ),
],
),
_getSettings(),
Expanded(
child: GestureDetector(
onTap: () {
if (_showModelOptions.value == true) {
setState(() {
_showModelOptions.value = false;
});
}
},
child: Chat(
messages: _messages,
// onAttachmentPressed: _handleAttachmentPressed,
// onMessageTap: _handleMessageTap,
// onPreviewDataFetched: _handlePreviewDataFetched,
onSendPressed: _handleSendPressed,
showUserAvatars: false,
showUserNames: false,
user: _user,
theme: getChatTheme(),
),
),
)
],
),
Positioned(
left: 0,
top: 0,
child: Visibility(
visible: _showModelOptions.value == true,
child: IconButton.filled(
iconSize: 20,
onPressed: () {
if (_showModelOptions.value == true) {
setState(() {
_showModelOptions.value = false;
});
} else {
setState(() {
_showModelOptions.value = true;
});
}
},
icon: const Icon(
Icons.settings,
),
),
),
),
Positioned(
right: 0,
bottom: 70,
child: MihFloatingMenu(
animatedIcon: AnimatedIcons.menu_close,
children: [
Expanded(
child: Container(
alignment: Alignment.centerLeft,
child: Row(
children: [
Visibility(
visible: _showModelOptions.value == false,
child: IconButton(
onPressed: () {
if (_showModelOptions.value == true) {
setState(() {
_showModelOptions.value = false;
});
} else {
setState(() {
_showModelOptions.value = true;
});
}
},
icon: const Icon(Icons.settings),
),
),
Visibility(
visible: _showModelOptions.value == true,
child: IconButton.filled(
onPressed: () {
if (_showModelOptions.value == true) {
setState(() {
_showModelOptions.value = false;
});
} else {
setState(() {
_showModelOptions.value = true;
});
}
},
icon: const Icon(Icons.settings),
),
),
],
),
SpeedDialChild(
child: Icon(
Icons.refresh,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
),
Text(
"Mzansi AI",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
label: "New Chat",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
_resetChat();
},
),
Expanded(
child: Container(
alignment: Alignment.centerRight,
child: IconButton(
onPressed: () {
_resetChat();
},
icon: const Icon(Icons.refresh),
),
SpeedDialChild(
child: Icon(
Icons.settings,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Settings",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
if (_showModelOptions.value == true) {
setState(() {
_showModelOptions.value = false;
});
} else {
setState(() {
_showModelOptions.value = true;
});
}
},
),
],
),
_getSettings(),
Expanded(
child: Chat(
messages: _messages,
// onAttachmentPressed: _handleAttachmentPressed,
// onMessageTap: _handleMessageTap,
// onPreviewDataFetched: _handlePreviewDataFetched,
onSendPressed: _handleSendPressed,
showUserAvatars: false,
showUserNames: false,
user: _user,
theme: getChatTheme(),
),
)
],
),
),
],
);
}
}

View File

@@ -1,3 +1,4 @@
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_apis/mih_mzansi_wallet_apis.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart';
@@ -7,6 +8,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_objects/app_user.dart';
@@ -316,24 +318,33 @@ class _MihCardsState extends State<MihCards> {
),
),
Positioned(
right: 0,
bottom: 0,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
color: MzanziInnovationHub.of(context)!.theme.secondaryColor(),
),
child: IconButton(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
onPressed: () {
addCardWindow(context);
},
icon: const Icon(
Icons.add_card,
size: 50,
),
),
))
right: 0,
bottom: 0,
child: MihFloatingMenu(
animatedIcon: AnimatedIcons.menu_close,
children: [
SpeedDialChild(
child: Icon(
Icons.add,
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Add Card",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
addCardWindow(context);
},
)
]),
)
],
);
}

View File

@@ -1,6 +1,8 @@
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_apis/mih_claim_statement_generation_api.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_objects/business.dart';
@@ -110,42 +112,92 @@ class _PatientClaimOrStatementState extends State<PatientClaimOrStatement> {
}
Widget getBody() {
return FutureBuilder(
future: futueFiles,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: Mihloadingcircle(),
);
} else if (snapshot.hasData) {
final filesList = snapshot.data!;
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: setIcons(),
),
Divider(
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor()),
const SizedBox(height: 10),
//const Placeholder(),
BuildClaimStatementFileList(
files: filesList,
signedInUser: widget.signedInUser,
selectedPatient: widget.selectedPatient,
business: widget.business,
businessUser: widget.businessUser,
type: widget.type,
),
],
);
} else {
return const Center(
child: Text("Error Loading Notes"),
);
}
},
return Stack(
children: [
FutureBuilder(
future: futueFiles,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: Mihloadingcircle(),
);
} else if (snapshot.hasData) {
final filesList = snapshot.data!;
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Claims/ Statements",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
),
),
],
),
Divider(
color: MzanziInnovationHub.of(context)!
.theme
.secondaryColor()),
const SizedBox(height: 10),
//const Placeholder(),
BuildClaimStatementFileList(
files: filesList,
signedInUser: widget.signedInUser,
selectedPatient: widget.selectedPatient,
business: widget.business,
businessUser: widget.businessUser,
type: widget.type,
),
],
);
} else {
return const Center(
child: Text("Error Loading Notes"),
);
}
},
),
Visibility(
visible: widget.type != "personal",
child: Positioned(
right: 0,
bottom: 0,
child: MihFloatingMenu(
icon: Icons.file_copy,
animatedIcon: AnimatedIcons.menu_close,
children: [
SpeedDialChild(
child: Icon(
Icons.add,
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Generate Claim/ Statement",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
claimOrStatementWindow();
},
)
],
),
),
),
],
);
}
}

View File

@@ -1,4 +1,5 @@
import 'dart:convert';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_multiline_text_input.dart';
@@ -6,6 +7,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart';
@@ -321,41 +323,88 @@ class _PatientConsultationState extends State<PatientConsultation> {
}
Widget getBody() {
return MihSingleChildScroll(
child: FutureBuilder(
future: futueNotes,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: Mihloadingcircle(),
);
} else if (snapshot.hasData) {
final notesList = snapshot.data!;
return Column(children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: setIcons(),
),
Divider(
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor()),
const SizedBox(height: 10),
BuildNotesList(
notes: notesList,
signedInUser: widget.signedInUser,
selectedPatient: widget.selectedPatient,
business: widget.business,
businessUser: widget.businessUser,
type: widget.type,
),
]);
} else {
return const Center(
child: Text("Error Loading Notes"),
);
}
},
),
return Stack(
children: [
MihSingleChildScroll(
child: FutureBuilder(
future: futueNotes,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: Mihloadingcircle(),
);
} else if (snapshot.hasData) {
final notesList = snapshot.data!;
return Column(children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Consultation Notes",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MzanziInnovationHub.of(context)!
.theme
.secondaryColor()),
),
],
),
Divider(
color: MzanziInnovationHub.of(context)!
.theme
.secondaryColor()),
const SizedBox(height: 10),
BuildNotesList(
notes: notesList,
signedInUser: widget.signedInUser,
selectedPatient: widget.selectedPatient,
business: widget.business,
businessUser: widget.businessUser,
type: widget.type,
),
]);
} else {
return const Center(
child: Text("Error Loading Notes"),
);
}
},
),
),
Visibility(
visible: widget.type != "personal",
child: Positioned(
right: 0,
bottom: 0,
child: MihFloatingMenu(
icon: Icons.add,
animatedIcon: AnimatedIcons.menu_close,
children: [
SpeedDialChild(
child: Icon(
Icons.add,
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Add Note",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {},
)
],
),
),
),
],
);
}
}

View File

@@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/med_cert_input.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart';
@@ -7,6 +8,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart';
@@ -372,6 +374,104 @@ class _PatientDocumentsState extends State<PatientDocuments> {
}
}
Widget getMenu() {
if (widget.type == "personal") {
return Positioned(
right: 0,
bottom: 0,
child: MihFloatingMenu(
icon: Icons.add,
animatedIcon: AnimatedIcons.menu_close,
children: [
SpeedDialChild(
child: Icon(
Icons.attach_file,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Attach Document",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
uploudFilePopUp();
},
)
],
),
);
} else {
return Positioned(
right: 0,
bottom: 0,
child: MihFloatingMenu(
icon: Icons.add,
animatedIcon: AnimatedIcons.menu_close,
children: [
SpeedDialChild(
child: Icon(
Icons.attach_file,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Add Document",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
uploudFilePopUp();
},
),
SpeedDialChild(
child: Icon(
Icons.sick_outlined,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Generate Medical Certificate",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
medCertPopUp();
},
),
SpeedDialChild(
child: Icon(
Icons.medication,
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Generate Prescription",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
prescritionPopUp();
},
),
],
),
);
}
}
List<Widget> setIcons() {
if (widget.type == "personal") {
return [
@@ -488,41 +588,59 @@ class _PatientDocumentsState extends State<PatientDocuments> {
}
Widget getBody() {
return MihSingleChildScroll(
child: FutureBuilder(
future: futueFiles,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: Mihloadingcircle(),
);
} else if (snapshot.hasData) {
final filesList = snapshot.data!;
return Column(children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: setIcons(),
),
Divider(
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor()),
const SizedBox(height: 10),
BuildFilesList(
files: filesList,
signedInUser: widget.signedInUser,
selectedPatient: widget.selectedPatient,
business: widget.business,
businessUser: widget.businessUser,
type: widget.type,
),
]);
} else {
return const Center(
child: Text("Error Loading Notes"),
);
}
},
),
return Stack(
children: [
MihSingleChildScroll(
child: FutureBuilder(
future: futueFiles,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: Mihloadingcircle(),
);
} else if (snapshot.hasData) {
final filesList = snapshot.data!;
return Column(children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Documents",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
),
),
],
),
Divider(
color: MzanziInnovationHub.of(context)!
.theme
.secondaryColor()),
const SizedBox(height: 10),
BuildFilesList(
files: filesList,
signedInUser: widget.signedInUser,
selectedPatient: widget.selectedPatient,
business: widget.business,
businessUser: widget.businessUser,
type: widget.type,
),
]);
} else {
return const Center(
child: Text("Error Loading Notes"),
);
}
},
),
),
getMenu(),
],
);
}
}

View File

@@ -1,7 +1,9 @@
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_objects/patients.dart';
@@ -237,58 +239,87 @@ class _PatientInfoState extends State<PatientInfo> {
}
Widget getBody() {
return MihSingleChildScroll(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
//crossAxisAlignment: ,
children: [
Text(
"Personal Details",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
),
return Stack(
children: [
MihSingleChildScroll(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
//crossAxisAlignment: ,
children: [
Text(
"Personal Details",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
),
),
]),
Divider(
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor()),
const SizedBox(height: 10),
getPatientDetailsField(),
const SizedBox(height: 10),
Text(
"Medical Aid Details",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
),
Visibility(
visible: widget.type == "personal",
child: IconButton(
icon: const Icon(Icons.edit),
alignment: Alignment.topRight,
),
Divider(
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor()),
const SizedBox(height: 10),
getMedAidDetailsFields(),
],
),
),
Visibility(
visible: widget.type == "personal",
child: Positioned(
right: 0,
bottom: 0,
child: MihFloatingMenu(
icon: Icons.add,
animatedIcon: AnimatedIcons.menu_close,
children: [
SpeedDialChild(
child: Icon(
Icons.edit,
color:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
onPressed: () {
Navigator.of(context).pushNamed('/patient-profile/edit',
arguments: PatientEditArguments(
widget.signedInUser, widget.selectedPatient));
},
MzanziInnovationHub.of(context)!.theme.primaryColor(),
),
label: "Edit Profile",
labelBackgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
labelStyle: TextStyle(
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontWeight: FontWeight.bold,
),
backgroundColor:
MzanziInnovationHub.of(context)!.theme.successColor(),
onTap: () {
Navigator.of(context).pushNamed('/patient-profile/edit',
arguments: PatientEditArguments(
widget.signedInUser, widget.selectedPatient));
},
)
]),
Divider(
color: MzanziInnovationHub.of(context)!.theme.secondaryColor()),
const SizedBox(height: 10),
getPatientDetailsField(),
const SizedBox(height: 10),
Text(
"Medical Aid Details",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MzanziInnovationHub.of(context)!.theme.secondaryColor(),
],
),
),
Divider(
color: MzanziInnovationHub.of(context)!.theme.secondaryColor()),
const SizedBox(height: 10),
getMedAidDetailsFields(),
],
),
),
],
);
}
}

View File

@@ -11,7 +11,9 @@ import flutter_tts
import geolocator_apple
import local_auth_darwin
import mobile_scanner
import path_provider_foundation
import printing
import share_plus
import shared_preferences_foundation
import syncfusion_pdfviewer_macos
import url_launcher_macos
@@ -24,7 +26,9 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin"))
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SyncfusionFlutterPdfViewerPlugin.register(with: registry.registrar(forPlugin: "SyncfusionFlutterPdfViewerPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))

View File

@@ -470,6 +470,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.27"
flutter_speed_dial:
dependency: "direct main"
description:
name: flutter_speed_dial
sha256: "698a037274a66dbae8697c265440e6acb6ab6cae9ac5f95c749e7944d8f28d41"
url: "https://pub.dev"
source: hosted
version: "7.0.0"
flutter_swipe_detector:
dependency: "direct main"
description:
@@ -856,6 +864,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12"
url: "https://pub.dev"
source: hosted
version: "2.2.16"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
path_provider_linux:
dependency: transitive
description:
@@ -992,6 +1024,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.0.1"
share_plus:
dependency: "direct main"
description:
name: share_plus
sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da
url: "https://pub.dev"
source: hosted
version: "10.1.4"
share_plus_platform_interface:
dependency: transitive
description:
name: share_plus_platform_interface
sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b
url: "https://pub.dev"
source: hosted
version: "5.0.2"
shared_preferences:
dependency: transitive
description:

View File

@@ -73,7 +73,9 @@ dependencies:
flutter_chat_types: ^3.6.2
uuid: ^4.5.1
flutter_tts: ^4.2.2
flutter_speed_dial: ^7.0.0
share_plus: ^10.1.4
dev_dependencies:
flutter_test:
sdk: flutter

View File

@@ -11,6 +11,7 @@
#include <geolocator_windows/geolocator_windows.h>
#include <local_auth_windows/local_auth_plugin.h>
#include <printing/printing_plugin.h>
#include <share_plus/share_plus_windows_plugin_c_api.h>
#include <syncfusion_pdfviewer_windows/syncfusion_pdfviewer_windows_plugin.h>
#include <url_launcher_windows/url_launcher_windows.h>
@@ -25,6 +26,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("LocalAuthPlugin"));
PrintingPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("PrintingPlugin"));
SharePlusWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin"));
UrlLauncherWindowsRegisterWithRegistrar(

View File

@@ -8,6 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
geolocator_windows
local_auth_windows
printing
share_plus
syncfusion_pdfviewer_windows
url_launcher_windows
)