5.9 KiB
5.9 KiB
Refactorisation : Suppression de la dépendance à sessionStorage pour les signatures
📋 Résumé
Suppression de l'utilisation de sessionStorage pour stocker les signatures électroniques. Les signatures sont maintenant gérées via l'état React, éliminant les dépendances inter-pages et les problèmes de synchronisation.
🔧 Changements techniques
1. Page signatures électroniques (app/(app)/signatures-electroniques/page.tsx)
Avant
// Stockage dans sessionStorage
sessionStorage.setItem('docuseal_signature_b64', normalizedSignature);
// Lecture depuis sessionStorage
const signature = sessionStorage.getItem('docuseal_signature_b64');
Après
// État React local
const [activeSignature, setActiveSignature] = useState<string | null>(null);
// Mise à jour de l'état
setActiveSignature(normalizedSignature);
// Utilisation directe de l'état
const signature = activeSignature;
Fichier modifié :
- Ajout de l'état
activeSignature(ligne ~119) - Remplacement de
sessionStorage.setItem()parsetActiveSignature()(ligne ~524) - Remplacement de
sessionStorage.getItem()par lecture deactiveSignature(ligne ~444) - Ajout d'
activeSignaturedans les dépendances du useEffect (ligne ~465)
2. Page contrats (app/(app)/contrats/[id]/page.tsx)
Avant
// Écriture dans sessionStorage
sessionStorage.setItem('docuseal_signature_b64', signatureB64);
// Lecture depuis sessionStorage dans le rendu
const signatureB64 = sessionStorage.getItem('docuseal_signature_b64');
Après
// État React
const [signatureB64ForDocuSeal, setSignatureB64ForDocuSeal] = useState<string | null>(null);
// Mise à jour lors du chargement
setSignatureB64ForDocuSeal(signatureB64);
// Utilisation directe dans le rendu
const signatureB64 = signatureB64ForDocuSeal;
Fichier modifié :
- Ajout de l'état
signatureB64ForDocuSeal(ligne ~586) - Remplacement de
sessionStorage.setItem()parsetSignatureB64ForDocuSeal()(ligne ~780) - Remplacement de
sessionStorage.getItem()par lecture designatureB64ForDocuSeal(ligne ~1544)
✅ Avantages
1. Isolation des composants
- Chaque page gère sa propre signature indépendamment
- Plus de dépendance inter-pages cachée
- Code plus prévisible et maintenable
2. Chargement dynamique
- La signature est chargée directement depuis l'API
/api/contrats/[id]/signature - Plus besoin de passer par une autre page pour "initialiser" la signature
- Fonctionne même si l'utilisateur arrive directement sur la page contrat
3. Réactivité améliorée
- Les changements de signature se propagent automatiquement via React
- Re-render automatique quand la signature change
- Meilleure intégration avec l'écosystème React
4. Débogage simplifié
- L'état est visible dans React DevTools
- Plus de problèmes de synchronisation avec sessionStorage
- Logs plus clairs (état React vs storage navigateur)
5. Sécurité
- Les données ne persistent pas entre sessions
- Pas de risque de lecture de signatures par d'autres onglets
- Nettoyage automatique à la fermeture de la page
🔍 Flux de données
Page signatures-electroniques
1. Utilisateur ouvre un formulaire DocuSeal
2. openSignature() charge les données du contrat depuis l'API
3. La signature est extraite et stockée dans activeSignature
4. useEffect détecte le changement d'activeSignature
5. Re-render du DocuSeal form avec data-signature mis à jour
Page contrats/[id]
1. Utilisateur clique sur "Signature électronique"
2. openSignature() appelle /api/contrats/[id]/signature
3. L'API joint automatiquement signature_b64 depuis organization_details
4. La signature est stockée dans signatureB64ForDocuSeal
5. DocuSeal form est rendu avec data-signature pré-rempli
📦 API impliquée
/api/contrats/[id]/signature
- Récupère le contrat et joint automatiquement la signature de l'organisation
- Requête sur
organization_detailsavecorg_iddu contrat - Retourne
signature_b64dans la réponse
/api/signatures-electroniques/contrats
- Liste les contrats disponibles pour signature
- Enrichit chaque contrat avec
signature_b64de son organisation
🧪 Tests recommandés
- Isolation : Ouvrir un contrat directement par URL → signature doit être pré-remplie
- Mise à jour : Modifier une signature → devrait être visible immédiatement
- Staff : En tant que staff, changer d'organisation → nouvelle signature chargée
- Sans signature : Organisation sans signature → pas de pré-remplissage (normal)
- Suppression : Supprimer une signature → formulaires futurs sans pré-remplissage
🔄 Migration
Pour les utilisateurs
Aucun impact visible. Le comportement reste identique, mais plus fiable.
Pour les développeurs
Si vous avez du code qui :
- Lit
sessionStorage.getItem('docuseal_signature_b64')→ Utiliser l'état React approprié - Écrit dans sessionStorage pour les signatures → Utiliser setState
📝 Notes techniques
- Le format de signature reste inchangé :
data:image/png;base64,... - La fonction
normalizeSignatureFormat()assure la compatibilité avec les anciennes données - Les logs de debug contiennent toujours "sessionStorage" dans les messages pour clarté historique
🎯 Prochaines étapes possibles
- Créer un hook personnalisé
useOrganizationSignature(orgId)pour centraliser la logique - Implémenter un cache React Query pour éviter les rechargements
- Ajouter un indicateur visuel de chargement pendant la récupération de la signature
- Précharger les signatures des organisations fréquemment utilisées
Date de refactorisation : 14 octobre 2025
Fichiers modifiés :
app/(app)/signatures-electroniques/page.tsxapp/(app)/contrats/[id]/page.tsx
Compatibilité : ✅ Rétrocompatible (les anciennes signatures en base64 pur fonctionnent toujours)