This commit is contained in:
team3
2026-06-15 16:09:38 +02:00
parent 44e04315cc
commit 19b520a3b1

View File

@@ -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() {
<template v-else>
<button class="bp-action" :disabled="pruefLoading || !pruefInput.trim()" @click="nachfragen">Nachhaken</button>
<button class="bp-action" :disabled="pruefLoading" @click="neuBewerten">Neu bewerten</button>
<button class="bp-action primary" :disabled="pruefLoading" @click="frageAnfordern">Nächste Frage</button>
<button class="bp-action primary" :disabled="pruefLoading" @click="naechsteFrageZeigen">Nächste Frage</button>
</template>
</div>
</template>