- Fix unused function warnings by renaming to _unusedExtractTags - Fix type errors in nostrTagSystem.ts for includes() calls - Fix type errors in reviews.ts for filter kinds array - Fix ArrayBuffer type errors in articleEncryption.ts - Remove unused imports (DecryptionKey, decryptArticleContent, extractTagsFromEvent) - All TypeScript checks now pass without disabling any controls
5.5 KiB
5.5 KiB
Fonctionnalités implémentées
Auteur : Équipe 4NK
Architecture de base
Nostr Paywall → zapwall4Science
- Publication d'articles avec aperçus gratuits et contenu payant
- Paiement Lightning via Alby/WebLN (remplacement de Rizful)
- Connexion via NostrConnect (use.nsec.app)
- Interface TypeScript/Next.js
Services principaux
- Nostr : Pool de connexions, publication/récupération d'événements, profils
- Paiements : Invoices Lightning, vérification zap receipts (NIP-57), envoi automatique contenu privé
- Stockage : IndexedDB avec chiffrement AES-GCM pour contenu privé
- Notifications : Surveillance des paiements en temps réel (zap receipts)
Fonctionnalités utilisateur
Profil et articles
- Page profil (
/profile) avec informations utilisateur - Liste des articles publiés par l'utilisateur
- Recherche et filtres (auteur, prix, texte)
- Tri (date, prix)
Édition et suppression
- Édition d'articles via événements Nostr (kind 1 avec tag
replace) - Suppression d'articles via événements Nostr (kind 5)
- Confirmation avant suppression
- Ré-encryptage du contenu privé lors de l'édition
Notifications
- Surveillance automatique des zap receipts (kind:9735) destinés à l'utilisateur
- Badge avec nombre de notifications non lues dans le header
- Centre de notifications (panneau latéral) avec liste des paiements
- Formatage du temps relatif (il y a X minutes/heures/jours)
- Marquer comme lu / marquer tout comme lu
- Tri par date (plus récentes en premier)
Scope : Uniquement notifications de paiements. Pas de mentions, reposts, likes. Si commentaires demandés plus tard, approbation explicite requise.
Stockage
IndexedDB avec chiffrement
- Remplacement de localStorage par IndexedDB
- Chiffrement AES-GCM du contenu privé
- Clé maître générée une fois et stockée en localStorage
- Secret par article :
<masterKey>:<articleId> - Expiration automatique (30 jours)
- Pas de fallback : échec si IndexedDB ou Web Crypto indisponible
Fichiers
lib/storage/indexedDB.ts: Service IndexedDBlib/storage/cryptoHelpers.ts: Helpers AES-GCMlib/articleStorage.ts: Gestion du stockage avec chiffrement
Hiérarchie de contenu
Structure
- Page auteur : Publication publique et gratuite (obligatoire avant de publier)
- Séries : Publications publiques et gratuites organisées par auteur
- Publications : Contenu confidentiel et gratuit pour l'auteur, payant pour l'accès (800 sats)
Navigation
- Home : Bouton "Créer page auteur" si pas de présentation, sinon "Publier une publication"
- Page auteur : Résumé du sponsoring et liste des séries
- Page série : Résumé de la série, illustration de couverture et liste des publications
Système de tags Nostr
Nouveau système (tous en anglais)
- Type :
#author,#series,#publication,#quote(tags simples) - Catégorie :
#sciencefictionou#research(tags simples) - ID :
#id_<id>(tag avec valeur) - Paywall :
#paywall(pour les publications payantes) - Payment :
#payment(optionnel, pour les notes de paiement)
Utilitaires
lib/nostrTagSystem.ts:buildTags(),extractTagsFromEvent(),buildTagFilter()- Migration complète depuis l'ancien système (
kind_type,site, etc.)
Séries et médias (NIP-95)
Séries
- Événements kind 1 avec tag
#series - Tags :
#sciencefictionou#research,#id_<id>,title,description,cover,preview - Agrégation du sponsoring et des paiements par série
Médias
- Upload d'images (≤5Mo) et vidéos (≤45Mo) via NIP-95
- Tags
banneretmediadans les événements - Validations de taille et type
- Support dans les articles et séries
Avis (reviews)
- Événements kind 1 avec tag
#quote - Tags :
#sciencefictionou#research,#id_<id>,#article,reviewer,title - Rémunération possible avec tags
rewardedetreward_amount
Optimisations et nettoyage
Refactoring
- Division des fichiers > 250 lignes
- Extraction des fonctions > 40 lignes
- Modules dédiés : parsing, messages privés, vérification zap, subscriptions, polling, résolution invoices, stockage, handlers
Code quality
- Respect strict
exactOptionalPropertyTypes - Fonctions < 40 lignes, fichiers < 250 lignes
- Pas de fallback implicite
- Logs structurés
- Pas d'analytics
Intégrations
Alby/WebLN
- Remplacement de Rizful par Alby/WebLN
- Standard WebLN compatible avec tous les portefeuilles
- Pas d'API backend nécessaire
- Service
AlbyServicepour enable, makeInvoice, sendPayment
Priorité 1 (implémenté)
- Génération d'invoice côté auteur lors de la publication
- Invoice stockée dans tags Nostr et localStorage
- Vérification de l'invoice avant création d'une nouvelle
- Signature distante (NIP-46) préparée
Internationalisation (i18n)
Système de traduction
- Fichiers texte plats :
public/locales/fr.txt,public/locales/en.txt - Format :
key=valueavec paramètres{{param}} - Hook
useI18npour charger et utiliser les traductions - Initialisation dans
_app.tsxavec locale par défaut (fr)
Langues supportées
- Français (fr) : langue par défaut
- Anglais (en) : disponible
- Extensible : ajout de nouvelles langues via fichiers de traduction
Financement IA
Jauge de financement
- Composant
FundingGaugesur la page d'accueil - Affiche montant collecté, cible (0.27 BTC) et pourcentage
- Calcul via
lib/fundingCalculation.ts - Description de l'usage des fonds pour le développement IA (développement et matériel)