Skip to content

Commit

Permalink
fix: fixed streak system
Browse files Browse the repository at this point in the history
refactor(DataProvider): DataProvider > UserDataUtil, deprecated Provider.
  • Loading branch information
SethCohen committed Apr 11, 2023
1 parent c933e34 commit 4b2a617
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 54 deletions.
Original file line number Diff line number Diff line change
@@ -1,37 +1,51 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:spaced_repetition/sm.dart';
import '../../features/flashcard/flashcard_model.dart';

final currentUser = FirebaseAuth.instance.currentUser!;
const pageSize = 5;

class DataProvider extends ChangeNotifier {
Future<void> updateCardProgress(FlashcardModel flashcard, int quality) async {
Sm sm = Sm();
class UserDataUtil {
static Future<void> updateLastLearnt() async {
final user = await FirebaseFirestore.instance
.collection('users')
.doc(currentUser.uid)
.get();

// Updates streak
FirebaseFirestore.instance
if (user.exists) {
user.reference.set({
'lastLearnt': DateTime.now(),
}, SetOptions(merge: true));
}
}

static Future<void> updateStreak() async {
final user = await FirebaseFirestore.instance
.collection('users')
.doc(currentUser.uid)
.get()
.then((user) {
final userData = user.data() as Map<String, dynamic>;
final lastLearnt = (userData['lastLearnt'] as Timestamp).toDate();
.get();

if (user.exists) {
final lastLearnt = (user.data()!['lastLearnt'] as Timestamp).toDate();
final now = DateTime.now();
DateTime lastStreakUpdate =
DateTime(lastLearnt.year, lastLearnt.month, lastLearnt.day);
DateTime today = DateTime(now.year, now.month, now.day);
DateTime yesterday = today.subtract(const Duration(days: 1));

if (lastStreakUpdate != today) {
if (lastStreakUpdate == yesterday) {
user.reference.set({
'streak': FieldValue.increment(1),
}, SetOptions(merge: true));
}
}).catchError((error) {
debugPrint(error);
});
}

UserDataUtil.updateLastLearnt();
}

static Future<void> updateCardProgress(
FlashcardModel flashcard, int quality) async {
Sm sm = Sm();

// Gets card progress for the current user
final card = await FirebaseFirestore.instance
Expand Down Expand Up @@ -100,8 +114,6 @@ class DataProvider extends ChangeNotifier {
SetOptions(merge: true));

await batch.commit();

notifyListeners();
}
}
}
5 changes: 2 additions & 3 deletions src/lib/features/flashcard/flashcard.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'flashcard_model.dart';
import '../../common/utils/data_provider.dart';
import '../../common/utils/user_data_util.dart';
import '../../common/widgets/custom_iconbutton.dart';

enum CardType { review, dictionary, lesson }
Expand Down Expand Up @@ -160,7 +159,7 @@ class _FlashcardState extends State<Flashcard> {
);

void _handleButtonPress(FlashcardModel flashcard, int quality) {
context.read<DataProvider>().updateCardProgress(flashcard, quality);
UserDataUtil.updateCardProgress(flashcard, quality);
widget.handleIndex!();
}

Expand Down
12 changes: 2 additions & 10 deletions src/lib/features/lesson/lesson_details_page.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../authentication/google_provider.dart';
import '../../common/utils/user_data_util.dart';
import '../flashcard/flashcard_model.dart';
import '../flashcard/flashcard.dart';
import 'lessons_list_page.dart';
Expand Down Expand Up @@ -56,14 +55,7 @@ class _LessonDetailsState extends State<LessonDetails> {
void _handleIndex() => setState(() {
bool isCompleted = _currentCardIndex == widget.lessonData.cardCount - 1;
if (isCompleted) {
final currentUser = context.read<GoogleSignInProvider>().user;

FirebaseFirestore.instance
.collection("users")
.doc(currentUser!.uid)
.set({
'lastLearnt': DateTime.now(),
}, SetOptions(merge: true));
UserDataUtil.updateStreak();

Navigator.pop(context);
} else {
Expand Down
12 changes: 6 additions & 6 deletions src/lib/features/lesson/lessons_list_page.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_ui_firestore/firebase_ui_firestore.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../authentication/google_provider.dart';

class Lesson {
Lesson(
Expand Down Expand Up @@ -48,7 +49,7 @@ class LessonsPage extends StatelessWidget {
String deckId = deckSnapshot.id;

return StreamBuilder<DocumentSnapshot>(
stream: _getUserDeckProgress(deckId),
stream: _getUserDeckProgress(context, deckId),
builder: (context, snapshot) {
int userDeckCardCount = 0;

Expand All @@ -63,12 +64,11 @@ class LessonsPage extends StatelessWidget {
);
}

Stream<DocumentSnapshot> _getUserDeckProgress(deckId) {
final currentuser = FirebaseAuth.instance.currentUser!;

Stream<DocumentSnapshot> _getUserDeckProgress(
BuildContext context, String deckId) {
return FirebaseFirestore.instance
.collection('users')
.doc(currentuser.uid)
.doc(context.read<GoogleSignInProvider>().user!.uid)
.collection('deckProgress')
.doc(deckId)
.snapshots();
Expand Down
13 changes: 2 additions & 11 deletions src/lib/features/review/review_details_page.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../authentication/google_provider.dart';
import '../../common/utils/user_data_util.dart';
import '../flashcard/flashcard_model.dart';
import 'review_model.dart';
import '../flashcard/flashcard.dart';
Expand Down Expand Up @@ -41,14 +39,7 @@ class _ReviewState extends State<Review> {
void _handleIndex() => setState(() {
bool isCompleted = _currentCardIndex == widget.cards.length - 1;
if (isCompleted) {
final currentUser = context.read<GoogleSignInProvider>().user;

FirebaseFirestore.instance
.collection("users")
.doc(currentUser!.uid)
.set({
'lastLearnt': DateTime.now(),
}, SetOptions(merge: true));
UserDataUtil.updateStreak();

Navigator.pop(context);
} else {
Expand Down
9 changes: 4 additions & 5 deletions src/lib/features/review/reviews_list_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import '../../common/utils/data_provider.dart';
import '../authentication/google_provider.dart';
import 'review_model.dart';

Expand Down Expand Up @@ -131,7 +130,8 @@ class _ReviewPageState extends State<ReviewPage> {
return FirebaseFirestore.instance
.collectionGroup('cards')
.where('nextReview', isLessThan: DateTime.now())
.where('userId', isEqualTo: currentUser.uid)
.where('userId',
isEqualTo: context.read<GoogleSignInProvider>().user!.uid)
.snapshots()
.map((querySnapshot) {
final reviewModelList = querySnapshot.docs.map((doc) {
Expand All @@ -143,11 +143,10 @@ class _ReviewPageState extends State<ReviewPage> {
}

Future<QuerySnapshot> _getNextAvailableReview() async {
final currentUser = context.read<GoogleSignInProvider>().user;

return await FirebaseFirestore.instance
.collectionGroup('cards')
.where('userId', isEqualTo: currentUser!.uid)
.where('userId',
isEqualTo: context.read<GoogleSignInProvider>().user!.uid)
.orderBy('nextReview', descending: false)
.limit(1)
.get();
Expand Down
2 changes: 0 additions & 2 deletions src/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:url_strategy/url_strategy.dart';
import 'common/utils/data_provider.dart';
import 'features/authentication/google_provider.dart';
import 'firebase_options.dart';
import 'common/utils/routes.dart';
Expand All @@ -26,7 +25,6 @@ class MyApp extends StatelessWidget {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => GoogleSignInProvider()),
ChangeNotifierProvider(create: (_) => DataProvider()),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
Expand Down

0 comments on commit 4b2a617

Please sign in to comment.