From ec00ad52898274a16a0eb86c65869da25f08179e Mon Sep 17 00:00:00 2001 From: nthsneha Date: Thu, 26 Mar 2026 01:11:43 +0530 Subject: [PATCH 1/6] feat: implement patient activities backend sync on navigation --- .../activities/daily_activities_screen.dart | 2 +- patient/lib/provider/task_provider.dart | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/patient/lib/presentation/activities/daily_activities_screen.dart b/patient/lib/presentation/activities/daily_activities_screen.dart index 182ba99..b0e9448 100644 --- a/patient/lib/presentation/activities/daily_activities_screen.dart +++ b/patient/lib/presentation/activities/daily_activities_screen.dart @@ -62,7 +62,7 @@ class _DailyActivitiesScreenState extends State leading: IconButton( icon: const Icon(Icons.arrow_back_ios_new_rounded), onPressed: () { - // context.read().updateActivityInBackground(); // TODO: Uncomment this when the backend is ready + context.read().updateActivityInBackground(); Navigator.pop(context); }, ), diff --git a/patient/lib/provider/task_provider.dart b/patient/lib/provider/task_provider.dart index 983a406..b5caff0 100644 --- a/patient/lib/provider/task_provider.dart +++ b/patient/lib/provider/task_provider.dart @@ -7,6 +7,7 @@ class TaskProvider extends ChangeNotifier { DateTime _selectedDate = DateTime.now(); final PatientRepository _patientRepository; ApiStatus _apiStatus = ApiStatus.initial; + ApiStatus _syncStatus = ApiStatus.initial; String? _activityId; String? _activitySetId; @@ -76,6 +77,26 @@ class TaskProvider extends ChangeNotifier { notifyListeners(); } + /// Updates activity completion status in the background (typically before navigation) + /// This method syncs the current task completion status to the backend + Future updateActivityInBackground() async { + if (_allTasks.isEmpty) { + return; + } + try { + _syncStatus = ApiStatus.loading; + notifyListeners(); + await updateActivityCompletion(_allTasks); + _syncStatus = ApiStatus.success; + } catch(e) { + _syncStatus = ApiStatus.failure; + // Activity data is still available locally - user can retry on return + } finally { + notifyListeners(); + } + } + int get completedTasksCount => tasks.where((task) => task.isCompleted ?? false).length; int get totalTasksCount => tasks.length; + ApiStatus get syncStatus => _syncStatus; } From 9caf1e414431f2aaebd62b7f754547f289e34c7b Mon Sep 17 00:00:00 2001 From: nthsneha Date: Sat, 28 Mar 2026 16:15:14 +0530 Subject: [PATCH 2/6] fix: add PopScope and improve exception handling --- .../activities/daily_activities_screen.dart | 30 ++++++++++++------- patient/lib/provider/task_provider.dart | 17 ++++------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/patient/lib/presentation/activities/daily_activities_screen.dart b/patient/lib/presentation/activities/daily_activities_screen.dart index b0e9448..7e7ebe4 100644 --- a/patient/lib/presentation/activities/daily_activities_screen.dart +++ b/patient/lib/presentation/activities/daily_activities_screen.dart @@ -55,18 +55,25 @@ class _DailyActivitiesScreenState extends State @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Daily Activities'), - centerTitle: true, - leading: IconButton( - icon: const Icon(Icons.arrow_back_ios_new_rounded), - onPressed: () { - context.read().updateActivityInBackground(); - Navigator.pop(context); - }, + return PopScope( + canPop: true, + onPopInvokedWithResult: (didPop, result) { + if (didPop) { + context.read().updateActivityInBackground(); + } + }, + child: Scaffold( + appBar: AppBar( + title: const Text('Daily Activities'), + centerTitle: true, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new_rounded), + onPressed: () { + context.read().updateActivityInBackground(); + Navigator.pop(context); + }, + ), ), - ), body: Consumer( builder: (context, taskProvider, child) { final tasks = taskProvider.tasks; @@ -229,6 +236,7 @@ class _DailyActivitiesScreenState extends State ); }, ), + ), ); } } diff --git a/patient/lib/provider/task_provider.dart b/patient/lib/provider/task_provider.dart index b5caff0..092d20c 100644 --- a/patient/lib/provider/task_provider.dart +++ b/patient/lib/provider/task_provider.dart @@ -83,17 +83,12 @@ class TaskProvider extends ChangeNotifier { if (_allTasks.isEmpty) { return; } - try { - _syncStatus = ApiStatus.loading; - notifyListeners(); - await updateActivityCompletion(_allTasks); - _syncStatus = ApiStatus.success; - } catch(e) { - _syncStatus = ApiStatus.failure; - // Activity data is still available locally - user can retry on return - } finally { - notifyListeners(); - } + _syncStatus = ApiStatus.loading; + notifyListeners(); + await updateActivityCompletion(_allTasks); + // updateActivityCompletion sets _apiStatus, copy it to _syncStatus + _syncStatus = _apiStatus; + notifyListeners(); } int get completedTasksCount => tasks.where((task) => task.isCompleted ?? false).length; From bfbc0640d92973dd7e96a3cdb7234167279f958c Mon Sep 17 00:00:00 2001 From: nthsneha Date: Sat, 28 Mar 2026 11:42:05 +0530 Subject: [PATCH 3/6] feat: add therapist dashboard metrics (patients/sessions/therapies) --- .../lib/presentation/home/home_screen.dart | 81 ++++++++++++------- .../lib/provider/therapist_provider.dart | 32 ++++++++ .../supabase_therapist_repository.dart | 51 +++++++++--- 3 files changed, 124 insertions(+), 40 deletions(-) diff --git a/therapist/lib/presentation/home/home_screen.dart b/therapist/lib/presentation/home/home_screen.dart index a30e396..74d1b88 100644 --- a/therapist/lib/presentation/home/home_screen.dart +++ b/therapist/lib/presentation/home/home_screen.dart @@ -36,8 +36,11 @@ class _HomeScreenState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { Provider.of(context, listen: false) .fetchConsultationRequests(); - Provider.of(context, listen: false) - .fetchPatientsMappedToTherapist(); + final therapistProvider = Provider.of(context, listen: false); + therapistProvider.fetchPatientsMappedToTherapist(); + therapistProvider.fetchTotals(); + Provider.of(context, listen: false) + .fetchTherapistSessions(); }); _refreshTimer = Timer.periodic(const Duration(minutes: 3), (_) { @@ -249,34 +252,54 @@ class HomeContent extends StatelessWidget { ), ), const SizedBox(height: 24), - //_buildConsultationRequestSection(context), - // _buildConsultationRequestSection(context), - Consumer( - builder: (context, provider, _) { - if(provider.patientsStatus == ApiStatus.loading) { - return const Center(child: CircularProgressIndicator()); - } else if(provider.patientsStatus == ApiStatus.failure) { - return const Center(child: Text('No patients found')); - } else if(provider.patientsStatus == ApiStatus.success) { - if(provider.patients.isEmpty) { - return const Center(child: Text('No patients found')); - } else { - return Column( - children: provider.patients.map((patient) => PatientCard( - name: patient.patientName, - id: patient.patientId, - phone: patient.phoneNo, - email: patient.email, - package: '-', - duration: '-', - imagePath: 'assets/abdul.png', - )).toList(), - ); + Consumer2( + builder: (context, therapistProvider, sessionProvider, _) { + if (therapistProvider.isLoading || sessionProvider.isLoading) { + return const Center(child: CircularProgressIndicator()); } - } - return const SizedBox.shrink(); - }, - ), + + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 5), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + StatsCard( + imagePath: 'assets/icon1.png', + backgroundColor: const Color(0xFFFEE8E8), + label: 'Patients', + value: therapistProvider.totalPatients.toString(), + ), + StatsCard( + imagePath: 'assets/icon2.png', + backgroundColor: const Color(0xFFF1E8FE), + label: 'Sessions', + value: sessionProvider.totalSessions.toString(), + ), + StatsCard( + imagePath: 'assets/icon3.png', + backgroundColor: const Color(0xFFE8FEF0), + label: 'Therapies', + value: therapistProvider.totalTherapies.toString(), + ), + ], + ), + ); + }, + ), + const SizedBox(height: 24), + // _buildConsultationRequestSection(context), + ], ), ), diff --git a/therapist/lib/provider/therapist_provider.dart b/therapist/lib/provider/therapist_provider.dart index 3cae5e8..7badd92 100644 --- a/therapist/lib/provider/therapist_provider.dart +++ b/therapist/lib/provider/therapist_provider.dart @@ -152,6 +152,15 @@ class TherapistDataProvider extends ChangeNotifier { notifyListeners(); } + int _totalPatients = 0; + int get totalPatients => _totalPatients; + + int _totalSessions = 0; + int get totalSessions => _totalSessions; + + int _totalTherapies = 0; + int get totalTherapies => _totalTherapies; + // Fetch therapies based on selected profession Future fetchTherapies(int professionId) async { _isLoading = true; @@ -170,6 +179,29 @@ class TherapistDataProvider extends ChangeNotifier { notifyListeners(); } + Future fetchTotals() async { + _isLoading = true; + notifyListeners(); + + final patientsResult = await _therapistRepository.getTotalPatients(); + if (patientsResult is ActionResultSuccess) { + _totalPatients = patientsResult.data as int; + } + + final sessionsResult = await _therapistRepository.getTotalSessions(); + if (sessionsResult is ActionResultSuccess) { + _totalSessions = sessionsResult.data as int; + } + + final therapiesResult = await _therapistRepository.getTotalTherapies(); + if (therapiesResult is ActionResultSuccess) { + _totalTherapies = therapiesResult.data as int; + } + + _isLoading = false; + notifyListeners(); + } + // Set selected profession and fetch related data Future setSelectedProfession(int professionId, String professionName) async { _selectedProfessionId = professionId; diff --git a/therapist/lib/repository/supabase_therapist_repository.dart b/therapist/lib/repository/supabase_therapist_repository.dart index d56e1f8..cc4d7b6 100644 --- a/therapist/lib/repository/supabase_therapist_repository.dart +++ b/therapist/lib/repository/supabase_therapist_repository.dart @@ -129,21 +129,50 @@ class SupabaseTherapistRepository implements TherapistRepository { } @override - Future getTotalPatients() { - // TODO: implement getTotalPatients - throw UnimplementedError(); + Future getTotalPatients() async { + try { + final response = await _supabaseClient + .from('patient') + .select('id') + .eq('therapist_id', _supabaseClient.auth.currentUser!.id); + + final count = response is List ? response.length : 0; + return ActionResultSuccess(data: count, statusCode: 200); + } catch (e) { + return ActionResultFailure(errorMessage: e.toString(), statusCode: 400); + } } - + @override - Future getTotalSessions() { - // TODO: implement getTotalSessions - throw UnimplementedError(); + Future getTotalSessions() async { + try { + final response = await _supabaseClient + .from('session') + .select('id') + .eq('therapist_id', _supabaseClient.auth.currentUser!.id); + + final count = response is List ? response.length : 0; + return ActionResultSuccess(data: count, statusCode: 200); + } catch (e) { + return ActionResultFailure(errorMessage: e.toString(), statusCode: 400); + } } - + @override - Future getTotalTherapies() { - // TODO: implement getTotalTherapies - throw UnimplementedError(); + Future getTotalTherapies() async { + try { + final response = await _supabaseClient + .from('therapy_goal') + .select('therapy_type_id') + .eq('therapist_id', _supabaseClient.auth.currentUser!.id); + + final count = response is List + ? (response.map((e) => e['therapy_type_id']).toSet().length) + : 0; + return ActionResultSuccess(data: count, statusCode: 200); + } catch (e) { + return ActionResultFailure(errorMessage: e.toString(), statusCode: 400); + } } @override From d16837781e9c98ef47056d8d5cb5ae17228c1425 Mon Sep 17 00:00:00 2001 From: nthsneha Date: Mon, 13 Apr 2026 23:38:57 +0530 Subject: [PATCH 4/6] fix: address PR review blockers for therapist metrics and activity sync --- .../activities/daily_activities_screen.dart | 24 ++++++---- patient/lib/provider/task_provider.dart | 14 ++++-- .../lib/presentation/home/home_screen.dart | 46 ++----------------- .../lib/provider/therapist_provider.dart | 41 ++++++++++------- .../supabase_therapist_repository.dart | 6 ++- 5 files changed, 58 insertions(+), 73 deletions(-) diff --git a/patient/lib/presentation/activities/daily_activities_screen.dart b/patient/lib/presentation/activities/daily_activities_screen.dart index 7e7ebe4..1ec627e 100644 --- a/patient/lib/presentation/activities/daily_activities_screen.dart +++ b/patient/lib/presentation/activities/daily_activities_screen.dart @@ -2,6 +2,7 @@ import 'package:easy_date_timeline/easy_date_timeline.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../core/core.dart'; import '../../core/theme/theme.dart'; import '../../provider/task_provider.dart'; @@ -56,11 +57,21 @@ class _DailyActivitiesScreenState extends State @override Widget build(BuildContext context) { return PopScope( - canPop: true, - onPopInvokedWithResult: (didPop, result) { - if (didPop) { - context.read().updateActivityInBackground(); + canPop: false, + onPopInvokedWithResult: (didPop, result) async { + if (didPop) return; + await context.read().updateActivityInBackground(); + final taskProvider = context.read(); + if (taskProvider.syncStatus == ApiStatus.failure && mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Failed to save your progress'), + backgroundColor: Colors.red, + duration: Duration(seconds: 2), + ), + ); } + if (mounted) Navigator.pop(context); }, child: Scaffold( appBar: AppBar( @@ -68,10 +79,7 @@ class _DailyActivitiesScreenState extends State centerTitle: true, leading: IconButton( icon: const Icon(Icons.arrow_back_ios_new_rounded), - onPressed: () { - context.read().updateActivityInBackground(); - Navigator.pop(context); - }, + onPressed: () => Navigator.maybePop(context), ), ), body: Consumer( diff --git a/patient/lib/provider/task_provider.dart b/patient/lib/provider/task_provider.dart index 092d20c..d701232 100644 --- a/patient/lib/provider/task_provider.dart +++ b/patient/lib/provider/task_provider.dart @@ -40,9 +40,13 @@ class TaskProvider extends ChangeNotifier { } } - Future updateActivityCompletion(List tasks) async { + Future updateActivityCompletion() async { try { - final result = await _patientRepository.updateActivityCompletion(tasks: _allTasks, activityId: _activityId, activitySetId: _activitySetId); + final result = await _patientRepository.updateActivityCompletion( + tasks: _allTasks, + activityId: _activityId, + activitySetId: _activitySetId, + ); if(result is ActionResultSuccess) { _apiStatus = ApiStatus.success; } else { @@ -61,7 +65,7 @@ class TaskProvider extends ChangeNotifier { _selectedDate = date; notifyListeners(); if(_allTasks.isNotEmpty) { - updateActivityCompletion(_allTasks); + updateActivityCompletion(); } getTodayActivities(date: date); } @@ -80,12 +84,12 @@ class TaskProvider extends ChangeNotifier { /// Updates activity completion status in the background (typically before navigation) /// This method syncs the current task completion status to the backend Future updateActivityInBackground() async { - if (_allTasks.isEmpty) { + if (_allTasks.isEmpty || _syncStatus == ApiStatus.loading) { return; } _syncStatus = ApiStatus.loading; notifyListeners(); - await updateActivityCompletion(_allTasks); + await updateActivityCompletion(); // updateActivityCompletion sets _apiStatus, copy it to _syncStatus _syncStatus = _apiStatus; notifyListeners(); diff --git a/therapist/lib/presentation/home/home_screen.dart b/therapist/lib/presentation/home/home_screen.dart index 74d1b88..25f3075 100644 --- a/therapist/lib/presentation/home/home_screen.dart +++ b/therapist/lib/presentation/home/home_screen.dart @@ -214,47 +214,9 @@ class HomeContent extends StatelessWidget { child: ListView( padding: const EdgeInsets.all(20), children: [ - Container( - padding: const EdgeInsets.all(20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.05), - blurRadius: 10, - offset: const Offset(0, 5), - ), - ], - ), - child: const Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - StatsCard( - imagePath: 'assets/icon1.png', - backgroundColor: Color(0xFFFEE8E8), - label: 'Patients', - value: '02', - ), - StatsCard( - imagePath: 'assets/icon2.png', - backgroundColor: Color(0xFFF1E8FE), - label: 'Sessions', - value: '20', - ), - StatsCard( - imagePath: 'assets/icon3.png', - backgroundColor: Color(0xFFE8FEF0), - label: 'Therapies', - value: '13', - ), - ], - ), - ), - const SizedBox(height: 24), - Consumer2( - builder: (context, therapistProvider, sessionProvider, _) { - if (therapistProvider.isLoading || sessionProvider.isLoading) { + Consumer( + builder: (context, therapistProvider, _) { + if (therapistProvider.isLoading) { return const Center(child: CircularProgressIndicator()); } @@ -284,7 +246,7 @@ class HomeContent extends StatelessWidget { imagePath: 'assets/icon2.png', backgroundColor: const Color(0xFFF1E8FE), label: 'Sessions', - value: sessionProvider.totalSessions.toString(), + value: therapistProvider.totalSessions.toString(), ), StatsCard( imagePath: 'assets/icon3.png', diff --git a/therapist/lib/provider/therapist_provider.dart b/therapist/lib/provider/therapist_provider.dart index 7badd92..ff6233a 100644 --- a/therapist/lib/provider/therapist_provider.dart +++ b/therapist/lib/provider/therapist_provider.dart @@ -182,24 +182,31 @@ class TherapistDataProvider extends ChangeNotifier { Future fetchTotals() async { _isLoading = true; notifyListeners(); - - final patientsResult = await _therapistRepository.getTotalPatients(); - if (patientsResult is ActionResultSuccess) { - _totalPatients = patientsResult.data as int; - } - - final sessionsResult = await _therapistRepository.getTotalSessions(); - if (sessionsResult is ActionResultSuccess) { - _totalSessions = sessionsResult.data as int; - } - - final therapiesResult = await _therapistRepository.getTotalTherapies(); - if (therapiesResult is ActionResultSuccess) { - _totalTherapies = therapiesResult.data as int; + try { + final results = await Future.wait([ + _therapistRepository.getTotalPatients(), + _therapistRepository.getTotalSessions(), + _therapistRepository.getTotalTherapies(), + ]); + + final patientsResult = results[0]; + if (patientsResult is ActionResultSuccess) { + _totalPatients = (patientsResult.data as num?)?.toInt() ?? 0; + } + + final sessionsResult = results[1]; + if (sessionsResult is ActionResultSuccess) { + _totalSessions = (sessionsResult.data as num?)?.toInt() ?? 0; + } + + final therapiesResult = results[2]; + if (therapiesResult is ActionResultSuccess) { + _totalTherapies = (therapiesResult.data as num?)?.toInt() ?? 0; + } + } finally { + _isLoading = false; + notifyListeners(); } - - _isLoading = false; - notifyListeners(); } // Set selected profession and fetch related data diff --git a/therapist/lib/repository/supabase_therapist_repository.dart b/therapist/lib/repository/supabase_therapist_repository.dart index cc4d7b6..49937c5 100644 --- a/therapist/lib/repository/supabase_therapist_repository.dart +++ b/therapist/lib/repository/supabase_therapist_repository.dart @@ -167,7 +167,11 @@ class SupabaseTherapistRepository implements TherapistRepository { .eq('therapist_id', _supabaseClient.auth.currentUser!.id); final count = response is List - ? (response.map((e) => e['therapy_type_id']).toSet().length) + ? response + .map((e) => e['therapy_type_id']) + .where((id) => id != null) + .toSet() + .length : 0; return ActionResultSuccess(data: count, statusCode: 200); } catch (e) { From 2b470a132b09e346686145fab45b3db08221bf49 Mon Sep 17 00:00:00 2001 From: nthsneha Date: Fri, 17 Apr 2026 05:57:04 +0530 Subject: [PATCH 5/6] fix: avoid context.read after async gap in pop callback --- .../lib/presentation/activities/daily_activities_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patient/lib/presentation/activities/daily_activities_screen.dart b/patient/lib/presentation/activities/daily_activities_screen.dart index 1ec627e..58272b0 100644 --- a/patient/lib/presentation/activities/daily_activities_screen.dart +++ b/patient/lib/presentation/activities/daily_activities_screen.dart @@ -60,8 +60,8 @@ class _DailyActivitiesScreenState extends State canPop: false, onPopInvokedWithResult: (didPop, result) async { if (didPop) return; - await context.read().updateActivityInBackground(); final taskProvider = context.read(); + await taskProvider.updateActivityInBackground(); if (taskProvider.syncStatus == ApiStatus.failure && mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( From 3959f9fd912d1a3a776b6642b32cd25c4ae491e5 Mon Sep 17 00:00:00 2001 From: nthsneha Date: Fri, 17 Apr 2026 00:47:27 +0530 Subject: [PATCH 6/6] fix: harden back nav sync and split dashboard loading flags --- .../activities/daily_activities_screen.dart | 23 +++++++------ .../lib/presentation/home/home_screen.dart | 2 +- .../lib/provider/therapist_provider.dart | 33 ++++++++++++------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/patient/lib/presentation/activities/daily_activities_screen.dart b/patient/lib/presentation/activities/daily_activities_screen.dart index 58272b0..7e11f2b 100644 --- a/patient/lib/presentation/activities/daily_activities_screen.dart +++ b/patient/lib/presentation/activities/daily_activities_screen.dart @@ -61,17 +61,20 @@ class _DailyActivitiesScreenState extends State onPopInvokedWithResult: (didPop, result) async { if (didPop) return; final taskProvider = context.read(); - await taskProvider.updateActivityInBackground(); - if (taskProvider.syncStatus == ApiStatus.failure && mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Failed to save your progress'), - backgroundColor: Colors.red, - duration: Duration(seconds: 2), - ), - ); + try { + await taskProvider.updateActivityInBackground(); + if (taskProvider.syncStatus == ApiStatus.failure && mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Failed to save your progress'), + backgroundColor: Colors.red, + duration: Duration(seconds: 2), + ), + ); + } + } finally { + if (mounted) Navigator.pop(context); } - if (mounted) Navigator.pop(context); }, child: Scaffold( appBar: AppBar( diff --git a/therapist/lib/presentation/home/home_screen.dart b/therapist/lib/presentation/home/home_screen.dart index 25f3075..dccfaf7 100644 --- a/therapist/lib/presentation/home/home_screen.dart +++ b/therapist/lib/presentation/home/home_screen.dart @@ -216,7 +216,7 @@ class HomeContent extends StatelessWidget { children: [ Consumer( builder: (context, therapistProvider, _) { - if (therapistProvider.isLoading) { + if (therapistProvider.isTotalsLoading) { return const Center(child: CircularProgressIndicator()); } diff --git a/therapist/lib/provider/therapist_provider.dart b/therapist/lib/provider/therapist_provider.dart index ff6233a..26e4e2e 100644 --- a/therapist/lib/provider/therapist_provider.dart +++ b/therapist/lib/provider/therapist_provider.dart @@ -15,6 +15,10 @@ class TherapistDataProvider extends ChangeNotifier { bool _isLoading = false; bool get isLoading => _isLoading; + bool _isTotalsLoading = false; + bool get isTotalsLoading => _isTotalsLoading; + bool _isPatientsLoading = false; + bool get isPatientsLoading => _isPatientsLoading; String _errorMessage = ''; String get errorMessage => _errorMessage; @@ -180,7 +184,7 @@ class TherapistDataProvider extends ChangeNotifier { } Future fetchTotals() async { - _isLoading = true; + _isTotalsLoading = true; notifyListeners(); try { final results = await Future.wait([ @@ -204,7 +208,7 @@ class TherapistDataProvider extends ChangeNotifier { _totalTherapies = (therapiesResult.data as num?)?.toInt() ?? 0; } } finally { - _isLoading = false; + _isTotalsLoading = false; notifyListeners(); } } @@ -248,19 +252,24 @@ class TherapistDataProvider extends ChangeNotifier { } Future fetchPatientsMappedToTherapist() async { + _isPatientsLoading = true; _patientsStatus = ApiStatus.loading; notifyListeners(); - final result = await _therapistRepository.fetchPatientsMappedToTherapist(); - - if(result is ActionResultSuccess) { - _patients = result.data; - _patientsStatus = ApiStatus.success; - } else if(result is ActionResultFailure) { - _patients = []; - _patientsStatus = ApiStatus.failure; - _errorMessage = result.errorMessage!; + try { + final result = await _therapistRepository.fetchPatientsMappedToTherapist(); + + if(result is ActionResultSuccess) { + _patients = result.data; + _patientsStatus = ApiStatus.success; + } else if(result is ActionResultFailure) { + _patients = []; + _patientsStatus = ApiStatus.failure; + _errorMessage = result.errorMessage!; + } + } finally { + _isPatientsLoading = false; + notifyListeners(); } - notifyListeners(); } }