nuxt-prawo-jazdy/pages/basic.vue

207 lines
5.4 KiB
Vue
Raw Normal View History

2025-03-03 19:46:35 +01:00
<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>