| 42-wallpapers-social-format-conversion-voice |
06 |
ui |
| react |
| typescript |
| drag-drop |
| format-conversion |
| deep-link |
| SSE |
| FormData |
| multipart |
| shadcn |
| lucide |
|
| phase |
plan |
provides |
| 42-wallpapers-social-format-conversion-voice |
03 |
POST /api/companies/:companyId/convert (multipart), GET /api/system/converters, ConvertBundle type |
|
| phase |
provides |
| 40-content-job-infra |
useContentJob hook, getContentJobAsset, SSE job tracking pattern |
|
|
| ui/src/api/convert.ts — submitConvertJob (multipart) and getConverterCapabilities API client |
| ui/src/components/ConvertPanel.tsx — drag-drop + grouped format chips + AI fallback notice + download |
| ui/src/pages/ConvertPage.tsx — /convert route with deep-link URL param reading |
| ui/src/App.tsx — three route variants /convert, /convert/:src, /convert/:src/:tgt |
|
| Any future phase adding nav links to /convert |
|
| added |
patterns |
|
|
| Direct fetch (not api.post) for multipart submissions that need per-status-code inspection (422 vs 202) |
| Direct EventSource connection for pre-submitted jobs (bypasses useContentJob.submit which re-submits) |
| FORMAT_GROUPS constant exported from ConvertPanel for reuse in ConvertPage validation |
| normalizeFormatParam helper |
| toLowerCase + allowlist check, silently returns undefined for invalid params |
|
|
|
| created |
modified |
| ui/src/api/convert.ts |
| ui/src/components/ConvertPanel.tsx |
| ui/src/pages/ConvertPage.tsx |
|
|
|
| Direct fetch used in submitConvertJob (not api.postForm) to inspect 422 vs 202 status before throwing — api.request() throws on !res.ok, but 422 is a valid business response with MIME error body |
| Direct EventSource in ConvertPanel for already-submitted jobs — useContentJob.submit() calls submitContentJob internally and cannot track an existing jobId without re-submitting |
| FORMAT_GROUPS exported from ConvertPanel so ConvertPage can import the same constant for allowlist validation without duplicating the list |
| AI fallback notice shown per target format group (Images/AV/Docs/Data) based on capabilities, not per individual format pair — matches CONV-08 spec that all paths fall to AI bridge when direct converter unavailable |
|
| Format chip role=radio within role=radiogroup — matches accessibility spec from 42-UI-SPEC.md |
| Drop zone uses motion-safe: Tailwind variant to disable transition for prefers-reduced-motion |
|
| CONV-01 |
| CONV-02 |
| CONV-03 |
| CONV-04 |
| CONV-05 |
| CONV-06 |
| CONV-07 |
| CONV-08 |
| CONV-09 |
|
12min |
2026-04-04 |