1+ // /create/page.tsx
12"use client" ;
23
34import { useState } from "react" ;
45import { Button } from "@/components/ui/button" ;
56import Questions from "./questions/questions" ;
67import { useTheme } from "@/hook/useTheme" ;
78import { useSubTopic } from "@/hook/useSubTopic" ;
9+ import { useQuestion } from "@/hook/useQuestion" ;
10+ import { useQuiz } from "@/hook/useQuiz" ;
811import SetQuiz from "./theme/set" ;
12+ import { AutomaticModeData } from "./questions/automatico/automatico" ;
13+ import { QuizPergunta } from "@/util/types/quiz" ;
914
1015interface ThemeData {
1116 id ?: string ;
@@ -28,6 +33,8 @@ export interface QuestionData {
2833 correct : boolean ;
2934 explanation : string ;
3035 } [ ] ;
36+ theme_id ?: string ;
37+ sub_topic_id ?: string ;
3138}
3239
3340type Step = "setup" | "questions" ;
@@ -37,10 +44,14 @@ export default function CreateQuiz() {
3744 const [ themeData , setThemeData ] = useState < ThemeData | null > ( null ) ;
3845 const [ subtopicData , setSubtopicData ] = useState < SubtopicData | null > ( null ) ;
3946 const [ questionsData , setQuestionsData ] = useState < QuestionData [ ] > ( [ ] ) ;
47+ const [ isAutomatic , setIsAutomatic ] = useState ( false ) ;
48+ const [ automaticData , setAutomaticData ] = useState < AutomaticModeData | null > ( null ) ;
4049 const [ saving , setSaving ] = useState ( false ) ;
4150
4251 const { createTheme } = useTheme ( ) ;
4352 const { createSubTopic } = useSubTopic ( ) ;
53+ const { createQuestion } = useQuestion ( ) ;
54+ const { createQuizFromText, createQuizFromAudio, createQuizFromDocument } = useQuiz ( ) ;
4455
4556 const handleNext = ( ) => {
4657 if ( ! themeData ?. title ) {
@@ -60,10 +71,39 @@ export default function CreateQuiz() {
6071 setCurrentStep ( "setup" ) ;
6172 } ;
6273
74+ const convertQuizToQuestions = ( quizPerguntas : QuizPergunta [ ] ) : QuestionData [ ] => {
75+ return quizPerguntas . map ( ( pergunta ) => ( {
76+ text : pergunta . pergunta ,
77+ alternatives : pergunta . alternativas . map ( ( alt ) => ( {
78+ text : alt . texto ,
79+ correct : alt . correta ,
80+ explanation : alt . explicacao ,
81+ } ) ) ,
82+ theme_id : pergunta . theme_id ,
83+ sub_topic_id : pergunta . sub_topic_id ,
84+ } ) ) ;
85+ } ;
86+
6387 const handleFinish = async ( ) => {
64- if ( questionsData . length === 0 ) {
65- alert ( "Adicione pelo menos uma questão!" ) ;
66- return ;
88+ // Validação
89+ if ( isAutomatic ) {
90+ if ( ! automaticData ) {
91+ alert ( "Preencha os dados para geração automática!" ) ;
92+ return ;
93+ }
94+ if ( automaticData . mode === "text" && ! automaticData . text ) {
95+ alert ( "Preencha o texto para geração!" ) ;
96+ return ;
97+ }
98+ if ( ( automaticData . mode === "audio" || automaticData . mode === "document" ) && ! automaticData . file ) {
99+ alert ( "Selecione um arquivo para geração!" ) ;
100+ return ;
101+ }
102+ } else {
103+ if ( questionsData . length === 0 ) {
104+ alert ( "Adicione pelo menos uma questão!" ) ;
105+ return ;
106+ }
67107 }
68108
69109 setSaving ( true ) ;
@@ -89,20 +129,58 @@ export default function CreateQuiz() {
89129 subTopicId = newSubTopic . id ;
90130 }
91131
92- // 3. Cria todas as questões
93- for ( const question of questionsData ) {
94- await fetch ( `/quiz-lab/api/questions` , {
95- method : "POST" ,
96- headers : {
97- "Content-Type" : "application/json" ,
98- "Authorization" : `Bearer ${ localStorage . getItem ( "access_token" ) } ` ,
99- } ,
100- body : JSON . stringify ( {
132+ // 3. Gera ou salva as questões
133+ if ( isAutomatic && automaticData ) {
134+ let generatedQuestions : QuestionData [ ] = [ ] ;
135+ let response ;
136+
137+ if ( automaticData . mode === "text" && automaticData . text ) {
138+ response = await createQuizFromText ( {
139+ text : automaticData . text ,
140+ num_questions : automaticData . num_questions ,
141+ num_alternatives : automaticData . num_alternatives ,
142+ theme_id : themeId ! ,
143+ sub_topic_id : subTopicId !
144+ } ) ;
145+ } else if ( automaticData . mode === "audio" && automaticData . file ) {
146+ response = await createQuizFromAudio ( {
147+ file : automaticData . file ,
148+ num_questions : automaticData . num_questions ,
149+ num_alternatives : automaticData . num_alternatives ,
150+ theme_id : themeId ! ,
151+ sub_topic_id : subTopicId !
152+ } ) ;
153+ } else if ( automaticData . mode === "document" && automaticData . file ) {
154+ response = await createQuizFromDocument ( {
155+ file : automaticData . file ,
156+ num_questions : automaticData . num_questions ,
157+ num_alternatives : automaticData . num_alternatives ,
158+ theme_id : themeId ! ,
159+ sub_topic_id : subTopicId !
160+ } ) ;
161+ }
162+
163+ if ( response && response . perguntas ) {
164+ generatedQuestions = convertQuizToQuestions ( response . perguntas ) ;
165+
166+ // Salva as questões geradas no banco
167+ for ( const question of generatedQuestions ) {
168+ await createQuestion ( {
169+ text : question . text ,
170+ sub_topic_id : subTopicId ! ,
171+ alternatives : question . alternatives ,
172+ } ) ;
173+ }
174+ }
175+ } else {
176+ // Salva as questões manuais
177+ for ( const question of questionsData ) {
178+ await createQuestion ( {
101179 text : question . text ,
102- sub_topic_id : subTopicId ,
180+ sub_topic_id : subTopicId ! ,
103181 alternatives : question . alternatives ,
104- } ) ,
105- } ) ;
182+ } ) ;
183+ }
106184 }
107185
108186 alert ( "Quiz criado com sucesso!" ) ;
@@ -128,7 +206,11 @@ export default function CreateQuiz() {
128206 { currentStep === "questions" && (
129207 < Questions
130208 onQuestionsChange = { setQuestionsData }
209+ onAutomaticDataChange = { setAutomaticData }
210+ onModeChange = { ( mode ) => setIsAutomatic ( mode === "automatic" ) }
131211 questions = { questionsData }
212+ themeId = { themeData ?. id || "" }
213+ subTopicId = { subtopicData ?. id || "" }
132214 />
133215 ) }
134216
@@ -147,7 +229,7 @@ export default function CreateQuiz() {
147229
148230 { currentStep === "questions" && (
149231 < Button onClick = { handleFinish } disabled = { saving } className = "ml-auto" >
150- { saving ? "Salvando ..." : "Finalizar" }
232+ { saving ? "Processando ..." : "Finalizar" }
151233 </ Button >
152234 ) }
153235 </ nav >
0 commit comments