6.4 KiB
6.4 KiB
Implémentation du système de notifications
Date : Décembre 2024 Status : ✅ Complété
Objectif
Permettre aux utilisateurs de recevoir des notifications en temps réel lorsque leurs articles sont achetés (paiements reçus via zap receipts).
Fonctionnalités implémentées
1. Surveillance des paiements
- Subscription automatique aux zap receipts (kind:9735) destinés à l'utilisateur connecté
- Détection en temps réel des nouveaux paiements
- Extraction des informations de paiement (montant, article, auteur du paiement)
2. Badge de notification
- Badge avec le nombre de notifications non lues
- Affiché dans le header à côté du profil utilisateur
- Masqué si aucune notification non lue
3. Centre de notifications
- Panneau latéral/dropdown avec liste de toutes les notifications
- Notifications triées par date (plus récentes en premier)
- Indicateur visuel pour les notifications non lues (fond bleu clair + point bleu)
- Formatage du temps relatif (il y a X minutes/heures/jours)
4. Gestion des notifications
- Marquer une notification comme lue en cliquant dessus
- Marquer toutes les notifications comme lues
- Supprimer une notification
- Stockage persistant dans localStorage (par utilisateur)
- Limite de 100 notifications stockées
5. Navigation
- Clic sur une notification pour la marquer comme lue et fermer le panneau
- Lien vers l'article associé (si disponible)
Fichiers créés
types/notifications.ts
Types TypeScript pour les notifications :
NotificationType: Types de notifications (payment, mention, comment)Notification: Interface pour une notificationNotificationState: État des notifications
lib/notifications.ts
Service de notifications :
NotificationService: Classe pour surveiller les zap receiptssubscribeToPayments(): S'abonne aux paiements pour un utilisateurloadStoredNotifications(): Charge les notifications depuis localStoragesaveNotifications(): Sauvegarde les notifications dans localStoragemarkNotificationAsRead(): Marque une notification comme luemarkAllAsRead(): Marque toutes les notifications comme luesdeleteNotification(): Supprime une notification
hooks/useNotifications.ts
Hook React pour gérer les notifications :
- Charge les notifications stockées au montage
- S'abonne aux nouvelles notifications en temps réel
- Calcule le nombre de notifications non lues
- Méthodes pour marquer comme lue et supprimer
Signature :
export function useNotifications(userPubkey: string | null)
Retour :
{
notifications: Notification[]
unreadCount: number
loading: boolean
markAsRead: (notificationId: string) => void
markAllAsRead: () => void
deleteNotification: (notificationId: string) => void
}
components/NotificationBadge.tsx
Badge de notification simple :
- Affiche une icône de cloche
- Badge avec le nombre de notifications non lues
- Masqué si aucune notification non lue
- Cliquable pour ouvrir le centre de notifications
components/NotificationCenter.tsx
Centre de notifications complet :
- Panneau dropdown avec liste des notifications
- Header avec bouton "Mark all as read" et fermeture
- Liste scrollable des notifications
- Chaque notification affiche :
- Titre et message
- Temps relatif
- Indicateur de non-lu
- Bouton de suppression
- Lien vers l'article (si disponible)
- Backdrop pour fermer en cliquant à l'extérieur
Fichiers modifiés
lib/nostr.ts
- Ajout de
getPool(): Méthode publique pour obtenir l'instance du pool (nécessaire pour le service de notifications)
components/ConnectButton.tsx
- Intégration de
NotificationCenterdans le header - Le badge de notification apparaît à côté du nom de l'utilisateur
Flux utilisateur
-
Réception d'un paiement :
- Un utilisateur achète un article de l'auteur connecté
- Un zap receipt est publié sur Nostr
- Le service de notifications détecte le zap receipt
- Une notification est créée et ajoutée à la liste
-
Visualisation des notifications :
- Le badge affiche le nombre de notifications non lues
- L'utilisateur clique sur le badge pour ouvrir le centre de notifications
- La liste des notifications s'affiche avec les plus récentes en premier
-
Gestion des notifications :
- Clic sur une notification pour la marquer comme lue
- Bouton "Mark all as read" pour tout marquer comme lu
- Bouton de suppression pour supprimer une notification
- Clic sur "View article" pour voir l'article associé
Stockage
Les notifications sont stockées dans localStorage avec la clé notifications_{userPubkey}. Cela permet :
- Persistance entre les sessions
- Notifications par utilisateur (si plusieurs comptes)
- Limite de 100 notifications (les plus anciennes sont supprimées)
Limitations et améliorations futures
Limitations actuelles
- Seulement les notifications de paiement (pas de mentions, commentaires, etc.)
- Pas de notifications push (navigateur)
- Stockage limité à localStorage (100 notifications max)
- Pas de filtrage par type de notification
- Pas de recherche dans les notifications
Améliorations possibles
- Notifications push : Utiliser l'API Notifications du navigateur
- Base de données : Remplacer localStorage par IndexedDB ou une DB externe
- Types de notifications : Ajouter mentions, commentaires, réactions
- Filtres : Filtrer par type, date, statut (lu/non-lu)
- Recherche : Rechercher dans les notifications
- Notifications groupées : Grouper les notifications similaires
- Paramètres : Permettre à l'utilisateur de configurer quelles notifications recevoir
Tests recommandés
-
Réception de notifications :
- Publier un article
- Faire un paiement pour cet article (depuis un autre compte)
- Vérifier que la notification apparaît
-
Badge :
- Vérifier que le badge affiche le bon nombre
- Vérifier que le badge disparaît quand toutes les notifications sont lues
-
Centre de notifications :
- Ouvrir/fermer le panneau
- Marquer une notification comme lue
- Marquer toutes comme lues
- Supprimer une notification
-
Persistance :
- Recevoir des notifications
- Recharger la page
- Vérifier que les notifications sont toujours là
-
Performance :
- Tester avec un grand nombre de notifications
- Vérifier que le scroll fonctionne bien
- Vérifier que les nouvelles notifications arrivent rapidement