-
-
Notifications
You must be signed in to change notification settings - Fork 19
Add result monitoring for quiz sets #3010
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…eck if same quiz-set name, then auto increase
…thod to quiz-sets if generate quizzes by AI
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThis update introduces new English and Vietnamese localization strings for quiz set statistics and home page hero features. It adds a new statistics page for quiz sets, displaying detailed metrics and individual quiz performance. The quiz set details layout now includes a button linking to this statistics page. Most other changes are stylistic. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant QuizSetDetailsLayout
participant StatisticsPage
participant SupabaseDB
User->>QuizSetDetailsLayout: Views quiz set details
QuizSetDetailsLayout->>User: Shows "Statistics" button
User->>QuizSetDetailsLayout: Clicks "Statistics" button
QuizSetDetailsLayout->>StatisticsPage: Navigates to /statistics
StatisticsPage->>SupabaseDB: Fetch quiz and attempt statistics
SupabaseDB-->>StatisticsPage: Returns statistics data
StatisticsPage->>User: Renders summary cards and per-quiz stats
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 8
🧹 Nitpick comments (2)
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/layout.tsx (1)
72-79
: Improve route construction consistency.The action button implementation is well-structured, but the route construction could be more consistent with the existing pattern.
Consider using the existing
commonHref
variable for consistency:action={ <Button variant="outline" className="gap-2" asChild> - <Link href={`/${wsId}/quiz-sets/${setId}/statistics`}> + <Link href={`${commonHref}/statistics`}> <BarChart3 className="h-4 w-4" /> {t("common.statistics")} </Link> </Button> }This approach aligns with how other links are constructed in the component and improves maintainability.
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/statistics/page.tsx (1)
255-255
: Improve error handling specificity.Instead of catching and logging all errors generically, consider handling specific error cases and potentially re-throwing critical errors.
- console.error("Error fetching quiz statistics:", error) + console.error("Failed to fetch quiz statistics for set", setId, error) + // Consider re-throwing or handling specific error types
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
apps/upskii/messages/en.json
(2 hunks)apps/upskii/messages/vi.json
(2 hunks)apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/layout.tsx
(2 hunks)apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/page.tsx
(2 hunks)apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/statistics/page.tsx
(1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/page.tsx (3)
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/page.tsx (1)
WorkspaceQuizzesPage
(25-63)apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quizzes/page.tsx (1)
WorkspaceQuizzesPage
(25-59)packages/types/src/db.ts (1)
WorkspaceQuiz
(16-16)
🔇 Additional comments (7)
apps/upskii/messages/en.json (2)
21-44
: home-hero translations look solid
Localization keys and placeholders align with the new UI; placeholders ({username}
) follow the established pattern.
322-322
: Add "statistics" key under common
This key provides the label for the statistics button across the app. No conflicts with existing keys.apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/layout.tsx (2)
10-13
: LGTM! Clean import additions.The new imports are properly structured and follow the existing import patterns in the file. All imported components are utilized in the code.
76-76
:✅ Verification successful
Verify the localization key exists.
Please ensure that the
"common.statistics"
localization key is properly defined in the translation files.
🏁 Script executed:
#!/bin/bash # Description: Verify that the localization key "common.statistics" exists in translation files # Expected: Find the key in both English and Vietnamese translation files echo "Checking for 'statistics' key in common section of translation files..." fd -e json messages | xargs grep -l "statistics" | head -5 echo "" echo "Contents of translation files:" fd -e json messages | xargs cat | jq '.common.statistics // empty' 2>/dev/null || echo "Key not found or invalid JSON"Length of output: 368
🏁 Script executed:
#!/bin/bash # Locate translation directories echo "Looking for directories named 'locales', 'i18n', or 'messages'..." fd -t d -g 'locales' | sed 's/^/ locales dir: /' fd -t d -g 'i18n' | sed 's/^/ i18n dir: /' fd -t d -g 'messages'| sed 's/^/ messages dir:/' echo "" # Find all common.json files echo "Searching for 'common.json' translation files..." fd -t f -g 'common.json' | sed 's/^/ found: /' echo "" # Check for "statistics" key in each common.json for file in $(fd -t f -g 'common.json'); do echo "Checking $file:" jq '.statistics // "Key not found"' "$file" || echo " ✗ Could not parse $file" doneLength of output: 953
🏁 Script executed:
#!/bin/bash set -e echo "Listing all translation files in apps/upskii/messages:" fd -t f . apps/upskii/messages | sed 's/^/ /' echo "" echo "Searching for 'statistics' key in apps/upskii/messages:" rg -n '"statistics"' apps/upskii/messages || echo " → No 'statistics' key found in messages/" echo "" echo "Listing all translation files in apps/upskii/src/i18n:" fd -t f . apps/upskii/src/i18n | sed 's/^/ /' echo "" echo "Searching for 'statistics' key in apps/upskii/src/i18n:" rg -n '"statistics"' apps/upskii/src/i18n || echo " → No 'statistics' key found in src/i18n/"Length of output: 1190
🏁 Script executed:
#!/bin/bash set -e echo "Checking '.common.statistics' in apps/upskii/messages/en.json:" jq '.common.statistics // "Key not found"' apps/upskii/messages/en.json echo "" echo "Checking '.common.statistics' in apps/upskii/messages/vi.json:" jq '.common.statistics // "Key not found"' apps/upskii/messages/vi.jsonLength of output: 473
Localization key “common.statistics” verified
Thecommon.statistics
key exists in bothapps/upskii/messages/en.json
andapps/upskii/messages/vi.json
, so no further action is needed.apps/upskii/messages/vi.json (2)
21-44
: Add new "home-hero" localization block
The new "home-hero" section adds personalized welcome messages and feature card texts correctly.
322-322
: Add "statistics" to common localization
Thestatistics
key undercommon
is correctly added for use in quiz set layouts.apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/page.tsx (1)
1-95
: Stylistic improvements look good.The formatting changes improve consistency by standardizing quote usage and code style across the file.
"quiz-set-statistics": { | ||
"title": "Quiz Set Statistics", | ||
"description": "View detailed statistics for your quizzes, including average scores, completion rates, and more.", | ||
"average_pass_rate": "Average Pass Rate", | ||
"average_score": "Average Score", | ||
"total_participants": "Total Participants", | ||
"total_quizzes": "Total Quizzes", | ||
"active_quizzes": "Active quizzes in set", | ||
"total_attempts": "Total Attempts", | ||
"accross_all_quizzes": "Across all quizzes", | ||
"individual_quiz_performance": "Individual Quiz Performance", | ||
"back": "Back", | ||
"pass_rate": "Pass Rate", | ||
"active_students": "Active Students", | ||
"unique_participants": "Unique participants", | ||
"last_attempt": "Last Attempt", | ||
"no_quizzes": "No Quiz Data Available", | ||
"no_quizzes_description": "No quiz attempts found for this set. Students haven't started taking quizzes yet." | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo & Label Casing in "quiz-set-statistics"
- Rename
"accross_all_quizzes"
to"across_all_quizzes"
to correct spelling. - Consider capitalizing the value for
"active_quizzes"
to"Active Quizzes in Set"
for consistency with other labels.
🤖 Prompt for AI Agents
In apps/upskii/messages/en.json between lines 2 and 20, correct the typo in the
key "accross_all_quizzes" by renaming it to "across_all_quizzes". Also, update
the value of "active_quizzes" to "Active Quizzes in Set" to maintain consistent
capitalization with other labels in the "quiz-set-statistics" section.
"quiz-set-statistics": { | ||
"title": "Thống Kê", | ||
"description": "Xem thống kê chi tiết về các bài kiểm tra của bạn, bao gồm điểm trung bình, tỷ lệ hoàn thành và nhiều thông tin khác.", | ||
"average_pass_rate": "Tỷ Lệ Đạt Trung Bình", | ||
"average_score": "Điểm Trung Bình", | ||
"total_participants": "Tổng Số Người Tham Gia", | ||
"total_quizzes": "Tổng Số Bài Kiểm Tra", | ||
"active_quizzes": "Bài kiểm tra hiện có", | ||
"total_attempts": "Tổng Số Lượt Làm Bài", | ||
"accross_all_quizzes": "Trên tất cả bài kiểm tra", | ||
"individual_quiz_performance": "Số Liệu Từng Bài Kiểm Tra", | ||
"back": "Quay Lại", | ||
"pass_rate": "Tỷ Lệ Đạt", | ||
"active_students": "Học Viên Đang Hoạt Động", | ||
"unique_participants": "Người tham gia khác nhau", | ||
"last_attempt": "Lần Làm Bài Gần Nhất", | ||
"no_quizzes": "Không Có Dữ Liệu Bài Kiểm Tra", | ||
"no_quizzes_description": "Không tìm thấy lượt làm bài nào cho bộ câu hỏi này. Học viên chưa bắt đầu làm bài kiểm tra." | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in key "accross_all_quizzes"
The key "accross_all_quizzes" is misspelled and should be "across_all_quizzes" to align with proper spelling and the English file.
Apply this diff:
- "accross_all_quizzes": "Trên tất cả bài kiểm tra",
+ "across_all_quizzes": "Trên tất cả bài kiểm tra",
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
"quiz-set-statistics": { | |
"title": "Thống Kê", | |
"description": "Xem thống kê chi tiết về các bài kiểm tra của bạn, bao gồm điểm trung bình, tỷ lệ hoàn thành và nhiều thông tin khác.", | |
"average_pass_rate": "Tỷ Lệ Đạt Trung Bình", | |
"average_score": "Điểm Trung Bình", | |
"total_participants": "Tổng Số Người Tham Gia", | |
"total_quizzes": "Tổng Số Bài Kiểm Tra", | |
"active_quizzes": "Bài kiểm tra hiện có", | |
"total_attempts": "Tổng Số Lượt Làm Bài", | |
"accross_all_quizzes": "Trên tất cả bài kiểm tra", | |
"individual_quiz_performance": "Số Liệu Từng Bài Kiểm Tra", | |
"back": "Quay Lại", | |
"pass_rate": "Tỷ Lệ Đạt", | |
"active_students": "Học Viên Đang Hoạt Động", | |
"unique_participants": "Người tham gia khác nhau", | |
"last_attempt": "Lần Làm Bài Gần Nhất", | |
"no_quizzes": "Không Có Dữ Liệu Bài Kiểm Tra", | |
"no_quizzes_description": "Không tìm thấy lượt làm bài nào cho bộ câu hỏi này. Học viên chưa bắt đầu làm bài kiểm tra." | |
}, | |
"quiz-set-statistics": { | |
"title": "Thống Kê", | |
"description": "Xem thống kê chi tiết về các bài kiểm tra của bạn, bao gồm điểm trung bình, tỷ lệ hoàn thành và nhiều thông tin khác.", | |
"average_pass_rate": "Tỷ Lệ Đạt Trung Bình", | |
"average_score": "Điểm Trung Bình", | |
"total_participants": "Tổng Số Người Tham Gia", | |
"total_quizzes": "Tổng Số Bài Kiểm Tra", | |
"active_quizzes": "Bài kiểm tra hiện có", | |
"total_attempts": "Tổng Số Lượt Làm Bài", | |
"across_all_quizzes": "Trên tất cả bài kiểm tra", | |
"individual_quiz_performance": "Số Liệu Từng Bài Kiểm Tra", | |
"back": "Quay Lại", | |
"pass_rate": "Tỷ Lệ Đạt", | |
"active_students": "Học Viên Đang Hoạt Động", | |
"unique_participants": "Người tham gia khác nhau", | |
"last_attempt": "Lần Làm Bài Gần Nhất", | |
"no_quizzes": "Không Có Dữ Liệu Bài Kiểm Tra", | |
"no_quizzes_description": "Không tìm thấy lượt làm bài nào cho bộ câu hỏi này. Học viên chưa bắt đầu làm bài kiểm tra." | |
}, |
🤖 Prompt for AI Agents
In apps/upskii/messages/vi.json around lines 2 to 20, the key
"accross_all_quizzes" is misspelled. Rename the key to "across_all_quizzes" to
correct the spelling and maintain consistency with the English version.
async function getQuizSetStatistics(setId: string): Promise<QuizStats[]> { | ||
const supabase = await createClient() | ||
|
||
try { | ||
// Get all quizzes in this set | ||
const { data: quizzes } = await supabase | ||
.from("quiz_set_quizzes") | ||
.select("...workspace_quizzes(id, question)") | ||
.eq("set_id", setId) | ||
|
||
if (!quizzes) return [] | ||
|
||
const quizStats: QuizStats[] = [] | ||
|
||
for (const quiz of quizzes) { | ||
if (!quiz.id) continue | ||
|
||
// Get quiz attempts and scores | ||
const { data: attempts } = await supabase | ||
.from("workspace_quiz_attempts") | ||
.select("user_id, score, created_at") | ||
.eq("quiz_id", quiz.id) | ||
|
||
if (!attempts) continue | ||
|
||
const totalAttempts = attempts.length | ||
const uniqueStudents = new Set(attempts.map((a) => a.user_id)).size | ||
const averageScore = | ||
attempts.length > 0 ? attempts.reduce((sum, a) => sum + (a.score || 0), 0) / attempts.length : 0 | ||
const passRate = | ||
attempts.length > 0 ? (attempts.filter((a) => (a.score || 0) >= 70).length / attempts.length) * 100 : 0 | ||
const lastAttempt = | ||
attempts.length > 0 | ||
? attempts.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())[0].created_at | ||
: null | ||
|
||
quizStats.push({ | ||
id: quiz.id, | ||
question: quiz.question || "Untitled Quiz", | ||
totalAttempts, | ||
uniqueStudents, | ||
averageScore: Math.round(averageScore * 100) / 100, | ||
passRate: Math.round(passRate * 100) / 100, | ||
lastAttempt, | ||
}) | ||
} | ||
|
||
return quizStats | ||
} catch (error) { | ||
console.error("Error fetching quiz statistics:", error) | ||
return [] | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Optimize database queries to avoid N+1 problem.
The current implementation makes one query per quiz to fetch attempts, which will cause performance issues as the number of quizzes grows. Consider fetching all attempts for all quizzes in the set with a single query.
Additionally:
- The hardcoded pass threshold (70) should be configurable
- The error handling should be more specific rather than catching all errors
- "Untitled Quiz" should be localized
Example optimization approach:
// Fetch all attempts for all quizzes in one query
const { data: attempts } = await supabase
.from("workspace_quiz_attempts")
.select("quiz_id, user_id, score, created_at")
.in("quiz_id", quizzes.map(q => q.id).filter(Boolean))
// Group attempts by quiz_id for processing
const attemptsByQuiz = attempts?.reduce((acc, attempt) => {
if (!acc[attempt.quiz_id]) acc[attempt.quiz_id] = []
acc[attempt.quiz_id].push(attempt)
return acc
}, {} as Record<string, typeof attempts>) ?? {}
🤖 Prompt for AI Agents
In
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/statistics/page.tsx
between lines 206 and 258, the current code queries quiz attempts inside a loop
causing an N+1 query problem. Refactor to first fetch all quiz attempts for all
quizzes in a single query using the quiz IDs, then group attempts by quiz_id for
processing. Replace the hardcoded pass threshold (70) with a configurable
parameter. Improve error handling by catching specific errors instead of a
generic catch-all. Also, replace the hardcoded "Untitled Quiz" string with a
localized version using the app's i18n or localization system.
totalQuizzes: stats.length, | ||
totalAttempts: stats.reduce((sum, s) => sum + s.totalAttempts, 0), | ||
totalStudents: new Set(stats.flatMap((s) => Array(s.uniqueStudents).fill(0))).size, | ||
averagePassRate: stats.length > 0 ? stats.reduce((sum, s) => sum + s.passRate, 0) / stats.length : 0, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix incorrect unique students calculation.
The current logic for calculating total unique students is flawed. Creating arrays filled with zeros and using a Set will always result in a size of 1 (containing only the value 0), regardless of the actual number of unique students.
To properly calculate unique students across all quizzes, you need to aggregate the actual user IDs from the database rather than using the count values.
🤖 Prompt for AI Agents
In
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/statistics/page.tsx
around lines 33 to 37, the calculation of totalStudents is incorrect because it
uses counts to create arrays of zeros and then a Set, which always results in 1.
To fix this, replace this logic by aggregating the actual unique student user
IDs from the stats data or database, then count the distinct user IDs to get the
correct total unique students value.
<div className="space-y-4"> | ||
<div className="flex items-center justify-between"> | ||
<h2 className="text-2xl font-semibold">{t("individual_quiz_performance")}</h2> | ||
<p className="text-sm text-muted-foreground">{stats.length} quizzes analyzed</p> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Localize remaining hardcoded strings.
Several UI strings need to be moved to localization files:
- Line 121: "quizzes analyzed"
- Line 142: "Quiz #"
- Line 144: "Quiz ID:"
- Line 156: Status labels ("Excellent", "Good", "Needs Attention")
- Line 191: "Never"
Also applies to: 142-144, 156-156, 191-191
🤖 Prompt for AI Agents
In
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/statistics/page.tsx
at lines 121, 142-144, 156, and 191, the UI strings such as "quizzes analyzed",
"Quiz #", "Quiz ID:", status labels ("Excellent", "Good", "Needs Attention"),
and "Never" are hardcoded. Replace these hardcoded strings with calls to the
localization function or use localized string variables from your i18n setup to
ensure all user-facing text is properly localized.
</CardHeader> | ||
<CardContent> | ||
<div className="text-3xl font-bold">{overallStats.totalAttempts}</div> | ||
<p className="text-xs text-muted-foreground">{t("accross_all_quizzes")}</p> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix typo in localization key.
There's a typo in the translation key.
- <p className="text-xs text-muted-foreground">{t("accross_all_quizzes")}</p>
+ <p className="text-xs text-muted-foreground">{t("across_all_quizzes")}</p>
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
<p className="text-xs text-muted-foreground">{t("accross_all_quizzes")}</p> | |
<p className="text-xs text-muted-foreground">{t("across_all_quizzes")}</p> |
🤖 Prompt for AI Agents
In
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/statistics/page.tsx
at line 84, the localization key "accross_all_quizzes" contains a typo. Correct
the key to "across_all_quizzes" to fix the spelling error in the translation
reference.
</CardHeader> | ||
<CardContent> | ||
<div className="text-3xl font-bold">{overallStats.averagePassRate.toFixed(1)}%</div> | ||
<p className="text-xs text-muted-foreground">70% passing threshold</p> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Localize hardcoded threshold text.
The passing threshold text should be localized.
- <p className="text-xs text-muted-foreground">70% passing threshold</p>
+ <p className="text-xs text-muted-foreground">{t("passing_threshold", { threshold: 70 })}</p>
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
<p className="text-xs text-muted-foreground">70% passing threshold</p> | |
<p className="text-xs text-muted-foreground"> | |
{t("passing_threshold", { threshold: 70 })} | |
</p> |
🤖 Prompt for AI Agents
In
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/statistics/page.tsx
at line 110, the text "70% passing threshold" is hardcoded and needs to be
localized. Replace the hardcoded string with a call to the localization function
or component used in the project, passing the appropriate key or message ID for
this text so it can be translated based on the user's locale.
<BarChart3 className="h-8 w-8" /> | ||
{t("title")} | ||
</h1> | ||
<p className="text-muted-foreground">Comprehensive analytics for all quizzes in this set</p> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Localize hardcoded description text.
The hardcoded string should be moved to the localization files for consistency.
- <p className="text-muted-foreground">Comprehensive analytics for all quizzes in this set</p>
+ <p className="text-muted-foreground">{t("description")}</p>
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
<p className="text-muted-foreground">Comprehensive analytics for all quizzes in this set</p> | |
<p className="text-muted-foreground">{t("description")}</p> |
🤖 Prompt for AI Agents
In
apps/upskii/src/app/[locale]/(dashboard)/[wsId]/quiz-sets/[setId]/statistics/page.tsx
at line 54, the description text is hardcoded. To fix this, move the string
"Comprehensive analytics for all quizzes in this set" to the appropriate
localization file and replace the hardcoded text with a localized string
reference using the localization function or hook used in the project.
… to any Supabase type definitions didn't include the workspace_quiz_attempts table, so used 'as any' to unblock the build. Needs proper type update later.
…at/upskii/taking-quiz
This PR includes:
Summary by CodeRabbit
New Features
Style