feat(vocab): update SRS session storage version to v3 and improve session handling
Some checks failed
Deploy to production / deploy (push) Failing after 1m3s

This commit is contained in:
Torsten Schulz (local)
2026-09-28 14:13:37 +02:00
parent d15c56a7b3
commit caabff5f5e
2 changed files with 16 additions and 2 deletions

View File

@@ -141,7 +141,9 @@ import { normalizeComparableWithNumberWords } from '@/utils/numberAnswerVariants
const PRACTICE_MIN_EXPOSURES = 3; const PRACTICE_MIN_EXPOSURES = 3;
// The original daily batch remains stable when the dialog is reopened. // The original daily batch remains stable when the dialog is reopened.
const SRS_SESSION_STORAGE_VERSION = 2; // Keep in sync with VocabCourseView. v3 discards legacy empty sessions that
// could block cards due later on the same calendar day.
const SRS_SESSION_STORAGE_VERSION = 3;
const HARD_REQUIRED_CONSECUTIVE_CORRECT = 5; const HARD_REQUIRED_CONSECUTIVE_CORRECT = 5;
const MAX_DAILY_DUE = 50; const MAX_DAILY_DUE = 50;
const MAX_DAILY_HARD_VOCABS = 7; const MAX_DAILY_HARD_VOCABS = 7;

View File

@@ -375,7 +375,9 @@ import { confirmAction, showApiError, showInfo, showSuccess } from '@/utils/feed
import VocabPracticeDialog from '@/dialogues/socialnetwork/VocabPracticeDialog.vue'; import VocabPracticeDialog from '@/dialogues/socialnetwork/VocabPracticeDialog.vue';
import { localizeVocabCourseTitle } from '@/utils/vocabCourseTitle.js'; import { localizeVocabCourseTitle } from '@/utils/vocabCourseTitle.js';
const SRS_SESSION_STORAGE_VERSION = 2; // v3 invalidates old empty daily sessions. Those could be created before a
// scheduled card became visible and then incorrectly hide today's due batch.
const SRS_SESSION_STORAGE_VERSION = 3;
export default { export default {
name: 'VocabCourseView', name: 'VocabCourseView',
@@ -600,6 +602,16 @@ export default {
return; return;
} }
const total = Math.max(0, Number(session.initialTotalDue) || 0); const total = Math.max(0, Number(session.initialTotalDue) || 0);
// A session with no originally scheduled cards must not take
// precedence over cards that are now due. This happened when the
// page was opened before the old time-of-day threshold and kept a
// zero-card session for the rest of the calendar day.
if (total === 0 && this.srsDueItems.length > 0) {
localStorage.removeItem(key);
this.srsTodayRemaining = null;
this.srsTodayQuota = null;
return;
}
const initialIds = new Set(Array.isArray(session.initialDueIds) ? session.initialDueIds : []); const initialIds = new Set(Array.isArray(session.initialDueIds) ? session.initialDueIds : []);
const done = new Set((Array.isArray(session.doneIds) ? session.doneIds : []) const done = new Set((Array.isArray(session.doneIds) ? session.doneIds : [])
.filter((id) => initialIds.has(id))).size; .filter((id) => initialIds.has(id))).size;