Skip to content

Enhance Practice Now Features and Save Modal Improvements with Dashboard Deep-Linking#27

Merged
navidshad merged 21 commits into
mainfrom
dev
May 26, 2026
Merged

Enhance Practice Now Features and Save Modal Improvements with Dashboard Deep-Linking#27
navidshad merged 21 commits into
mainfrom
dev

Conversation

@navidshad

@navidshad navidshad commented May 26, 2026

Copy link
Copy Markdown
Collaborator

🏷️ PR Title:
Enhance Practice Now Features and Save Modal Improvements with Dashboard Deep-Linking

📋 Summary

This PR introduces multiple enhancements across the Practice Now and Save Modal features. It emphasizes practiced phrases, improves login flows, and allows configuration access for logged-out users with clearer CTAs. Additionally, it adds voice session configuration and deep-linking to the dashboard tab. The Save Modal now supports per-chunk definitions, chunk highlights, AI advice chat, bundle suggestions, and inline removal with dirty-aware saves. Circular import issues are fixed, and bundle suggestions are fetched per page via a dedicated RPC. Several UI and functionality improvements enhance user experience in flashcard previews, word detail actions, and navigation.

🔗 Related Tasks

#86exnxnw7 - Practice Now config page in ConsoleCrane with deep-link to dashboard tab
#86exnxbwb - Build PRFAQ 001 Phase 1 Productive Retrieval Smart Review
#86exkh0z3 - First run dashboard fix: name, avatar, timezone, install extension nudge

📝 Additional Details

  • DB-first lookup implemented for saved phrases to avoid unnecessary AI recalls.
  • Per-field bundle chips added with inline removal and save state awareness.
  • Circular import between save-modal and console-crane store resolved.
  • Announcement of extension presence on dashboard origins included for install nudges.
  • "Save & view" button renamed to "Save and Learn" for clarity.

📜 Commit List

  • 8ff3408 feat(practice-now): emphasize practiced phrase + cover login flows
  • 2f09e05 feat(practice-now): open config to logged-out users + clearer CTAs
  • db1a3fc feat(practice-now): voice session config + dashboard deep-link
  • 25499da fix(save-modal): refetch bundle options so post-save chip shows title
  • 1315cc8 feat(saved-phrase): DB-first lookup, reuse stored translation, no AI re-call
  • 374cbb4 feat(save-modal): in-field bundle chips with dirty-aware save + inline removal
  • ab00130 fix(save-modal): break circular import to console-crane store
  • 01e510c refactor(save-modal): per-page bundle suggestion via dedicated RPC
  • f766040 feat(save-modal): per-chunk definitions, merged pronunciation, reorder save
  • 9954c22 feat(save-modal): chunk highlights, AI advice chat, bundle suggestion
  • 69dcf1b feat: announce extension presence on dashboard origins for install nudge #86exkh0z3
  • 3b85dd8 chore(nibble): rename "Save & view" button to "Save and Learn"

navidshad and others added 21 commits May 13, 2026 20:01
…dge #86exkh0z3

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PRFAQ-001 Phase 1 (extension, CU-86exnxnd3):
- Inline chunk highlights on the selection; "Ask AI" chat (explain or fix) with
  conversation history and editable user messages (re-runs from edit point).
- Bundle suggestion: URL-matched bundle -> suggested chip (editable) -> last-used;
  named "Save to <bundle>" button; sends chunks + sourceUrl to createPhrase.
- Preview flashcard (chunk cloze) and Practice now button (-> practice-config stub).
- Modal trims: drop examples + related expressions; "Phonetic" -> "Pronunciation"
  with per-chunk transliteration; pass pageTitle/pageUrl to translateWithContext.
- dir="auto" on chat bubbles/input for mixed RTL/LTR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…r save

- Definition section now shows one block per chunk (label + pronunciation +
  meaning); the separate Pronunciation fieldset is merged in.
- Falls back to the whole-phrase definition + transliteration for short
  selections with no chunks.
- Move the Save / Login button below the definition so meaning comes first.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…-dashboard-fix-name-avatar-timezone-install-extension-nudge_Navid-Shad

feat: announce extension presence on dashboard origins for install nudge #86exkh0z3
# [1.12.0-dev.1](v1.11.2-dev.1...v1.12.0-dev.1) (2026-05-21)

### Features

* announce extension presence on dashboard origins for install nudge [#86](https://github.com/codebridger/subturtle-extension-apps/issues/86)exkh0z3 ([69dcf1b](69dcf1b)), closes [#86exkh0z3](https://github.com/codebridger/subturtle-extension-apps/issues/86exkh0z3)
- New BundleSuggestionService: calls getBundleSuggestionForPage once per page
  (logged-in only), cached by normalised URL; cache cleared after a save.
- SaveWordSectionV2 default-bundle chain now uses the suggestion result
  (matchedBundle -> suggestedName -> last-used), replacing the client-side
  matchBundleByUrl and the suggested_bundle_name prop.
- Drop pageTitle/pageUrl from the translation call and suggested_bundle_name
  from the LanguageLearningData type.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
SaveWordSectionV2 -> console-crane store -> router -> word-detail ->
SaveWordSectionV2 caused "Cannot access '__WEBPACK_DEFAULT_EXPORT__' before
initialization" at runtime. Lazy-import the store inside startPracticeNow
instead of at module top so the static cycle is broken.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…e removal

- Saved bundles now render as chips inside the selector (removed the separate
  "Saved in" fieldset that collided with the action row). Each chip has a ×.
- Dirty-aware Save: disabled (greyed) unless a not-yet-saved bundle is selected;
  compact "Save" label since the bundle is shown in the field.
- Removing a saved bundle via × calls removePhrase immediately (watcher); Save
  only adds newly selected bundles. createPhrase reuses an existing same-named
  bundle instead of recreating (avoids E11000).
- In-field "Suggested" chip (editable) replaces the standalone row; resolve
  bundle titles from loaded options (pilotui hands back ids when preselected);
  normalise selection to ids so objects never leak to the parent / createPhrase.
- Existing-phrase lookup matches by phrase + owner only (translation varies per
  AI call, which previously made saved phrases look unsaved).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…re-call

- New shared findSavedPhrase (common/services/phrase.service.ts): single source
  of truth, matches by phrase text + owner (translation excluded by design).
- Nibble popup: for an already-saved phrase, load the stored translation from
  the DB and label the action "Learn" (book icon) instead of "Save and Learn" —
  no AI translate call.
- Word-detail modal: for a saved phrase, build the view from the stored document
  (translation + linguistic_data + chunks) instead of calling the detailed AI
  translation (also avoids the occasional "failed to parse JSON" error).
- SaveWordSectionV2 reuses findSavedPhrase for its existing-phrase check.
- Restore the source sentence: showContext now displays the surrounding
  sentence (only hides when empty/identical to the selection), and context
  prefers the stored source sentence for saved phrases.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
When a bundle id is selected that isn't in the loaded options (just
created on save, or matched server-side), refetch so its title resolves
instead of rendering the raw id.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tion actions

- Move "Practice with AI" (renamed from "Practice now") and "Preview flashcard"
  out of the save card up under the translation, where they're visible.
- Flashcard preview is now its own page that previews every card a phrase
  generates: a Recognition card (Levels 1-2) plus one Fill-in-the-blank card per
  confirmed chunk found in the sentence (Levels 3-5), each tagged with its levels.
- Show a back button on every sub-page (settings, practice-config,
  flashcard-preview), not just settings, via the store's isOnMainPage.
- Decouple the console-crane store from the router through a small registration
  holder (navigation.ts). The store imported the router, which reads page default
  exports at module-eval time, creating a circular init; the prior workaround used
  a dynamic import() that webpack split into a chunk that cannot load in a
  content-script context (wrong public path + page CSP). The holder breaks the
  cycle so everything stays in one bundle.
- Restyle the Definition section from a Fieldset legend to a card with the same
  inline uppercase label as the other sections.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…vigation

- Extract the flashcard card-building out of the SFC into a pure
  flashcard-preview/cards.ts (buildPreviewCards) so it's unit-testable, and have
  the page consume it.
- Unit-test buildPreviewCards: recognition card always present, one cloze card
  per confirmed chunk found in the sentence, case-insensitive/first-occurrence
  blanking, and the skip cases (no chunk match, no sentence, empty chunk text).
- Component-test the flashcard-preview page (recognition-only, recognition +
  cloze, empty state) and word-detail (Definition renders as a card without the
  Fieldset legend; the action buttons show when logged in and hide when logged
  out; "Practice with AI" and "Preview flashcard" navigate via toggleConsoleCrane
  with the right route and params).
- Add navigation-holder tests (null before register, returns/replaces the
  router) and repoint the existing console-crane-store test's mock from the
  router module to the navigation holder, matching the store decoupling.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…AQ-001-Phase-1-Productive-Retrieval-Smart-Review_Navid-Shad

Enhance Save Modal with Per-Chunk Definitions, AI Advice Chat, and UI Improvements #86exnxbwb
# [1.12.0-dev.2](v1.12.0-dev.1...v1.12.0-dev.2) (2026-05-24)

### Bug Fixes

* **save-modal:** break circular import to console-crane store ([ab00130](ab00130))
* **save-modal:** refetch bundle options so post-save chip shows title ([25499da](25499da))

### Features

* **console-crane:** practice + flashcard-preview pages, near-translation actions ([224b9da](224b9da))
* **save-modal:** chunk highlights, AI advice chat, bundle suggestion ([9954c22](9954c22))
* **save-modal:** in-field bundle chips with dirty-aware save + inline removal ([374cbb4](374cbb4))
* **save-modal:** per-chunk definitions, merged pronunciation, reorder save ([f766040](f766040))
* **saved-phrase:** DB-first lookup, reuse stored translation, no AI re-call ([1315cc8](1315cc8))
Fill in the Practice now ConsoleCrane page: an avatar voice picker
(voices fetched from the server), an inline save-first flow, and a Start
button that opens the dashboard live-session gate via the
login_with_token deep-link. Free users see their remaining AI-session
allocation (read from profile) and are prompted to upgrade once used up.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Show "Practice with AI" and "Preview flashcard" in word-detail
regardless of login — flashcard preview has no auth guard, and the
practice-config page now handles the login prompt itself.

In practice-config the voice picker + duration hint are always shown;
only the footer changes across states (logged out -> "Log in & save
first"; logged in + unsaved -> save-first flow; saved -> Start/Upgrade).
The picker stays mounted across saving so the chosen voice is kept.
Point the free-tier Upgrade button at the dashboard
/settings/subscription page.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Promote the phrase being practiced to a large bold heading (the focal
point) and demote "Practice now" to a small eyebrow label, so the phrase
is obvious at a glance.

Also add tests for the logged-out paths: the login CTA dispatches an
OpenLoginWindowMessage, and the isLogin watch advances the page to the
save-first flow after login (the voice picker persists across it).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…fig-page-in-ConsoleCrane-with-deep-link-to-dashboard-tab_Navid-Shad

practice now config page in console crane with deep link to dashboard tab #86exnxnw7
# [1.12.0-dev.3](v1.12.0-dev.2...v1.12.0-dev.3) (2026-05-25)

### Features

* **practice-now:** emphasize practiced phrase + cover login flows ([8ff3408](8ff3408))
* **practice-now:** open config to logged-out users + clearer CTAs ([2f09e05](2f09e05))
* **practice-now:** voice session config + dashboard deep-link ([db1a3fc](db1a3fc))
@navidshad navidshad changed the title Dev Enhance Practice Now Features and Save Modal Improvements with Dashboard Deep-Linking May 26, 2026
@navidshad navidshad merged commit a271aff into main May 26, 2026
5 checks passed
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 1.12.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants