> ## Documentation Index
> Fetch the complete documentation index at: https://www.mellowtel.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Guide d’Intégration et de Consentement pour le SDK Electron de Mellowtel

> La configuration du SDK Electron de Mellowtel couvre l’authentification au registre npm, l’installation, les dialogues de consentement, les paramètres, les compteurs de requêtes, le comportement du cycle de vie et le dépannage.

Intègre Mellowtel dans ton application Electron multiplateforme pour permettre aux utilisateurs de partager leur bande passante internet inutilisée en échange de récompenses ou de fonctionnalités premium. Le SDK Electron fonctionne partout où Electron fonctionne (macOS, Windows et Linux).

<Warning>
  **Le consentement de l'utilisateur est obligatoire.** Le SDK ne fonctionne que lorsque l'utilisateur a explicitement donné son accord. `init()` retourne silencieusement tôt lorsqu'il n'y a pas de consentement enregistré, donc si tu vois le SDK démarrer sans erreurs mais ne jamais envoyer de trafic, la raison la plus probable est que l'utilisateur n'a pas encore donné son accord.
</Warning>

## Prérequis

* Un compte Mellowtel et une clé de configuration (obtiens la tienne depuis le [tableau de bord](https://www.mellowtel.com/mellowtel-auth/)).
* Une application Electron avec accès au processus principal.

***

## Installation

### 1. Configurer l'authentification npm

Crée un fichier `.npmrc` dans le répertoire racine de ton projet pour indiquer à npm le registre des packages GitHub de Mellowtel et authentifier l'installation :

```bash theme={null}
@mellowtel-inc:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=YOUR_NPM_TOKEN
```

Remplace `YOUR_NPM_TOKEN` par le jeton d'installation ci-dessous. Clique pour révéler, puis utilise l'icône de copie sur le bloc de code pour le copier dans ton presse-papiers.

<Accordion title="Révéler le jeton d'installation">
  ```
  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
  ```
</Accordion>

### 2. Installer le package

Depuis la racine de ton projet, installe le SDK Electron :

```bash theme={null}
npm install @mellowtel-inc/mellowtel-electron
```

### 3. Ajouter à ton code

Dans ton fichier de processus principal Electron (typiquement `main.ts` ou `main.js`), importe le SDK, instancie-le avec ta clé de configuration, demande le consentement de l'utilisateur, puis appelle `init()` pour démarrer le service.

```typescript theme={null}
import { app, BrowserWindow } from 'electron';
import Mellowtel from '@mellowtel-inc/mellowtel-electron';


// Quand l'application est prête, crée la fenêtre
app.whenReady().then(async () => {
  let win = createWindow();
  
  const mellowtel: Mellowtel = new Mellowtel('YOUR_CONFIGURATION_KEY');

  await mellowtel.requestConsent(win, "Obtenez 3 mois gratuits")
  await mellowtel.init()
});
```

<Note>
  Remplace `YOUR_CONFIGURATION_KEY` par la clé de ton tableau de bord Mellowtel.
</Note>

**Ce que fait chaque appel :**

* `new Mellowtel(configurationKey, options?)` instancie le SDK. La seule option disponible aujourd'hui est `disableLogs`, qui est par défaut à `true`. Mets-le à `false` pendant l'intégration pour voir l'état de la connexion et l'activité des requêtes dans ton terminal.
* `requestConsent(window, incentive)` rend une **boîte de message native Electron** ancrée à la `BrowserWindow` que tu passes. Le deuxième argument est le titre principal du dialogue (par exemple, `"Obtenez 3 mois gratuits"`), affiché au-dessus d'une explication fixe de ce que fait Mellowtel. Cela se résout à `true` si l'utilisateur accepte, `false` si l'utilisateur refuse ou ferme le dialogue, et `undefined` si le consentement est déjà enregistré. Le SDK persiste automatiquement la décision d'opt-in, donc tu n'as pas besoin d'appeler `optIn()` ensuite.
* `init()` ne génère une erreur que lorsque `configurationKey` est vide. Si l'utilisateur n'a pas opté, il enregistre et retourne silencieusement. Sinon, il ouvre un WebSocket vers le backend de Mellowtel. L'appel n'est pas bloquant pour l'interface utilisateur du renderer, donc les fenêtres restent réactives pendant que la connexion est établie.

### Prévenir les interruptions de dialogue système (recommandé)

Le SDK est livré avec un assistant optionnel, `setupMellowtelApp()`, qui configure les indicateurs de ligne de commande Electron pour supprimer les dialogues système (popups de remplissage automatique, barres de traduction, invites d'authentification NTLM / Kerberos, intégration du gestionnaire de mots de passe, superpositions multimédias, dialogues de première exécution) qui interrompraient autrement tes utilisateurs lorsque les fenêtres cachées de Mellowtel traitent les requêtes en arrière-plan.

Appelle-le en haut de ton fichier de processus principal, **avant** `app.whenReady()`, et importe-le avec l'exportation par défaut de `@mellowtel-inc/mellowtel-electron`. Consulte le [README en amont](https://github.com/mellowtel-inc/mellowtel-electron#setupmellowtelapp-optional) pour l'utilisation canonique.

***

## Consentement de l'utilisateur

<Warning>
  Afficher un dialogue de consentement est **obligatoire**. Tu dois laisser les utilisateurs opter explicitement avant d'appeler `init()`, et tu dois fournir un moyen pour eux de gérer leur état d'opt-in à tout moment.
</Warning>

Tu as deux voies pour gérer le consentement :

1. **Utiliser le dialogue natif intégré** via `requestConsent(window, incentive)`. C'est le chemin le plus rapide et ce que montre l'extrait ci-dessus. Il rend un `dialog.showMessageBox` natif Electron avec ton texte d'incitation comme titre et persiste automatiquement la décision de l'utilisateur.
2. **Construire ta propre interface de consentement** et piloter le SDK via `optIn()`, `optOut()`, et `getOptInStatus()`. Utilise cela si tu veux un branding personnalisé, des explications plus riches, ou une localisation au-delà de ce que le dialogue natif offre.

### Ce que ton dialogue de consentement doit inclure

<Steps>
  <Step title="Expliquer ce que fait Mellowtel">
    Utilise un langage simple. Exemple : *"Cette application utilise Mellowtel pour partager votre bande passante internet inutilisée. En retour, vous obtenez \[avantage/fonctionnalité]. Vous pouvez vous désinscrire à tout moment dans les paramètres."*
  </Step>

  <Step title="Donner aux utilisateurs un choix clair">
    Inclure des options distinctes Accepter et Refuser.
  </Step>

  <Step title="Lier aux politiques">
    Inclure des liens vers les [Conditions d'utilisation](https://www.mellowtel.com/terms-and-conditions) et la [Politique de confidentialité](https://www.mellowtel.com/privacy-policy).
  </Step>
</Steps>

### Permettre aux utilisateurs de changer leur consentement plus tard

Mellowtel fournit un dialogue de paramètres intégré via `showConsentSettings(window)`. Il rend un dialogue natif avec des boutons Opt In / Opt Out qui correspondent à l'état actuel de l'utilisateur, et appelle en interne `optIn()` ou `optOut()` (plus la reconnexion du WebSocket lors de l'opt-in) lorsque l'utilisateur bascule. Connecte-le à un élément de menu ou un bouton de paramètres dans ton application pour que les utilisateurs puissent revoir leur choix.

Si tu préfères construire ton propre écran de paramètres, appelle `getOptInStatus()` pour lire l'état actuel et `optIn()` / `optOut()` pour le changer.

***

## Référence des méthodes

La classe `Mellowtel` expose les méthodes publiques suivantes. Toutes sont disponibles sur l'instance que tu as créée avec `new Mellowtel(configurationKey, options?)`.

**Cycle de vie**

* `init(): Promise<void>` démarre le service si l'utilisateur a opté, ou retourne silencieusement tôt sinon. Génère une erreur uniquement lorsque la clé de configuration est vide.
* `requestConsent(window: BrowserWindow, incentive: string): Promise<boolean | undefined>` affiche le dialogue de consentement natif intégré et persiste le résultat. Retourne `true` en cas d'acceptation, `false` en cas de refus ou de fermeture, `undefined` si le consentement a déjà été donné.
* `showConsentSettings(window: BrowserWindow): Promise<void>` affiche le dialogue de gestion du consentement intégré. Le SDK gère les transitions d'opt-in / opt-out en interne lorsque l'utilisateur bascule son choix.

**Contrôle manuel de l'opt-in**

* `optIn(): Promise<void>` marque l'utilisateur comme ayant opté sans afficher de dialogue. Utilise ceci uniquement après avoir collecté le consentement via ton propre UI.
* `optOut(): Promise<void>` marque l'utilisateur comme ayant opté et ferme la connexion WebSocket active.
* `getOptInStatus(): boolean | undefined` retourne l'état actuel de l'opt-in, ou `undefined` si l'utilisateur n'a jamais fait de choix.
* `getNodeId(): string` retourne l'identifiant de nœud Mellowtel pour cette installation. Utile lors du dépôt de tickets de support.

**Compteurs de requêtes**

Les comptes de requêtes sont persistés localement via `electron-store` et survivent aux redémarrages de l'application. Fais-les apparaître dans ton propre UI si tu veux montrer aux utilisateurs l'impact de leur opt-in.

* `getTotalRequestCount(): number` retourne le total des requêtes traitées depuis l'installation.
* `getDailyRequestCount(): number` retourne le nombre de requêtes traitées aujourd'hui.
* `getRequestCountForDate(date: string): number` retourne le compte pour une date spécifique `YYYY-MM-DD`.
* `getDailyRequestsHistory(): { [date: string]: number }` retourne chaque compte quotidien sous forme de carte.
* `getRequestCountsInRange(startDate: string, endDate: string): { [date: string]: number }` retourne les comptes pour une plage de dates.
* `getRequestCounts(): { total: number; daily: number; dailyHistory: { [date: string]: number } }` retourne les trois compteurs en un seul appel.

***

## Arrêt et Cycle de Vie

Le SDK Electron **ne** s'enregistre pas ses propres gestionnaires `before-quit` ou `will-quit`. Lorsque ton processus Electron se termine, la connexion WebSocket en arrière-plan est détruite avec lui, et aucun nettoyage explicite n'est requis de ton côté.

Si tu veux déconnecter Mellowtel en cours de session (par exemple, lorsqu'un utilisateur bascule un paramètre "pause" dans ton application), appelle `optOut()`. Cela efface à la fois le drapeau d'opt-in et ferme la connexion active. Pour te reconnecter, appelle `optIn()` suivi de `init()`.

## Persistance du Consentement

L'état d'opt-in est stocké dans le chemin de configuration `electron-store` par défaut de la plateforme :

* macOS : `~/Library/Application Support/<YourAppName>/config.json`
* Windows : `%APPDATA%\<YourAppName>\config.json`
* Linux : `~/.config/<YourAppName>/config.json`

L'état survit aux mises à jour de l'application. Désinstaller ton application ne le supprimera pas automatiquement à moins que ton désinstalleur ne supprime explicitement le répertoire de configuration de l'application.

***

## Dépannage

<AccordionGroup>
  <Accordion title="Erreur &#x22;Package not found&#x22; lors de l’installation">
    1. Vérifie que `.npmrc` est à la racine du projet, à côté de ton `package.json`.
    2. Assure-toi que le jeton n'a pas d'espaces blancs au début ou à la fin.
    3. Vide le cache npm et réessaie en exécutant `npm cache clean --force` suivi de `npm install`.
  </Accordion>

  <Accordion title="Erreur &#x22;Unauthorized&#x22; ou 401 lors de l’installation">
    1. Vérifie que le jeton dans `.npmrc` est correct et actif. Si tu n'es pas sûr, demande un nouveau jeton à [info@mellowtel.com](mailto:info@mellowtel.com).
    2. Confirme que la ligne `@mellowtel-inc:registry` est présente et pointe vers `https://npm.pkg.github.com/`.
  </Accordion>

  <Accordion title="Le dialogue de consentement n'apparaît jamais">
    1. Assure-toi d'appeler `requestConsent` **après** que `app.whenReady()` ait été résolu et avec une référence `BrowserWindow` valide et non détruite.
    2. Si tu utilises `setupMellowtelApp()`, vérifie qu'il est appelé **avant** `app.whenReady()`, pas après.
  </Accordion>

  <Accordion title="&#x22;init() s’exécute sans erreurs mais rien ne se passe&#x22;">
    C'est intentionnel. `init()` retourne silencieusement tôt lorsque l'utilisateur n'a pas opté. Vérifie `getOptInStatus()` pour confirmer. Si cela retourne `undefined` ou `false`, exécute `requestConsent` d'abord. Note que le journal interne "User is not opted in" est avalé lorsque `disableLogs` est laissé à sa valeur par défaut (voir "Les journaux sont silencieux" ci-dessous), donc le terminal ne te donne aucun signal dans un sens ou dans l'autre jusqu'à ce que tu changes ce drapeau.
  </Accordion>

  <Accordion title="Les journaux sont silencieux">
    L'option de constructeur `disableLogs` est par défaut à `true`. Passe `{ disableLogs: false }` comme deuxième argument au constructeur pendant l'intégration pour faire apparaître l'état de la connexion et l'activité des requêtes dans ton terminal. C'est aussi le moyen le plus rapide de distinguer un "not opted in" silencieux d'un échec de connexion réel.
  </Accordion>
</AccordionGroup>

***

Temps estimé pour compléter : 10-15 minutes.

Si tu as besoin d'aide ou si tu as des commentaires, contacte-nous à [info@mellowtel.com](mailto:info@mellowtel.com) ou rejoins notre [communauté Discord](https://discord.com/invite/txAZp4MSDe).
