Skip to content

Commit 493c4c7

Browse files
authored
Merge pull request #211 from les-crepes/201-correction-vue-diary
201 correction vue diary
2 parents 38c4c35 + 6177ed2 commit 493c4c7

File tree

5 files changed

+81
-10
lines changed

5 files changed

+81
-10
lines changed

lib/api/firebase_meal.dart

+31-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,13 @@ class FirebaseMeal extends FirebaseAPI implements IMeal {
6060

6161
@override
6262
Future<List<Meal>> getUsersMealForDay(String userId, DateTime day) async {
63-
DateTime newD = DateTime(day.year, day.month, day.day, 0, 0); /// Start of the day
64-
DateTime endD = newD.add(const Duration(days: 1)); /// End of the day
63+
DateTime newD = DateTime(day.year, day.month, day.day, 0, 0);
64+
65+
/// Start of the day
66+
DateTime endD = newD.add(const Duration(days: 1));
67+
68+
/// End of the day
69+
6570
final m = await collectionReference
6671
.where("owner", isEqualTo: userId)
6772
.where("startTime", isGreaterThanOrEqualTo: newD)
@@ -74,6 +79,30 @@ class FirebaseMeal extends FirebaseAPI implements IMeal {
7479
return meals;
7580
}
7681

82+
@override
83+
Stream<List<Meal>> followMeals(String userId, DateTime day) {
84+
DateTime newD = DateTime(day.year, day.month, day.day, 0, 0);
85+
86+
/// Start of the day
87+
DateTime endD = newD.add(const Duration(days: 1));
88+
89+
/// End of the day
90+
91+
Stream<QuerySnapshot<Meal>> mealStream = collectionReference
92+
.where("owner", isEqualTo: userId)
93+
.where("startTime", isGreaterThanOrEqualTo: newD)
94+
.where("startTime", isLessThanOrEqualTo: endD)
95+
.withConverter(
96+
fromFirestore: Meal.fromFirestore,
97+
toFirestore: (Meal meal, options) => meal.toFirestore())
98+
.snapshots();
99+
100+
return mealStream
101+
.map((querySnapshot) => querySnapshot.docs)
102+
.map((doc) => doc.map((e) => e.data()))
103+
.cast();
104+
}
105+
77106
@override
78107
Future<List<Meal>> getUserMeal(String userId) async {
79108
final m = await collectionReference

lib/api/imeal.dart

+8
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,22 @@ import 'package:pdg_app/model/meal.dart';
44
abstract class IMeal {
55
/// Add [meal] to the database
66
Future<void> createMeal(Meal meal);
7+
78
/// Returns the meal in the database with [mealId]
89
Future<Meal> readMeal(String mealId);
10+
911
/// Update the [meal] in the database
1012
Future<void> updateMeal(Meal meal);
13+
1114
/// Delete the meal with [mealId] from the database
1215
void deleteMeal(String mealId);
16+
1317
/// Get the meals of the user [userId] for the day [day]
1418
Future<List<Meal>> getUsersMealForDay(String userId, DateTime day);
19+
20+
/// Subscribe to the user [userId] meals for the day [day]
21+
Stream<List<Meal>> followMeals(String userId, DateTime day);
22+
1523
/// Get the meals of the user [userId]
1624
Future<List<Meal>> getUserMeal(String userId);
1725
}

lib/provider/chat_provider.dart

-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'dart:async';
22
import 'dart:collection';
3-
import 'dart:developer';
43

54
import 'package:cloud_firestore/cloud_firestore.dart';
65
import 'package:flutter/material.dart';
@@ -105,8 +104,6 @@ class ChatProvider extends ChangeNotifier {
105104
final subscription = _messageApi
106105
.followConversation(currentUserUid, user.uid)
107106
.listen((event) {
108-
log('FOLLOW: $event');
109-
110107
/// Be sure that the last received message isn't already in the list.
111108
if (event != null && !_messages[user]!.any((m) => m.uid == event.uid)) {
112109
_messages[user]!.add(event);

lib/provider/meal_provider.dart

+18
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'dart:async';
12
import 'dart:developer';
23

34
import 'package:cloud_firestore/cloud_firestore.dart';
@@ -16,6 +17,7 @@ class MealProvider extends ChangeNotifier {
1617
final String _uid;
1718
bool _isFetching = false;
1819
final IFile _fileApi = FirebaseFile(FirebaseStorage.instance);
20+
StreamSubscription<List<Meal>>? _subscription;
1921

2022
MealProvider(this._uid) {
2123
fetchMeals();
@@ -71,4 +73,20 @@ class MealProvider extends ChangeNotifier {
7173

7274
return picUrl;
7375
}
76+
77+
void startNewDiaryListener(String userId, DateTime date) {
78+
if (_subscription != null) return;
79+
80+
final subscription = _mealApi.followMeals(userId, date).listen((event) {
81+
_meals = event;
82+
notifyListeners();
83+
});
84+
85+
_subscription = subscription;
86+
}
87+
88+
/// Stop listening to new incoming meal.
89+
void stopNewDiaryListener() {
90+
_subscription?.cancel();
91+
}
7492
}

lib/screens/diary.dart

+24-5
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,14 @@ class _DiaryScreenState extends State<DiaryScreen> {
3939
IFile fileApi = FirebaseFile(FirebaseStorage.instance);
4040
final LoadingOverlayController _loadingOverlayController =
4141
LoadingOverlayController();
42+
late MealProvider mealProvider;
4243

43-
_onDaySelected(DateTime day) async {
44-
_selectedDate = day;
44+
@override
45+
void dispose() {
46+
if (GetIt.I.get<AuthProvider>().isAdmin) {
47+
mealProvider.stopNewDiaryListener();
48+
}
49+
super.dispose();
4550
}
4651

4752
List<Meal> _getEventsForDay(BuildContext context, DateTime day) {
@@ -60,20 +65,34 @@ class _DiaryScreenState extends State<DiaryScreen> {
6065
builder: (context, child) {
6166
context.watch<MealProvider>().meals;
6267

63-
MealProvider mealProvider = context.read<MealProvider>();
68+
mealProvider = context.read<MealProvider>();
6469
AuthProvider authProvider = GetIt.I.get<AuthProvider>();
6570

71+
if (isAdmin) {
72+
mealProvider.startNewDiaryListener(
73+
widget._client!.uid, _selectedDate);
74+
}
75+
6676
return LoadingOverlay(
6777
controller: _loadingOverlayController,
6878
child: Diary(
69-
onDaySelected: _onDaySelected,
79+
onDaySelected: (date) {
80+
_selectedDate = date;
81+
if (isAdmin) {
82+
mealProvider.stopNewDiaryListener();
83+
mealProvider.startNewDiaryListener(
84+
widget._client!.uid, date);
85+
}
86+
},
7087
getDiariesForDay: (day) {
7188
return _getEventsForDay(context, day);
7289
},
7390
clientName: !isAdmin
7491
? GetIt.I.get<AuthProvider>().user!.firstName
7592
: widget._client!.firstName,
76-
clientPicturePath: authProvider.user!.photoUrl,
93+
clientPicturePath: !isAdmin
94+
? authProvider.user!.photoUrl
95+
: widget._client!.photoUrl,
7796
defaultUserPic: "assets/images/default_user_pic.png",
7897
showActionButton: !isAdmin,
7998
defaultMealPic: "assets/images/breakfast.jpg",

0 commit comments

Comments
 (0)