162 lines
5.9 KiB
Markdown
162 lines
5.9 KiB
Markdown
# 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
|
|
```typescript
|
|
// Stockage dans sessionStorage
|
|
sessionStorage.setItem('docuseal_signature_b64', normalizedSignature);
|
|
|
|
// Lecture depuis sessionStorage
|
|
const signature = sessionStorage.getItem('docuseal_signature_b64');
|
|
```
|
|
|
|
#### Après
|
|
```typescript
|
|
// É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
|
|
```typescript
|
|
// Écriture dans sessionStorage
|
|
sessionStorage.setItem('docuseal_signature_b64', signatureB64);
|
|
|
|
// Lecture depuis sessionStorage dans le rendu
|
|
const signatureB64 = sessionStorage.getItem('docuseal_signature_b64');
|
|
```
|
|
|
|
#### Après
|
|
```typescript
|
|
// É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)
|