feat:update form
This commit is contained in:
+33
-8
@@ -17,9 +17,10 @@ export const dynamic = "force-dynamic";
|
||||
export default async function FormsSubmitPage(
|
||||
props: {
|
||||
params: Promise<{ id: string }>;
|
||||
searchParams: Promise<{ submission?: string | string[] }>;
|
||||
}
|
||||
) {
|
||||
const params = await props.params;
|
||||
const [params, query] = await Promise.all([props.params, props.searchParams]);
|
||||
const session = await getServerSession(authOptions);
|
||||
const discordId = getSessionDiscordId(session);
|
||||
|
||||
@@ -44,10 +45,11 @@ export default async function FormsSubmitPage(
|
||||
orderBy: (q, { asc }) => [asc(q.displayOrder)],
|
||||
});
|
||||
|
||||
const [existingSubmission, submissionStats] = await Promise.all([
|
||||
db.query.submissions.findFirst({
|
||||
const [ownSubmissions, submissionStats] = await Promise.all([
|
||||
db.query.submissions.findMany({
|
||||
where: (s, { eq, and }) =>
|
||||
and(eq(s.formId, form.id), eq(s.userDiscordId, discordId)),
|
||||
orderBy: (s, { desc }) => [desc(s.submittedAt)],
|
||||
}),
|
||||
getFormSubmissionStats([form.id], discordId),
|
||||
]);
|
||||
@@ -56,19 +58,36 @@ export default async function FormsSubmitPage(
|
||||
queueNumber: null,
|
||||
};
|
||||
|
||||
const initialAnswers: Record<string, FormAnswerValue> = {};
|
||||
if (existingSubmission) {
|
||||
const requestedSubmissionId = Array.isArray(query.submission)
|
||||
? query.submission[0]
|
||||
: query.submission;
|
||||
const existingSubmission = form.allowMultipleSubmissions
|
||||
? ownSubmissions.find((submission) => submission.id === requestedSubmissionId) ?? null
|
||||
: ownSubmissions[0] ?? null;
|
||||
|
||||
const answersBySubmissionId: Record<
|
||||
string,
|
||||
Record<string, { value: FormAnswerValue; imageCdnId: string | null }>
|
||||
> = {};
|
||||
if (ownSubmissions.length > 0) {
|
||||
const answersList = await db.query.answers.findMany({
|
||||
where: (a, { eq }) => eq(a.submissionId, existingSubmission.id),
|
||||
where: (a, { inArray }) => inArray(a.submissionId, ownSubmissions.map((submission) => submission.id)),
|
||||
});
|
||||
const questionTypes = new Map(questionsList.map((question) => [question.id, question.type]));
|
||||
for (const answer of answersList) {
|
||||
initialAnswers[answer.questionId] =
|
||||
answersBySubmissionId[answer.submissionId] ??= {};
|
||||
answersBySubmissionId[answer.submissionId][answer.questionId] = {
|
||||
value:
|
||||
questionTypes.get(answer.questionId) === "checkbox"
|
||||
? decodeCheckboxAnswer(answer.value)
|
||||
: answer.value;
|
||||
: answer.value,
|
||||
imageCdnId: answer.imageCdnId ?? null,
|
||||
};
|
||||
}
|
||||
}
|
||||
const initialAnswers = existingSubmission
|
||||
? answersBySubmissionId[existingSubmission.id] ?? {}
|
||||
: {};
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -79,6 +98,12 @@ export default async function FormsSubmitPage(
|
||||
questions={questionsList}
|
||||
initialAnswers={initialAnswers}
|
||||
hasSubmission={Boolean(existingSubmission)}
|
||||
selectedSubmissionId={existingSubmission?.id ?? null}
|
||||
ownSubmissions={ownSubmissions.map((submission) => ({
|
||||
id: submission.id,
|
||||
submittedAt: submission.submittedAt.toISOString(),
|
||||
answers: answersBySubmissionId[submission.id] ?? {},
|
||||
}))}
|
||||
totalAnswers={stats.totalAnswers}
|
||||
queueNumber={stats.queueNumber}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user