Skip to content

Commit

Permalink
refactor: refactored lesson code readability
Browse files Browse the repository at this point in the history
  • Loading branch information
SethCohen committed Feb 23, 2023
1 parent bff2d25 commit 29b19ea
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 114 deletions.
13 changes: 7 additions & 6 deletions src/lib/widgets/flashcard.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import 'package:flutter/material.dart';
class Flashcard extends StatefulWidget {
const Flashcard({
super.key,
required this.handleCardIndex,
required this.data,
required this.handleCard,
required this.handleCardIndex,
required this.handleCardProgress,
required this.isReview,
});

final Function(DocumentSnapshot, int) handleCard;
final Function(DocumentSnapshot, int) handleCardProgress;
final Function() handleCardIndex;
final QueryDocumentSnapshot data;
final bool isReview;
Expand Down Expand Up @@ -60,7 +60,7 @@ class _FlashcardState extends State<Flashcard> {
onPressed: () {
setState(() {
widget.handleCardIndex();
widget.handleCard(widget.data, 0);
widget.handleCardProgress(widget.data, 0);
});
},
child: const Text('Hard'),
Expand All @@ -74,7 +74,7 @@ class _FlashcardState extends State<Flashcard> {
onPressed: () {
setState(() {
widget.handleCardIndex();
widget.handleCard(widget.data, 2);
widget.handleCardProgress(widget.data, 2);
});
},
child: const Text('Medium'),
Expand All @@ -88,7 +88,7 @@ class _FlashcardState extends State<Flashcard> {
onPressed: () {
setState(() {
widget.handleCardIndex();
widget.handleCard(widget.data, 5);
widget.handleCardProgress(widget.data, 5);
});
},
child: const Text('Easy'),
Expand All @@ -113,6 +113,7 @@ class _FlashcardState extends State<Flashcard> {
),
onPressed: () {
widget.handleCardIndex();
widget.handleCardProgress(widget.data, 0);
},
child: const Text('Next'),
),
Expand Down
194 changes: 86 additions & 108 deletions src/lib/widgets/lesson.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,21 @@ class Lesson extends StatefulWidget {
}

class _LessonState extends State<Lesson> {
final _user = FirebaseAuth.instance.currentUser!;

int _currentCardIndex = 0;
int _cardsLength = 0;
String _lessonId = '';

@override
Widget build(BuildContext context) {
final arguments = (ModalRoute.of(context)?.settings.arguments ??
<String, dynamic>{}) as Map;

final lesson = arguments['lesson'] as QueryDocumentSnapshot;

return WillPopScope(
onWillPop: () async {
final user = FirebaseAuth.instance.currentUser!;
final currentLesson = arguments['lesson'] as QueryDocumentSnapshot;
FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.collection('progress')
.doc(currentLesson.id)
.get()
.then((value) {
if (!value.data()!['inProgress']) {
FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.collection('progress')
.doc(currentLesson.id)
.update({'inProgress': true});
}
});

_handleInProgress(lesson);
return true;
},
child: Scaffold(
Expand All @@ -61,6 +45,8 @@ class _LessonState extends State<Lesson> {
stream: lesson.reference.collection('cards').snapshots(),
builder: (context, snapshot) {
if (snapshot.hasData) {
_lessonId = lesson.id;

final cards = snapshot.data!.docs;
_cardsLength = cards.length;

Expand All @@ -83,8 +69,8 @@ class _LessonState extends State<Lesson> {
children: cards.map((card) {
return Flashcard(
data: card,
handleCard: _updateCardInProgressCollection,
handleCardIndex: _incrementCardIndex,
handleCardProgress: _handleCardProgress,
handleCardIndex: _handleCardIndex,
isReview: false,
);
}).toList()),
Expand All @@ -107,111 +93,103 @@ class _LessonState extends State<Lesson> {
return input.replaceAll('lesson', 'Lesson ');
}

void _incrementCardIndex() {
setState(() {
if (_currentCardIndex == _cardsLength - 1) {
final user = FirebaseAuth.instance.currentUser!;
final arguments = (ModalRoute.of(context)?.settings.arguments ??
<String, dynamic>{}) as Map;
final currentLesson = arguments['lesson'] as QueryDocumentSnapshot;
FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.collection('progress')
.doc(currentLesson.id)
.get()
.then((value) {
if (!value.data()!['complete']) {
FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.collection('progress')
.doc(currentLesson.id)
.update({'complete': true});
void _handleCardProgress(DocumentSnapshot currentCard, int quality) {
final sm = Sm();
debugPrint('test');

FirebaseFirestore.instance
.collection('users')
.doc(_user.uid)
.collection('progress')
.doc(_lessonId)
.collection('cards')
.doc(currentCard.id)
.get()
.then(
(card) {
SmResponse calculateCardProgress() {
if (!card.exists) {
return sm.calc(
quality: quality,
previousEaseFactor: 2.5,
previousInterval: 0,
repetitions: 0,
);
} else {
return sm.calc(
quality: quality,
previousEaseFactor: card.data()!['easeFactor'],
previousInterval: card.data()!['interval'],
repetitions: card.data()!['repetitions'],
);
}
}

SmResponse progress = calculateCardProgress();
final lastReview = DateTime.now();
final nextReview = lastReview.add(Duration(days: progress.interval));

card.reference.set({
'lastReview': lastReview,
'nextReview': nextReview,
'easeFactor': progress.easeFactor,
'interval': progress.interval,
'quality': quality,
'repetitions': progress.repetitions,
});
},
);
}

void _handleCardIndex() {
setState(() {
if (_currentCardIndex == _cardsLength - 1) {
_handleComplete();
Navigator.pop(context);
} else {
_currentCardIndex++;
}
});
}

void _updateCardInProgressCollection(
DocumentSnapshot card,
int quality,
) {
final user = FirebaseAuth.instance.currentUser!;
final currentLesson =
ModalRoute.of(context)!.settings.arguments as QueryDocumentSnapshot;
final currentCard = card;

void _handleInProgress(QueryDocumentSnapshot currentLesson) {
FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.doc(_user.uid)
.collection('progress')
.doc(currentLesson.id)
.collection('cards')
.doc(currentCard.id)
.get()
.then((value) {
final sm = Sm();

if (!value.exists) {
final SmResponse sm2Response = sm.calc(
quality: quality,
previousEaseFactor: 2.5,
previousInterval: 0,
repetitions: 0,
);

final lastReviewed = DateTime.now();
final nextReview =
lastReviewed.add(Duration(days: sm2Response.interval));

FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.collection('progress')
.doc(currentLesson.id)
.collection('cards')
.doc(currentCard.id)
.set({
'lastReviewed': lastReviewed,
'nextReview': nextReview,
'previousEaseFactor': sm2Response.easeFactor,
'previousInterval': sm2Response.interval,
'quality': quality,
'repetitions': sm2Response.repetitions,
});
} else {
final SmResponse sm2Response = sm.calc(
quality: quality,
previousEaseFactor: value.data()!['previousEaseFactor'],
previousInterval: value.data()!['previousInterval'],
repetitions: value.data()!['repetitions'],
);

final lastReviewed = DateTime.now();
final nextReview =
lastReviewed.add(Duration(days: sm2Response.interval));
.then(
(lessonProgress) {
bool isNotInProgress = !lessonProgress.data()!['inProgress'];
if (isNotInProgress) {
FirebaseFirestore.instance
.collection('users')
.doc(_user.uid)
.collection('progress')
.doc(currentLesson.id)
.update({'inProgress': true});
}
},
);
}

void _handleComplete() {
FirebaseFirestore.instance
.collection('users')
.doc(_user.uid)
.collection('progress')
.doc(_lessonId)
.get()
.then((lessonProgress) {
bool isNotComplete = !lessonProgress.data()!['complete'];
if (isNotComplete) {
FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.doc(_user.uid)
.collection('progress')
.doc(currentLesson.id)
.collection('cards')
.doc(currentCard.id)
.update({
'lastReviewed': lastReviewed,
'nextReview': nextReview,
'previousEaseFactor': sm2Response.easeFactor,
'previousInterval': sm2Response.interval,
'quality': quality,
'repetitions': sm2Response.repetitions,
});
.doc(_lessonId)
.update({'complete': true});
}
});
}
Expand Down

0 comments on commit 29b19ea

Please sign in to comment.