espace-paie-odentas/SIGNATURE_STATE_REFACTORING.md

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() par setActiveSignature() (ligne ~524)
  • Remplacement de sessionStorage.getItem() par lecture de activeSignature (ligne ~444)
  • Ajout d'activeSignature dans 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() par setSignatureB64ForDocuSeal() (ligne ~780)
  • Remplacement de sessionStorage.getItem() par lecture de signatureB64ForDocuSeal (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_details avec org_id du contrat
  • Retourne signature_b64 dans la réponse

/api/signatures-electroniques/contrats

  • Liste les contrats disponibles pour signature
  • Enrichit chaque contrat avec signature_b64 de son organisation

🧪 Tests recommandés

  1. Isolation : Ouvrir un contrat directement par URL → signature doit être pré-remplie
  2. Mise à jour : Modifier une signature → devrait être visible immédiatement
  3. Staff : En tant que staff, changer d'organisation → nouvelle signature chargée
  4. Sans signature : Organisation sans signature → pas de pré-remplissage (normal)
  5. 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

  1. Créer un hook personnalisé useOrganizationSignature(orgId) pour centraliser la logique
  2. Implémenter un cache React Query pour éviter les rechargements
  3. Ajouter un indicateur visuel de chargement pendant la récupération de la signature
  4. Précharger les signatures des organisations fréquemment utilisées

Date de refactorisation : 14 octobre 2025
Fichiers modifiés :

  • app/(app)/signatures-electroniques/page.tsx
  • app/(app)/contrats/[id]/page.tsx

Compatibilité : Rétrocompatible (les anciennes signatures en base64 pur fonctionnent toujours)