Skip to content

Commit db27acd

Browse files
authored
Merge pull request #150 from PDG-NUTRI/88-intégrer-backend-dans-page-profile
88 intégrer backend dans page profile
2 parents d2ee5e4 + 818150f commit db27acd

File tree

9 files changed

+94
-48
lines changed

9 files changed

+94
-48
lines changed

android/app/src/main/AndroidManifest.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
<application
44
android:label="pdg_app"
55
android:name="${applicationName}"
6-
android:icon="@mipmap/ic_launcher">
6+
android:icon="@mipmap/ic_launcher"
7+
android:usesCleartextTraffic="true">
78
<activity
89
android:name=".MainActivity"
910
android:exported="true"

lib/api/firebase_connection.dart

+2-6
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,8 @@ class FirebaseConnection implements Auth {
4444
.signInWithEmailAndPassword(email: email, password: password);
4545
}
4646
return true;
47-
} on FirebaseAuthException catch (e) {
48-
if (e.code == 'user-not-found') {
49-
log('No user found for that email.');
50-
} else if (e.code == 'wrong-password') {
51-
log('Wrong password provided for that user.');
52-
}
47+
} catch (e) {
48+
log(e.toString());
5349
}
5450
return false;
5551
}

lib/api/firebase_user.dart

+3-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class FirebaseUser extends FirebaseAPI implements IUser {
7575
}
7676

7777
@override
78-
Future<User> readDietitianOfClient(String clientId) async {
78+
Future<User?> readDietitianOfClient(String clientId) async {
7979
final querySnapshot = await collectionReference
8080
.where('clientList', arrayContains: clientId)
8181
.withConverter(
@@ -85,6 +85,7 @@ class FirebaseUser extends FirebaseAPI implements IUser {
8585
.get();
8686
List<User> dietitians =
8787
querySnapshot.docs.map((doc) => doc.data()).toList();
88-
return dietitians.first;
88+
89+
return dietitians.isNotEmpty ? dietitians.first : null;
8990
}
9091
}

lib/api/iuser.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ abstract class IUser {
66
void updateUser(User user);
77
void deleteUser(String userid);
88
Future<List<User>> getDietitianClient(String dietitianId);
9-
Future<User> readDietitianOfClient(String clientId);
9+
Future<User?> readDietitianOfClient(String clientId);
1010
}

lib/provider/auth_provider.dart

+20
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class AuthProvider extends ChangeNotifier {
1212
bool _isAdmin = false;
1313

1414
User? _client;
15+
User? _clientDietitian;
1516

1617
AuthProvider({required Auth auth, required IUser clientApi})
1718
: _auth = auth,
@@ -25,13 +26,16 @@ class AuthProvider extends ChangeNotifier {
2526
]);
2627

2728
_isAdmin = values[1] as bool;
29+
await fetchClientDietitian();
2830
}
2931
}
3032

3133
bool get isAdmin => _isAdmin;
3234

3335
User? get user => _client;
3436

37+
User? get clientDietitian => _clientDietitian;
38+
3539
String get userUid => _auth.uid;
3640

3741
bool isConnected() {
@@ -45,6 +49,7 @@ class AuthProvider extends ChangeNotifier {
4549
_isAdmin = await _auth.isDietitian();
4650
if (isConnected) {
4751
await fetchClient();
52+
await fetchClientDietitian();
4853
}
4954

5055
notifyListeners();
@@ -53,6 +58,7 @@ class AuthProvider extends ChangeNotifier {
5358
Future<void> signOut() async {
5459
await _auth.signOut();
5560
_client = null;
61+
_clientDietitian = null;
5662
_isAdmin = false;
5763
notifyListeners();
5864
}
@@ -75,4 +81,18 @@ class AuthProvider extends ChangeNotifier {
7581

7682
return _client;
7783
}
84+
85+
Future<User?> fetchClientDietitian() async {
86+
try {
87+
if (!isAdmin) {
88+
_clientDietitian = await _userApi.readDietitianOfClient(_client!.uid);
89+
notifyListeners();
90+
return _clientDietitian;
91+
}
92+
return null;
93+
} catch (e) {
94+
log("Error fetching client's dietitian: $e");
95+
}
96+
return null;
97+
}
7898
}

lib/screens/diary.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:auto_route/auto_route.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:get_it/get_it.dart';
34
import 'package:intl/intl.dart';
45
import 'package:pdg_app/model/meal.dart';
56
import 'package:pdg_app/provider/meal_provider.dart';
@@ -44,7 +45,7 @@ class _DiaryScreenState extends State<DiaryScreen> {
4445
getDiariesForDay: (day) {
4546
return _getEventsForDay(context, day);
4647
},
47-
clientName: "Marie",
48+
clientName: GetIt.I.get<AuthProvider>().user!.firstName,
4849
onAddPressed: () async {
4950
final addedMeal = await AutoRouter.of(context)
5051
.push<Meal?>(AddMealScreenRoute(day: _selectedDate));

lib/screens/profile.dart

+61-26
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,56 @@
11
import 'package:auto_route/auto_route.dart';
22
import 'package:flutter/material.dart';
33
import 'package:get_it/get_it.dart';
4+
import 'package:pdg_app/model/user.dart';
45
import 'package:pdg_app/widgets/cards/left_element_card.dart';
56
import 'package:pdg_app/widgets/profile_template.dart';
67
import '../router/router.gr.dart';
8+
import '../widgets/buttons/custom_icon_button.dart';
79
import '../widgets/custom_divider.dart';
810

911
import '../provider/auth_provider.dart';
1012

1113
class ProfileScreen extends StatelessWidget {
1214
const ProfileScreen({Key? key}) : super(key: key);
1315

16+
// IDietitian dietitianApi = FirebaseDietitian(FirebaseFirestore.instance);
17+
18+
// Dietitian dietitian = await dietitianApi.readDietitian("bZB6G7LbLSfp8lTPsh00fWxiHb03");
19+
1420
@override
1521
Widget build(BuildContext context) {
22+
final authProvider = GetIt.I.get<AuthProvider>();
23+
final User? user = authProvider.user;
24+
25+
if (user == null) {
26+
return Center(
27+
child: Column(
28+
mainAxisAlignment: MainAxisAlignment.center,
29+
children: [
30+
const Text("An error has occured."),
31+
CustomIconButton(
32+
icon: Icons.logout_outlined,
33+
onTap: () {
34+
authProvider.signOut();
35+
AutoRouter.of(context).navigate(const LoginScreenRoute());
36+
},
37+
)
38+
],
39+
),
40+
);
41+
}
42+
1643
return Profile(
17-
clientFirstName: "Luca",
18-
clienLastName: "Coduri",
19-
nutriFirstName: "Claire",
20-
nutriLastName: "Nutri",
21-
clientEmail: "[email protected]",
22-
clientPhone: "0794563418",
23-
clientBirthday: DateTime(1996, 12, 18),
24-
clientInsurance: "09734789789248943",
44+
clientFirstName: user.firstName,
45+
clienLastName: user.lastName,
46+
blockEnabled: !authProvider.isAdmin,
47+
blockText: authProvider.clientDietitian == null
48+
? "Yous nutritionnist hasn't contact you yet."
49+
: "Your nutritionnist is ${authProvider.clientDietitian!.firstName} ${authProvider.clientDietitian!.lastName}.",
50+
clientEmail: user.email,
51+
clientPhone: user.phoneNumber,
52+
clientBirthday: user.birthDate,
53+
clientInsurance: user.avs,
2554
onLogoutPressed: () {
2655
GetIt.I.get<AuthProvider>().signOut();
2756
context.router.replaceAll([
@@ -37,8 +66,8 @@ class Profile extends StatelessWidget {
3766
final String _clientPicturePath;
3867
final String _clientFirstName;
3968
final String _clientLastName;
40-
final String _nutriFirstName;
41-
final String _nutriLastName;
69+
final bool _blockEnabled;
70+
final String _blocText;
4271
final String _clientEmail;
4372
final String _clientPhone;
4473
final DateTime _clientBirthday;
@@ -50,20 +79,20 @@ class Profile extends StatelessWidget {
5079
clientPicturePath = 'assets/images/default_user_pic.png',
5180
required clientFirstName,
5281
required clienLastName,
53-
required nutriFirstName,
54-
required nutriLastName,
5582
required clientEmail,
5683
required clientPhone,
5784
required clientBirthday,
5885
required clientInsurance,
86+
blockEnabled = false,
87+
blockText = "",
5988
void Function()? onLogoutPressed,
6089
Key? key,
6190
}) : _screenWidth = screenWidth,
6291
_clientPicturePath = clientPicturePath,
6392
_clientFirstName = clientFirstName,
6493
_clientLastName = clienLastName,
65-
_nutriFirstName = nutriFirstName,
66-
_nutriLastName = nutriLastName,
94+
_blocText = blockText,
95+
_blockEnabled = blockEnabled,
6796
_clientEmail = clientEmail,
6897
_clientPhone = clientPhone,
6998
_clientBirthday = clientBirthday,
@@ -85,18 +114,24 @@ class Profile extends StatelessWidget {
85114
onIconButtonPressed: _onLogoutPressed,
86115
buttonIcon: Icons.logout_outlined,
87116
firstBloc: Column(children: [
88-
LeftElementCard(
89-
title:
90-
Text("Your nutritionnist is $_nutriFirstName $_nutriLastName."),
91-
element: IconTheme(
92-
data: IconThemeData(
93-
color: Theme.of(context).colorScheme.primary,
94-
size: 30,
95-
),
96-
child: const Icon(Icons.notification_important_outlined),
97-
),
98-
),
99-
const CustomDivider(),
117+
_blockEnabled
118+
? Column(
119+
children: [
120+
LeftElementCard(
121+
title: Text(_blocText),
122+
element: IconTheme(
123+
data: IconThemeData(
124+
color: Theme.of(context).colorScheme.primary,
125+
size: 30,
126+
),
127+
child:
128+
const Icon(Icons.notification_important_outlined),
129+
),
130+
),
131+
const CustomDivider(),
132+
],
133+
)
134+
: const SizedBox(),
100135
const Text("Personal data",
101136
textAlign: TextAlign.center,
102137
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 18)),

test/user_test.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ User c1 = User(
1111
phoneNumber: '0780001223',
1212
birthDate: DateTime.now(),
1313
avs: '',
14-
email: '[email protected]');
14+
email: '[email protected]');
1515
User c2 = User(
1616
firstName: 'Chloé',
1717
lastName: 'Fontaine',
1818
phoneNumber: '0780002334',
1919
birthDate: DateTime.now(),
2020
avs: '',
21-
email: '[email protected]');
21+
email: '[email protected]');
2222
User c3 = User(
2323
firstName: 'Luca',
2424
lastName: 'Coduri',
@@ -131,7 +131,7 @@ void main() {
131131
});
132132

133133
test("Read Dietitian of Client", () async {
134-
final User dietCopy = await userApi.readDietitianOfClient(c3.uid);
134+
final User? dietCopy = await userApi.readDietitianOfClient(c3.uid);
135135
expect(d1.toString(), dietCopy.toString());
136136
});
137137
}

widgetbook/widgetbook.dart

-8
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,6 @@ class HotReload extends StatelessWidget {
224224
label: 'Last name',
225225
initialValue: "Coduri",
226226
),
227-
nutriFirstName: context.knobs.text(
228-
label: 'Nutri first name',
229-
initialValue: "Claire",
230-
),
231-
nutriLastName: context.knobs.text(
232-
label: 'Nutri last name',
233-
initialValue: "Nutri",
234-
),
235227
clientEmail: context.knobs.text(
236228
label: 'Email',
237229
initialValue: "[email protected]",

0 commit comments

Comments
 (0)