scoring done
This commit is contained in:
@@ -8,7 +8,7 @@ import '../widgets/kanji_card.dart';
|
||||
import '../widgets/options_grid.dart';
|
||||
import 'settings_screen.dart';
|
||||
|
||||
enum QuizMode { kanjiToEnglish, englishToKanji, reading }
|
||||
import '../models/kanji_item.dart';
|
||||
|
||||
class _ReadingInfo {
|
||||
final List<String> correctReadings;
|
||||
@@ -65,11 +65,13 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
_status = 'Fetching deck...';
|
||||
});
|
||||
|
||||
final items = await repo.fetchAndCacheFromWk(apiKey);
|
||||
var items = await repo.loadKanji();
|
||||
if (items.isEmpty) {
|
||||
setState(() {
|
||||
_status = 'Fetching deck...';
|
||||
});
|
||||
items = await repo.fetchAndCacheFromWk(apiKey);
|
||||
}
|
||||
|
||||
setState(() {
|
||||
_deck = items;
|
||||
@@ -102,14 +104,24 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
|
||||
final pickedType = choices[_random.nextInt(choices.length)];
|
||||
final readingsList = pickedType == 'onyomi' ? item.onyomi : item.kunyomi;
|
||||
final hint = 'Select the ${pickedType == 'onyomi' ? "on'yomi" : "kunyomi"}';
|
||||
final hint = 'Select the ${pickedType == 'onyomi' ? "on\'yomi" : "kunyomi"}';
|
||||
|
||||
return _ReadingInfo(readingsList, hint);
|
||||
}
|
||||
|
||||
void _nextQuestion() {
|
||||
if (_deck.isEmpty) return;
|
||||
_current = (_deck..shuffle()).first;
|
||||
_deck.sort((a, b) {
|
||||
final aSrsItem = a.srsItems[_mode.toString()] ?? SrsItem(kanjiId: a.id, quizMode: _mode);
|
||||
final bSrsItem = b.srsItems[_mode.toString()] ?? SrsItem(kanjiId: b.id, quizMode: _mode);
|
||||
|
||||
final stageComparison = aSrsItem.srsStage.compareTo(bSrsItem.srsStage);
|
||||
if (stageComparison != 0) {
|
||||
return stageComparison;
|
||||
}
|
||||
return aSrsItem.lastAsked.compareTo(bSrsItem.lastAsked);
|
||||
});
|
||||
|
||||
_current = _deck.first;
|
||||
|
||||
_correctAnswers = [];
|
||||
_options = [];
|
||||
@@ -150,15 +162,42 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
void _answer(String option) {
|
||||
void _answer(String option) async {
|
||||
final isCorrect = _correctAnswers
|
||||
.map((a) => a.toLowerCase().trim())
|
||||
.contains(option.toLowerCase().trim());
|
||||
|
||||
final repo = Provider.of<DeckRepository>(context, listen: false);
|
||||
final current = _current!;
|
||||
|
||||
String readingType = '';
|
||||
if (_mode == QuizMode.reading) {
|
||||
readingType = _readingHint.contains("on'yomi") ? 'onyomi' : 'kunyomi';
|
||||
}
|
||||
final srsKey = _mode.toString() + readingType;
|
||||
|
||||
var srsItem = current.srsItems[srsKey];
|
||||
final isNew = srsItem == null;
|
||||
srsItem ??= SrsItem(kanjiId: current.id, quizMode: _mode, readingType: readingType);
|
||||
|
||||
setState(() {
|
||||
_asked += 1;
|
||||
if (isCorrect) _score += 1;
|
||||
if (isCorrect) {
|
||||
_score += 1;
|
||||
srsItem!.srsStage += 1;
|
||||
} else {
|
||||
srsItem!.srsStage = max(0, srsItem.srsStage - 1);
|
||||
}
|
||||
srsItem.lastAsked = DateTime.now();
|
||||
current.srsItems[srsKey] = srsItem;
|
||||
});
|
||||
|
||||
if (isNew) {
|
||||
await repo.insertSrsItem(srsItem);
|
||||
} else {
|
||||
await repo.updateSrsItem(srsItem);
|
||||
}
|
||||
|
||||
final correctDisplay = (_mode == QuizMode.kanjiToEnglish)
|
||||
? _toTitleCase(_correctAnswers.first)
|
||||
: (_mode == QuizMode.reading ? _correctAnswers.join(', ') : _correctAnswers.first);
|
||||
@@ -174,7 +213,9 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
backgroundColor: const Color(0xFF222222),
|
||||
duration: const Duration(milliseconds: 900),
|
||||
);
|
||||
ScaffoldMessenger.of(context).showSnackBar(snack);
|
||||
if (mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(snack);
|
||||
}
|
||||
|
||||
Future.delayed(const Duration(milliseconds: 900), _nextQuestion);
|
||||
}
|
||||
@@ -307,4 +348,4 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
backgroundColor: const Color(0xFF1E1E1E),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user