From 19b520a3b1bd9ce17cbba837257cd5ef4e2616d8 Mon Sep 17 00:00:00 2001 From: team3 Date: Mon, 15 Jun 2026 16:09:38 +0200 Subject: [PATCH] update --- frontend/src/components/BausteinPanel.vue | 56 ++++++++++++++++++++--- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/BausteinPanel.vue b/frontend/src/components/BausteinPanel.vue index 65b560e..f900ad1 100644 --- a/frontend/src/components/BausteinPanel.vue +++ b/frontend/src/components/BausteinPanel.vue @@ -80,6 +80,8 @@ const pruefLoading = ref(false) const aktuelleFrage = ref('') // ankert Bewertung/Diskussion const letztesFeedback = ref('') // Kontext für die Diskussion über eine Bewertung const scoreVorFrage = ref(0) // Score, als die aktuelle Frage gestellt wurde → driftfreies (Re-)Bewerten +const naechsteFrage = ref(null) // im Hintergrund vorbereitete nächste Frage (Prefetch) +let prefetchPromise = null // laufender Hintergrund-Abruf (verhindert Doppel-Prefetch) const pruefMessagesEl = ref(null) const pruefInputEl = ref(null) const pruefStick = ref(true) // nur auto-scrollen, wenn der Nutzer (fast) unten ist @@ -127,14 +129,56 @@ async function pruefSenden(payload, onOk) { } } +// Frage anzeigen (frisch oder vorgemerkt). scoreVorFrage = LIVE-Score zur Anzeigezeit (driftfrei). +function frageZeigen(text) { + aktuelleFrage.value = text + letztesFeedback.value = '' + scoreVorFrage.value = st.value.gute_antworten + pruefMessages.value.push({ role: 'assistant', kind: 'frage', content: text }) + pruefPhase.value = 'frage_offen' +} + +// Nächste Frage im Hintergrund vorbereiten (überbrückt die Wartezeit). Ohne pruefLoading/pruefRun. +function prefetchFrage() { + if (naechsteFrage.value || prefetchPromise) return + prefetchPromise = pruefeBaustein({ + topic: props.topic, baustein: props.baustein, section: props.section, + provider: props.provider, aktion: 'frage', messages: pruefDialog(), + }) + .then((res) => { naechsteFrage.value = res.frage }) + .catch(() => {}) + .finally(() => { prefetchPromise = null }) +} + +// Erste Frage (Phase idle): frisch generieren, dann die nächste vorbereiten. function frageAnfordern() { if (pruefLoading.value) return pruefSenden({ aktion: 'frage' }, (res) => { - aktuelleFrage.value = res.frage - letztesFeedback.value = '' - scoreVorFrage.value = res.gute_antworten // Basis für (Re-)Bewertung dieser Frage - pruefMessages.value.push({ role: 'assistant', kind: 'frage', content: res.frage }) - pruefPhase.value = 'frage_offen' + frageZeigen(res.frage) + prefetchFrage() + }) +} + +// „Nächste Frage": vorgemerkte sofort zeigen, sonst auf den Prefetch warten, sonst frisch holen. +async function naechsteFrageZeigen() { + if (pruefLoading.value) return + if (!naechsteFrage.value && prefetchPromise) { + pruefLoading.value = true + try { await prefetchPromise } finally { pruefLoading.value = false } + } + if (naechsteFrage.value) { + const text = naechsteFrage.value + naechsteFrage.value = null + frageZeigen(text) + pruefScroll() + nextTick(() => pruefInputEl.value?.focus()) + prefetchFrage() + return + } + // Fallback: kein Cache → frisch generieren. + pruefSenden({ aktion: 'frage' }, (res) => { + frageZeigen(res.frage) + prefetchFrage() }) } @@ -284,7 +328,7 @@ function neuBewerten() {