From 6486dce7517249710ca6f06397b61b18b99ce5dc Mon Sep 17 00:00:00 2001 From: SethCohen Date: Mon, 3 Apr 2023 01:57:43 -0400 Subject: [PATCH] feat(review): added next available review indicator --- .../features/review/reviews_list_page.dart | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/lib/features/review/reviews_list_page.dart b/src/lib/features/review/reviews_list_page.dart index 76abf09..dd10a5e 100644 --- a/src/lib/features/review/reviews_list_page.dart +++ b/src/lib/features/review/reviews_list_page.dart @@ -1,6 +1,8 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../common/utils/data_provider.dart'; +import '../authentication/google_provider.dart'; import 'review_model.dart'; class ReviewPage extends StatefulWidget { @@ -24,7 +26,41 @@ class _ReviewPageState extends State { _decks = context.watch().reviews; if (_decks.isEmpty) { - return const Center(child: Text('Nothing left to review! Good work!')); + // TODO cleanup + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text('No reviews available. Please come back again later.'), + StreamBuilder( + stream: _getNextReview(), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } + + if (snapshot.connectionState == ConnectionState.waiting) { + return const CircularProgressIndicator(); + } + + if (snapshot.data!.docs.isEmpty) { + return const Text( + 'Please do a lesson first to get a review.'); + } + + final card = + snapshot.data!.docs.first.data() as Map; + + final formattedDate = (card['nextReview'] as Timestamp) + .toDate() + .toLocal() + .toString(); + + return Text('Next Review: $formattedDate'); + }), + ], + )); } final allCards = _decks.values.expand((element) => element).toList(); @@ -68,4 +104,15 @@ class _ReviewPageState extends State { }, ); } + + Stream _getNextReview() { + final currentUser = context.read().user; + + return FirebaseFirestore.instance + .collectionGroup('cards') + .where('userId', isEqualTo: currentUser!.uid) + .orderBy('nextReview', descending: false) + .limit(1) + .snapshots(); + } }