lucas-wa
Adding build options
d1cad4b
raw
history blame
5.93 kB
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
import { ChevronLeft, Menu } from "lucide-react"
import { useEffect, useState } from "react";
import { ToastContainer, toast } from "react-toastify"
import 'react-toastify/dist/ReactToastify.css';
function App() {
const [subject, setSubject] = useState("");
const [menuState, setMenuState] = useState(true);
const [isLoading, setIsLoading] = useState(false);
const [questions, setQuestions] = useState([
{
question: "Qual a cor do céu?",
options: ["Azul", "Verde", "Amarelo", "Vermelho"],
answer: "Azul"
},
{
question: "Qual a cor da grama?",
options: ["Azul", "Verde", "Amarelo", "Vermelho"],
answer: "Verde"
},
{
question: "Qual a cor do sol?",
options: ["Azul", "Verde", "Amarelo", "Vermelho"],
answer: "Amarelo"
},
{
question: "Qual a cor do sangue?",
options: ["Azul", "Verde", "Amarelo", "Vermelho"],
answer: "Vermelho"
}
]);
const handleSubmit = async (e) => {
e.preventDefault();
setIsLoading(true);
try {
const res = await fetch("/generate_questions", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
subject
})
});
console.log(res)
if (res.ok) {
const data = await res.json();
console.log(data)
setQuestions(data.questions);
} else {
toast.error("Erro ao gerar questões", {
position: "top-right",
autoClose: 5000,
hideProgressBar: false,
closeOnClick: true,
pauseOnHover: true,
draggable: true,
progress: undefined,
className: "bg-slate-900 text-white font-semibold",
});
}
} catch (err) {
console.error(err);
toast.error("Erro ao gerar questões", {
position: "top-right",
autoClose: 5000,
hideProgressBar: false,
closeOnClick: true,
pauseOnHover: true,
draggable: true,
progress: undefined,
className: "bg-slate-900 text-white font-semibold",
});
}
setIsLoading(false);
}
useEffect(() => {
const handleResize = () => {
if (window.innerWidth > 768) {
setMenuState(true);
} else {
setMenuState(false);
}
}
window.addEventListener("resize", handleResize);
return () => window.removeEventListener("resize", handleResize);
}
, []);
return (
<div className="font-sans h-screen text-white min-h-screen bg-slate-900 flex flex-col relative overflow-hidden">
<header className="p-10 flex items-center gap-2.5">
<Menu className="md:hidden" onClick={() => setMenuState(prev => !prev)} />
<h1 className="text-3xl font-bold">
Pergunt.<span className="text-transparent bg-clip-text bg-gradient-to-r from-green-300 to bg-blue-500"></span>
</h1>
</header>
<main className="flex-1 flex overflow-hidden">
{
menuState &&
<form
onSubmit={handleSubmit}
className="p-10 flex flex-col gap-2.5 absolute top-0 bg-black/95 h-full z-10 md:static md:h-full md:bg-transparent">
<div className="md:sr-only">
<ChevronLeft className="w-10 h-10" onClick={e => setMenuState(prev => !prev)} />
</div>
<h2>Selecione uma matéria:</h2>
<Select defaultValue="biologia" >
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="Matéria" />
</SelectTrigger>
<SelectContent >
<SelectItem value="biologia">Biologia</SelectItem>
</SelectContent>
</Select>
<h2>Selecione um conteúdo:</h2>
<Select onValueChange={value => setSubject(value)}>
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="Conteúdo" />
</SelectTrigger>
<SelectContent onChange={e => console.log(e)}>
<SelectItem value="fisiologia">Fisiologia</SelectItem>
<SelectItem value="embriologia">Embriologia</SelectItem>
<SelectItem value="citologia">Citologia</SelectItem>
</SelectContent>
</Select>
<button className="h-10 bg-purple-500 rounded px-2.5 py-1 mt-5 hover:brightness-110 transition-all flex items-center justify-center disabled:hover:brightness-75 disabled:brightness-75"
disabled={isLoading || !subject}>
{
isLoading ?
<div className="animate-spin h-5 w-5 border-2 border-white border-r-purple-500 rounded-full"></div>
:
"Enviar"
}
</button>
</form>
}
<section className="p-10 flex-1 md:border-l-2 md:border-l-white flex flex-col gap-2.5 ">
<h2 className="text-2xl font-bold">Questões</h2>
<div className="w-full h-full flex flex-col gap-5 rounded p-2.5 overflow-y-scroll">
{questions ?
questions.map(({ question, options, answer }, index) => (
<div key={index} className="bg-slate-950 ring-2 ring-white p-2.5 rounded">
{question}<br /><br />
{options.map((option, i) => (
<div key={i}>
{option}
</div>
))}<br />
Resposta correta: {answer}
</div>
))
: <div className="p-2.5 bg-slate-950 ring-2 ring-white rounded">{"Ainda sem questões"}</div>}
</div>
</section>
<ToastContainer />
</main>
</div>
)
}
export default App