feat(client): frontend (formulaire d'ajout + file d'attente) #3
Loading…
Reference in a new issue
No description provided.
Delete branch "feature/frontend-ui"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Résumé
Empilée sur #2 (elle-même sur #1) — à merger en dernier de la chaîne. Interface web complète : jusqu'ici tout était backend/API, cette PR ajoute l'UI par-dessus les routes existantes.
Détails
client/src/views/downloadForm/: sélecteur de mode (vidéo/audio/miniature) partagé entre les deux façons d'ajouter une vidéo — URL directe, ou recherche de chaîne (GET /api/channel) avec bouton "Ajouter" par résultat.client/src/views/queuePanel/: sondeGET /api/queuetoutes les 1,5s, affiche statut/progression/erreur par élément, bouton d'annulation et lien de téléchargement natif (<a download>, pas de fetch+blob — c'est le navigateur qui gère le téléchargement).client/src/api/: clients fetch typés vers le backend, chaqueawaitdans son propretry/catchavec message d'erreur distinct (réseau/HTTP/JSON).createElement/textContent, jamaisinnerHTMLavec du texte venant de YouTube (titres affichés tels quels, pas de risque d'injection).QueueItemgagne un champtitleoptionnel (purement informatif, jamais utilisé pour construire la commande yt-dlp) — affichage plus lisible qu'une URL brute dans la file.client/tsconfig.json/build.mjs: cible relevée à ES2022 (nécessaire pourError.cause, utilisé dans les clients API).format.ts— pas de jsdom, le câblage DOM (formulaires, rendu) est vérifié manuellement dans le navigateur.Deux bugs réels trouvés en testant dans un vrai navigateur (pas seulement en lisant le code)
.download-form__options[hidden]restait affiché — undisplay: flexde ma propre feuille de style écrasait la règle[hidden] { display: none }du navigateur (même spécificité, la feuille de l'auteur gagne). Les panneaux d'options vidéo/audio s'affichaient tous les deux en même temps. Corrigé (&[hidden] { display: none; }).server/src/routes/channel.ts: ne mappait vers502que lesYtDlpError(code de sortie non nul) — pas les erreurs brutes de spawn (ex. binaire yt-dlp introuvable,ENOENT), qui remontaient donc en500générique au lieu du message propre attendu. Repéré en testant sans yt-dlp installé localement. Corrigé + test de non-régression (channelRoute.test.ts).Vérifications locales
npm run lint(Biome, racine) : cleannpm run typecheck+npm test+npm run build, serveur et client : clean, 60 tests serveur + 7 tests client🤖 Generated with Claude Code