You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
12 KiB
Dart
293 lines
12 KiB
Dart
import 'package:easy_localization/easy_localization.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:hmg_patient_app_new/core/app_export.dart';
|
|
import 'package:hmg_patient_app_new/core/utils/utils.dart';
|
|
import 'package:hmg_patient_app_new/extensions/route_extensions.dart';
|
|
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
|
|
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
|
|
import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart';
|
|
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
|
|
import 'package:hmg_patient_app_new/theme/colors.dart';
|
|
import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
|
|
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
|
|
import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
class SuggestionsScreen extends StatefulWidget {
|
|
const SuggestionsScreen({super.key});
|
|
|
|
@override
|
|
State<SuggestionsScreen> createState() => _SuggestionsScreenState();
|
|
}
|
|
|
|
class _SuggestionsScreenState extends State<SuggestionsScreen> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
// Initialize symptom groups based on selected organs
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
final viewModel = context.read<SymptomsCheckerViewModel>();
|
|
viewModel.initializeSymptomGroups();
|
|
});
|
|
}
|
|
|
|
void _onOptionSelected(int optionIndex) {}
|
|
|
|
void _onNextPressed(SymptomsCheckerViewModel viewModel) {
|
|
if (viewModel.hasSelectedSymptoms) {
|
|
// Navigate to triage screen
|
|
context.navigateWithName(AppRoutes.triageScreen);
|
|
} else {
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text('Please select at least one option before proceeding'.needTranslation),
|
|
backgroundColor: AppColors.errorColor,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
void _onPreviousPressed() {
|
|
context.pop();
|
|
}
|
|
|
|
_buildConfirmationBottomSheet({required BuildContext context, required VoidCallback onConfirm}) {
|
|
return showCommonBottomSheetWithoutHeight(
|
|
title: LocaleKeys.notice.tr(context: context),
|
|
context,
|
|
child: Utils.getWarningWidget(
|
|
loadingText: "Are you sure you want to restart the organ selection?".needTranslation,
|
|
isShowActionButtons: true,
|
|
onCancelTap: () => Navigator.pop(context),
|
|
onConfirmTap: () => onConfirm(),
|
|
),
|
|
callBackFunc: () {},
|
|
isFullScreen: false,
|
|
isCloseButtonVisible: true,
|
|
);
|
|
}
|
|
|
|
Widget _buildOptionItem(int index, bool selected, String optionText) {
|
|
return GestureDetector(
|
|
onTap: () => _onOptionSelected(index),
|
|
child: Container(
|
|
margin: EdgeInsets.only(bottom: 12.h),
|
|
child: Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
AnimatedContainer(
|
|
duration: const Duration(milliseconds: 300),
|
|
curve: Curves.easeInOut,
|
|
width: 24.w,
|
|
height: 24.w,
|
|
decoration: BoxDecoration(
|
|
color: selected ? AppColors.primaryRedColor : Colors.transparent,
|
|
borderRadius: BorderRadius.circular(5.r),
|
|
border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 1.w),
|
|
),
|
|
child: selected ? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor) : null,
|
|
),
|
|
SizedBox(width: 12.w),
|
|
Expanded(
|
|
child: Text(
|
|
optionText,
|
|
style: TextStyle(fontSize: 14.f, color: AppColors.textColor, fontWeight: FontWeight.w500),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget buildFactorsList() {
|
|
return AnimatedSwitcher(
|
|
duration: const Duration(milliseconds: 400),
|
|
transitionBuilder: (Widget child, Animation<double> animation) {
|
|
final offsetAnimation = Tween<Offset>(
|
|
begin: const Offset(1.0, 0.0),
|
|
end: Offset.zero,
|
|
).animate(CurvedAnimation(
|
|
parent: animation,
|
|
curve: Curves.easeInOut,
|
|
));
|
|
|
|
return SlideTransition(
|
|
position: offsetAnimation,
|
|
child: FadeTransition(
|
|
opacity: animation,
|
|
child: child,
|
|
),
|
|
);
|
|
},
|
|
child: Container(
|
|
width: double.infinity,
|
|
margin: EdgeInsets.symmetric(horizontal: 24.w),
|
|
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
|
|
padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 20.w),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
...List.generate(4, (index) {
|
|
return _buildOptionItem(index, false, "currentQuestion.options[index].text");
|
|
}),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
backgroundColor: AppColors.bgScaffoldColor,
|
|
body: Consumer<SymptomsCheckerViewModel>(
|
|
builder: (context, viewModel, _) {
|
|
return Column(
|
|
children: [
|
|
Expanded(
|
|
child: CollapsingListView(
|
|
title: "Suggestions".needTranslation,
|
|
leadingCallback: () => _buildConfirmationBottomSheet(
|
|
context: context,
|
|
onConfirm: () => {
|
|
context.pop(),
|
|
context.pop(),
|
|
}),
|
|
child: _buildEmptyState(),
|
|
|
|
// child: viewModel.organSymptomsGroups.isEmpty
|
|
// ? _buildEmptyState()
|
|
// : Column(
|
|
// crossAxisAlignment: CrossAxisAlignment.start,
|
|
// children: [
|
|
// SizedBox(height: 16.h),
|
|
// ...viewModel.organSymptomsGroups.map((group) {
|
|
// return Padding(
|
|
// padding: EdgeInsets.only(bottom: 16.h),
|
|
// child: Container(
|
|
// width: double.infinity,
|
|
// margin: EdgeInsets.symmetric(horizontal: 24.w),
|
|
// decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
|
|
// padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
|
|
// child: Column(
|
|
// crossAxisAlignment: CrossAxisAlignment.start,
|
|
// children: [
|
|
// Row(
|
|
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
// children: [
|
|
// Expanded(
|
|
// child: Text(
|
|
// 'Possible symptoms related to "${group.organName}"',
|
|
// style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
|
|
// ),
|
|
// ),
|
|
// ],
|
|
// ),
|
|
// SizedBox(height: 24.h),
|
|
// Wrap(
|
|
// runSpacing: 12.h,
|
|
// spacing: 8.w,
|
|
// children: group.symptoms.map((symptom) {
|
|
// bool isSelected = viewModel.isSymptomSelected(group.organId, symptom.id);
|
|
// return GestureDetector(
|
|
// onTap: () => viewModel.toggleSymptomSelection(group.organId, symptom.id),
|
|
// child: CustomSelectableChip(
|
|
// label: symptom.name,
|
|
// selected: isSelected,
|
|
// activeColor: AppColors.primaryRedBorderColor,
|
|
// activeTextColor: AppColors.primaryRedBorderColor,
|
|
// inactiveBorderColor: AppColors.bottomNAVBorder,
|
|
// inactiveTextColor: AppColors.textColor,
|
|
// ),
|
|
// );
|
|
// }).toList(),
|
|
// ),
|
|
// ],
|
|
// ),
|
|
// ),
|
|
// );
|
|
// }),
|
|
// ],
|
|
// ),
|
|
),
|
|
),
|
|
_buildStickyBottomCard(context, viewModel),
|
|
],
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildEmptyState() {
|
|
return Center(
|
|
child: Padding(
|
|
padding: EdgeInsets.all(24.h),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Icon(Icons.info_outline, size: 64.h, color: AppColors.greyTextColor),
|
|
SizedBox(height: 16.h),
|
|
Text(
|
|
'No organs selected'.needTranslation,
|
|
style: TextStyle(
|
|
fontSize: 18.f,
|
|
fontWeight: FontWeight.w600,
|
|
color: AppColors.textColor,
|
|
),
|
|
),
|
|
SizedBox(height: 8.h),
|
|
Text(
|
|
'Please go back and select organs first'.needTranslation,
|
|
textAlign: TextAlign.center,
|
|
style: TextStyle(
|
|
fontSize: 14.f,
|
|
color: AppColors.greyTextColor,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildStickyBottomCard(BuildContext context, SymptomsCheckerViewModel viewModel) {
|
|
return Container(
|
|
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
SizedBox(height: 16.h),
|
|
Row(
|
|
children: [
|
|
Expanded(
|
|
child: CustomButton(
|
|
text: "Previous".needTranslation,
|
|
onPressed: _onPreviousPressed,
|
|
backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
|
|
borderColor: Colors.transparent,
|
|
textColor: AppColors.primaryRedColor,
|
|
fontSize: 16.f,
|
|
),
|
|
),
|
|
SizedBox(width: 12.w),
|
|
Expanded(
|
|
child: CustomButton(
|
|
text: "Next".needTranslation,
|
|
onPressed: () => _onNextPressed(viewModel),
|
|
backgroundColor: AppColors.primaryRedColor,
|
|
borderColor: AppColors.primaryRedColor,
|
|
textColor: AppColors.whiteColor,
|
|
fontSize: 16.f,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
SizedBox(height: 24.h),
|
|
],
|
|
).paddingSymmetrical(24.w, 0),
|
|
);
|
|
}
|
|
}
|