207 lines
5.4 KiB
Vue
207 lines
5.4 KiB
Vue
![]() |
<script lang="ts" setup>
|
||
|
import type { BasicQuestion } from "@/types/basic";
|
||
|
|
||
|
useHead({
|
||
|
title: "Pytanie 1/20",
|
||
|
});
|
||
|
|
||
|
const { data, error, status, refresh } = await useFetch<BasicQuestion[]>(
|
||
|
"/api/basic"
|
||
|
);
|
||
|
|
||
|
const runtimeConfig = useRuntimeConfig();
|
||
|
const cdnUrl = runtimeConfig.public.cdn_url;
|
||
|
|
||
|
const count = ref(0);
|
||
|
|
||
|
const tak_nie_model = ref();
|
||
|
|
||
|
async function next() {
|
||
|
if (count.value + 1 < data.value?.length!) {
|
||
|
questionaries.value.push({
|
||
|
nr_pytania: question.value?.nr_pytania,
|
||
|
chosen_answer: tak_nie_model.value ?? "",
|
||
|
correct_answer: question.value?.poprawna_odp?.toLowerCase(),
|
||
|
chosen_is_correct:
|
||
|
tak_nie_model.value == question.value?.poprawna_odp?.toLowerCase(),
|
||
|
liczba_pkt: question.value?.liczba_pkt,
|
||
|
});
|
||
|
tak_nie_model.value = "";
|
||
|
count.value++;
|
||
|
useHead({
|
||
|
title: `Pytanie ${count.value + 1}/${data.value?.length}`,
|
||
|
});
|
||
|
} else {
|
||
|
// await navigateTo("/advanced");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const question = computed(() => data.value?.at(count.value));
|
||
|
const media = computed(() => {
|
||
|
const mediaSplit = question.value?.media?.split(".");
|
||
|
return {
|
||
|
fileType: mediaSplit?.pop()?.toLowerCase(),
|
||
|
fileName: mediaSplit?.join("."),
|
||
|
};
|
||
|
});
|
||
|
|
||
|
const questionaries: Ref<Array<any>> = ref([]);
|
||
|
|
||
|
const progres = ref();
|
||
|
|
||
|
onMounted(() => {
|
||
|
const progresInterval = setInterval(() => {
|
||
|
progres.value.value = +progres.value.value + 1;
|
||
|
if (progres.value.value >= 100) {
|
||
|
clearInterval(progresInterval);
|
||
|
}
|
||
|
}, 100);
|
||
|
});
|
||
|
</script>
|
||
|
|
||
|
<template>
|
||
|
<div>
|
||
|
<div v-if="status === 'success'">
|
||
|
<div class="grid grid-cols-4">
|
||
|
<div class="col-span-3 flex flex-col gap-4 p-4">
|
||
|
<div class="flex flex-row gap-5">
|
||
|
<div>
|
||
|
Wartość punktowa
|
||
|
<div class="info-little-box">
|
||
|
{{ question?.liczba_pkt }}
|
||
|
</div>
|
||
|
</div>
|
||
|
<div>
|
||
|
Aktualna kategoria (implement)
|
||
|
<div class="info-little-box">B</div>
|
||
|
</div>
|
||
|
<div>
|
||
|
Czas do końca egzaminu (implement)
|
||
|
<div class="info-little-box">25:00</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div
|
||
|
class="select-none z-[-1] w-full flex items-center justify-center *:object-contain *:object-contain *:*:object-contain"
|
||
|
>
|
||
|
<div class="w-[650px] *:w-full">
|
||
|
<img
|
||
|
:src="cdnUrl + [media.fileName, media.fileType].join('.')"
|
||
|
alt=""
|
||
|
v-if="media.fileType == 'jpg'"
|
||
|
/>
|
||
|
<video
|
||
|
v-else-if="media.fileType == 'wmv'"
|
||
|
:key="media.fileName"
|
||
|
autoplay
|
||
|
>
|
||
|
<source
|
||
|
:src="cdnUrl + [media.fileName, 'mp4'].join('.')"
|
||
|
type="video/mp4"
|
||
|
/>
|
||
|
</video>
|
||
|
<span v-else>Brak mediów</span>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div>{{ question?.pytanie }}</div>
|
||
|
<div>
|
||
|
<div class="flex flex-row justify-around">
|
||
|
<input
|
||
|
type="radio"
|
||
|
name="tak_nie"
|
||
|
id="odp_tak"
|
||
|
v-model="tak_nie_model"
|
||
|
value="tak"
|
||
|
class="hidden"
|
||
|
/>
|
||
|
<label for="odp_tak">
|
||
|
<div
|
||
|
:class="`btn-answer ${
|
||
|
tak_nie_model == 'tak' ? ' !bg-fuchsia-500' : ''
|
||
|
}`"
|
||
|
>
|
||
|
TAK
|
||
|
</div>
|
||
|
</label>
|
||
|
<input
|
||
|
type="radio"
|
||
|
name="tak_nie"
|
||
|
id="odp_nie"
|
||
|
v-model="tak_nie_model"
|
||
|
value="nie"
|
||
|
class="hidden"
|
||
|
/>
|
||
|
<label for="odp_nie">
|
||
|
<div
|
||
|
:class="`btn-answer ${
|
||
|
tak_nie_model == 'nie' ? ' !bg-fuchsia-500' : ''
|
||
|
}`"
|
||
|
>
|
||
|
NIE
|
||
|
</div>
|
||
|
</label>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div class="flex flex-col items-center">
|
||
|
<div>
|
||
|
<button class="btn-major">Zakończ egzamin</button>
|
||
|
</div>
|
||
|
<div class="flex flex-row">
|
||
|
<div>
|
||
|
Pytania podstawowe
|
||
|
<div class="progressive">
|
||
|
{{ count + 1 }} / {{ data?.length }}
|
||
|
</div>
|
||
|
</div>
|
||
|
<div>
|
||
|
Pytania specjalistyczne
|
||
|
<div class="progressive">
|
||
|
{{ count + 1 }} / {{ data?.length }}
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div>TimeLeft (implement)</div>
|
||
|
<div>
|
||
|
<button @click="next()" class="btn-major">Następne pytanie</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<br />
|
||
|
{{ questionaries }}
|
||
|
</div>
|
||
|
<div v-else-if="status === 'error'">Error: {{ error }}</div>
|
||
|
<div v-else>Loading...</div>
|
||
|
<progress max="100" ref="progres">Aha...</progress>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<style scoped>
|
||
|
.btn {
|
||
|
@apply box-border text-white font-bold p-3 rounded-md w-fit cursor-pointer border-[4px];
|
||
|
}
|
||
|
|
||
|
.btn-answer {
|
||
|
@apply btn bg-blue-500 text-xl;
|
||
|
}
|
||
|
|
||
|
.btn-answer:hover {
|
||
|
@apply bg-blue-300;
|
||
|
}
|
||
|
|
||
|
.btn-answer:active {
|
||
|
@apply bg-blue-400;
|
||
|
}
|
||
|
|
||
|
.btn-major {
|
||
|
@apply btn bg-orange-400 text-base;
|
||
|
}
|
||
|
|
||
|
.info-little-box {
|
||
|
@apply inline-block px-[15px] py-[8px] bg-blue-500 text-white font-bold;
|
||
|
}
|
||
|
/*
|
||
|
.progressive {
|
||
|
} */
|
||
|
</style>
|