# Chapitre 2 : Gestion d'état
SmartCommon propose plusieurs hooks pour gérer l'état selon les besoins :
- **useGlobalStates** : état partagé entre composants avec persistance
- **useStates** : état local d'un composant
- **useForm** : état spécialisé pour les formulaires
## useGlobalStates
État global accessible partout, avec persistance automatique.
### Syntaxe de base
```javascript
import { useGlobalStates } from '@cap-rel/smartcommon';
function MyComponent() {
const gst = useGlobalStates();
return (
);
};
```
## useForm
Hook spécialisé pour les formulaires avec validation.
### Syntaxe de base
```javascript
import { useForm } from '@cap-rel/smartcommon';
import { Form, Input, Button } from '@cap-rel/smartcommon';
function LoginForm() {
const form = useForm({ defaultValues: { email: '', password: '' } });
const handleSubmit = async (data) => {
console.log('Données validées:', data);
};
return (
);
}
```
### Avec valeurs initiales
```javascript
function EditProductForm({ product }) {
const form = useForm({
defaultValues: {
label: product.label,
price: product.price,
description: product.description
}
});
const handleSubmit = async (data) => {
await api.private.put(`products/${product.id}`, { json: data });
};
return (
);
}
```
### Validation manuelle avec setField
```javascript
// useForm ne fait pas de validation automatique.
// Utilisez setField pour gérer les erreurs manuellement :
form.setField({
name: 'email',
value: inputValue,
errors: {
required: { condition: !inputValue },
format: { condition: inputValue && !isValidEmail(inputValue) }
}
});
// Vérifier les erreurs
const hasError = form.get('errors.email.required'); // true | false
```
## Comparaison des hooks d'état
^ Hook ^ Portée ^ Persistance ^ Cas d'usage ^
| useGlobalStates | Application | localStorage | Session, préférences, panier |
| useStates | Composant | Non | État de page, chargement |
| useForm | Composant | Non | Formulaires avec validation |
| useState (React) | Composant | Non | État simple |
## Bonnes pratiques
### 1. Choisir le bon hook
```javascript
// Session utilisateur → useGlobalStates
const gst = useGlobalStates();
const session = gst.get('session');
// État de chargement d'une page → useStates
const st = useStates({ initialStates: { loading: true, data: null } });
// Formulaire → useForm
const form = useForm({ defaultValues: { name: '', email: '' } });
// Toggle simple → useState
const [isOpen, setIsOpen] = useState(false);
```
### 2. Organiser l'état global
```javascript
// appConfig.js
globalState: {
reducers: {
// Auth
session: null,
// Préférences utilisateur
settings: { lng: 'fr', theme: 'light' },
// Données métier globales
cart: { items: [], total: 0 },
// Cache
categories: []
}
}
```
## useConfirm
Hook pour afficher des dialogues de confirmation et d'alerte modaux.
### Import
```javascript
import { useConfirm } from '@cap-rel/smartcommon';
```
### Fonctions retournées
Le hook retourne un objet avec deux fonctions :
```javascript
const { confirm, alert } = useConfirm();
```
- **confirm** : affiche un dialogue avec boutons Confirmer / Annuler, retourne `true` ou `false`
- **alert** : affiche un dialogue avec un seul bouton OK, retourne toujours `true`
### Utilisation de confirm
```javascript
function DeleteButton({ item, onDelete }) {
const { confirm } = useConfirm();
const handleDelete = async () => {
const confirmed = await confirm({
type: 'delete',
title: 'Supprimer cet élément ?',
message: `Voulez-vous vraiment supprimer "${item.name}" ?`,
detail: item.ref,
confirmText: 'Supprimer',
cancelText: 'Annuler'
});
if (confirmed) {
onDelete(item.id);
}
};
return ;
}
```
### Utilisation de alert
```javascript
function SaveButton({ onSave }) {
const { alert } = useConfirm();
const handleSave = async () => {
try {
await onSave();
await alert({
type: 'info',
title: 'Succès',
message: 'Les données ont été enregistrées.'
});
} catch (err) {
await alert({
type: 'warning',
title: 'Erreur',
message: err.message
});
}
};
return ;
}
```
### Options
^ Option ^ Type ^ Description ^
| type | string | Type de dialogue : `'danger'`, `'delete'`, `'warning'`, `'info'` |
| title | string | Titre du dialogue |
| message | string | Message de confirmation |
| detail | string | Texte complémentaire affiché dans un encadré gris |
| confirmText | string | Texte du bouton de confirmation |
| cancelText | string | Texte du bouton d'annulation |
### Types et icônes
^ Type ^ Icône ^ Couleur du bouton ^
| danger | Corbeille (rouge) | Rouge |
| delete | Corbeille (rouge) | Rouge |
| warning | Triangle exclamation (orange) | Orange |
| info | Info (bleu) | Bleu |
| (autre) | Point d'interrogation (gris) | Bleu (défaut) |
### Prérequis
Le composant `ConfirmProvider` doit envelopper l'application :
```javascript
import { ConfirmProvider } from '@cap-rel/smartcommon';
function App() {
return (
);
}
```
La prop `labels` permet de définir les textes par défaut des boutons. Si non fournie, les valeurs sont `"Cancel"` et `"OK"`.
## usePWAUpdate
Hook pour détecter et gérer les mises à jour de l'application PWA.
### Import
```javascript
import { usePWAUpdate } from '@cap-rel/smartcommon';
```
### Utilisation
```javascript
function UpdateBanner() {
const {
updateAvailable,
updateActivated,
checkForUpdates,
applyUpdate
} = usePWAUpdate({
checkInterval: 300000 // Vérifier toutes les 5 min
});
if (!updateAvailable) return null;
return (
Une mise à jour est disponible
);
}
```
### Avec rechargement automatique
```javascript
function App() {
usePWAUpdate({
autoReload: true,
onUpdateAvailable: () => {
console.log('Mise à jour disponible');
},
onUpdateActivated: () => {
console.log('Mise à jour activée');
}
});
return ;
}
```
### Options
^ Option ^ Type ^ Défaut ^ Description ^
| autoReload | boolean | false | Recharger automatiquement après mise à jour |
| checkInterval | number | 0 | Intervalle de vérification en ms (0 = désactivé) |
| onUpdateAvailable | function | - | Callback quand une mise à jour est disponible |
| onUpdateActivated | function | - | Callback quand la mise à jour est activée |
### Valeurs retournées
^ Propriété ^ Type ^ Description ^
| updateAvailable | boolean | Mise à jour en attente |
| updateActivated | boolean | Mise à jour activée |
| registration | object | ServiceWorkerRegistration |
| checkForUpdates | function | Vérifier manuellement |
| applyUpdate | function | Appliquer la mise à jour |
| reloadPage | function | Recharger la page |
## UpdatePrompt
Composant UI prêt à l'emploi qui encapsule `usePWAUpdate` et affiche une notification quand une mise à jour est disponible.
### Import
```javascript
import { UpdatePrompt } from '@cap-rel/smartcommon';
```
### Variantes d'affichage
Trois variantes sont disponibles :
- **toast** (défaut) : notification discrète via react-hot-toast
- **banner** : bandeau fixe en haut ou en bas de l'écran
- **modal** : dialogue modal centré
### Utilisation directe
```javascript
function App() {
return (
);
}
```
### Via le Provider
Le `Provider` de SmartCommon accepte une prop `pwaUpdate` qui intègre automatiquement `UpdatePrompt` :
```javascript
import { Provider } from '@cap-rel/smartcommon';
import { config } from './appConfig';
export const App = () => (
);
```
### Props
^ Prop ^ Type ^ Défaut ^ Description ^
| variant | string | `"toast"` | `"toast"`, `"banner"` ou `"modal"` |
| position | string | `"bottom"` | Position du banner : `"top"` ou `"bottom"` |
| autoReload | boolean | `false` | Recharger automatiquement après activation |
| checkInterval | number | `0` | Intervalle de vérification en ms (0 = désactivé) |
| labels | object | - | Textes personnalisés (voir ci-dessous) |
| onUpdateAvailable | function | - | Callback quand une mise à jour est détectée |
| onUpdateActivated | function | - | Callback quand la mise à jour est activée |
### Labels par défaut
^ Clé ^ Valeur par défaut ^
| title | "Mise à jour disponible" |
| message | "Une nouvelle version est disponible." |
| reloadButton | "Rafraîchir" |
| dismissButton | "Plus tard" |
## Points clés à retenir
1. **useGlobalStates** pour les données partagées et persistées
2. **useStates** pour l'état local avec path notation
3. **useForm** pour les formulaires avec validation manuelle
4. **useConfirm** pour les dialogues de confirmation et d'alerte
5. **usePWAUpdate** pour détecter les mises à jour PWA
6. **UpdatePrompt** pour afficher une UI de mise à jour prête à l'emploi
7. **Path notation** : `user.address.city`, `items[0]`, `items[]`
8. Configurer **storage.local** pour la persistance
[[:15_training:module7-smartcommon-hooks:useapi|← Chapitre précédent]] | [[:15_training:module7-smartcommon-hooks:start|Retour au module]] | [[:15_training:module7-smartcommon-hooks:utilitaires|Chapitre suivant : Utilitaires →]]