enzostvs's picture
enzostvs HF Staff
timer reduced depending on the score
ded1740
"use client";
import { useState } from "react";
import { useBoolean, useInterval, useUpdateEffect } from "react-use";
import { RxLapTimer } from "react-icons/rx";
import { useQuizz } from "./hooks/useQuizz";
import { PromptType } from "@/utils/type";
import { Card } from "./card";
import { Button } from "../button/button";
import Link from "next/link";
export const QuizzContent = () => {
const { loading, prompts, question, onScore, result, score } = useQuizz();
const [counter, setCounter] = useState(10);
const [isRunning, toggleIsRunning] = useBoolean(true);
useUpdateEffect(() => {
if (!counter) {
(async () => {
await onScore();
return;
})();
}
}, [counter]);
useInterval(
() => {
if (counter > 0) {
setCounter(counter - 1);
}
},
isRunning ? 1000 : null
);
const handleScore = async (id: string) => {
toggleIsRunning(false);
await onScore(id);
};
useUpdateEffect(() => {
if (typeof score !== "number") return;
toggleIsRunning(true);
const delay = score > 10 ? 5 : score > 5 ? 8 : 10;
setCounter(delay);
}, [question]);
return (
<div className="flex flex-col items-center justify-center gap-10 lg:gap-12">
{!loading && (
<p className="font-extrabold bg-clip-text text-transparent bg-gradient-to-b from-white to-white/80 text-2xl lg:text-4xl text-center lg:!leading-snug relative">
<span className="font-action text-4xl lg:text-7xl !leading-3 text-white translate-y-2 lg:translate-y-4 inline-block pr-2">
</span>
{question}
<span className="font-action text-4xl lg:text-7xl text-white !leading-3 relative translate-y-5 lg:translate-y-12 pl-2 inline-block">
</span>
</p>
)}
<div className="grid grid-cols-1 gap-4 lg:gap-12">
<p className="text-white font-normal text-lg lg:text-2xl text-center mb-5 lg:mb-0">
Guess which image is related to the prompt above
</p>
<p className="text-white text-center text-3xl font-extrabold max-w-max mx-auto flex items-center justify-between gap-4 relative">
<RxLapTimer className="inline-block mb-4 lg:mb-2 text-3xl lg:text-4xl" />
{counter}
</p>
<div className="grid grid-cols-2 lg:flex lg:flex-row items-center justify-center gap-0 lg:gap-16">
{loading
? Array.from({ length: 3 }).map((_, i: number) => (
<div
key={i}
className="w-full lg:w-[340px] h-[340px] animate-pulse bg-gradient-to-br from-black/30 to-white/5 rounded-lg"
/>
))
: prompts?.map((prompt: PromptType, i: number) => (
<Card prompt={prompt} key={i} onScore={handleScore} />
))}
</div>
</div>
{result && !result?.success && (
<Link href="/results">
<Button>Go to results</Button>
</Link>
)}
</div>
);
};