Skip to content

Commit 40a932d

Browse files
authored
Merge pull request #191 from les-crepes/167-ajouter-photos-dans-firebase
167 ajouter photos dans firebase
2 parents a3f101f + 6136344 commit 40a932d

24 files changed

+305
-111
lines changed

assets/images/default_user_pic.jpeg

77.7 KB
Loading

lib/api/firebase_user.dart

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class FirebaseUser extends FirebaseAPI implements IUser {
6969
lastName: doc['lastName'],
7070
phoneNumber: doc['phoneNumber'],
7171
email: doc['email'],
72+
photoUrl: doc['photoUrl'],
7273
uid: doc['uid']))
7374
.toList();
7475
return clients;

lib/main.dart

+3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'package:cloud_firestore/cloud_firestore.dart';
2+
import 'package:firebase_storage/firebase_storage.dart';
23
import 'package:flutter/material.dart';
34
import 'package:firebase_core/firebase_core.dart';
45
import 'package:flutter/services.dart';
56
import 'package:get_it/get_it.dart';
7+
import 'package:pdg_app/api/firebase_file.dart';
68
import 'package:pdg_app/provider/auth_provider.dart';
79
import 'package:pdg_app/router/auth_gard.dart';
810
import 'package:pdg_app/router/chat_guard.dart';
@@ -21,6 +23,7 @@ Future<void> setup() async {
2123
AuthProvider(
2224
auth: FirebaseConnection(),
2325
clientApi: FirebaseUser(FirebaseFirestore.instance),
26+
fileApi: FirebaseFile(FirebaseStorage.instance),
2427
),
2528
);
2629
await GetIt.I.get<AuthProvider>().init();

lib/provider/auth_provider.dart

+27-3
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
import 'dart:developer';
22

33
import 'package:flutter/material.dart';
4+
import 'package:image_picker/image_picker.dart';
45
import 'package:pdg_app/api/iauth.dart';
6+
import 'package:pdg_app/api/ifile.dart';
57
import 'package:pdg_app/api/iuser.dart';
68

79
import '../model/user.dart';
810

911
class AuthProvider extends ChangeNotifier {
1012
final Auth _auth;
1113
final IUser _userApi;
14+
final IFile _fileApi;
1215
bool _isAdmin = false;
1316

1417
User? _client;
1518
User? _clientDietitian;
1619

17-
AuthProvider({required Auth auth, required IUser clientApi})
20+
AuthProvider(
21+
{required Auth auth, required IUser clientApi, required IFile fileApi})
1822
: _auth = auth,
19-
_userApi = clientApi;
23+
_userApi = clientApi,
24+
_fileApi = fileApi;
2025

2126
Future<void> init() async {
2227
if (isConnected()) {
@@ -70,10 +75,29 @@ class AuthProvider extends ChangeNotifier {
7075
notifyListeners();
7176
}
7277

78+
// Return the profile pic URL
79+
Future<String?> uploadProfilePic(XFile? pic, String userUid) async {
80+
String? picUrl;
81+
if (pic != null) {
82+
String path = "images/profile/$userUid.jpg";
83+
picUrl = await _fileApi.uploadFile(pic.path, path);
84+
log(picUrl);
85+
log(pic.path);
86+
}
87+
88+
return picUrl;
89+
}
90+
7391
/// register a new user using [email] and [password] as credentials.
74-
Future<void> register(String email, String password, User user) async {
92+
Future<void> register(
93+
String email, String password, User user, XFile? pic) async {
94+
String? picUrl = await uploadProfilePic(pic, user.uid);
95+
7596
await _auth.register(email: email, password: password);
7697
user.uid = _auth.uid;
98+
99+
user.photoUrl = picUrl;
100+
77101
await _userApi.createUser(user);
78102
_client = user;
79103
notifyListeners();

lib/provider/meal_provider.dart

+27-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1+
import 'dart:developer';
2+
13
import 'package:cloud_firestore/cloud_firestore.dart';
4+
import 'package:firebase_storage/firebase_storage.dart';
25
import 'package:flutter/foundation.dart';
6+
import 'package:image_picker/image_picker.dart';
7+
import 'package:pdg_app/api/firebase_file.dart';
38
import 'package:pdg_app/api/firebase_meal.dart';
49
import 'package:pdg_app/api/imeal.dart';
510

11+
import '../api/ifile.dart';
612
import '../model/meal.dart';
713

814
class MealProvider extends ChangeNotifier {
915
final IMeal _mealApi = FirebaseMeal(FirebaseFirestore.instance);
1016
final String _uid;
1117
bool _isFetching = false;
18+
final IFile _fileApi = FirebaseFile(FirebaseStorage.instance);
1219

1320
MealProvider(this._uid) {
1421
fetchMeals();
@@ -37,13 +44,31 @@ class MealProvider extends ChangeNotifier {
3744
}).toList();
3845
}
3946

40-
Future<void> addMeal(Meal meal) async {
47+
Future<void> addMeal(Meal meal, XFile? pic) async {
48+
String? picUrl = await uploadMealPic(pic, meal.uid);
49+
meal.photo = picUrl;
4150
await _mealApi.createMeal(meal);
4251
notifyListeners();
4352
}
4453

45-
Future<void> updateMeal(Meal meal) async {
54+
Future<void> updateMeal(Meal meal, XFile? pic) async {
55+
// Not really optimized to reload each time but is working
56+
String? picUrl = await uploadMealPic(pic, meal.uid);
57+
meal.photo = picUrl;
4658
await _mealApi.updateMeal(meal);
4759
notifyListeners();
4860
}
61+
62+
// Return the meal pic URL
63+
Future<String?> uploadMealPic(XFile? pic, String mealUid) async {
64+
String? picUrl;
65+
if (pic != null) {
66+
String path = "images/diary/$mealUid.jpg";
67+
picUrl = await _fileApi.uploadFile(pic.path, path);
68+
log(picUrl);
69+
log(pic.path);
70+
}
71+
72+
return picUrl;
73+
}
4974
}

lib/router/router.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:auto_route/auto_route.dart';
22
import 'package:auto_route/empty_router_widgets.dart';
3+
import 'package:image_picker/image_picker.dart';
34
import 'package:pdg_app/model/aftercare.dart';
45
import 'package:pdg_app/router/chat_guard.dart';
56
import 'package:pdg_app/screens/add_meal.dart';
@@ -14,6 +15,7 @@ import 'package:pdg_app/screens/profile.dart';
1415
import 'package:pdg_app/screens/register.dart';
1516
import 'package:pdg_app/widgets/register/register_first_page.dart';
1617
import 'package:pdg_app/widgets/register/register_second_page.dart';
18+
import 'package:tuple/tuple.dart';
1719

1820
import '../model/meal.dart';
1921
import '../screens/home.dart';
@@ -89,7 +91,7 @@ import 'home_guard.dart';
8991
path: '',
9092
page: DiaryScreen,
9193
),
92-
AutoRoute<Meal?>(
94+
AutoRoute<Tuple2<Meal?, XFile?>>(
9395
path: 'add',
9496
page: AddMealScreen,
9597
),

lib/router/router.gr.dart

+25-22
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@
1313
// ignore_for_file: no_leading_underscores_for_library_prefixes
1414
import 'package:auto_route/auto_route.dart' as _i18;
1515
import 'package:auto_route/empty_router_widgets.dart' as _i5;
16+
import 'package:flutter/foundation.dart' as _i27;
1617
import 'package:flutter/material.dart' as _i19;
18+
import 'package:image_picker/image_picker.dart' as _i26;
19+
import 'package:tuple/tuple.dart' as _i24;
1720

1821
import '../model/aftercare.dart' as _i23;
19-
import '../model/meal.dart' as _i24;
20-
import '../model/user.dart' as _i25;
22+
import '../model/meal.dart' as _i25;
23+
import '../model/user.dart' as _i28;
2124
import '../screens/add_meal.dart' as _i14;
2225
import '../screens/chat.dart' as _i7;
2326
import '../screens/client_list.dart' as _i10;
@@ -129,7 +132,7 @@ class AppRouter extends _i18.RootStackRouter {
129132
},
130133
AddMealScreenRoute.name: (routeData) {
131134
final args = routeData.argsAs<AddMealScreenRouteArgs>();
132-
return _i18.MaterialPageX<_i24.Meal?>(
135+
return _i18.MaterialPageX<_i24.Tuple2<_i25.Meal?, _i26.XFile?>>(
133136
routeData: routeData,
134137
child: _i14.AddMealScreen(
135138
day: args.day, meal: args.meal, key: args.key));
@@ -289,7 +292,7 @@ class ProfileScreenRoute extends _i18.PageRouteInfo<void> {
289292
/// generated route for
290293
/// [_i7.ChatScreen]
291294
class ChatScreenRoute extends _i18.PageRouteInfo<ChatScreenRouteArgs> {
292-
ChatScreenRoute({_i19.Key? key, _i25.User? otherUser})
295+
ChatScreenRoute({_i27.Key? key, _i28.User? otherUser})
293296
: super(ChatScreenRoute.name,
294297
path: 'onechat',
295298
args: ChatScreenRouteArgs(key: key, otherUser: otherUser));
@@ -300,9 +303,9 @@ class ChatScreenRoute extends _i18.PageRouteInfo<ChatScreenRouteArgs> {
300303
class ChatScreenRouteArgs {
301304
const ChatScreenRouteArgs({this.key, this.otherUser});
302305

303-
final _i19.Key? key;
306+
final _i27.Key? key;
304307

305-
final _i25.User? otherUser;
308+
final _i28.User? otherUser;
306309

307310
@override
308311
String toString() {
@@ -323,7 +326,7 @@ class DiscussionListScreenRoute extends _i18.PageRouteInfo<void> {
323326
/// [_i9.DocumentListScreen]
324327
class DocumentListScreenRoute
325328
extends _i18.PageRouteInfo<DocumentListScreenRouteArgs> {
326-
DocumentListScreenRoute({_i19.Key? key, required _i25.User user})
329+
DocumentListScreenRoute({_i27.Key? key, required _i28.User user})
327330
: super(DocumentListScreenRoute.name,
328331
path: 'documents',
329332
args: DocumentListScreenRouteArgs(key: key, user: user));
@@ -334,9 +337,9 @@ class DocumentListScreenRoute
334337
class DocumentListScreenRouteArgs {
335338
const DocumentListScreenRouteArgs({this.key, required this.user});
336339

337-
final _i19.Key? key;
340+
final _i27.Key? key;
338341

339-
final _i25.User user;
342+
final _i28.User user;
340343

341344
@override
342345
String toString() {
@@ -375,7 +378,7 @@ class ClientListScreenRoute extends _i18.PageRouteInfo<void> {
375378
/// [_i11.ClientRecordScreen]
376379
class ClientRecordScreenRoute
377380
extends _i18.PageRouteInfo<ClientRecordScreenRouteArgs> {
378-
ClientRecordScreenRoute({required _i25.User user, _i19.Key? key})
381+
ClientRecordScreenRoute({required _i28.User user, _i27.Key? key})
379382
: super(ClientRecordScreenRoute.name,
380383
path: 'record',
381384
args: ClientRecordScreenRouteArgs(user: user, key: key));
@@ -386,9 +389,9 @@ class ClientRecordScreenRoute
386389
class ClientRecordScreenRouteArgs {
387390
const ClientRecordScreenRouteArgs({required this.user, this.key});
388391

389-
final _i25.User user;
392+
final _i28.User user;
390393

391-
final _i19.Key? key;
394+
final _i27.Key? key;
392395

393396
@override
394397
String toString() {
@@ -401,7 +404,7 @@ class ClientRecordScreenRouteArgs {
401404
class UpdateClientRecordScreenRoute
402405
extends _i18.PageRouteInfo<UpdateClientRecordScreenRouteArgs> {
403406
UpdateClientRecordScreenRoute(
404-
{required dynamic user, _i23.Aftercare? aftercare, _i19.Key? key})
407+
{required dynamic user, _i23.Aftercare? aftercare, _i27.Key? key})
405408
: super(UpdateClientRecordScreenRoute.name,
406409
path: 'update',
407410
args: UpdateClientRecordScreenRouteArgs(
@@ -418,7 +421,7 @@ class UpdateClientRecordScreenRouteArgs {
418421

419422
final _i23.Aftercare? aftercare;
420423

421-
final _i19.Key? key;
424+
final _i27.Key? key;
422425

423426
@override
424427
String toString() {
@@ -429,7 +432,7 @@ class UpdateClientRecordScreenRouteArgs {
429432
/// generated route for
430433
/// [_i13.DiaryScreen]
431434
class DiaryScreenRoute extends _i18.PageRouteInfo<DiaryScreenRouteArgs> {
432-
DiaryScreenRoute({_i25.User? client, _i19.Key? key})
435+
DiaryScreenRoute({_i28.User? client, _i27.Key? key})
433436
: super(DiaryScreenRoute.name,
434437
path: '', args: DiaryScreenRouteArgs(client: client, key: key));
435438

@@ -439,9 +442,9 @@ class DiaryScreenRoute extends _i18.PageRouteInfo<DiaryScreenRouteArgs> {
439442
class DiaryScreenRouteArgs {
440443
const DiaryScreenRouteArgs({this.client, this.key});
441444

442-
final _i25.User? client;
445+
final _i28.User? client;
443446

444-
final _i19.Key? key;
447+
final _i27.Key? key;
445448

446449
@override
447450
String toString() {
@@ -452,7 +455,7 @@ class DiaryScreenRouteArgs {
452455
/// generated route for
453456
/// [_i14.AddMealScreen]
454457
class AddMealScreenRoute extends _i18.PageRouteInfo<AddMealScreenRouteArgs> {
455-
AddMealScreenRoute({required DateTime day, _i24.Meal? meal, _i19.Key? key})
458+
AddMealScreenRoute({required DateTime day, _i25.Meal? meal, _i27.Key? key})
456459
: super(AddMealScreenRoute.name,
457460
path: 'add',
458461
args: AddMealScreenRouteArgs(day: day, meal: meal, key: key));
@@ -465,9 +468,9 @@ class AddMealScreenRouteArgs {
465468

466469
final DateTime day;
467470

468-
final _i24.Meal? meal;
471+
final _i25.Meal? meal;
469472

470-
final _i19.Key? key;
473+
final _i27.Key? key;
471474

472475
@override
473476
String toString() {
@@ -487,7 +490,7 @@ class RegisterFirstPageRoute extends _i18.PageRouteInfo<void> {
487490
/// [_i16.RegisterSecondPage]
488491
class RegisterSecondPageRoute
489492
extends _i18.PageRouteInfo<RegisterSecondPageRouteArgs> {
490-
RegisterSecondPageRoute({_i19.Key? key})
493+
RegisterSecondPageRoute({_i27.Key? key})
491494
: super(RegisterSecondPageRoute.name,
492495
path: '1', args: RegisterSecondPageRouteArgs(key: key));
493496

@@ -497,7 +500,7 @@ class RegisterSecondPageRoute
497500
class RegisterSecondPageRouteArgs {
498501
const RegisterSecondPageRouteArgs({this.key});
499502

500-
final _i19.Key? key;
503+
final _i27.Key? key;
501504

502505
@override
503506
String toString() {

0 commit comments

Comments
 (0)