You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
3.9 KiB
JavaScript

import { defineStore } from 'pinia'
import api from '../axiosPostulante'
export const useExamenStore = defineStore('examenStore', {
state: () => ({
procesos: [],
areas: [],
examenActual: null,
preguntas: [],
cargando: false,
error: null,
}),
actions: {
// 1. Obtener procesos disponibles para el postulante
async fetchProcesos() {
try {
this.cargando = true
const { data } = await api.get('/examen/procesos')
this.procesos = data
} catch (e) {
this.error = e.response?.data?.message || e.message
} finally {
this.cargando = false
}
},
// 2. Obtener áreas por proceso
async fetchAreas(proceso_id) {
try {
this.cargando = true
const { data } = await api.get('/examen/areas', {
params: { proceso_id }
})
this.areas = data
} catch (e) {
this.error = e.response?.data?.message || e.message
} finally {
this.cargando = false
}
},
// 3. Crear examen (sin preguntas)
async crearExamen(area_proceso_id, pago = null) {
try {
this.cargando = true
const payload = { area_proceso_id, ...pago }
const { data } = await api.post('/examen/crear', payload)
this.examenActual = { id: data.examen_id }
return data
} catch (e) {
this.error = e.response?.data?.message || e.message
return { success: false, message: this.error }
} finally {
this.cargando = false
}
},
// 4. Obtener examen actual
async fetchExamenActual() {
try {
this.cargando = true
const { data } = await api.get('/examen/actual')
this.examenActual = data.examen
} catch (e) {
this.error = e.response?.data?.message || e.message
} finally {
this.cargando = false
}
},
// 5. Generar preguntas para un examen
async generarPreguntas(examenId) {
try {
this.cargando = true
const { data } = await api.post(`/examen/${examenId}/generar-preguntas`)
return data
} catch (e) {
this.error = e.response?.data?.message || e.message
return { success: false, message: this.error }
} finally {
this.cargando = false
}
},
// 6. Iniciar examen
async iniciarExamen(examenId) {
try {
this.cargando = true
const { data } = await api.post('/examen/iniciar', { examen_id: examenId })
this.examenActual = data.examen
this.preguntas = data.preguntas
return data
} catch (e) {
this.error = e.response?.data?.message || e.message
return { success: false, message: this.error }
} finally {
this.cargando = false
}
},
// 7. Responder pregunta
async responderPregunta(preguntaId, respuesta) {
try {
const { data } = await api.post(`/examen/pregunta/${preguntaId}/responder`, { respuesta })
// Actualizar pregunta local si es necesario
const index = this.preguntas.findIndex(p => p.id === preguntaId)
if (index !== -1) this.preguntas[index].respuesta = respuesta
return data
} catch (e) {
this.error = e.response?.data?.message || e.message
return { success: false, message: this.error }
}
},
// 8. Finalizar examen
async finalizarExamen(examenId) {
try {
const { data } = await api.post(`/examen/${examenId}/finalizar`)
this.examenActual = null
this.preguntas = []
return data
} catch (e) {
this.error = e.response?.data?.message || e.message
return { success: false, message: this.error }
}
},
// Limpiar estado
resetStore() {
this.procesos = []
this.areas = []
this.examenActual = null
this.preguntas = []
this.cargando = false
this.error = null
}
}
})