feat:update form

This commit is contained in:
2026-07-28 00:02:34 +07:00 Unverified
parent 0e8c816276
commit fa35f00f38
25 changed files with 919 additions and 149 deletions
+33 -8
View File
@@ -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}
/>