story-research-zapwall/features/skeleton-loaders-toast-notifications.md
2026-01-15 11:31:09 +01:00

222 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Skeleton Loaders, Toast Notifications, Indicateur Visuel et Raccourcis Clavier
**Auteur** : Équipe 4NK
**Date** : 2025-01-27
## Objectif
Implémenter les quatre premières améliorations UX de priorité haute :
1. Skeleton loaders - Remplacer les messages "Loading..." par des skeleton loaders
2. Toast notifications - Intégrer le système de toast pour les confirmations visuelles
3. Indicateur visuel pour contenu débloqué - Badge et bordure distinctive pour les articles débloqués
4. Raccourcis clavier de base - `/` pour focus sur recherche, `Esc` pour fermer modals/overlays
## Impacts
### Skeleton loaders
- **Expérience utilisateur** : Amélioration de la perception de performance en affichant la structure du contenu pendant le chargement
- **Cohérence visuelle** : Remplacement des messages textuels par des éléments visuels cohérents avec le design system
- **Feedback visuel** : Animation subtile pour indiquer le chargement actif
### Toast notifications
- **Feedback utilisateur** : Confirmations visuelles immédiates après les actions importantes
- **Accessibilité** : Toasts avec `role="alert"` et `aria-live="polite"` pour les screen readers
- **Expérience utilisateur** : Retour visuel clair et non intrusif pour les actions réussies
### Indicateur visuel pour contenu débloqué
- **Clarté visuelle** : Identification immédiate des articles déjà débloqués
- **Feedback positif** : Confirmation visuelle que l'utilisateur a accès au contenu complet
- **Accessibilité** : Badge avec `aria-label` pour les screen readers
### Raccourcis clavier de base
- **Efficacité** : Réduction du nombre de clics pour accéder à la recherche
- **Accessibilité** : Navigation au clavier améliorée
- **Expérience utilisateur** : Raccourcis intuitifs et standards
## Modifications
### Skeleton loaders
1. **`components/ArticlesList.tsx`** :
- Ajout de `ArticleCardSkeleton` qui reproduit la structure d'une carte d'article
- Remplacement de `LoadingState` par un affichage de 3 skeletons
2. **`components/AuthorsList.tsx`** :
- Ajout de `AuthorCardSkeleton` qui reproduit la structure d'une carte d'auteur
- Remplacement de `LoadingState` par un affichage de 4 skeletons en grille
3. **`components/UserArticlesList.tsx`** :
- Ajout de `ArticleCardSkeleton` (identique à ArticlesList)
- Remplacement de `ArticlesLoading` par un affichage de 3 skeletons
- Ajout de l'import `Skeleton`
4. **`components/authorPage/AuthorPageContent.tsx`** :
- Extraction de `AuthorPageLoadingSkeleton`, `AuthorPageError`, `AuthorPageNotFound` pour respecter `max-lines-per-function`
- Remplacement du message de chargement par des skeletons représentant la structure de la page auteur
5. **`components/authorPresentationEditor/AuthorPresentationEditor.tsx`** :
- Remplacement de `LoadingNotice` par des skeletons représentant la structure du formulaire
- Ajout de l'import `Skeleton`
6. **`components/DocsContent.tsx`** :
- Remplacement du message de chargement par des skeletons représentant la structure du contenu markdown
- Suppression de l'import `t` non utilisé
7. **`components/FundingGauge.tsx`** :
- Remplacement de `FundingGaugeLoading` par des skeletons représentant la structure du gauge
- Ajout de l'import `Skeleton`
### Toast notifications
1. **`components/ui/ToastContainer.tsx`** (nouveau) :
- Création du système de gestion des toasts avec `ToastProvider` et `useToast` hook
- Gestion d'une pile de toasts avec suppression automatique après durée configurable
- Affichage des toasts en position fixe (top-right) avec z-index élevé
2. **`pages/_app.tsx`** :
- Intégration du `ToastProvider` dans l'application pour rendre les toasts disponibles globalement
3. **`components/ArticleCard.tsx`** :
- Ajout d'un toast de succès après déblocage réussi d'un article
- Extraction de `useArticleCardState` pour respecter `max-lines-per-function`
- Extraction de `ArticleCardContent` pour réduire le nombre de lignes de `ArticleCard`
4. **`components/ArticleEditor.tsx`** :
- Ajout d'un toast de succès après publication réussie via `useEffect`
- Extraction de `usePublishSuccessToast` pour respecter `max-lines-per-function`
5. **`components/PaymentModal.tsx`** :
- Ajout d'un toast de succès après copie d'invoice dans `copyInvoiceToClipboard`
- Ajout d'un toast de succès après initiation du paiement dans `openWalletForInvoice`
- Mise à jour de `usePaymentModalState` pour accepter `showToast` optionnel
6. **`hooks/useArticlePayment.ts`** :
- Refactoring pour accepter un objet de paramètres au lieu de paramètres individuels (respect de `max-params`)
- Ajout du support `showToast` optionnel pour afficher des toasts après paiement réussi
- Propagation de `showToast` à travers `checkPaymentAndUnlock` et `startArticlePaymentFlow`
7. **`locales/fr.txt` et `locales/en.txt`** :
- Ajout des clés de traduction pour les toasts :
- `article.unlock.success` : "Article débloqué avec succès!" / "Article unlocked successfully!"
- `article.publish.success` : "Article publié avec succès!" / "Article published successfully!"
- `payment.modal.copySuccess` : "Facture copiée dans le presse-papiers" / "Invoice copied to clipboard"
- `payment.modal.paymentInitiated` : "Paiement initié avec succès" / "Payment initiated successfully"
- Ajout des clés de traduction manquantes pour `payment.modal.*` déjà utilisées dans le code
### Indicateur visuel pour contenu débloqué
1. **`components/ArticleCard.tsx`** :
- Ajout d'un badge "Débloqué" avec icône SVG de cadenas ouvert dans `ArticleHeader`
- Badge affiché uniquement si `article.paid === true`
- Badge avec variant "success" (vert) et `aria-label` pour l'accessibilité
- Ajout d'une bordure distinctive (border-2 border-neon-green/40) et d'un glow vert (shadow-[0_0_5px_#00ff41,0_0_10px_#00ff41]) sur la Card pour les articles débloqués
- Utilisation de `shadow-[...]` avec les valeurs de `tailwind.config.js` (glow-green)
2. **`locales/fr.txt` et `locales/en.txt`** :
- Ajout de la clé de traduction `article.unlocked.badge` : "Débloqué" / "Unlocked"
### Raccourcis clavier de base
1. **`hooks/useKeyboardShortcuts.ts`** (nouveau) :
- Création du hook pour gérer les raccourcis clavier globaux
- Détection de la touche `/` pour focus sur la barre de recherche
- Vérification que l'utilisateur n'est pas déjà dans un champ de saisie avant d'activer le raccourci
- Recherche de l'input avec `role="search"` et focus/select automatique
2. **`components/ui/Input.tsx`** :
- Ajout du support `forwardRef` pour permettre le focus programmatique
- Conservation de toutes les fonctionnalités existantes
3. **`components/SearchBar.tsx`** :
- Ajout du support `forwardRef` pour permettre le focus programmatique
- Ajout de `role="search"` pour l'accessibilité et la détection par le hook
- Ajout de `aria-label` pour l'accessibilité
4. **`pages/_app.tsx`** :
- Intégration du hook `useKeyboardShortcuts` dans l'application pour activer les raccourcis globaux
6. **`components/NotificationPanel.tsx`** :
- Ajout de la gestion de `Esc` pour fermer le panel de notifications
- Ajout de `useEffect` pour écouter les événements clavier
7. **`components/createSeriesModal/CreateSeriesModalView.tsx`** :
- Ajout de la gestion de `Esc` pour fermer la modal de création de série
- Ajout de la gestion du clic sur l'overlay pour fermer la modal
- Ajout de `document.body.style.overflow = 'hidden'` pour empêcher le scroll pendant l'ouverture
8. **Raccourci `Esc`** :
- Déjà implémenté pour les modals via `useModalKeyboard` dans `components/ui/Modal.tsx`
- Déjà implémenté pour le menu mobile via `useEffect` dans `components/ui/MobileMenu.tsx`
- Ajouté pour `NotificationPanel` et `CreateSeriesModalView`
## Modalités de déploiement
1. **Vérification** :
- `npm run type-check` : Aucune erreur TypeScript
- `npm run lint` : Aucune erreur de linting (4 warnings acceptables sur l'utilisation de l'index dans les keys pour les skeletons)
2. **Déploiement** :
- Utiliser les scripts de déploiement existants (`deploy.sh`, `update-from-git.sh`, `update-remote-git.sh`)
- Validation explicite requise avant déploiement
## Modalités d'analyse
1. **Skeleton loaders** :
- Vérifier visuellement que les skeletons apparaissent pendant le chargement des listes
- Vérifier que les animations de pulse sont fluides
- Vérifier que les skeletons disparaissent correctement une fois les données chargées
2. **Toast notifications** :
- Vérifier que les toasts apparaissent après :
- Déblocage réussi d'un article
- Publication réussie d'un article
- Copie d'invoice dans le presse-papiers
- Initiation du paiement avec Alby
- Vérifier que les toasts disparaissent automatiquement après 5 secondes (2 secondes pour la copie)
- Vérifier que les toasts peuvent être fermés manuellement via le bouton ×
- Vérifier l'accessibilité avec un screen reader (toasts annoncés via `aria-live="polite"`)
3. **Indicateur visuel pour contenu débloqué** :
- Vérifier que le badge "Débloqué" apparaît dans le header des articles débloqués
- Vérifier que l'icône de cadenas ouvert est visible dans le badge
- Vérifier que les cartes d'articles débloqués ont une bordure verte distinctive et un glow vert
- Vérifier que les articles non débloqués n'ont pas de badge ni de bordure distinctive
- Vérifier l'accessibilité avec un screen reader (badge annoncé via `aria-label`)
4. **Raccourcis clavier de base** :
- Vérifier que la touche `/` focus la barre de recherche et sélectionne son contenu
- Vérifier que le raccourci `/` ne s'active pas si l'utilisateur est déjà dans un champ de saisie (input, textarea, contenteditable)
- Vérifier que la touche `Esc` ferme les modals (`Modal.tsx`)
- Vérifier que la touche `Esc` ferme le menu mobile (`MobileMenu.tsx`)
- Vérifier que la touche `Esc` ferme le panel de notifications (`NotificationPanel.tsx`)
- Vérifier que la touche `Esc` ferme la modal de création de série (`CreateSeriesModalView.tsx`)
- Tester sur différentes pages (HomeView, ProfileView) pour s'assurer que le raccourci `/` fonctionne partout
## Pages affectées
- `components/ArticlesList.tsx`
- `components/AuthorsList.tsx`
- `components/UserArticlesList.tsx`
- `components/authorPage/AuthorPageContent.tsx`
- `components/authorPresentationEditor/AuthorPresentationEditor.tsx`
- `components/DocsContent.tsx`
- `components/FundingGauge.tsx`
- `components/ui/ToastContainer.tsx` (nouveau)
- `components/ArticleCard.tsx`
- `components/ArticleEditor.tsx`
- `components/PaymentModal.tsx`
- `hooks/useArticlePayment.ts`
- `pages/_app.tsx`
- `locales/fr.txt`
- `locales/en.txt`
- `components/ui/index.ts`
- `hooks/useKeyboardShortcuts.ts` (nouveau)
- `components/NotificationPanel.tsx`
- `components/createSeriesModal/CreateSeriesModalView.tsx`
- `docs/migration-status.md`
- `docs/todo-remaining.md`