Skip to content

feat(platform): in-app help & learning center with eLearning content (#1922)#1938

Open
larryro wants to merge 1 commit into
mainfrom
tale/xs77vq7cyx2sjd6n16yx9t2nnh897hf3
Open

feat(platform): in-app help & learning center with eLearning content (#1922)#1938
larryro wants to merge 1 commit into
mainfrom
tale/xs77vq7cyx2sjd6n16yx9t2nnh897hf3

Conversation

@larryro

@larryro larryro commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

Summary

Resolves #1922 — adds an in-app Help & learning center at /dashboard/help, the end-user learning surface the issue asked for. It covers the three pillars from the issue:

  • AI fundamentals — what LLMs are, how they generate answers, limitations & hallucinations.
  • Using Tale — getting started, chatting with agents, building the knowledge base, automations.
  • Opportunities & risks of AI — where AI helps, the risks, and responsible-use best practices.

The account menu (user-button) now links to this in-app center alongside the existing external feedback link, replacing the old "help points only to tale.dev/contact" state.

Video hosting decision

The platform CSP pins media-src and frame-src to 'self' for offline / self-hosted deployments, so external embeds (YouTube/Vimeo) are intentionally unsupported. LessonVideo plays self-hosted clips via a native <video> element (with same-origin WebVTT captions) and falls back to an accessible "coming soon" placeholder until clips are produced. This keeps the feature consistent with the air-gapped posture.

What's included

  • app/routes/dashboard/help.tsx — localized master-detail learning portal (curriculum sidebar + lesson content), deep-linkable via ?lesson=.
  • app/features/help/content.ts — curriculum structure; all copy resolved from the new help i18n namespace.
  • app/features/help/components/lesson-video.tsx — self-hosted video / placeholder.
  • Full en / de / fr translations + metadata.help; dynamic key prefixes allowlisted in keys-dynamic.txt.
  • user-button account-menu entry → in-app learning center.

Tests

  • content.test.ts — every curriculum id resolves to a real localized message (guards the dynamic-key wiring).
  • lesson-video.test.tsx — placeholder & self-hosted branches + axe a11y audit.
  • user-button.test.tsx — menu now exposes the learning-center item.
  • page-loads.spec.ts — e2e render-smoke for /dashboard/help.

Locally green: tsc --noEmit, oxlint (changed files), i18n parity/usage (messages.test.ts), and the UI test suite above.

Follow-ups

  • Self-hosted walkthrough clips (videoSrc) can be dropped in per lesson once produced.
  • A developer/admin docs-site page under docs/ could cross-link to this center.

…1922)

Add an in-app Help & learning center at /dashboard/help covering the three
pillars from the issue: LLM fundamentals, platform how-tos, and the
opportunities & risks of AI (responsible-use guidance).

- New route app/routes/dashboard/help.tsx: a localized master-detail learning
  portal (curriculum sidebar + lesson content), deep-linkable via ?lesson=.
- app/features/help/content.ts: curriculum structure (categories, lessons,
  reading time, optional self-hosted video src); all copy resolved from i18n.
- LessonVideo: self-hosted <video> with a 'coming soon' placeholder. External
  embeds are intentionally unsupported — the deployment CSP pins media-src and
  frame-src to 'self' for offline/self-hosted installs.
- user-button: the account menu now links to the in-app learning center
  alongside the existing external feedback link.
- Full en/de/fr translations + metadata; dynamic key prefixes allowlisted.
- Tests: curriculum↔i18n wiring, LessonVideo (both branches + axe), user-button
  menu, and an e2e render-smoke for the route.
@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@larryro, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 50 minutes. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

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 credits.

🚦 How do rate limits work?

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

For paid Pro and Pro+ PR reviews, CodeRabbit uses rolling per-developer review limits. Reviews become available again as older review attempts age out of the rolling limit window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: b771957e-3685-48ed-975f-aac086993b46

📥 Commits

Reviewing files that changed from the base of the PR and between b418075 and 5e9ecdb.

📒 Files selected for processing (13)
  • services/platform/app/components/user-button.test.tsx
  • services/platform/app/components/user-button.tsx
  • services/platform/app/features/help/components/lesson-video.test.tsx
  • services/platform/app/features/help/components/lesson-video.tsx
  • services/platform/app/features/help/content.test.ts
  • services/platform/app/features/help/content.ts
  • services/platform/app/routeTree.gen.ts
  • services/platform/app/routes/dashboard/help.tsx
  • services/platform/lib/i18n/keys-dynamic.txt
  • services/platform/messages/de.json
  • services/platform/messages/en.json
  • services/platform/messages/fr.json
  • services/platform/tests/e2e/specs/page-loads.spec.ts
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch tale/xs77vq7cyx2sjd6n16yx9t2nnh897hf3

Warning

Billing warning: we have not been able to collect payment for this subscription for more than 72 hours. Please update the payment method or pay any pending invoices in Billing to avoid service interruption.


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.

@larryro larryro left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Desk review — feat(platform): in-app help & learning center (#1922)

Verdict: READY TO MERGE. Clean, well-scoped, fully localized implementation that genuinely resolves the issue. CI is green and the project's own tests pass.

What I verified

  • CI: all required checks pass (gh pr checks — Type check, Lint, Format, Knip, Unit, UI, Storybook, Build platform, all 16 Playwright platform shards, Smoke test, Scan platform, etc.). No red, no pending.
  • Tests run locally (bun + vitest):
    • bunx vitest --run --config vitest.ui.config.ts app/features/help app/components/user-button21 passed
    • i18n messages suite → 40 passed (orphan-key + en/de/fr parity)
    • content.test.ts6 passed
  • i18n parity: all 49 help.* / metadata.help keys present and non-empty in en, de, fr — no missing/extra.
  • Routing: /dashboard/help is org-independent and auth-guarded via the /dashboard parent beforeLoad (same pattern as changelog). ?lesson= resolves valid → that lesson, invalid/missing → first lesson. routeTree.gen.ts regenerated correctly.
  • CSP/video posture: LessonVideo self-hosts <video> + same-origin WebVTT and falls back to an accessible "coming soon" placeholder — consistent with the media-src 'self' air-gapped posture described in the PR.
  • Content: all three issue pillars are substantively delivered (not stubs) — LLM fundamentals (what/how/limitations incl. hallucinations), platform how-tos (getting started, agents, knowledge base, automations), and opportunities & risks + responsible-use best practices.

Non-blocking nits (optional follow-ups, do not block merge)

  1. Dead i18n copy. help.lessons.<id>.summary (×10) and help.categories.<id>.description (×3) are authored in all three languages and asserted truthy by content.test.ts, but are never rendered by help.tsx (only title/body/contact.description are used). Either surface them (e.g. nav/lesson preview text) or drop them to avoid orphan copy. They escape the orphan-key scanner because the whole help.lessons/help.categories prefixes are allowlisted in keys-dynamic.txt.
  2. Latent .vtt assumption. lesson-video.tsx always emits <track src={${videoSrc}.vtt} default> when a videoSrc is set; whoever adds a clip must drop the sibling .vtt alongside it or captions silently 404. Currently inert (no lesson sets videoSrc).
  3. Test depth. The ?lesson= valid/invalid/missing resolution and the HelpNav deep-link interaction are covered only by the page-loads e2e smoke (heading visible), consistent with how sibling routes are tested. A small help.test.tsx exercising the three param branches would harden it, but this matches repo convention and is not required.

I reviewed the dormant onNavigate prop on the new help menu item — the sole <UserButton> render passes no onNavigate, so it's a no-op everywhere today (and the in-file "What's New" link already navigates without it). Not a defect.

Sign up for free to 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.

Feature: In-app help portal with eLearning / how-to videos

1 participant