linguaielts-api / fronted /src /stores /practice.js
AnhviNguyen
covertation + security
e5dee87
Raw
History Blame Contribute Delete
3.51 kB
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { practiceService } from '@/services/practiceService.js'
import { useBadgeCelebrationStore } from '@/stores/badgeCelebration.js'
export const usePracticeStore = defineStore('practice', () => {
const currentSession = ref(null)
const lastResult = ref(null)
const loading = ref(false)
const error = ref(null)
const sessionStartedAt = ref(null)
async function startSession(subject, quizId = null) {
loading.value = true
error.value = null
sessionStartedAt.value = Date.now()
try {
currentSession.value =
subject === 'reading'
? await practiceService.createReadingSession(quizId)
: await practiceService.createListeningSession(quizId)
return currentSession.value
} catch (err) {
error.value = err.response?.data?.detail || 'Failed to start session'
return null
} finally {
loading.value = false
}
}
async function submitSession(subject, sessionId, answers) {
loading.value = true
error.value = null
const duration_seconds = sessionStartedAt.value
? Math.floor((Date.now() - sessionStartedAt.value) / 1000)
: 0
try {
const payload = { session_id: sessionId, answers, duration_seconds }
lastResult.value =
subject === 'reading'
? await practiceService.submitReading(payload)
: await practiceService.submitListening(payload)
useBadgeCelebrationStore().enqueue(lastResult.value?.new_badges)
return lastResult.value
} catch (err) {
const detail = err.response?.data?.detail
const already =
err.response?.status === 400 &&
typeof detail === 'string' &&
detail.toLowerCase().includes('already submitted')
if (already && sessionId) {
try {
lastResult.value = await practiceService.getResultBySession(sessionId)
return lastResult.value
} catch {
/* fall through */
}
}
error.value = detail || 'Failed to submit session'
return null
} finally {
loading.value = false
}
}
async function fetchResult(sessionId) {
loading.value = true
error.value = null
try {
const payload = await practiceService.getResultBySession(sessionId)
lastResult.value = payload?.history || null
return lastResult.value
} catch (err) {
error.value = err.response?.data?.detail || 'Failed to load result'
return null
} finally {
loading.value = false
}
}
async function fetchResultByQuiz(quizId) {
loading.value = true
error.value = null
try {
const payload = await practiceService.getResultByQuiz(quizId)
lastResult.value = payload?.history || null
return lastResult.value
} catch (err) {
error.value = err.response?.data?.detail || 'Failed to load result'
return null
} finally {
loading.value = false
}
}
async function checkAnswer(sessionId, questionId, userAnswer) {
try {
return await practiceService.checkAnswer({
session_id: sessionId,
question_id: questionId,
user_answer: userAnswer,
})
} catch (err) {
error.value = err.response?.data?.detail || 'Failed to check answer'
return null
}
}
return {
currentSession,
lastResult,
loading,
error,
startSession,
submitSession,
checkAnswer,
fetchResult,
fetchResultByQuiz,
}
})