Skip to content

Epic: 'Continue Reading' Flow & Auto-Add Prompts #13256

Open
1 of 2 issues completed
Open

Description

@Sadashii

Epic: "Continue Reading" Flow

Summary

New patrons land on an empty My Books page — the Loans carousel just says "No books are on this shelf," with no path back to value. We know populated shelves correlate strongly with retention, so this Epic closes that gap with a "Continue Reading" shelf on My Books. The moment a patron has touched one book, their dashboard should already look alive.

Two structural problems drive the empty state today and motivate the sub-tasks below:

  • Short-term borrows disappear. Most loans are ~1hr; once expired, they vanish from the active dashboard with no "pick up where you left off" surface.
  • No historical fallback. A patron who interacts with books or open-access items needs a reliable server-side reading history to power the Continue Reading experience across devices.

Close this issue once all phases below are merged and the unified carousel is live on My Books.

graph TD
    Phase1[Phase 1: Merge Active Loans & Loan History Carousel] --> Phase2[Phase 2: Database-Backed Read History & Unified Carousel]
Loading

Roadmap & Checklist

[x] Phase 1: Merge Active Loans & Loan History Carousel (Backend + Template)

Tracked in #13272.
Replace the legacy Loans carousel on My Books with a unified carousel that displays both active CDL loans and past checkouts.

  • Fetch active loans (get_loans_of_user) and historical loans (user_borrow_history).
  • Deduplicate books by work OLID.
  • Sort by last-access/updated timestamp descending.

[x] Phase 2: Database-Backed Read History & Unified Carousel

Tracked in #13273.
Implement server-side database-backed read history (read_history table) and integrate it directly into the unified Continue Reading carousel alongside active loans and loan history, superseding client-side localStorage tracking.

  • Automatically record reading activity during borrow and read flows.
  • Merge active loans, loan history, and database read history with robust work-key deduplication and timestamp sorting (prioritizing active loans).

Sub-Issues


Next steps

  • Close this issue once Phase 2 is merged and the unified Continue Reading carousel is confirmed live.

Engineering Standards

  • Python: double quotes, max line length 162, Ruff-compliant import order.
  • JS: ESLint-compliant, single quotes, no jQuery in new components.
  • CSS: Stylelint-compliant — no hex colors, use variables defined in static/css/.
  • i18n: don't split sentences into separate translatable fragments around HTML links. Use single translatable strings with placeholders (e.g. %(link_start)s / %(link_end)s) so translators can reposition links per target-language grammar.

Activity

  1. added
    Type: EpicA feature or refactor that is big enough to require subissues. [managed]
    Type: Feature RequestIssue describes a feature or enhancement we'd like to implement. [managed]
    Needs: TriageThis issue needs triage. The team needs to decide who should own it, what to do, by when. [managed]
    Needs: BreakdownThis big issue needs a checklist or subissues to describe a breakdown of work. [managed]
    Theme: Reading LogRelated to workflows for creating, modifying, displaying a user's reading log. [managed]
    Affects: UIIssues with the web site's user interface. [managed]
    Module: JavaScriptIssues related to the JavaScript functionality. [managed]
    on Aug 4, 2026
  2. lokesh commented on Aug 4, 2026

    @lokesh
    Collaborator

    Options: Yes, Add (one-time) — keeps addition, prompts again next time; Yes, and Remember — saves always, bypasses modal going forward; No, don't add — reverts via the PR 2 endpoint; No, and Remember — reverts and saves never.

    This 2x2 grid of options seems overly complex. I'd like to propose a simpler approach, but first I'd like to understand what patron acitons/info is...

    1. Public
    2. Private
    3. Can be public or private based on the patron's privacy preferences
  3. Sadashii commented on Aug 5, 2026

    @Sadashii
    CollaboratorAuthor

    This behavior adds the book to a patrons Currently Reading bookshelf - by default, that is currently public.

    It can be toggled to be made private.

    Ideally, to provide maximum value to a patron, we want them to choose 'Always add' in the prompt.

  4. Sadashii commented on Aug 6, 2026

    @Sadashii
    CollaboratorAuthor

    Perhaps a checkbox that is 'Remember my decision' and two action buttons "Add to bookshelf", "Don't add"

    Worthwile to directly provide them an option to change their privacy settings in this modal itself? In case they hesitate to add it due to privacy reasons, providing this option here directly might prompt them to toggle and then remember this action?

  5. added
    Lead: @mekarpelesIssues overseen by Mek (Staff: Program Lead) [managed]
    Priority: 2Important, as time permits. [managed]
    and removed
    Needs: TriageThis issue needs triage. The team needs to decide who should own it, what to do, by when. [managed]
    on Aug 10, 2026
  6. added a commit that references this issue on Sep 17, 2026
    22064b1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Affects: UIIssues with the web site's user interface. [managed]Lead: @mekarpelesIssues overseen by Mek (Staff: Program Lead) [managed]Module: JavaScriptIssues related to the JavaScript functionality. [managed]Needs: BreakdownThis big issue needs a checklist or subissues to describe a breakdown of work. [managed]Needs: DesignsNeeds: Review AssigneePriority: 2Important, as time permits. [managed]Theme: My BooksTheme: Reading LogRelated to workflows for creating, modifying, displaying a user's reading log. [managed]Type: EpicA feature or refactor that is big enough to require subissues. [managed]Type: Feature RequestIssue describes a feature or enhancement we'd like to implement. [managed]

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions