Skip to content

錯題重練+每日 streak - #3

Merged
Retsomm merged 2 commits into
mainfrom
dev
Jul 10, 2026
Merged

錯題重練+每日 streak#3
Retsomm merged 2 commits into
mainfrom
dev

Conversation

@Retsomm

@RetsommRetsomm commented Jul 10, 2026

Copy link
Copy Markdown
Owner
  • 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除; 首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題, 重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
  • streak:完成關卡或重練時更新連續學習天數(本地時區日界), 首頁以火焰徽章顯示;中斷一天即重算
  • 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式

Summary by CodeRabbit

  • New Features

    • Added a “Review Wrong Questions” mode for retrying missed questions.
    • Incorrect answers are tracked and removed after being answered correctly.
    • Added learning streak tracking and a streak badge on the home screen.
    • Review results now show cleared questions and earned XP.
  • UI Improvements

    • Added review banners, secondary actions, and supporting icons.
    • The review option appears only when missed questions are available.

- 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除;
首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題,
重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
- streak:完成關卡或重練時更新連續學習天數(本地時區日界),
首頁以火焰徽章顯示;中斷一天即重算
- 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
easy-learnReadyReadyPreview, CommentJul 10, 2026 11:02am

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Retsomm, you've reached your PR review limit, so we couldn't start this review.

Next review available in:50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd10f9ea-6ed4-4b1e-9e57-dbc12068e7fa

📥 Commits

Reviewing files that changed from the base of the PR and between b09d0f6 and 189530e.

📒 Files selected for processing (2)
  • src/App.jsx
  • src/screens/Quiz.jsx
📝 Walkthrough

Walkthrough

Adds wrong-answer and streak persistence, a review flow for up to six wrong questions, review-specific quiz completion behavior, and home-screen controls and styling for streaks and review sessions.

Changes

Wrong Question Review

Layer / File(s)Summary
Progress tracking and review completion
src/hooks/useProgress.js
Progress now stores wrong question IDs and streak data, updates them when answers and levels are completed, and exposes answerQuestion and finishReview.
Review question selection and app wiring
src/data/chapters.js, src/App.jsx
Wrong questions are collected in chapter order, shuffled and limited to six, then supplied to a review-mode Quiz instance.
Review quiz behavior and results
src/screens/Quiz.jsx
Review mode records answers, finishes through finishReview, and renders review-specific banners, results, statistics, hints, and navigation.
Home review controls and visual assets
src/screens/Home.jsx, src/components/Icons.jsx, src/index.css
The home screen conditionally shows streak and wrong-question review controls, with new icons and styles for review UI elements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Home
participant App
participant QuestionData
participant Quiz
participant Progress
Home->>App: Start wrong-question review
App->>QuestionData: getWrongQuestions(wrongIds)
QuestionData-->>App: Return ordered wrong questions
App->>Quiz: Render review quiz with up to six questions
Quiz->>Progress: answerQuestion(questionId, correct)
Quiz->>Progress: finishReview(xpEarned)
Progress-->>Quiz: Updated progress and streak
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ Passed標題準確概括了這次的主要變更:錯題重練與每日 streak。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/App.jsx (1)

15-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Prefer Fisher-Yates over sort(() => Math.random() - 0.5).

Array.sort with a random comparator produces a biased distribution — not all permutations are equally likely. For selecting a review subset this is low-impact, but Fisher-Yates is equally simple and correct.

♻️ Proposed Fisher-Yates shuffle
 function startReview() {
// 抽最多 6 題錯題組成一輪重練(洗牌避免每次順序相同)
const pool = getWrongQuestions(progress.wrongIds)
- const shuffled = [...pool].sort(() => Math.random() - 0.5).slice(0, REVIEW_SIZE)+ const shuffled = [...pool]+ for (let i = shuffled.length - 1; i > 0; i--) {+ const j = Math.floor(Math.random() * (i + 1))+ ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]+ }+ shuffled.splice(REVIEW_SIZE)
if (shuffled.length === 0) return
setView({ name: 'review', questions: shuffled })
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/App.jsx` around lines 15 - 21, Replace the biased random comparator in
startReview with a Fisher-Yates shuffle, using a copied pool so the original
question order is not mutated, then select the first REVIEW_SIZE questions and
preserve the existing empty-result guard and review view update.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/screens/Quiz.jsx`:
- Around line 46-50: Prevent XP from being double-counted on the result screen
by updating the result XP display logic in the component’s completion/render
path: after finishReview or finishLevel updates progress.xp, display progress.xp
directly instead of adding finalXp. Apply this consistently to both review and
normal quiz flows.
---
Nitpick comments:
In `@src/App.jsx`:
- Around line 15-21: Replace the biased random comparator in startReview with a
Fisher-Yates shuffle, using a copied pool so the original question order is not
mutated, then select the first REVIEW_SIZE questions and preserve the existing
empty-result guard and review view update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28b71e97-f709-4a4d-8125-1879436e6b78

📥 Commits

Reviewing files that changed from the base of the PR and between 127f42a and b09d0f6.

📒 Files selected for processing (7)
  • src/App.jsx
  • src/components/Icons.jsx
  • src/data/chapters.js
  • src/hooks/useProgress.js
  • src/index.css
  • src/screens/Home.jsx
  • src/screens/Quiz.jsx

Comment threadsrc/screens/Quiz.jsx
- 結算時 progress.xp 已含本輪 XP,Mascot 改直接吃 progress.xp,
避免等級條/進化階段多算一次
- 錯題抽題改 Fisher-Yates,修掉 sort(random) 的偏差
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Retsomm
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
錯題重練+每日 streak by Retsomm · Pull Request #3 · Retsomm/EasyLearn · GitHub
Skip to content

錯題重練+每日 streak - #3

Merged
Retsomm merged 2 commits into
mainfrom
dev
Jul 10, 2026
Merged

錯題重練+每日 streak#3
Retsomm merged 2 commits into
mainfrom
dev

Conversation

@Retsomm

@RetsommRetsomm commented Jul 10, 2026

Copy link
Copy Markdown
Owner
  • 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除; 首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題, 重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
  • streak:完成關卡或重練時更新連續學習天數(本地時區日界), 首頁以火焰徽章顯示;中斷一天即重算
  • 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式

Summary by CodeRabbit

  • New Features

    • Added a “Review Wrong Questions” mode for retrying missed questions.
    • Incorrect answers are tracked and removed after being answered correctly.
    • Added learning streak tracking and a streak badge on the home screen.
    • Review results now show cleared questions and earned XP.
  • UI Improvements

    • Added review banners, secondary actions, and supporting icons.
    • The review option appears only when missed questions are available.

- 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除;
首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題,
重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
- streak:完成關卡或重練時更新連續學習天數(本地時區日界),
首頁以火焰徽章顯示;中斷一天即重算
- 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
easy-learnReadyReadyPreview, CommentJul 10, 2026 11:02am

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Retsomm, you've reached your PR review limit, so we couldn't start this review.

Next review available in:50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd10f9ea-6ed4-4b1e-9e57-dbc12068e7fa

📥 Commits

Reviewing files that changed from the base of the PR and between b09d0f6 and 189530e.

📒 Files selected for processing (2)
  • src/App.jsx
  • src/screens/Quiz.jsx
📝 Walkthrough

Walkthrough

Adds wrong-answer and streak persistence, a review flow for up to six wrong questions, review-specific quiz completion behavior, and home-screen controls and styling for streaks and review sessions.

Changes

Wrong Question Review

Layer / File(s)Summary
Progress tracking and review completion
src/hooks/useProgress.js
Progress now stores wrong question IDs and streak data, updates them when answers and levels are completed, and exposes answerQuestion and finishReview.
Review question selection and app wiring
src/data/chapters.js, src/App.jsx
Wrong questions are collected in chapter order, shuffled and limited to six, then supplied to a review-mode Quiz instance.
Review quiz behavior and results
src/screens/Quiz.jsx
Review mode records answers, finishes through finishReview, and renders review-specific banners, results, statistics, hints, and navigation.
Home review controls and visual assets
src/screens/Home.jsx, src/components/Icons.jsx, src/index.css
The home screen conditionally shows streak and wrong-question review controls, with new icons and styles for review UI elements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Home
participant App
participant QuestionData
participant Quiz
participant Progress
Home->>App: Start wrong-question review
App->>QuestionData: getWrongQuestions(wrongIds)
QuestionData-->>App: Return ordered wrong questions
App->>Quiz: Render review quiz with up to six questions
Quiz->>Progress: answerQuestion(questionId, correct)
Quiz->>Progress: finishReview(xpEarned)
Progress-->>Quiz: Updated progress and streak
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ Passed標題準確概括了這次的主要變更:錯題重練與每日 streak。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/App.jsx (1)

15-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Prefer Fisher-Yates over sort(() => Math.random() - 0.5).

Array.sort with a random comparator produces a biased distribution — not all permutations are equally likely. For selecting a review subset this is low-impact, but Fisher-Yates is equally simple and correct.

♻️ Proposed Fisher-Yates shuffle
 function startReview() {
// 抽最多 6 題錯題組成一輪重練(洗牌避免每次順序相同)
const pool = getWrongQuestions(progress.wrongIds)
- const shuffled = [...pool].sort(() => Math.random() - 0.5).slice(0, REVIEW_SIZE)+ const shuffled = [...pool]+ for (let i = shuffled.length - 1; i > 0; i--) {+ const j = Math.floor(Math.random() * (i + 1))+ ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]+ }+ shuffled.splice(REVIEW_SIZE)
if (shuffled.length === 0) return
setView({ name: 'review', questions: shuffled })
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/App.jsx` around lines 15 - 21, Replace the biased random comparator in
startReview with a Fisher-Yates shuffle, using a copied pool so the original
question order is not mutated, then select the first REVIEW_SIZE questions and
preserve the existing empty-result guard and review view update.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/screens/Quiz.jsx`:
- Around line 46-50: Prevent XP from being double-counted on the result screen
by updating the result XP display logic in the component’s completion/render
path: after finishReview or finishLevel updates progress.xp, display progress.xp
directly instead of adding finalXp. Apply this consistently to both review and
normal quiz flows.
---
Nitpick comments:
In `@src/App.jsx`:
- Around line 15-21: Replace the biased random comparator in startReview with a
Fisher-Yates shuffle, using a copied pool so the original question order is not
mutated, then select the first REVIEW_SIZE questions and preserve the existing
empty-result guard and review view update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28b71e97-f709-4a4d-8125-1879436e6b78

📥 Commits

Reviewing files that changed from the base of the PR and between 127f42a and b09d0f6.

📒 Files selected for processing (7)
  • src/App.jsx
  • src/components/Icons.jsx
  • src/data/chapters.js
  • src/hooks/useProgress.js
  • src/index.css
  • src/screens/Home.jsx
  • src/screens/Quiz.jsx

Comment threadsrc/screens/Quiz.jsx
- 結算時 progress.xp 已含本輪 XP,Mascot 改直接吃 progress.xp,
避免等級條/進化階段多算一次
- 錯題抽題改 Fisher-Yates,修掉 sort(random) 的偏差
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Retsomm
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 錯題重練+每日 streak by Retsomm · Pull Request #3 · Retsomm/EasyLearn · GitHub
Skip to content

錯題重練+每日 streak - #3

Merged
Retsomm merged 2 commits into
mainfrom
dev
Jul 10, 2026
Merged

錯題重練+每日 streak#3
Retsomm merged 2 commits into
mainfrom
dev

Conversation

@Retsomm

@RetsommRetsomm commented Jul 10, 2026

Copy link
Copy Markdown
Owner
  • 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除; 首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題, 重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
  • streak:完成關卡或重練時更新連續學習天數(本地時區日界), 首頁以火焰徽章顯示;中斷一天即重算
  • 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式

Summary by CodeRabbit

  • New Features

    • Added a “Review Wrong Questions” mode for retrying missed questions.
    • Incorrect answers are tracked and removed after being answered correctly.
    • Added learning streak tracking and a streak badge on the home screen.
    • Review results now show cleared questions and earned XP.
  • UI Improvements

    • Added review banners, secondary actions, and supporting icons.
    • The review option appears only when missed questions are available.

- 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除;
首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題,
重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
- streak:完成關卡或重練時更新連續學習天數(本地時區日界),
首頁以火焰徽章顯示;中斷一天即重算
- 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
easy-learnReadyReadyPreview, CommentJul 10, 2026 11:02am

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Retsomm, you've reached your PR review limit, so we couldn't start this review.

Next review available in:50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd10f9ea-6ed4-4b1e-9e57-dbc12068e7fa

📥 Commits

Reviewing files that changed from the base of the PR and between b09d0f6 and 189530e.

📒 Files selected for processing (2)
  • src/App.jsx
  • src/screens/Quiz.jsx
📝 Walkthrough

Walkthrough

Adds wrong-answer and streak persistence, a review flow for up to six wrong questions, review-specific quiz completion behavior, and home-screen controls and styling for streaks and review sessions.

Changes

Wrong Question Review

Layer / File(s)Summary
Progress tracking and review completion
src/hooks/useProgress.js
Progress now stores wrong question IDs and streak data, updates them when answers and levels are completed, and exposes answerQuestion and finishReview.
Review question selection and app wiring
src/data/chapters.js, src/App.jsx
Wrong questions are collected in chapter order, shuffled and limited to six, then supplied to a review-mode Quiz instance.
Review quiz behavior and results
src/screens/Quiz.jsx
Review mode records answers, finishes through finishReview, and renders review-specific banners, results, statistics, hints, and navigation.
Home review controls and visual assets
src/screens/Home.jsx, src/components/Icons.jsx, src/index.css
The home screen conditionally shows streak and wrong-question review controls, with new icons and styles for review UI elements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Home
participant App
participant QuestionData
participant Quiz
participant Progress
Home->>App: Start wrong-question review
App->>QuestionData: getWrongQuestions(wrongIds)
QuestionData-->>App: Return ordered wrong questions
App->>Quiz: Render review quiz with up to six questions
Quiz->>Progress: answerQuestion(questionId, correct)
Quiz->>Progress: finishReview(xpEarned)
Progress-->>Quiz: Updated progress and streak
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ Passed標題準確概括了這次的主要變更:錯題重練與每日 streak。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/App.jsx (1)

15-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Prefer Fisher-Yates over sort(() => Math.random() - 0.5).

Array.sort with a random comparator produces a biased distribution — not all permutations are equally likely. For selecting a review subset this is low-impact, but Fisher-Yates is equally simple and correct.

♻️ Proposed Fisher-Yates shuffle
 function startReview() {
// 抽最多 6 題錯題組成一輪重練(洗牌避免每次順序相同)
const pool = getWrongQuestions(progress.wrongIds)
- const shuffled = [...pool].sort(() => Math.random() - 0.5).slice(0, REVIEW_SIZE)+ const shuffled = [...pool]+ for (let i = shuffled.length - 1; i > 0; i--) {+ const j = Math.floor(Math.random() * (i + 1))+ ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]+ }+ shuffled.splice(REVIEW_SIZE)
if (shuffled.length === 0) return
setView({ name: 'review', questions: shuffled })
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/App.jsx` around lines 15 - 21, Replace the biased random comparator in
startReview with a Fisher-Yates shuffle, using a copied pool so the original
question order is not mutated, then select the first REVIEW_SIZE questions and
preserve the existing empty-result guard and review view update.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/screens/Quiz.jsx`:
- Around line 46-50: Prevent XP from being double-counted on the result screen
by updating the result XP display logic in the component’s completion/render
path: after finishReview or finishLevel updates progress.xp, display progress.xp
directly instead of adding finalXp. Apply this consistently to both review and
normal quiz flows.
---
Nitpick comments:
In `@src/App.jsx`:
- Around line 15-21: Replace the biased random comparator in startReview with a
Fisher-Yates shuffle, using a copied pool so the original question order is not
mutated, then select the first REVIEW_SIZE questions and preserve the existing
empty-result guard and review view update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28b71e97-f709-4a4d-8125-1879436e6b78

📥 Commits

Reviewing files that changed from the base of the PR and between 127f42a and b09d0f6.

📒 Files selected for processing (7)
  • src/App.jsx
  • src/components/Icons.jsx
  • src/data/chapters.js
  • src/hooks/useProgress.js
  • src/index.css
  • src/screens/Home.jsx
  • src/screens/Quiz.jsx

Comment threadsrc/screens/Quiz.jsx
- 結算時 progress.xp 已含本輪 XP,Mascot 改直接吃 progress.xp,
避免等級條/進化階段多算一次
- 錯題抽題改 Fisher-Yates,修掉 sort(random) 的偏差
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Retsomm
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 錯題重練+每日 streak by Retsomm · Pull Request #3 · Retsomm/EasyLearn · GitHub
Skip to content

錯題重練+每日 streak - #3

Merged
Retsomm merged 2 commits into
mainfrom
dev
Jul 10, 2026
Merged

錯題重練+每日 streak#3
Retsomm merged 2 commits into
mainfrom
dev

Conversation

@Retsomm

@RetsommRetsomm commented Jul 10, 2026

Copy link
Copy Markdown
Owner
  • 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除; 首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題, 重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
  • streak:完成關卡或重練時更新連續學習天數(本地時區日界), 首頁以火焰徽章顯示;中斷一天即重算
  • 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式

Summary by CodeRabbit

  • New Features

    • Added a “Review Wrong Questions” mode for retrying missed questions.
    • Incorrect answers are tracked and removed after being answered correctly.
    • Added learning streak tracking and a streak badge on the home screen.
    • Review results now show cleared questions and earned XP.
  • UI Improvements

    • Added review banners, secondary actions, and supporting icons.
    • The review option appears only when missed questions are available.

- 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除;
首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題,
重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
- streak:完成關卡或重練時更新連續學習天數(本地時區日界),
首頁以火焰徽章顯示;中斷一天即重算
- 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
easy-learnReadyReadyPreview, CommentJul 10, 2026 11:02am

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Retsomm, you've reached your PR review limit, so we couldn't start this review.

Next review available in:50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd10f9ea-6ed4-4b1e-9e57-dbc12068e7fa

📥 Commits

Reviewing files that changed from the base of the PR and between b09d0f6 and 189530e.

📒 Files selected for processing (2)
  • src/App.jsx
  • src/screens/Quiz.jsx
📝 Walkthrough

Walkthrough

Adds wrong-answer and streak persistence, a review flow for up to six wrong questions, review-specific quiz completion behavior, and home-screen controls and styling for streaks and review sessions.

Changes

Wrong Question Review

Layer / File(s)Summary
Progress tracking and review completion
src/hooks/useProgress.js
Progress now stores wrong question IDs and streak data, updates them when answers and levels are completed, and exposes answerQuestion and finishReview.
Review question selection and app wiring
src/data/chapters.js, src/App.jsx
Wrong questions are collected in chapter order, shuffled and limited to six, then supplied to a review-mode Quiz instance.
Review quiz behavior and results
src/screens/Quiz.jsx
Review mode records answers, finishes through finishReview, and renders review-specific banners, results, statistics, hints, and navigation.
Home review controls and visual assets
src/screens/Home.jsx, src/components/Icons.jsx, src/index.css
The home screen conditionally shows streak and wrong-question review controls, with new icons and styles for review UI elements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Home
participant App
participant QuestionData
participant Quiz
participant Progress
Home->>App: Start wrong-question review
App->>QuestionData: getWrongQuestions(wrongIds)
QuestionData-->>App: Return ordered wrong questions
App->>Quiz: Render review quiz with up to six questions
Quiz->>Progress: answerQuestion(questionId, correct)
Quiz->>Progress: finishReview(xpEarned)
Progress-->>Quiz: Updated progress and streak
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ Passed標題準確概括了這次的主要變更:錯題重練與每日 streak。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/App.jsx (1)

15-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Prefer Fisher-Yates over sort(() => Math.random() - 0.5).

Array.sort with a random comparator produces a biased distribution — not all permutations are equally likely. For selecting a review subset this is low-impact, but Fisher-Yates is equally simple and correct.

♻️ Proposed Fisher-Yates shuffle
 function startReview() {
// 抽最多 6 題錯題組成一輪重練(洗牌避免每次順序相同)
const pool = getWrongQuestions(progress.wrongIds)
- const shuffled = [...pool].sort(() => Math.random() - 0.5).slice(0, REVIEW_SIZE)+ const shuffled = [...pool]+ for (let i = shuffled.length - 1; i > 0; i--) {+ const j = Math.floor(Math.random() * (i + 1))+ ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]+ }+ shuffled.splice(REVIEW_SIZE)
if (shuffled.length === 0) return
setView({ name: 'review', questions: shuffled })
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/App.jsx` around lines 15 - 21, Replace the biased random comparator in
startReview with a Fisher-Yates shuffle, using a copied pool so the original
question order is not mutated, then select the first REVIEW_SIZE questions and
preserve the existing empty-result guard and review view update.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/screens/Quiz.jsx`:
- Around line 46-50: Prevent XP from being double-counted on the result screen
by updating the result XP display logic in the component’s completion/render
path: after finishReview or finishLevel updates progress.xp, display progress.xp
directly instead of adding finalXp. Apply this consistently to both review and
normal quiz flows.
---
Nitpick comments:
In `@src/App.jsx`:
- Around line 15-21: Replace the biased random comparator in startReview with a
Fisher-Yates shuffle, using a copied pool so the original question order is not
mutated, then select the first REVIEW_SIZE questions and preserve the existing
empty-result guard and review view update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28b71e97-f709-4a4d-8125-1879436e6b78

📥 Commits

Reviewing files that changed from the base of the PR and between 127f42a and b09d0f6.

📒 Files selected for processing (7)
  • src/App.jsx
  • src/components/Icons.jsx
  • src/data/chapters.js
  • src/hooks/useProgress.js
  • src/index.css
  • src/screens/Home.jsx
  • src/screens/Quiz.jsx

Comment threadsrc/screens/Quiz.jsx
- 結算時 progress.xp 已含本輪 XP,Mascot 改直接吃 progress.xp,
避免等級條/進化階段多算一次
- 錯題抽題改 Fisher-Yates,修掉 sort(random) 的偏差
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Retsomm
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' 錯題重練+每日 streak by Retsomm · Pull Request #3 · Retsomm/EasyLearn · GitHub
Skip to content

錯題重練+每日 streak - #3

Merged
Retsomm merged 2 commits into
mainfrom
dev
Jul 10, 2026
Merged

錯題重練+每日 streak#3
Retsomm merged 2 commits into
mainfrom
dev

Conversation

@Retsomm

@RetsommRetsomm commented Jul 10, 2026

Copy link
Copy Markdown
Owner
  • 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除; 首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題, 重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
  • streak:完成關卡或重練時更新連續學習天數(本地時區日界), 首頁以火焰徽章顯示;中斷一天即重算
  • 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式

Summary by CodeRabbit

  • New Features

    • Added a “Review Wrong Questions” mode for retrying missed questions.
    • Incorrect answers are tracked and removed after being answered correctly.
    • Added learning streak tracking and a streak badge on the home screen.
    • Review results now show cleared questions and earned XP.
  • UI Improvements

    • Added review banners, secondary actions, and supporting icons.
    • The review option appears only when missed questions are available.

- 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除;
首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題,
重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
- streak:完成關卡或重練時更新連續學習天數(本地時區日界),
首頁以火焰徽章顯示;中斷一天即重算
- 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
easy-learnReadyReadyPreview, CommentJul 10, 2026 11:02am

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Retsomm, you've reached your PR review limit, so we couldn't start this review.

Next review available in:50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd10f9ea-6ed4-4b1e-9e57-dbc12068e7fa

📥 Commits

Reviewing files that changed from the base of the PR and between b09d0f6 and 189530e.

📒 Files selected for processing (2)
  • src/App.jsx
  • src/screens/Quiz.jsx
📝 Walkthrough

Walkthrough

Adds wrong-answer and streak persistence, a review flow for up to six wrong questions, review-specific quiz completion behavior, and home-screen controls and styling for streaks and review sessions.

Changes

Wrong Question Review

Layer / File(s)Summary
Progress tracking and review completion
src/hooks/useProgress.js
Progress now stores wrong question IDs and streak data, updates them when answers and levels are completed, and exposes answerQuestion and finishReview.
Review question selection and app wiring
src/data/chapters.js, src/App.jsx
Wrong questions are collected in chapter order, shuffled and limited to six, then supplied to a review-mode Quiz instance.
Review quiz behavior and results
src/screens/Quiz.jsx
Review mode records answers, finishes through finishReview, and renders review-specific banners, results, statistics, hints, and navigation.
Home review controls and visual assets
src/screens/Home.jsx, src/components/Icons.jsx, src/index.css
The home screen conditionally shows streak and wrong-question review controls, with new icons and styles for review UI elements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Home
participant App
participant QuestionData
participant Quiz
participant Progress
Home->>App: Start wrong-question review
App->>QuestionData: getWrongQuestions(wrongIds)
QuestionData-->>App: Return ordered wrong questions
App->>Quiz: Render review quiz with up to six questions
Quiz->>Progress: answerQuestion(questionId, correct)
Quiz->>Progress: finishReview(xpEarned)
Progress-->>Quiz: Updated progress and streak
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ Passed標題準確概括了這次的主要變更:錯題重練與每日 streak。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/App.jsx (1)

15-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Prefer Fisher-Yates over sort(() => Math.random() - 0.5).

Array.sort with a random comparator produces a biased distribution — not all permutations are equally likely. For selecting a review subset this is low-impact, but Fisher-Yates is equally simple and correct.

♻️ Proposed Fisher-Yates shuffle
 function startReview() {
// 抽最多 6 題錯題組成一輪重練(洗牌避免每次順序相同)
const pool = getWrongQuestions(progress.wrongIds)
- const shuffled = [...pool].sort(() => Math.random() - 0.5).slice(0, REVIEW_SIZE)+ const shuffled = [...pool]+ for (let i = shuffled.length - 1; i > 0; i--) {+ const j = Math.floor(Math.random() * (i + 1))+ ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]+ }+ shuffled.splice(REVIEW_SIZE)
if (shuffled.length === 0) return
setView({ name: 'review', questions: shuffled })
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/App.jsx` around lines 15 - 21, Replace the biased random comparator in
startReview with a Fisher-Yates shuffle, using a copied pool so the original
question order is not mutated, then select the first REVIEW_SIZE questions and
preserve the existing empty-result guard and review view update.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/screens/Quiz.jsx`:
- Around line 46-50: Prevent XP from being double-counted on the result screen
by updating the result XP display logic in the component’s completion/render
path: after finishReview or finishLevel updates progress.xp, display progress.xp
directly instead of adding finalXp. Apply this consistently to both review and
normal quiz flows.
---
Nitpick comments:
In `@src/App.jsx`:
- Around line 15-21: Replace the biased random comparator in startReview with a
Fisher-Yates shuffle, using a copied pool so the original question order is not
mutated, then select the first REVIEW_SIZE questions and preserve the existing
empty-result guard and review view update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28b71e97-f709-4a4d-8125-1879436e6b78

📥 Commits

Reviewing files that changed from the base of the PR and between 127f42a and b09d0f6.

📒 Files selected for processing (7)
  • src/App.jsx
  • src/components/Icons.jsx
  • src/data/chapters.js
  • src/hooks/useProgress.js
  • src/index.css
  • src/screens/Home.jsx
  • src/screens/Quiz.jsx

Comment threadsrc/screens/Quiz.jsx
- 結算時 progress.xp 已含本輪 XP,Mascot 改直接吃 progress.xp,
避免等級條/進化階段多算一次
- 錯題抽題改 Fisher-Yates,修掉 sort(random) 的偏差
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Retsomm
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 錯題重練+每日 streak by Retsomm · Pull Request #3 · Retsomm/EasyLearn · GitHub
Skip to content

錯題重練+每日 streak - #3

Merged
Retsomm merged 2 commits into
mainfrom
dev
Jul 10, 2026
Merged

錯題重練+每日 streak#3
Retsomm merged 2 commits into
mainfrom
dev

Conversation

@Retsomm

@RetsommRetsomm commented Jul 10, 2026

Copy link
Copy Markdown
Owner
  • 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除; 首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題, 重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
  • streak:完成關卡或重練時更新連續學習天數(本地時區日界), 首頁以火焰徽章顯示;中斷一天即重算
  • 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式

Summary by CodeRabbit

  • New Features

    • Added a “Review Wrong Questions” mode for retrying missed questions.
    • Incorrect answers are tracked and removed after being answered correctly.
    • Added learning streak tracking and a streak badge on the home screen.
    • Review results now show cleared questions and earned XP.
  • UI Improvements

    • Added review banners, secondary actions, and supporting icons.
    • The review option appears only when missed questions are available.

- 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除;
首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題,
重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
- streak:完成關卡或重練時更新連續學習天數(本地時區日界),
首頁以火焰徽章顯示;中斷一天即重算
- 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
easy-learnReadyReadyPreview, CommentJul 10, 2026 11:02am

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Retsomm, you've reached your PR review limit, so we couldn't start this review.

Next review available in:50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd10f9ea-6ed4-4b1e-9e57-dbc12068e7fa

📥 Commits

Reviewing files that changed from the base of the PR and between b09d0f6 and 189530e.

📒 Files selected for processing (2)
  • src/App.jsx
  • src/screens/Quiz.jsx
📝 Walkthrough

Walkthrough

Adds wrong-answer and streak persistence, a review flow for up to six wrong questions, review-specific quiz completion behavior, and home-screen controls and styling for streaks and review sessions.

Changes

Wrong Question Review

Layer / File(s)Summary
Progress tracking and review completion
src/hooks/useProgress.js
Progress now stores wrong question IDs and streak data, updates them when answers and levels are completed, and exposes answerQuestion and finishReview.
Review question selection and app wiring
src/data/chapters.js, src/App.jsx
Wrong questions are collected in chapter order, shuffled and limited to six, then supplied to a review-mode Quiz instance.
Review quiz behavior and results
src/screens/Quiz.jsx
Review mode records answers, finishes through finishReview, and renders review-specific banners, results, statistics, hints, and navigation.
Home review controls and visual assets
src/screens/Home.jsx, src/components/Icons.jsx, src/index.css
The home screen conditionally shows streak and wrong-question review controls, with new icons and styles for review UI elements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Home
participant App
participant QuestionData
participant Quiz
participant Progress
Home->>App: Start wrong-question review
App->>QuestionData: getWrongQuestions(wrongIds)
QuestionData-->>App: Return ordered wrong questions
App->>Quiz: Render review quiz with up to six questions
Quiz->>Progress: answerQuestion(questionId, correct)
Quiz->>Progress: finishReview(xpEarned)
Progress-->>Quiz: Updated progress and streak
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ Passed標題準確概括了這次的主要變更:錯題重練與每日 streak。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/App.jsx (1)

15-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Prefer Fisher-Yates over sort(() => Math.random() - 0.5).

Array.sort with a random comparator produces a biased distribution — not all permutations are equally likely. For selecting a review subset this is low-impact, but Fisher-Yates is equally simple and correct.

♻️ Proposed Fisher-Yates shuffle
 function startReview() {
// 抽最多 6 題錯題組成一輪重練(洗牌避免每次順序相同)
const pool = getWrongQuestions(progress.wrongIds)
- const shuffled = [...pool].sort(() => Math.random() - 0.5).slice(0, REVIEW_SIZE)+ const shuffled = [...pool]+ for (let i = shuffled.length - 1; i > 0; i--) {+ const j = Math.floor(Math.random() * (i + 1))+ ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]+ }+ shuffled.splice(REVIEW_SIZE)
if (shuffled.length === 0) return
setView({ name: 'review', questions: shuffled })
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/App.jsx` around lines 15 - 21, Replace the biased random comparator in
startReview with a Fisher-Yates shuffle, using a copied pool so the original
question order is not mutated, then select the first REVIEW_SIZE questions and
preserve the existing empty-result guard and review view update.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/screens/Quiz.jsx`:
- Around line 46-50: Prevent XP from being double-counted on the result screen
by updating the result XP display logic in the component’s completion/render
path: after finishReview or finishLevel updates progress.xp, display progress.xp
directly instead of adding finalXp. Apply this consistently to both review and
normal quiz flows.
---
Nitpick comments:
In `@src/App.jsx`:
- Around line 15-21: Replace the biased random comparator in startReview with a
Fisher-Yates shuffle, using a copied pool so the original question order is not
mutated, then select the first REVIEW_SIZE questions and preserve the existing
empty-result guard and review view update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28b71e97-f709-4a4d-8125-1879436e6b78

📥 Commits

Reviewing files that changed from the base of the PR and between 127f42a and b09d0f6.

📒 Files selected for processing (7)
  • src/App.jsx
  • src/components/Icons.jsx
  • src/data/chapters.js
  • src/hooks/useProgress.js
  • src/index.css
  • src/screens/Home.jsx
  • src/screens/Quiz.jsx

Comment threadsrc/screens/Quiz.jsx
- 結算時 progress.xp 已含本輪 XP,Mascot 改直接吃 progress.xp,
避免等級條/進化階段多算一次
- 錯題抽題改 Fisher-Yates,修掉 sort(random) 的偏差
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Retsomm
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 錯題重練+每日 streak by Retsomm · Pull Request #3 · Retsomm/EasyLearn · GitHub
Skip to content

錯題重練+每日 streak - #3

Merged
Retsomm merged 2 commits into
mainfrom
dev
Jul 10, 2026
Merged

錯題重練+每日 streak#3
Retsomm merged 2 commits into
mainfrom
dev

Conversation

@Retsomm

@RetsommRetsomm commented Jul 10, 2026

Copy link
Copy Markdown
Owner
  • 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除; 首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題, 重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
  • streak:完成關卡或重練時更新連續學習天數(本地時區日界), 首頁以火焰徽章顯示;中斷一天即重算
  • 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式

Summary by CodeRabbit

  • New Features

    • Added a “Review Wrong Questions” mode for retrying missed questions.
    • Incorrect answers are tracked and removed after being answered correctly.
    • Added learning streak tracking and a streak badge on the home screen.
    • Review results now show cleared questions and earned XP.
  • UI Improvements

    • Added review banners, secondary actions, and supporting icons.
    • The review option appears only when missed questions are available.

- 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除;
首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題,
重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
- streak:完成關卡或重練時更新連續學習天數(本地時區日界),
首頁以火焰徽章顯示;中斷一天即重算
- 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
easy-learnReadyReadyPreview, CommentJul 10, 2026 11:02am

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Retsomm, you've reached your PR review limit, so we couldn't start this review.

Next review available in:50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd10f9ea-6ed4-4b1e-9e57-dbc12068e7fa

📥 Commits

Reviewing files that changed from the base of the PR and between b09d0f6 and 189530e.

📒 Files selected for processing (2)
  • src/App.jsx
  • src/screens/Quiz.jsx
📝 Walkthrough

Walkthrough

Adds wrong-answer and streak persistence, a review flow for up to six wrong questions, review-specific quiz completion behavior, and home-screen controls and styling for streaks and review sessions.

Changes

Wrong Question Review

Layer / File(s)Summary
Progress tracking and review completion
src/hooks/useProgress.js
Progress now stores wrong question IDs and streak data, updates them when answers and levels are completed, and exposes answerQuestion and finishReview.
Review question selection and app wiring
src/data/chapters.js, src/App.jsx
Wrong questions are collected in chapter order, shuffled and limited to six, then supplied to a review-mode Quiz instance.
Review quiz behavior and results
src/screens/Quiz.jsx
Review mode records answers, finishes through finishReview, and renders review-specific banners, results, statistics, hints, and navigation.
Home review controls and visual assets
src/screens/Home.jsx, src/components/Icons.jsx, src/index.css
The home screen conditionally shows streak and wrong-question review controls, with new icons and styles for review UI elements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Home
participant App
participant QuestionData
participant Quiz
participant Progress
Home->>App: Start wrong-question review
App->>QuestionData: getWrongQuestions(wrongIds)
QuestionData-->>App: Return ordered wrong questions
App->>Quiz: Render review quiz with up to six questions
Quiz->>Progress: answerQuestion(questionId, correct)
Quiz->>Progress: finishReview(xpEarned)
Progress-->>Quiz: Updated progress and streak
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ Passed標題準確概括了這次的主要變更:錯題重練與每日 streak。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/App.jsx (1)

15-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Prefer Fisher-Yates over sort(() => Math.random() - 0.5).

Array.sort with a random comparator produces a biased distribution — not all permutations are equally likely. For selecting a review subset this is low-impact, but Fisher-Yates is equally simple and correct.

♻️ Proposed Fisher-Yates shuffle
 function startReview() {
// 抽最多 6 題錯題組成一輪重練(洗牌避免每次順序相同)
const pool = getWrongQuestions(progress.wrongIds)
- const shuffled = [...pool].sort(() => Math.random() - 0.5).slice(0, REVIEW_SIZE)+ const shuffled = [...pool]+ for (let i = shuffled.length - 1; i > 0; i--) {+ const j = Math.floor(Math.random() * (i + 1))+ ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]+ }+ shuffled.splice(REVIEW_SIZE)
if (shuffled.length === 0) return
setView({ name: 'review', questions: shuffled })
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/App.jsx` around lines 15 - 21, Replace the biased random comparator in
startReview with a Fisher-Yates shuffle, using a copied pool so the original
question order is not mutated, then select the first REVIEW_SIZE questions and
preserve the existing empty-result guard and review view update.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/screens/Quiz.jsx`:
- Around line 46-50: Prevent XP from being double-counted on the result screen
by updating the result XP display logic in the component’s completion/render
path: after finishReview or finishLevel updates progress.xp, display progress.xp
directly instead of adding finalXp. Apply this consistently to both review and
normal quiz flows.
---
Nitpick comments:
In `@src/App.jsx`:
- Around line 15-21: Replace the biased random comparator in startReview with a
Fisher-Yates shuffle, using a copied pool so the original question order is not
mutated, then select the first REVIEW_SIZE questions and preserve the existing
empty-result guard and review view update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28b71e97-f709-4a4d-8125-1879436e6b78

📥 Commits

Reviewing files that changed from the base of the PR and between 127f42a and b09d0f6.

📒 Files selected for processing (7)
  • src/App.jsx
  • src/components/Icons.jsx
  • src/data/chapters.js
  • src/hooks/useProgress.js
  • src/index.css
  • src/screens/Home.jsx
  • src/screens/Quiz.jsx

Comment threadsrc/screens/Quiz.jsx
- 結算時 progress.xp 已含本輪 XP,Mascot 改直接吃 progress.xp,
避免等級條/進化階段多算一次
- 錯題抽題改 Fisher-Yates,修掉 sort(random) 的偏差
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Retsomm
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); 錯題重練+每日 streak by Retsomm · Pull Request #3 · Retsomm/EasyLearn · GitHub
Skip to content

錯題重練+每日 streak - #3

Merged
Retsomm merged 2 commits into
mainfrom
dev
Jul 10, 2026
Merged

錯題重練+每日 streak#3
Retsomm merged 2 commits into
mainfrom
dev

Conversation

@Retsomm

@RetsommRetsomm commented Jul 10, 2026

Copy link
Copy Markdown
Owner
  • 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除; 首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題, 重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
  • streak:完成關卡或重練時更新連續學習天數(本地時區日界), 首頁以火焰徽章顯示;中斷一天即重算
  • 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式

Summary by CodeRabbit

  • New Features

    • Added a “Review Wrong Questions” mode for retrying missed questions.
    • Incorrect answers are tracked and removed after being answered correctly.
    • Added learning streak tracking and a streak badge on the home screen.
    • Review results now show cleared questions and earned XP.
  • UI Improvements

    • Added review banners, secondary actions, and supporting icons.
    • The review option appears only when missed questions are available.

- 錯題本:答錯的題目記進 localStorage(wrongIds),任何模式答對即移除;
首頁顯示「錯題重練(N 題)」按鈕,每輪隨機抽最多 6 題,
重練只加 XP 不計首通關 bonus、不動關卡最佳紀錄
- streak:完成關卡或重練時更新連續學習天數(本地時區日界),
首頁以火焰徽章顯示;中斷一天即重算
- 新增 flame、rotate-ccw 線型圖示與 secondary-btn 樣式
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
easy-learnReadyReadyPreview, CommentJul 10, 2026 11:02am

@coderabbitai

coderabbitaiBot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Retsomm, you've reached your PR review limit, so we couldn't start this review.

Next review available in:50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd10f9ea-6ed4-4b1e-9e57-dbc12068e7fa

📥 Commits

Reviewing files that changed from the base of the PR and between b09d0f6 and 189530e.

📒 Files selected for processing (2)
  • src/App.jsx
  • src/screens/Quiz.jsx
📝 Walkthrough

Walkthrough

Adds wrong-answer and streak persistence, a review flow for up to six wrong questions, review-specific quiz completion behavior, and home-screen controls and styling for streaks and review sessions.

Changes

Wrong Question Review

Layer / File(s)Summary
Progress tracking and review completion
src/hooks/useProgress.js
Progress now stores wrong question IDs and streak data, updates them when answers and levels are completed, and exposes answerQuestion and finishReview.
Review question selection and app wiring
src/data/chapters.js, src/App.jsx
Wrong questions are collected in chapter order, shuffled and limited to six, then supplied to a review-mode Quiz instance.
Review quiz behavior and results
src/screens/Quiz.jsx
Review mode records answers, finishes through finishReview, and renders review-specific banners, results, statistics, hints, and navigation.
Home review controls and visual assets
src/screens/Home.jsx, src/components/Icons.jsx, src/index.css
The home screen conditionally shows streak and wrong-question review controls, with new icons and styles for review UI elements.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
participant Home
participant App
participant QuestionData
participant Quiz
participant Progress
Home->>App: Start wrong-question review
App->>QuestionData: getWrongQuestions(wrongIds)
QuestionData-->>App: Return ordered wrong questions
App->>Quiz: Render review quiz with up to six questions
Quiz->>Progress: answerQuestion(questionId, correct)
Quiz->>Progress: finishReview(xpEarned)
Progress-->>Quiz: Updated progress and streak
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ Passed標題準確概括了這次的主要變更:錯題重練與每日 streak。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/App.jsx (1)

15-21: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Prefer Fisher-Yates over sort(() => Math.random() - 0.5).

Array.sort with a random comparator produces a biased distribution — not all permutations are equally likely. For selecting a review subset this is low-impact, but Fisher-Yates is equally simple and correct.

♻️ Proposed Fisher-Yates shuffle
 function startReview() {
// 抽最多 6 題錯題組成一輪重練(洗牌避免每次順序相同)
const pool = getWrongQuestions(progress.wrongIds)
- const shuffled = [...pool].sort(() => Math.random() - 0.5).slice(0, REVIEW_SIZE)+ const shuffled = [...pool]+ for (let i = shuffled.length - 1; i > 0; i--) {+ const j = Math.floor(Math.random() * (i + 1))+ ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]+ }+ shuffled.splice(REVIEW_SIZE)
if (shuffled.length === 0) return
setView({ name: 'review', questions: shuffled })
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/App.jsx` around lines 15 - 21, Replace the biased random comparator in
startReview with a Fisher-Yates shuffle, using a copied pool so the original
question order is not mutated, then select the first REVIEW_SIZE questions and
preserve the existing empty-result guard and review view update.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/screens/Quiz.jsx`:
- Around line 46-50: Prevent XP from being double-counted on the result screen
by updating the result XP display logic in the component’s completion/render
path: after finishReview or finishLevel updates progress.xp, display progress.xp
directly instead of adding finalXp. Apply this consistently to both review and
normal quiz flows.
---
Nitpick comments:
In `@src/App.jsx`:
- Around line 15-21: Replace the biased random comparator in startReview with a
Fisher-Yates shuffle, using a copied pool so the original question order is not
mutated, then select the first REVIEW_SIZE questions and preserve the existing
empty-result guard and review view update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 28b71e97-f709-4a4d-8125-1879436e6b78

📥 Commits

Reviewing files that changed from the base of the PR and between 127f42a and b09d0f6.

📒 Files selected for processing (7)
  • src/App.jsx
  • src/components/Icons.jsx
  • src/data/chapters.js
  • src/hooks/useProgress.js
  • src/index.css
  • src/screens/Home.jsx
  • src/screens/Quiz.jsx

Comment threadsrc/screens/Quiz.jsx
- 結算時 progress.xp 已含本輪 XP,Mascot 改直接吃 progress.xp,
避免等級條/進化階段多算一次
- 錯題抽題改 Fisher-Yates,修掉 sort(random) 的偏差
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Retsomm