Single Attempt Screen — Product Requirements Document
Product: Arivu
Module: MCQ Practice
Feature type: Core practice flow
Status: In Review
Overview
The Single Attempt Screen is the core MCQ answering experience. Users answer one question at a time, receive immediate feedback, and navigate through a list of questions. Each question can only be answered once — answers are locked after submission.
Entry Points
Users can land on this screen from three places:
| Entry Point | Description |
|---|---|
| L3 Listing | Subject/topic level question list |
| Year Listing | Questions filtered by year (e.g., PYQ 2021) |
| Bookmark Listing | User’s saved/bookmarked questions |
The question counter (“X of Y”) in the header reflects the user’s position within whichever list they entered from.
Loading & Error States
Initial Data Fetch
When the user lands on the screen, a batch fetch is triggered to load all questions in the active session upfront — this includes the current question and all questions accessible via Prev/Next navigation. No lazy or on-demand fetching occurs during navigation.
Loading UI: A full-screen overlay spinner is shown during the fetch. The header is not visible during loading — the spinner occupies the entire screen.
Once the fetch completes successfully, the spinner is dismissed and the screen renders in the appropriate state (Unanswered or Review depending on question status).
Error States
| Scenario | Likelihood | UI | Action Available | Logging |
|---|---|---|---|---|
| Question not found | Should never occur (questions are sourced from local DB) | Friendly error message | Go Back CTA | Critically logged — with question ID, entry point, and session context |
No internet / offline errors do not apply to this screen. Questions are always present in the local database before the user can navigate to them.
On any error, the only available action is Go Back, which returns the user to the originating listing page.
Note for engineers: A “question not found” error indicates a data integrity issue between the listing and the local DB. This must be critically logged with the question ID, entry point, and session context. It should never surface in normal usage.
Screen States
The screen has three distinct states depending on question status:
- State 1 — Unanswered: Shown when the user arrives at a question they have not yet attempted.
- State 2 — Answer Submitted (Transition): Shown briefly after the user selects an answer. Provides visual feedback before auto-navigating to the Review state.
- State 3 — Review / Solution: Shown after the answer is submitted, or immediately on arrival if the question was previously answered.
Header (Persistent Across All States)
The header remains visible throughout all states.
| Element | Description |
|---|---|
| Question counter | ”X of Y” — position of the current question within the active list |
| PYQ badge | ”P [Year]” — indicates a Previous Year Question. Only shown when the question is from a past year paper; hidden otherwise |
| Close (X) button | Navigates the user back to the originating listing page immediately, with no confirmation dialog |
State 1 — Unanswered
Layout
- Question text displayed at the top
- Mark as Guessed toggle (yellow/amber)
- Four answer options labelled A, B, C, D — each in a card layout
- Each option card has a circular indicator on the right side (empty/unfilled before answering)
- The bottom navigation bar (Prev / Next) is not visible in this state. It becomes visible only after the user submits an answer.
Mark as Guessed Toggle
- Purpose: Personal tag to flag questions answered with uncertainty. No effect on scoring or reporting.
- Behaviour: Can be toggled ON or OFF freely before the user selects an answer.
- Post-answer: Fully hidden once the user submits. Not shown in Review state.
- Data: The guessed flag is submitted to the backend alongside the answer on submission.
Option Cards (Before Answering)
- Each card shows the option label (A/B/C/D) and answer text.
- The circular indicator is visible but empty before answering. The fill (%) is revealed only after the user selects an answer.
- Tapping any option triggers answer submission — there is no separate Submit button.
State 2 — Answer Submitted (Transition)
Immediately after the user taps an option:
- The Mark as Guessed toggle hides.
- Visual feedback is applied to option cards:
- Correct answer selected: Selected option highlights green.
- Wrong answer selected: Selected option highlights red; correct option highlights green.
- Non-selected, non-correct options remain uncoloured.
- The circular indicator on each option fills to show the % of all users who selected that option (all four simultaneously).
- “X% got it right!” appears beneath the correct option card.
- After 0.5s the screen auto-navigates to State 3 — Review / Solution.
State 3 — Review / Solution
The post-answer view. Users land here after submitting (via State 2 transition) or directly if the question was previously answered.
Options (Locked)
- All four option cards remain visible.
- Correct answer highlighted green with a green checkmark.
- Wrong selected answer remains red (if applicable).
- Circular indicators show % of users who selected each option.
- Answers are locked — the user cannot change their answer or re-attempt.
Rating Banner
- Displays “X% got it right!” with thumbs-up and thumbs-down icons labelled “Rate this MCQ”.
- Users can tap to rate. Rating can be changed after submission — the selected thumb is highlighted.
- Rating is persisted — returning to the same question shows the previously selected rating.
Topic & Tags
- Topic label (e.g. “Infrastructure / Transport”) below the rating row.
- Hashtag chips below the topic (e.g.
#PYQS,#RecentUpdates).
Solution Section
- “Solution” heading followed by detailed explanation text.
- May include additional attached content blocks beyond plain text.
MCQ ID
- Displayed at the bottom of the solution area.
- Copy icon allows the user to copy the MCQ ID to clipboard.
Bottom Action Bar
Persistent in Review state.
| Action | Behaviour |
|---|---|
| Bookmark | If not bookmarked → bookmarks immediately and opens bookmark sheet. If already bookmarked → opens bookmark sheet to manage or remove. |
| Share | Opens native platform share sheet with a pre-composed message containing a universal deep link to this MCQ. |
| Report | Opens the report flow. |
| < Prev | Navigates to previous question. Hidden on the first question. |
| Next > | Navigates to next question. |
Last Question Behaviour
- On the final question, “Next >” is replaced by “Done”.
- Tapping Done has two outcomes:
- All questions answered + entered from a topic listing → navigates to the Topic Completed screen.
- Any questions skipped, or not entered from a topic listing → returns directly to the originating listing page.
- Rapid tapping guard: Tapping Done multiple times rapidly triggers only one navigation action.
Prev / Next Navigation
- Navigating to a previously answered question → lands on State 3 (Review).
- Navigating to an unanswered question → lands on State 1 (Unanswered).
- Scroll position resets to top whenever the user navigates to a different question.
Already Answered Questions
If a user enters on a previously answered question (from any entry point), they land directly on State 3. States 1 and 2 are skipped entirely. Answer is locked — cannot be re-attempted.
Offline Support
Offline attempting is fully supported. Users can attempt questions without internet. Answers are saved locally first and synced to the backend in the background on reconnect.
Data & Sync
On answer submission, the following data is persisted:
| Field | Description |
|---|---|
| Question ID | Identifier of the attempted question |
| Selected answer | The option the user chose: option_1, option_2, option_3, option_4, or -1 |
| Mark as Guessed flag | Boolean — whether the user flagged the question as guessed |
Strategy: Local-first. The answer is saved to local storage immediately on submission. A background sync job then pushes the data to the backend.
Submission timing: Answers are submitted per question at the moment the user selects an option — not on “Done”. The Done button only handles session completion and navigation. Duplicate submissions for the same question must be guarded against at the data layer.
Backend Integration
POST /mcqs_attrs/attempt
Request Body:
{
"attempts": [
{
"mcq_id": "683650e6025dfeec20a56401",
"selected_option": "option_1",
"guessed": false
}
]
}
| Field | Type | Required | Description |
|---|---|---|---|
mcq_id | ObjectId | Yes | The attempted MCQ |
selected_option | string | int | Yes | The chosen option |
guessed | boolean | No | Whether the user marked this as a guess. Omit to leave unchanged. |
The attempts field is an array — a single attempt is sent as a one-item array.
Response:
{
"status": "success",
"data": {}
}
Transitions and Animations
TBD
Open Questions
| # | Question | Current assumption |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 |