-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- application submissions - missing: prompt for name and mail address
- Loading branch information
1 parent
0ab58df
commit d399e26
Showing
16 changed files
with
2,340 additions
and
142 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,11 @@ | |
|
||
import { useRouter } from "next/navigation"; | ||
import { | ||
AddStudentApplicationForEventDocument, | ||
AddStudentApplicationForEventMutation, | ||
AddStudentApplicationForEventMutationVariables, | ||
NewQuestionResponsePair, | ||
NewUserToEventApplication, | ||
QuestionType, | ||
RegistrationFormDocument, | ||
RegistrationFormQuery, | ||
|
@@ -32,6 +37,7 @@ import { | |
FormItem, | ||
FormMessage, | ||
} from "@/components/ui/form"; | ||
import { Toaster, toast } from "sonner"; | ||
|
||
type Props = { | ||
searchParams: { | ||
|
@@ -66,11 +72,17 @@ const Home = ({ searchParams }: Props) => { | |
const [index, setIndex] = useState(0); | ||
const [loading, setLoading] = useState(true); | ||
const router = useRouter(); | ||
const [responses, setResponses] = useState<NewQuestionResponsePair[]>([]); | ||
|
||
useEffect(() => { | ||
const fetchData = async () => { | ||
const eventID = searchParams.e; | ||
if (responses.length > 0) { | ||
onSubmit(); | ||
} | ||
}, [responses]); | ||
|
||
const eventID = searchParams.e; | ||
useEffect(() => { | ||
const fetchData = async () => { | ||
const vars: RegistrationFormQueryVariables = { | ||
eventID: parseInt(eventID), | ||
}; | ||
|
@@ -92,7 +104,7 @@ const Home = ({ searchParams }: Props) => { | |
}; | ||
|
||
fetchData(); | ||
}, [searchParams.e, router]); | ||
}, [router]); | ||
|
||
useEffect(() => { | ||
if (regForm) { | ||
|
@@ -101,14 +113,18 @@ const Home = ({ searchParams }: Props) => { | |
}, [index, regForm]); | ||
|
||
const mcForm = useForm<z.infer<ReturnType<typeof MultipleChoiceFormSchema>>>({ | ||
resolver: zodResolver(MultipleChoiceFormSchema(regForm?.questions[index].required!)), | ||
resolver: zodResolver( | ||
MultipleChoiceFormSchema(regForm?.questions[index].required!) | ||
), | ||
defaultValues: { | ||
multipleChoice: [], | ||
}, | ||
}); | ||
|
||
const scForm = useForm<z.infer<ReturnType<typeof SingleChoiceFormSchema>>>({ | ||
resolver: zodResolver(SingleChoiceFormSchema(regForm?.questions[index].required!)), | ||
resolver: zodResolver( | ||
SingleChoiceFormSchema(regForm?.questions[index].required!) | ||
), | ||
defaultValues: { | ||
singleChoice: undefined, | ||
}, | ||
|
@@ -118,36 +134,79 @@ const Home = ({ searchParams }: Props) => { | |
router.push("/"); | ||
} | ||
|
||
const FooterButtons = () => ( | ||
<div className="flex justify-between w-full"> | ||
<Button onClick={handleQuit} variant="outline" className="w-auto"> | ||
Abbrechen | ||
</Button> | ||
<Button type="submit" className="w-auto"> | ||
{regForm?.questions.length !== index + 1 ? "Nächste Frage" : "Anmelden"} | ||
</Button> | ||
</div> | ||
); | ||
|
||
function onSubmit() { | ||
const onSubmit = async () => { | ||
if (regForm?.questions.length !== index + 1) { | ||
setIndex((prevIndex) => prevIndex + 1); | ||
return; | ||
} | ||
} | ||
|
||
await new Promise((resolve) => setTimeout(resolve, 250)); | ||
|
||
const application: NewUserToEventApplication = { | ||
// TODO | ||
userMail: "[email protected]", | ||
eventID: +eventID, | ||
answers: responses, | ||
}; | ||
|
||
const vars: AddStudentApplicationForEventMutationVariables = { | ||
application: application, | ||
}; | ||
|
||
try { | ||
await client.request<AddStudentApplicationForEventMutation>( | ||
AddStudentApplicationForEventDocument, | ||
vars | ||
); | ||
toast("Anmeldung abgeschickt!"); | ||
handleQuit(); | ||
} catch (err) { | ||
toast("Ein Fehler ist aufgetreten"); | ||
console.error(err) | ||
} | ||
}; | ||
|
||
function onScaleSubmit() { | ||
onSubmit(); | ||
const res: NewQuestionResponsePair = { | ||
questionID: regForm?.questions[index].ID || 0, | ||
value: String(sliderValue), | ||
}; | ||
setResponses((prevResponses) => [...prevResponses, res]); | ||
|
||
setSliderValue(0); | ||
} | ||
|
||
function onMCSubmit(data: z.infer<ReturnType<typeof MultipleChoiceFormSchema>>) { | ||
onSubmit(); | ||
function onMCSubmit( | ||
data: z.infer<ReturnType<typeof MultipleChoiceFormSchema>> | ||
) { | ||
const newResponses = data.multipleChoice!.map((id) => ({ | ||
questionID: regForm?.questions[index].ID || 0, | ||
answerID: id, | ||
})); | ||
setResponses((prevResponses) => [...prevResponses, ...newResponses]); | ||
} | ||
|
||
function onSCSubmit(data: z.infer<ReturnType<typeof SingleChoiceFormSchema>>) { | ||
onSubmit(); | ||
function onSCSubmit( | ||
data: z.infer<ReturnType<typeof SingleChoiceFormSchema>> | ||
) { | ||
const res: NewQuestionResponsePair = { | ||
questionID: regForm?.questions[index].ID || 0, | ||
answerID: data.singleChoice!, | ||
}; | ||
setResponses((prevResponses) => [...prevResponses, res]); | ||
} | ||
|
||
const FooterButtons = () => ( | ||
<div className="flex justify-between w-full"> | ||
<Button onClick={handleQuit} variant="outline" className="w-auto"> | ||
Abbrechen | ||
</Button> | ||
<Button type="submit" className="w-auto"> | ||
{regForm?.questions.length !== index + 1 ? "Nächste Frage" : "Anmelden"} | ||
</Button> | ||
</div> | ||
); | ||
|
||
if (loading) { | ||
return <div>Loading...</div>; | ||
} | ||
|
@@ -195,7 +254,7 @@ const Home = ({ searchParams }: Props) => { | |
onCheckedChange={(checked) => { | ||
return checked | ||
? field.onChange([ | ||
...field.value || [], | ||
...(field.value || []), | ||
answer.ID, | ||
]) | ||
: field.onChange( | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
"use client" | ||
|
||
import { useTheme } from "next-themes" | ||
import { Toaster as Sonner } from "sonner" | ||
|
||
type ToasterProps = React.ComponentProps<typeof Sonner> | ||
|
||
const Toaster = ({ ...props }: ToasterProps) => { | ||
const { theme = "system" } = useTheme() | ||
|
||
return ( | ||
<Sonner | ||
theme={theme as ToasterProps["theme"]} | ||
className="toaster group" | ||
toastOptions={{ | ||
classNames: { | ||
toast: | ||
"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg", | ||
description: "group-[.toast]:text-muted-foreground", | ||
actionButton: | ||
"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground", | ||
cancelButton: | ||
"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground", | ||
}, | ||
}} | ||
{...props} | ||
/> | ||
) | ||
} | ||
|
||
export { Toaster } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.