diff --git a/frontend/src/dialogues/socialnetwork/VocabPracticeDialog.vue b/frontend/src/dialogues/socialnetwork/VocabPracticeDialog.vue index 0f986dc..fd61b1c 100755 --- a/frontend/src/dialogues/socialnetwork/VocabPracticeDialog.vue +++ b/frontend/src/dialogues/socialnetwork/VocabPracticeDialog.vue @@ -143,7 +143,9 @@ const PRACTICE_MIN_EXPOSURES = 3; // The original daily batch remains stable when the dialog is reopened. // 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; +// Keep this in sync with VocabCourseView. Version 4 discards stale empty +// sessions that could mask a new daily SRS batch. +const SRS_SESSION_STORAGE_VERSION = 4; const HARD_REQUIRED_CONSECUTIVE_CORRECT = 5; const MAX_DAILY_DUE = 50; const MAX_DAILY_HARD_VOCABS = 7; diff --git a/frontend/src/views/social/VocabCourseView.vue b/frontend/src/views/social/VocabCourseView.vue index bb727fc..ec412e8 100755 --- a/frontend/src/views/social/VocabCourseView.vue +++ b/frontend/src/views/social/VocabCourseView.vue @@ -377,7 +377,9 @@ import { localizeVocabCourseTitle } from '@/utils/vocabCourseTitle.js'; // 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; +// Version 4 invalidates the old zero-card day sessions. Those sessions could +// hide a server-reported due backlog for the rest of a calendar day. +const SRS_SESSION_STORAGE_VERSION = 4; export default { name: 'VocabCourseView', @@ -602,11 +604,11 @@ export default { return; } 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) { + // A session with no originally scheduled cards must never take + // precedence over a server-reported due backlog. Check the server + // total rather than just the loaded first page of cards: an empty or + // late item array must not turn e.g. "588 due" into "0 of 0 today". + if (total === 0 && this.srsDueCount > 0) { localStorage.removeItem(key); this.srsTodayRemaining = null; this.srsTodayQuota = null;