| 44-video-presentations |
03 |
ui |
| remotion |
| video |
| presentations |
| react |
| sse |
| progress |
| content-studio |
|
| phase |
provides |
| 44-video-presentations/44-01 |
PresentationBundle interface, content_job.progress LiveEventType, presentation case in content-job-runner |
|
| phase |
provides |
| 44-video-presentations/44-02 |
Server-side presentation renderer emitting SSE progress events |
|
|
| useContentJob extended to read fine-grained data.progress from SSE events |
| PresentationPanel component with prompt, type selector, real-time progress, MP4 player |
| ContentStudio Presentations tab wiring PresentationPanel |
|
| Any future content studio panels using useContentJob (can use fine-grained progress) |
|
| added |
patterns |
|
|
| Fine-grained SSE progress: data.progress preferred over coarse statusToProgress fallback |
| mp4Base64 -> blob URL via useMemo with URL.revokeObjectURL cleanup in useEffect |
| Panel pattern: useContentJob + getContentJobAsset fetch on job.status === done |
|
|
| created |
modified |
| ui/src/components/PresentationPanel.tsx |
|
| ui/src/hooks/useContentJob.ts |
| ui/src/pages/ContentStudio.tsx |
|
|
| data.progress preferred over statusToProgress when typeof data.progress === 'number' — backward-compatible for all non-video job types |
| mp4Base64 blob URL created in useMemo and cleaned up via useEffect return — avoids memory leaks across rerenders |
| PresentationBundle interface defined locally in PresentationPanel — avoids cross-package import from server types |
|
| Fine-grained SSE progress reading: check typeof data.progress === 'number' before falling back to coarse status mapping |
| Video blob URL lifecycle: useMemo for creation, useEffect cleanup for revocation |
|
| PRES-01 |
| PRES-02 |
| PRES-03 |
| PRES-04 |
|
5min |
2026-04-04 |