Sub-ticket of P5 (#328), epic #323. Depends on #336 (approved-read path); integrates with #337 (pipeline) for the submit flow and #338 (moderation).
What: surface videos in the shared LanguagePlaygroundShellComponent so all five playgrounds get them at once, reusing the shell's right-pane tab pattern established by the Reading tab (#326/#327).
Scope:
Videos tab/pane in the shell right pane: official video for the current lesson + approved community videos for the current block (GET /api/Lessons/{n}/videos), grouped by panelIndex
Player consistent with existing media components; lazy-load, poster thumbnail, no autoplay
Submit-a-video flow for logged-in users (upload to #337's endpoint) with a clear pending-review state for the submitter; hidden/CTA-to-login for anonymous users
Empty state when a lesson/block has no videos (no empty chrome, matching the Reading tab behavior)
i18n chrome (en/es); data-testid per the shell E2E convention
Unit tests: tab renders approved videos grouped by block, submit gating by auth, empty state
Acceptance: an approved community video appears on its lesson block across all five playgrounds; logged-in users can submit and see a pending state; anonymous users never see unapproved content.
Sub-ticket of P5 (#328), epic #323. Depends on #336 (approved-read path); integrates with #337 (pipeline) for the submit flow and #338 (moderation).
**What:** surface videos in the shared `LanguagePlaygroundShellComponent` so all five playgrounds get them at once, reusing the shell's right-pane tab pattern established by the Reading tab (#326/#327).
**Scope:**
- [ ] **Videos** tab/pane in the shell right pane: official video for the current lesson + approved community videos for the current block (`GET /api/Lessons/{n}/videos`), grouped by `panelIndex`
- [ ] Player consistent with existing media components; lazy-load, poster thumbnail, no autoplay
- [ ] Submit-a-video flow for logged-in users (upload to #337's endpoint) with a clear pending-review state for the submitter; hidden/CTA-to-login for anonymous users
- [ ] Empty state when a lesson/block has no videos (no empty chrome, matching the Reading tab behavior)
- [ ] i18n chrome (en/es); `data-testid` per the shell E2E convention
- [ ] Unit tests: tab renders approved videos grouped by block, submit gating by auth, empty state
**Acceptance:** an approved community video appears on its lesson block across all five playgrounds; logged-in users can submit and see a pending state; anonymous users never see unapproved content.
Done — merged via spikersoft-angular PR #102. Videos tab in the shared LanguagePlaygroundShellComponent (all five playgrounds): official + approved community videos grouped by block, native <video> player, submit-a-video flow for logged-in users (via #336's URL+metadata endpoint) with pending-review state, login CTA for anonymous, empty-state handling, data-testid selectors, en/es i18n, 11 unit tests. Note: file-upload/transcode is a later enhancement (#337); the current submit accepts a URL. Closing.
Done — merged via spikersoft-angular PR #102. Videos tab in the shared `LanguagePlaygroundShellComponent` (all five playgrounds): official + approved community videos grouped by block, native `<video>` player, submit-a-video flow for logged-in users (via #336's URL+metadata endpoint) with pending-review state, login CTA for anonymous, empty-state handling, `data-testid` selectors, en/es i18n, 11 unit tests. Note: file-upload/transcode is a later enhancement (#337); the current submit accepts a URL. Closing.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Sub-ticket of P5 (#328), epic #323. Depends on #336 (approved-read path); integrates with #337 (pipeline) for the submit flow and #338 (moderation).
What: surface videos in the shared
LanguagePlaygroundShellComponentso all five playgrounds get them at once, reusing the shell's right-pane tab pattern established by the Reading tab (#326/#327).Scope:
GET /api/Lessons/{n}/videos), grouped bypanelIndexdata-testidper the shell E2E conventionAcceptance: an approved community video appears on its lesson block across all five playgrounds; logged-in users can submit and see a pending state; anonymous users never see unapproved content.
Done — merged via spikersoft-angular PR #102. Videos tab in the shared
LanguagePlaygroundShellComponent(all five playgrounds): official + approved community videos grouped by block, native<video>player, submit-a-video flow for logged-in users (via #336's URL+metadata endpoint) with pending-review state, login CTA for anonymous, empty-state handling,data-testidselectors, en/es i18n, 11 unit tests. Note: file-upload/transcode is a later enhancement (#337); the current submit accepts a URL. Closing.