added monthly report

pull/152/head
Fatimah.Alshammari 3 weeks ago
parent c9de23347a
commit 68f044de52

@ -31,6 +31,7 @@ import 'package:hmg_patient_app_new/features/location/location_repo.dart';
import 'package:hmg_patient_app_new/features/location/location_view_model.dart';
import 'package:hmg_patient_app_new/features/medical_file/medical_file_repo.dart';
import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
import 'package:hmg_patient_app_new/features/monthly_reports/monthly_reports_repo.dart';
import 'package:hmg_patient_app_new/features/my_appointments/appointment_rating_view_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart';
import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart';
@ -48,6 +49,7 @@ import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_v
import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart';
import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart';
import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart';
import 'package:hmg_patient_app_new/presentation/monthly_reports/monthly_reports_page.dart';
import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart';
import 'package:hmg_patient_app_new/services/cache_service.dart';
import 'package:hmg_patient_app_new/services/dialog_service.dart';
@ -62,8 +64,8 @@ import 'package:logger/web.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../features/active_prescriptions/active_prescriptions_repo.dart';
import '../features/terms_conditions/terms_conditions_repo.dart';
import '../features/terms_conditions/terms_conditions_view_model.dart';
import '../features/monthly_reports/terms_conditions_repo.dart';
import '../features/monthly_reports/terms_conditions_view_model.dart';
GetIt getIt = GetIt.instance;
@ -135,6 +137,7 @@ class AppDependencies {
getIt.registerLazySingleton<TermsConditionsRepo>(() => TermsConditionsRepoImp(loggerService: getIt<LoggerService>(), apiClient: getIt()));
getIt.registerFactory<TermsConditionsViewModel>(() => TermsConditionsViewModel(termsConditionsRepo: getIt<TermsConditionsRepo>(), errorHandlerService: getIt<ErrorHandlerService>(),
),);
getIt.registerLazySingleton<MonthlyReportsRepo>(() => MonthlyReportsRepoImp(loggerService: getIt<LoggerService>(), apiClient: getIt()));
// ViewModels
// Global/shared VMs LazySingleton

@ -0,0 +1,96 @@
import 'package:dartz/dartz.dart';
import '../../core/api/api_client.dart';
import '../../core/api_consts.dart';
import '../../core/common_models/generic_api_model.dart';
import '../../core/exceptions/api_failure.dart';
import '../../services/logger_service.dart';
abstract class MonthlyReportsRepo {
Future<Either<Failure, GenericApiModel<dynamic>>> saveMonthlyReport({
String? email,
});
}
class MonthlyReportsRepoImp implements MonthlyReportsRepo {
final ApiClient apiClient;
final LoggerService loggerService;
MonthlyReportsRepoImp({
required this.loggerService,
required this.apiClient,
});
@override
Future<Either<Failure, GenericApiModel<dynamic>>> saveMonthlyReport({
String? email,
}) async {
try {
Failure? failure;
GenericApiModel<dynamic>? reportApiResponse;
await apiClient.post(
ApiConsts.getMonthlyReports,
body: <String, dynamic>{},
onFailure: (error, statusCode, {messageStatus, failureType}) {
failure = failureType;
},
onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
try {
reportApiResponse = GenericApiModel<dynamic>(
messageStatus: messageStatus,
statusCode: statusCode,
errorMessage: errorMessage,
data: response,
);
} catch (e) {
failure = DataParsingFailure(e.toString());
}
},
);
if (failure != null) return Left(failure!);
if (reportApiResponse == null) return Left(ServerFailure("Unknown error"));
if ((reportApiResponse!.messageStatus ?? 0) != 1) {
return Right(reportApiResponse!);
}
GenericApiModel<dynamic>? emailApiResponse;
final Map<String, dynamic> emailRequest = <String, dynamic>{};
if (email != null && email.trim().isNotEmpty) {
emailRequest["Email"] = email.trim();
}
await apiClient.post(
ApiConsts.updatePatientEmail,
body: emailRequest,
onFailure: (error, statusCode, {messageStatus, failureType}) {
failure = failureType;
},
onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
try {
emailApiResponse = GenericApiModel<dynamic>(
messageStatus: messageStatus,
statusCode: statusCode,
errorMessage: errorMessage,
data: response,
);
} catch (e) {
failure = DataParsingFailure(e.toString());
}
},
);
if (failure != null) return Left(failure!);
if (emailApiResponse == null) return Left(ServerFailure("Unknown error"));
return Right(emailApiResponse!);
} catch (e) {
loggerService.logError("MonthlyReportsRepo.saveMonthlyReport error: $e");
return Left(UnknownFailure(e.toString()));
}
}
}

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/services/error_handler_service.dart';
import 'monthly_reports_repo.dart';
class MonthlyReportsViewModel extends ChangeNotifier {
final MonthlyReportsRepo monthlyReportsRepo;
final ErrorHandlerService errorHandlerService;
bool isLoading = false;
MonthlyReportsViewModel({
required this.monthlyReportsRepo,
required this.errorHandlerService,
});
Future<bool> saveMonthlyReport({String? email}) async {
isLoading = true;
notifyListeners();
final result = await monthlyReportsRepo.saveMonthlyReport(email: email);
final success = result.fold(
(failure) {
errorHandlerService.handleError(failure: failure);
return false;
},
(apiResponse) => (apiResponse.messageStatus ?? 0) == 1,
);
isLoading = false;
notifyListeners();
return success;
}
}

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/features/terms_conditions/terms_conditions_repo.dart';
import 'package:hmg_patient_app_new/features/monthly_reports/terms_conditions_repo.dart';
import 'package:hmg_patient_app_new/services/error_handler_service.dart';
class TermsConditionsViewModel extends ChangeNotifier {

@ -43,7 +43,7 @@ import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'core/utils/size_utils.dart';
import 'features/terms_conditions/terms_conditions_view_model.dart';
import 'features/monthly_reports/terms_conditions_view_model.dart';
import 'firebase_options.dart';
@pragma('vm:entry-point')

@ -3,12 +3,15 @@ import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_export.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/monthly_reports/monthly_reports_view_model.dart';
import 'package:hmg_patient_app_new/presentation/monthly_reports/user_agreement_page.dart';
import 'package:provider/provider.dart';
import '../../generated/locale_keys.g.dart';
import '../../theme/colors.dart';
import '../../widgets/appbar/app_bar_widget.dart';
import '../../widgets/input_widget.dart';
import '../../widgets/loader/bottomsheet_loader.dart';
class MonthlyReportsPage extends StatefulWidget {
const MonthlyReportsPage({super.key});
@ -39,7 +42,25 @@ class _MonthlyReportsPageState extends State<MonthlyReportsPage> {
);
}
void _onSavePressed() {
void _showSuccessSnackBar() {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Successfully updated".needTranslation,
style: const TextStyle(
color: AppColors.whiteColor,
fontWeight: FontWeight.w600,
),
),
behavior: SnackBarBehavior.floating,
backgroundColor: AppColors.textGreenColor,
duration: const Duration(seconds: 2),
),
);
}
Future<void> _onSavePressed() async {
if (!isTermsAccepted) {
_showError("Please accept the terms and conditions".needTranslation);
return;
@ -51,11 +72,18 @@ class _MonthlyReportsPageState extends State<MonthlyReportsPage> {
return;
}
setState(() {
isHealthSummaryEnabled = true;
});
final vm = context.read<MonthlyReportsViewModel>();
// LoaderBottomSheet.showLoader();
final ok = await vm.saveMonthlyReport(email: email);
// LoaderBottomSheet.hideLoader();
// TODO: هنا حطي API/logic حق الحفظ
if (ok) {
setState(() => isHealthSummaryEnabled = true);
_showSuccessSnackBar();
} else {
_showError("Failed to update".needTranslation);
}
}
@override
@ -87,7 +115,7 @@ class _MonthlyReportsPageState extends State<MonthlyReportsPage> {
height: 54.h,
alignment: Alignment.center,
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
color: Colors.white,
color: AppColors.whiteColor,
borderRadius: (12.r),
),
child: Row(
@ -139,7 +167,7 @@ class _MonthlyReportsPageState extends State<MonthlyReportsPage> {
child: Text(
"Click here".needTranslation,
style: TextStyle(
color: AppColors.errorColor,
color: AppColors.primaryRedColor,
fontSize: 14.f,
fontWeight: FontWeight.w600,
),
@ -179,7 +207,7 @@ class _MonthlyReportsPageState extends State<MonthlyReportsPage> {
),
),
child: isTermsAccepted
? Icon(Icons.check, size: 16.f, color: Colors.white)
? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor,)
: null,
),
SizedBox(width: 12.h),
@ -188,7 +216,7 @@ class _MonthlyReportsPageState extends State<MonthlyReportsPage> {
style: context.dynamicTextStyle(
fontSize: 12.f,
fontWeight: FontWeight.w500,
color: const Color(0xFF2E3039),
color: AppColors.textColor,
),
),
],
@ -198,7 +226,8 @@ class _MonthlyReportsPageState extends State<MonthlyReportsPage> {
SizedBox(height: 12.h),
Text(
"This is monthly health summary report".needTranslation,
"This monthly Health Summary Report reflects the health indicators and analysis results of the latest visits. Please note that this will be sent automatically from the system and it's not considered as an official report so no medical decisions should be taken based on it"
.needTranslation,
style: TextStyle(
color: AppColors.textColor,
fontSize: 10.f,
@ -279,5 +308,3 @@ class _MonthlyReportsPageState extends State<MonthlyReportsPage> {
);
}
}

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/features/terms_conditions/terms_conditions_view_model.dart';
import 'package:hmg_patient_app_new/features/monthly_reports/terms_conditions_view_model.dart';
import 'package:provider/provider.dart';
import 'package:webview_flutter/webview_flutter.dart';
@ -93,14 +93,14 @@ class _UserAgreementPageState extends State<UserAgreementPage> {
margin: const EdgeInsets.all(16),
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
color: AppColors.whiteColor,
borderRadius: BorderRadius.circular(8),
),
child: Text(
_errorMessage!,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.red,
style: TextStyle(
color: AppColors.primaryRedColor,
fontWeight: FontWeight.w600,
),
),

@ -23,7 +23,12 @@ import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_sele
import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart';
import 'package:hmg_patient_app_new/splashPage.dart';
import '../core/dependencies.dart';
import '../features/monthly_reports/monthly_reports_repo.dart';
import '../features/monthly_reports/monthly_reports_view_model.dart';
import '../presentation/monthly_reports/monthly_reports_page.dart';
import '../services/error_handler_service.dart';
import 'package:provider/provider.dart';
class AppRoutes {
static const String initialRoute = '/initialRoute';
@ -83,7 +88,14 @@ class AppRoutes {
//
healthCalculatorsPage: (context) => HealthCalculatorsPage(),
monthlyReports: (context) => MonthlyReportsPage()
// monthlyReports: (context) => MonthlyReportsPage()
monthlyReports: (context) => ChangeNotifierProvider(
create: (_) => MonthlyReportsViewModel(
monthlyReportsRepo: getIt<MonthlyReportsRepo>(),
errorHandlerService: getIt<ErrorHandlerService>(),
),
child: const MonthlyReportsPage(),
),
};
}

Loading…
Cancel
Save