fix error with browser view and levels

This commit is contained in:
Rene Kievits
2025-11-02 19:53:10 +01:00
parent 5f1b9ba12e
commit 14ad880f79

View File

@@ -173,11 +173,22 @@ class _BrowseScreenState extends State<BrowseScreen>
itemBuilder: (context, index) { itemBuilder: (context, index) {
final level = sortedLevels[index]; final level = sortedLevels[index];
final levelItems = groupedItems[level]!; final levelItems = groupedItems[level]!;
final bool isDisabled = levelItems.every( final bool isDisabled;
(item) => (item as dynamic).srsItems.values.every( if (repository is DeckRepository) {
(srs) => (srs as SrsItem).disabled, isDisabled = levelItems.every(
), (item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().every(
); (srs) => srs.disabled,
),
);
} else if (repository is VocabDeckRepository) {
isDisabled = levelItems.every(
(item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast<SrsItem>().every(
(srs) => srs.disabled,
),
);
} else {
isDisabled = false; // Default to false if repository type is unknown
}
return Column( return Column(
children: [ children: [
@@ -197,7 +208,7 @@ class _BrowseScreenState extends State<BrowseScreen>
Checkbox( Checkbox(
value: !isDisabled, value: !isDisabled,
onChanged: (value) { onChanged: (value) {
_toggleLevelExclusion(level, repository); _toggleLevelExclusion(level, repository, index, pageController);
}, },
), ),
], ],
@@ -227,13 +238,20 @@ class _BrowseScreenState extends State<BrowseScreen>
final level = levels[index]; final level = levels[index];
final isSelected = index == currentPage; final isSelected = index == currentPage;
final items = isKanji ? _kanjiByLevel[level] : _vocabByLevel[level]; final items = isKanji ? _kanjiByLevel[level] : _vocabByLevel[level];
final bool isDisabled = final bool isDisabled;
items?.every( if (isKanji) {
(item) => (item as dynamic).srsItems.values.every( isDisabled = items?.every(
(srs) => (srs as SrsItem).disabled, (item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().every(
), (srs) => srs.disabled,
) ?? ), ) ??
false; false;
} else {
isDisabled = items?.every(
(item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast<SrsItem>().every(
(srs) => srs.disabled,
), ) ??
false;
}
return Expanded( return Expanded(
child: Padding( child: Padding(
@@ -636,14 +654,20 @@ class _BrowseScreenState extends State<BrowseScreen>
_vocabSortedLevels = _vocabByLevel.keys.toList()..sort(); _vocabSortedLevels = _vocabByLevel.keys.toList()..sort();
} }
Future<void> _toggleLevelExclusion(int level, dynamic repository) async { Future<void> _toggleLevelExclusion(
int level,
dynamic repository,
int currentPageIndex,
PageController pageController,
) async {
final List<SrsItem> itemsToUpdate = []; final List<SrsItem> itemsToUpdate = [];
final bool currentlyDisabled; List<dynamic> items = [];
bool currentlyDisabled = false;
if (repository is DeckRepository) { if (repository is DeckRepository) {
final items = _kanjiByLevel[level] ?? []; items = _kanjiByLevel[level] ?? [];
currentlyDisabled = items.every( currentlyDisabled = items.every(
(item) => item.srsItems.values.every((srs) => srs.disabled), (item) => (item as KanjiItem).srsItems.values.isNotEmpty && (item as KanjiItem).srsItems.values.cast<SrsItem>().every((srs) => srs.disabled),
); );
for (final item in items) { for (final item in items) {
for (final srsItem in item.srsItems.values) { for (final srsItem in item.srsItems.values) {
@@ -651,9 +675,9 @@ class _BrowseScreenState extends State<BrowseScreen>
} }
} }
} else if (repository is VocabDeckRepository) { } else if (repository is VocabDeckRepository) {
final items = _vocabByLevel[level] ?? []; items = _vocabByLevel[level] ?? [];
currentlyDisabled = items.every( currentlyDisabled = items.every(
(item) => item.srsItems.values.every((srs) => srs.disabled), (item) => (item as VocabularyItem).srsItems.values.isNotEmpty && (item as VocabularyItem).srsItems.values.cast<SrsItem>().every((srs) => srs.disabled),
); );
for (final item in items) { for (final item in items) {
for (final srsItem in item.srsItems.values) { for (final srsItem in item.srsItems.values) {
@@ -664,12 +688,70 @@ class _BrowseScreenState extends State<BrowseScreen>
return; return;
} }
for (final item in itemsToUpdate) { if (itemsToUpdate.isEmpty) {
item.disabled = !currentlyDisabled; // No SrsItems exist for this level, so create them and set their disabled status
for (final item in items) { // 'items' contains KanjiItem or VocabularyItem
// Determine quiz modes based on repository type
List<QuizMode> quizModes = [];
if (repository is DeckRepository) {
quizModes = [QuizMode.kanjiToEnglish, QuizMode.englishToKanji, QuizMode.reading];
} else if (repository is VocabDeckRepository) {
quizModes = [QuizMode.vocabToEnglish, QuizMode.englishToVocab, QuizMode.audioToEnglish];
}
for (final mode in quizModes) {
String? readingType;
if (mode == QuizMode.reading && repository is DeckRepository) {
// For reading mode, create SrsItems for both onyomi and kunyomi if they exist
if ((item as KanjiItem).onyomi.isNotEmpty) {
readingType = 'onyomi';
itemsToUpdate.add(SrsItem(
subjectId: item.id,
quizMode: mode,
readingType: readingType,
disabled: !currentlyDisabled,
));
}
if ((item as KanjiItem).kunyomi.isNotEmpty) {
readingType = 'kunyomi';
itemsToUpdate.add(SrsItem(
subjectId: item.id,
quizMode: mode,
readingType: readingType,
disabled: !currentlyDisabled,
));
}
} else {
itemsToUpdate.add(SrsItem(
subjectId: item.id,
quizMode: mode,
disabled: !currentlyDisabled,
));
}
}
}
// Now insert these newly created SrsItems
if (repository is DeckRepository) {
for (final srsItem in itemsToUpdate) {
await (repository as DeckRepository).insertSrsItem(srsItem);
}
} else if (repository is VocabDeckRepository) {
for (final srsItem in itemsToUpdate) {
await (repository as VocabDeckRepository).insertVocabSrsItem(srsItem);
}
}
} else {
// Existing SrsItems, so update them
for (final item in itemsToUpdate) {
item.disabled = !currentlyDisabled;
}
await repository.updateSrsItems(itemsToUpdate);
} }
await repository.updateSrsItems(itemsToUpdate); setState(() {});
_loadDecks(); if (pageController.hasClients) {
pageController.jumpToPage(currentPageIndex);
}
} }
@override @override