feat: proses saving kuis
This commit is contained in:
parent
cc98d85658
commit
5278ff3473
|
@ -19,6 +19,7 @@
|
||||||
"react-router-dom": "^6.26.1",
|
"react-router-dom": "^6.26.1",
|
||||||
"react-virtualized-auto-sizer": "^1.0.24",
|
"react-virtualized-auto-sizer": "^1.0.24",
|
||||||
"react-window": "^1.8.10",
|
"react-window": "^1.8.10",
|
||||||
|
"sweetalert2": "^11.17.2",
|
||||||
"tailwind-merge": "^2.5.2",
|
"tailwind-merge": "^2.5.2",
|
||||||
"zustand": "^4.5.5"
|
"zustand": "^4.5.5"
|
||||||
},
|
},
|
||||||
|
@ -4312,6 +4313,16 @@
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/sweetalert2": {
|
||||||
|
"version": "11.17.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.17.2.tgz",
|
||||||
|
"integrity": "sha512-HKxDr1IyV3Lxr3W6sb61qm/p2epFIEdr5EKwteRFHnIg6f8nHFl2kX++DBVz16Mac+fFiU3hMpjq1L6yE2Ge5w==",
|
||||||
|
"license": "MIT",
|
||||||
|
"funding": {
|
||||||
|
"type": "individual",
|
||||||
|
"url": "https://github.com/sponsors/limonte"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/tailwind-merge": {
|
"node_modules/tailwind-merge": {
|
||||||
"version": "2.5.2",
|
"version": "2.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz",
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
"react-router-dom": "^6.26.1",
|
"react-router-dom": "^6.26.1",
|
||||||
"react-virtualized-auto-sizer": "^1.0.24",
|
"react-virtualized-auto-sizer": "^1.0.24",
|
||||||
"react-window": "^1.8.10",
|
"react-window": "^1.8.10",
|
||||||
|
"sweetalert2": "^11.17.2",
|
||||||
"tailwind-merge": "^2.5.2",
|
"tailwind-merge": "^2.5.2",
|
||||||
"zustand": "^4.5.5"
|
"zustand": "^4.5.5"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import LayoutPage from "@/components/templates/LayoutPage";
|
import LayoutPage from "@/components/templates/LayoutPage";
|
||||||
import useMenyusunHurufStore from "@/stores/MenyusunHurufStore";
|
import useMenyusunHurufStore from "@/stores/MenyusunHurufStore";
|
||||||
import { Link } from "react-router-dom";
|
import { useEffect } from "react";
|
||||||
|
import { Link, useNavigate } from "react-router-dom";
|
||||||
|
import Swal from "sweetalert2";
|
||||||
|
|
||||||
const MenyusunHuruf = () => {
|
const MenyusunHuruf = () => {
|
||||||
const quizStore = useMenyusunHurufStore();
|
const quizStore = useMenyusunHurufStore();
|
||||||
|
@ -13,6 +15,33 @@ const MenyusunHuruf = () => {
|
||||||
return array;
|
return array;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const router = useNavigate();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (quizStore.isFinish) {
|
||||||
|
Swal.fire({
|
||||||
|
icon: "success",
|
||||||
|
title: "Kuis telah selesai",
|
||||||
|
text: `Anda menyelesaikan kuis dalam waktu ${quizStore.time} detik`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [quizStore.isFinish]);
|
||||||
|
|
||||||
|
const ProsesKuis = () => {
|
||||||
|
if (quizStore.name === "") {
|
||||||
|
Swal.fire({
|
||||||
|
icon: "error",
|
||||||
|
title: "Oops...",
|
||||||
|
text: "Isi nama terlebih dahulu",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
quizStore.setListSoal(shuffleArray(quizStore.listSoal));
|
||||||
|
quizStore.setSession(true);
|
||||||
|
router("/kuis/menyusun-huruf/app");
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<LayoutPage>
|
<LayoutPage>
|
||||||
<div className="flex flex-col flex-1 py-4 relative">
|
<div className="flex flex-col flex-1 py-4 relative">
|
||||||
|
@ -36,19 +65,18 @@ const MenyusunHuruf = () => {
|
||||||
<input
|
<input
|
||||||
placeholder="Name.."
|
placeholder="Name.."
|
||||||
type="text"
|
type="text"
|
||||||
|
value={quizStore.name}
|
||||||
|
onChange={(e) => quizStore.setName(e.target.value)}
|
||||||
className="bg-transparent outline-none p-2 px-8 flex-1 w-full"
|
className="bg-transparent outline-none p-2 px-8 flex-1 w-full"
|
||||||
/>
|
/>
|
||||||
<Link to="/kuis/menyusun-huruf/app">
|
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
quizStore.setListSoal(shuffleArray(quizStore.listSoal));
|
ProsesKuis();
|
||||||
quizStore.setSession(true)
|
|
||||||
}}
|
}}
|
||||||
className="bg-blue-500 hover:bg-blue-700 text-white px-3 py-2 rounded-full whitespace-nowrap"
|
className="bg-blue-500 hover:bg-blue-700 text-white px-3 py-2 rounded-full whitespace-nowrap"
|
||||||
>
|
>
|
||||||
Mulai Kuis
|
Mulai Kuis
|
||||||
</button>
|
</button>
|
||||||
</Link>
|
|
||||||
</div>
|
</div>
|
||||||
<span className="text-primary">Lihat Ranking</span>
|
<span className="text-primary">Lihat Ranking</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -10,6 +10,7 @@ import ProgressBar from "@/components/molecules/ProgressBar";
|
||||||
import { MdOutlineQuiz } from "react-icons/md";
|
import { MdOutlineQuiz } from "react-icons/md";
|
||||||
import useMenyusunHurufStore from "@/stores/MenyusunHurufStore";
|
import useMenyusunHurufStore from "@/stores/MenyusunHurufStore";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import Swal from "sweetalert2";
|
||||||
|
|
||||||
// type PredictResult = {
|
// type PredictResult = {
|
||||||
// abjad: String;
|
// abjad: String;
|
||||||
|
@ -51,8 +52,6 @@ const Quiz = () => {
|
||||||
videoRef.current.srcObject = stream;
|
videoRef.current.srcObject = stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// setLoadCamera(true);
|
// setLoadCamera(true);
|
||||||
await initializeHandDetection();
|
await initializeHandDetection();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -171,13 +170,12 @@ const Quiz = () => {
|
||||||
tempAnswer = "";
|
tempAnswer = "";
|
||||||
setAnswer("");
|
setAnswer("");
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(async () => {
|
||||||
setShowAnswer(false);
|
setShowAnswer(false);
|
||||||
setResultAnswer({
|
setResultAnswer({
|
||||||
minutes: 0,
|
minutes: 0,
|
||||||
seconds: 0,
|
seconds: 0,
|
||||||
});
|
});
|
||||||
}, 3000);
|
|
||||||
|
|
||||||
quizStore.setSoalIndex(noSoal + 1);
|
quizStore.setSoalIndex(noSoal + 1);
|
||||||
|
|
||||||
|
@ -185,12 +183,50 @@ const Quiz = () => {
|
||||||
|
|
||||||
noSoal++;
|
noSoal++;
|
||||||
|
|
||||||
if (noSoal === 10) {
|
if (noSoal === quizStore.listSoal.length) {
|
||||||
quizStore.setTime(answerTime);
|
quizStore.setTime(answerTime);
|
||||||
quizStore.setSession(false);
|
quizStore.setSession(false);
|
||||||
|
quizStore.setIsFinish(true);
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: "Loading",
|
||||||
|
text: "Proses menyimpan data...",
|
||||||
|
allowOutsideClick: false,
|
||||||
|
didOpen: () => {
|
||||||
|
Swal.showLoading();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await saveData(parseInt(answerTime.toString()));
|
||||||
|
|
||||||
navigate("/kuis/menyusun-huruf/");
|
navigate("/kuis/menyusun-huruf/");
|
||||||
}
|
}
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const saveData = async (time: number) => {
|
||||||
|
try {
|
||||||
|
await fetch("https://ksuli-api.deno.dev/proses-kuis", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer KSULI_TOKEN_321`,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
kategori_id: "rec_cuum7c5qrj60bgubcjog",
|
||||||
|
person_name: quizStore.name,
|
||||||
|
score: time,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
Swal.close();
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error saving data:", error);
|
||||||
|
Swal.fire({
|
||||||
|
icon: "error",
|
||||||
|
title: "Oops...",
|
||||||
|
text: "Something went wrong while saving your data!",
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -270,7 +306,7 @@ const Quiz = () => {
|
||||||
<div className="flex items-center gap-2 mt-4">
|
<div className="flex items-center gap-2 mt-4">
|
||||||
<MdOutlineQuiz size={18} />
|
<MdOutlineQuiz size={18} />
|
||||||
<h1 className="text-xl font-semibold">
|
<h1 className="text-xl font-semibold">
|
||||||
Soal: {quizStore.soalIndex + 1} / 10
|
Soal: {quizStore.soalIndex + 1} / {quizStore.listSoal.length}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,11 @@ const soal = [
|
||||||
"SIBI",
|
"SIBI",
|
||||||
"MAHASISWA",
|
"MAHASISWA",
|
||||||
"KSULI",
|
"KSULI",
|
||||||
"INFORMATIKA",
|
// "INFORMATIKA",
|
||||||
"CODING",
|
// "CODING",
|
||||||
"WHATSAPP",
|
// "WHATSAPP",
|
||||||
"INSTAGRAM",
|
// "INSTAGRAM",
|
||||||
"TEMAN",
|
// "TEMAN",
|
||||||
];
|
];
|
||||||
|
|
||||||
type MenyusunHurufType = {
|
type MenyusunHurufType = {
|
||||||
|
@ -22,6 +22,10 @@ type MenyusunHurufType = {
|
||||||
setTime: (time: number) => void;
|
setTime: (time: number) => void;
|
||||||
session: boolean;
|
session: boolean;
|
||||||
setSession: (session: boolean) => void;
|
setSession: (session: boolean) => void;
|
||||||
|
name: string;
|
||||||
|
setName: (name: string) => void;
|
||||||
|
isFinish: boolean;
|
||||||
|
setIsFinish: (isFinish: boolean) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
const useMenyusunHurufStore = create<MenyusunHurufType>((set) => ({
|
const useMenyusunHurufStore = create<MenyusunHurufType>((set) => ({
|
||||||
|
@ -33,6 +37,10 @@ const useMenyusunHurufStore = create<MenyusunHurufType>((set) => ({
|
||||||
setTime: (time) => set({ time: time }),
|
setTime: (time) => set({ time: time }),
|
||||||
session: false,
|
session: false,
|
||||||
setSession: (session) => set({ session: session }),
|
setSession: (session) => set({ session: session }),
|
||||||
|
name: "",
|
||||||
|
setName: (name) => set({ name: name }),
|
||||||
|
isFinish: false,
|
||||||
|
setIsFinish: (isFinish) => set({ isFinish: isFinish }),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export default useMenyusunHurufStore;
|
export default useMenyusunHurufStore;
|
||||||
|
|
Loading…
Reference in New Issue