Owner Nikunj

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 PointDescription
L3 ListingSubject/topic level question list
Year ListingQuestions filtered by year (e.g., PYQ 2021)
Bookmark ListingUser’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

ScenarioLikelihoodUIAction AvailableLogging
Question not foundShould never occur (questions are sourced from local DB)Friendly error messageGo Back CTACritically 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.

ElementDescription
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) buttonNavigates 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:

  1. The Mark as Guessed toggle hides.
  2. 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.
  3. The circular indicator on each option fills to show the % of all users who selected that option (all four simultaneously).
  4. “X% got it right!” appears beneath the correct option card.
  5. 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.

ActionBehaviour
BookmarkIf not bookmarked → bookmarks immediately and opens bookmark sheet. If already bookmarked → opens bookmark sheet to manage or remove.
ShareOpens native platform share sheet with a pre-composed message containing a universal deep link to this MCQ.
ReportOpens the report flow.
< PrevNavigates 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:

FieldDescription
Question IDIdentifier of the attempted question
Selected answerThe option the user chose: option_1, option_2, option_3, option_4, or -1
Mark as Guessed flagBoolean — 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
    }
  ]
}
FieldTypeRequiredDescription
mcq_idObjectIdYesThe attempted MCQ
selected_optionstring | intYesThe chosen option
guessedbooleanNoWhether 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

#QuestionCurrent assumption
1
2
3