# Toast

Ce répertoire fournit un **système de notifications toast** basé sur un contexte React. Il expose un provider, un hook, et un conteneur à placer dans le layout. Les features utilisent le hook pour déclencher des notifications.

---

## Structure

```
src/core/toast/
├── index.js              Toast, ToastProvider, useToast, ToastContainer
├── ToastContext.js        contexte, provider, hook useToast
├── ToastContainer.js      conteneur à monter dans le layout
└── Toast.js              composant d'affichage individuel
```

---

## Import

```js
import { ToastProvider, useToast, ToastContainer } from '@zen/core/toast';
```

---

## Mise en place

Entourer le layout avec `ToastProvider` et y placer `ToastContainer`.

```jsx
import { ToastProvider, ToastContainer } from '@zen/core/toast';

export default function RootLayout({ children }) {
  return (
    <ToastProvider>
      {children}
      <ToastContainer />
    </ToastProvider>
  );
}
```

`useToast` lève une erreur si appelé hors du `ToastProvider`.

---

## API

### `useToast()`

Hook qui expose les méthodes et l'état courant des toasts.

```js
const { success, error, warning, info, addToast, removeToast, clearAllToasts } = useToast();
```

**Méthodes de raccourci**

```js
success('Modifications enregistrées.');
error('La connexion a échoué.');
warning('Session sur le point d'expirer.');
info('Une mise à jour est disponible.');
```

Chaque méthode accepte un message et un objet `options` optionnel pour surcharger les paramètres par défaut.

```js
success('Fichier importé.', { duration: 3000, dismissible: false });
```

Toutes retournent l'`id` du toast créé.

**`addToast(toast)`**

Crée un toast à partir d'un objet complet.

```js
const id = addToast({
  type: 'success',
  message: 'Profil mis à jour.',
  title: 'Enregistré',
  duration: 4000,
  dismissible: true,
});
```

| Paramètre | Type | Défaut | Description |
|-----------|------|--------|-------------|
| `type` | `'success' \| 'error' \| 'warning' \| 'info'` | `'info'` | Variante visuelle |
| `message` | `string` | — | Corps du toast |
| `title` | `string` | Selon `type` | Titre affiché (optionnel) |
| `duration` | `number` | `5000` | Durée en ms avant disparition automatique. `0` pour désactiver |
| `dismissible` | `boolean` | `true` | Afficher le bouton de fermeture |

Durées par défaut selon le type : `error` → 7000 ms, `warning` → 6000 ms, `success` / `info` → 5000 ms.

**`removeToast(id)`**

Supprime un toast immédiatement par son `id`.

**`clearAllToasts()`**

Supprime tous les toasts actifs.

---

## ToastContainer

Composant à placer une seule fois dans le layout. Affiche les toasts en bas à droite de l'écran, empilés avec une animation de survol.

```jsx
<ToastContainer maxToasts={5} />
```

| Prop | Type | Défaut | Description |
|------|------|--------|-------------|
| `maxToasts` | `number` | `5` | Nombre maximum de toasts visibles simultanément |

Au survol du toast le plus récent, la pile se déploie pour afficher tous les toasts à leur taille réelle.

---

## Déclencher un toast depuis une feature

```js
// src/features/auth/actions/login.js
import { useToast } from '@zen/core/toast';

export function useLoginActions() {
  const { success, error } = useToast();

  async function login(credentials) {
    const result = await loginRequest(credentials);
    if (result.success) {
      success('Connexion réussie.');
    } else {
      error('Identifiants incorrects.');
    }
  }

  return { login };
}
```
