import type { JSX } from "react" import { Suspense } from "react" import { ClipboardList } from "lucide-react" import { getTranslations } from "next-intl/server" import { QuestionFilters } from "@/modules/questions/components/question-filters" import { CreateQuestionButton } from "@/modules/questions/components/create-question-button" import { QuestionBankResultsClient } from "@/modules/questions/components/question-bank-results-client" import { ImportExportButtons } from "@/modules/questions/components/import-export-buttons" import { EmptyState } from "@/shared/components/ui/empty-state" import { Skeleton } from "@/shared/components/ui/skeleton" import { getQuestions } from "@/modules/questions/data-access" import { getParam, type SearchParams } from "@/shared/lib/search-params" import { requirePermission } from "@/shared/lib/auth-guard" import { Permissions } from "@/shared/types/permissions" import type { QuestionType } from "@/modules/questions/types" export const dynamic = "force-dynamic" const VALID_QUESTION_TYPES: ReadonlySet = new Set([ "single_choice", "multiple_choice", "text", "judgment", "composite", ]) function parseQuestionType(v?: string): QuestionType | undefined { return v && VALID_QUESTION_TYPES.has(v) ? (v as QuestionType) : undefined } async function QuestionBankResults({ searchParams }: { searchParams: Promise }): Promise { await requirePermission(Permissions.QUESTION_READ) const params = await searchParams const q = getParam(params, "q") const type = getParam(params, "type") const difficulty = getParam(params, "difficulty") const knowledgePointId = getParam(params, "kp") const textbookId = getParam(params, "tb") const chapterId = getParam(params, "ch") const questionType = parseQuestionType(type) const difficultyNum = difficulty && difficulty !== "all" ? Number(difficulty) : undefined const safeDifficulty = difficultyNum !== undefined && Number.isFinite(difficultyNum) ? difficultyNum : undefined const { data: questions } = await getQuestions({ q: q || undefined, type: questionType, difficulty: safeDifficulty, knowledgePointId: knowledgePointId && knowledgePointId !== "all" ? knowledgePointId : undefined, textbookId: textbookId && textbookId !== "all" ? textbookId : undefined, chapterId: chapterId && chapterId !== "all" ? chapterId : undefined, pageSize: 200, }) const hasFilters = Boolean( q || (type && type !== "all") || (difficulty && difficulty !== "all") || (knowledgePointId && knowledgePointId !== "all") || (textbookId && textbookId !== "all") || (chapterId && chapterId !== "all") ) if (questions.length === 0) { const t = await getTranslations("questions") return ( ) } return (
) } export default async function QuestionBankPage({ searchParams, }: { searchParams: Promise }): Promise { const t = await getTranslations("questions") return (

{t("title")}

{t("subtitle")}

}> }>
) } function QuestionBankResultsFallback() { return (
{Array.from({ length: 6 }).map((_, idx) => ( ))}
) }