Skip to content

Commit

Permalink
added providers for state management
Browse files Browse the repository at this point in the history
  • Loading branch information
Piyushhhhh committed Jul 16, 2023
1 parent ae088b6 commit 9e17cf0
Show file tree
Hide file tree
Showing 18 changed files with 382 additions and 115 deletions.
3 changes: 3 additions & 0 deletions lib/constants/strings.dart
Expand Up @@ -24,4 +24,7 @@ class Strings {
static const String showMore = "show more";
static const String showLess = "show less";
static const String selectSchedule = "Select Schedule";

static const String defaultErrorMessage =
'An error occurred while loading data';
}
3 changes: 3 additions & 0 deletions lib/data/api/config/api_config.dart
@@ -0,0 +1,3 @@
class ApiConfig {
static const String baseUrl = '';
}
3 changes: 3 additions & 0 deletions lib/data/api/implementation/medical_consultation_service.dart
@@ -0,0 +1,3 @@
import 'package:medical_consultation/data/api/service/remote_api_service.dart';

class MedicalConsultationService implements RemoteApiService {}
1 change: 1 addition & 0 deletions lib/data/api/service/remote_api_service.dart
@@ -0,0 +1 @@
abstract class RemoteApiService {}
20 changes: 20 additions & 0 deletions lib/features/conversations/provider/conversation_provider.dart
@@ -0,0 +1,20 @@
import 'package:medical_consultation/constants/strings.dart';
import 'package:medical_consultation/data/mock_data/conversation.dart';
import 'package:medical_consultation/features/shared/notifiers/base_notifier.dart';
import 'package:medical_consultation/models/conversation.dart';

class ConversationProvider extends BaseNotifier {
List<Conversation> userCurrentConversations = [];
Future<void> featchUserCurrentConversation() async {
try {
sendLoading();
userCurrentConversations = userConversations;
sendSuccess();
} on Error catch (error) {
sendError(message: error.toString());
} catch (_) {
sendError(message: Strings.defaultErrorMessage);
rethrow;
}
}
}
19 changes: 15 additions & 4 deletions lib/features/conversations/screens/conversation_screen.dart
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:medical_consultation/constants/colors.dart';
import 'package:medical_consultation/features/conversations/provider/conversation_provider.dart';
import 'package:medical_consultation/features/conversations/widgets/conversation_app_bar.dart';
import 'package:medical_consultation/features/conversations/widgets/conversation_list.dart';
import 'package:medical_consultation/features/conversations/widgets/search_conversation.dart';
Expand All @@ -12,6 +13,13 @@ class ConversationScreen extends StatefulWidget {
}

class _ConversationScreenState extends State<ConversationScreen> {
ConversationProvider conversationProvider = ConversationProvider();
@override
void initState() {
Future.wait([conversationProvider.featchUserCurrentConversation()]);
super.initState();
}

@override
Widget build(BuildContext context) {
return Scaffold(
Expand All @@ -21,12 +29,15 @@ class _ConversationScreenState extends State<ConversationScreen> {
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Column(
children: const [
SearchConversation(),
SizedBox(
children: [
const SearchConversation(),
const SizedBox(
height: 10,
),
ConversationListWidget(),
ConversationListWidget(
userConversations:
conversationProvider.userCurrentConversations,
),
],
),
),
Expand Down
11 changes: 4 additions & 7 deletions lib/features/conversations/widgets/conversation_list.dart
@@ -1,16 +1,13 @@
import 'package:flutter/material.dart';
import 'package:medical_consultation/constants/colors.dart';
import 'package:medical_consultation/constants/text_styles.dart';
import 'package:medical_consultation/data/mock_data/conversation.dart';
import 'package:medical_consultation/models/conversation.dart';

class ConversationListWidget extends StatefulWidget {
const ConversationListWidget({super.key});
class ConversationListWidget extends StatelessWidget {
final List<Conversation> userConversations;

@override
State<ConversationListWidget> createState() => _ConversationListWidgetState();
}
const ConversationListWidget({super.key, required this.userConversations});

class _ConversationListWidgetState extends State<ConversationListWidget> {
@override
Widget build(BuildContext context) {
return ListView.builder(
Expand Down
49 changes: 49 additions & 0 deletions lib/features/dashboard/provider/dashboard_provider.dart
@@ -0,0 +1,49 @@
import 'package:medical_consultation/constants/strings.dart';
import 'package:medical_consultation/data/mock_data/appointments_mock.dart';
import 'package:medical_consultation/data/mock_data/recomended_doctor_mock.dart';
import 'package:medical_consultation/features/shared/notifiers/base_notifier.dart';
import 'package:medical_consultation/models/appointment.dart';
import 'package:medical_consultation/models/doctor_details.dart';

class DashboardProvider extends BaseNotifier {
List<DoctorDetail> topRecomendedDoctor = [];
List<UserAppointment> userCurrentAppointment = [];

Future<void> init() async {
try {
fetchRecomendedDoctor();
userAppointments();
} on Error catch (error) {
sendError(message: error.toString());
} catch (_) {
sendError(message: Strings.defaultErrorMessage);
rethrow;
}
}

Future fetchRecomendedDoctor() async {
try {
sendLoading();
topRecomendedDoctor = recomendedDoctor;
sendSuccess();
} on Error catch (error) {
sendError(message: error.toString());
} catch (_) {
sendError(message: Strings.defaultErrorMessage);
rethrow;
}
}

Future userAppointments() async {
try {
sendLoading();
userCurrentAppointment = userAppointment;
sendSuccess();
} on Error catch (error) {
sendError(message: error.toString());
} catch (_) {
sendError(message: Strings.defaultErrorMessage);
rethrow;
}
}
}
61 changes: 44 additions & 17 deletions lib/features/dashboard/screens/dashboard_screen.dart
@@ -1,9 +1,13 @@
import 'package:flutter/material.dart';
import 'package:medical_consultation/features/dashboard/provider/dashboard_provider.dart';
import 'package:medical_consultation/features/dashboard/widgets/appointments.dart';
import 'package:medical_consultation/features/dashboard/widgets/dashboard_title.dart';
import 'package:medical_consultation/features/dashboard/widgets/search_consultion.dart';
import 'package:medical_consultation/features/dashboard/widgets/top_buttons.dart';
import 'package:medical_consultation/features/dashboard/widgets/top_doctors.dart';
import 'package:medical_consultation/features/shared/notifiers/base_provider.dart';
import 'package:medical_consultation/features/shared/widgets/error_snack_bar.dart';
import 'package:provider/provider.dart';

class DashboardScreen extends StatefulWidget {
const DashboardScreen({super.key});
Expand All @@ -14,25 +18,48 @@ class DashboardScreen extends StatefulWidget {

class _DashboardScreenState extends State<DashboardScreen> {
TextEditingController searchController = TextEditingController();
DashboardProvider dashboardProvider = DashboardProvider();
@override
void initState() {
Future.wait([dashboardProvider.init()]);
super.initState();
}

@override
Widget build(BuildContext context) {
return SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
DashboardTitle(),
SearchConsultaionField(),
TopButtons(),
AppointmentDashboardWidget(),
TopDoctors(),
],
),
),
),
return BaseProvider.value(
value: dashboardProvider,
onError: (notifier, message) =>
buildErrorSnackBar(context, message: message),
builder: (context, child) {
return Consumer<DashboardProvider>(
builder: (context, provider, child) {
return SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const DashboardTitle(),
const SearchConsultaionField(),
const TopButtons(),
AppointmentDashboardWidget(
userAppointment:
dashboardProvider.userCurrentAppointment,
),
TopDoctors(
topDoctors: dashboardProvider.topRecomendedDoctor,
),
],
),
),
),
);
},
);
},
);
}
}
5 changes: 3 additions & 2 deletions lib/features/dashboard/widgets/appointment_card.dart
@@ -1,10 +1,11 @@
import 'package:flutter/material.dart';
import 'package:medical_consultation/constants/colors.dart';
import 'package:medical_consultation/constants/text_styles.dart';
import 'package:medical_consultation/data/mock_data/appointments_mock.dart';
import 'package:medical_consultation/models/appointment.dart';

class AppionmentStackCard extends StatelessWidget {
const AppionmentStackCard({super.key});
final List<UserAppointment> userAppointment;
const AppionmentStackCard({super.key, required this.userAppointment});

@override
Widget build(BuildContext context) {
Expand Down
8 changes: 6 additions & 2 deletions lib/features/dashboard/widgets/appointments.dart
Expand Up @@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:medical_consultation/constants/strings.dart';
import 'package:medical_consultation/constants/text_styles.dart';
import 'package:medical_consultation/features/dashboard/widgets/appointment_card.dart';
import 'package:medical_consultation/models/appointment.dart';

class AppointmentDashboardWidget extends StatelessWidget {
const AppointmentDashboardWidget({super.key});
final List<UserAppointment> userAppointment;
const AppointmentDashboardWidget({super.key, required this.userAppointment});

@override
Widget build(BuildContext context) {
Expand All @@ -30,7 +32,9 @@ class AppointmentDashboardWidget extends StatelessWidget {
const SizedBox(
height: 10,
),
const AppionmentStackCard(),
AppionmentStackCard(
userAppointment: userAppointment,
),
],
);
}
Expand Down
19 changes: 10 additions & 9 deletions lib/features/dashboard/widgets/top_doctors.dart
Expand Up @@ -2,11 +2,12 @@ import 'package:flutter/material.dart';
import 'package:medical_consultation/constants/colors.dart';
import 'package:medical_consultation/constants/strings.dart';
import 'package:medical_consultation/constants/text_styles.dart';
import 'package:medical_consultation/data/mock_data/recomended_doctor_mock.dart';
import 'package:medical_consultation/features/dashboard/screens/doctor_details_screen.dart';
import 'package:medical_consultation/models/doctor_details.dart';

class TopDoctors extends StatelessWidget {
const TopDoctors({super.key});
final List<DoctorDetail> topDoctors;
const TopDoctors({super.key, required this.topDoctors});

@override
Widget build(BuildContext context) {
Expand All @@ -30,7 +31,7 @@ class TopDoctors extends StatelessWidget {
height: 10,
),
ListView.builder(
itemCount: recomendedDoctor.length,
itemCount: topDoctors.length,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
Expand All @@ -40,7 +41,7 @@ class TopDoctors extends StatelessWidget {
context,
MaterialPageRoute(
builder: (_) => DoctorDetailsScreen(
doctorDetail: recomendedDoctor[index],
doctorDetail: topDoctors[index],
),
),
);
Expand All @@ -58,7 +59,7 @@ class TopDoctors extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.network(
recomendedDoctor[index].imageUrl ?? '',
topDoctors[index].imageUrl ?? '',
),
const SizedBox(
width: 10,
Expand All @@ -68,14 +69,14 @@ class TopDoctors extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'${recomendedDoctor[index].specialty ?? ''} ${Strings.specialist}',
'${topDoctors[index].specialty ?? ''} ${Strings.specialist}',
style: TextStyles.regular16.withFadeText(),
),
const SizedBox(
height: 5,
),
Text(
'dr. ${recomendedDoctor[index].name ?? ''}',
'dr. ${topDoctors[index].name ?? ''}',
style: TextStyles.semibold22.textColor(),
),
const SizedBox(
Expand All @@ -91,7 +92,7 @@ class TopDoctors extends StatelessWidget {
width: 2,
),
Text(
(recomendedDoctor[index].rating ?? '').toString(),
(topDoctors[index].rating ?? '').toString(),
style: TextStyles.regular16.textColor(),
),
const SizedBox(
Expand All @@ -105,7 +106,7 @@ class TopDoctors extends StatelessWidget {
width: 5,
),
Text(
'${recomendedDoctor[index].numberOfReviews ?? ''} ${Strings.reviews}',
'${topDoctors[index].numberOfReviews ?? ''} ${Strings.reviews}',
style: TextStyles.regular16.textColor(),
),
],
Expand Down
10 changes: 10 additions & 0 deletions lib/features/shared/enums/base_notifier_status.dart
@@ -0,0 +1,10 @@
enum BaseNotifierStatus {
init,
error,
success,
loading,

cancel,
disconnected,
loaded,
}

0 comments on commit 9e17cf0

Please sign in to comment.