Skip to content

Conversation

@THE-lulu57
Copy link

@THE-lulu57 THE-lulu57 commented Jan 9, 2026

Contribution

Règles de contribution

Caution

Afin de garantir une application stable et pérenne dans le temps, nous t'invitons à vérifier que tu as bien respecté les règles de contribution. Sans cela, ta Pull Request ne pourra pas être examinée.

  • Cette Pull Request porte sur une seule fonctionnalité ou un seul correctif.
  • Cette Pull Request n'est pas faite essentiellement avec de l'IA.
  • Pour tout changement majeur, j’ai créé une issue afin d’échanger avec les mainteneurs de Papillon sur la meilleure façon de l’intégrer.
  • Ma Pull Request respecte les conventions Conventional Commits et Conventional Branch ainsi que les conventions de codage de l'application.
  • J’ai testé mes modifications sur iOS et Android, et l’application fonctionne correctement.
  • J’emploie un langage informel, clair et concis dans mes messages.
  • J’ai documenté mes changements de manière appropriée, soit dans la description de la Pull Request, soit dans le GitBook.
  • J’ai ajouté les traductions nécessaires dans au moins un fichier de langue.

Résumé des changements

Ajout d'un système de gestion de la luminosité lors de l'affichage d'un QR-Code. L'objectif est de garantir une lisibilité maximale pour les scanners de cantine en forçant l'écran à 100% de luminosité.

Utilisation de "expo-brightness" :

  • j'ai préféré utiliser "Brightness.setBrightnessAsync" au lieu de "Brightness.setSystemBrightnessAsync", pour éviter notamment de demander des permissions supplémentaires sur un téléphone Android.
  • sauvegarde de la valeur initiale via "useRef" pour une restauration par la suite.

La luminosité revient à sa valeur initiale quand on clique sur la croix, quand on swipe le QR-Code vers le bas et quand on quitte l'application. Réactivation automatique du mode 100% si l'utilisateur revient sur l'application.

Summary by CodeRabbit

  • Nouvelles Fonctionnalités

    • Luminosité intelligente pour les codes QR : écran automatiquement mis au maximum lors de l’affichage d’un QR code et rétabli ensuite pour une lecture/scan facilitée.
    • Comportement robuste lors des changements d’état de l’application : la luminosité est restaurée quand l’app passe en arrière‑plan ou est réactivée.
  • Chores

    • Ajout d’une dépendance pour gérer la luminosité de l’appareil.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 9, 2026

Walkthrough

Ajout d’un contrôle de luminosité autour de la vue QR : capture de la luminosité au montage, réglage à 1 pendant l’affichage, écoute d’AppState pour restaurer/réappliquer la luminosité lors des transitions, et restauration finale au démontage.

Changes

Cohort / File(s) Résumé des modifications
Contrôle de luminosité QR
app/(features)/(cards)/qrcode.tsx
Capture initiale via getBrightnessAsync(), stockage dans un ref, réglage à 1 au montage, gestion des transitions AppState pour restaurer/réappliquer la luminosité, et nettoyage au démontage
Dépendance expo-brightness
package.json
Ajout de la dépendance expo-brightness version ~14.0.8

Diagrammes de séquence

sequenceDiagram
    participant Component as Composant QR
    participant AppState as AppState
    participant Brightness as API Brightness
    participant Device as Appareil

    Component->>Brightness: getBrightnessAsync()
    Brightness-->>Component: currentBrightness
    Component->>Brightness: setBrightnessAsync(1)
    Brightness->>Device: appliquer luminosité maximale

    AppState->>Component: changement → background/inactive
    Component->>Brightness: setBrightnessAsync(currentBrightness)
    Brightness->>Device: appliquer luminosité précédente

    AppState->>Component: changement → active
    Component->>Brightness: setBrightnessAsync(1)
    Brightness->>Device: appliquer luminosité maximale

    Component->>Brightness: Unmount → setBrightnessAsync(currentBrightness)
    Brightness->>Device: appliquer luminosité précédente
Loading

Estimated code review effort

🎯 3 (Modéré) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Le titre décrit précisément le changement principal : l'activation de la luminosité maximale pour la lecture de codes QR.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c828a09 and 3bec971.

📒 Files selected for processing (1)
  • app/(features)/(cards)/qrcode.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/(features)/(cards)/qrcode.tsx

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
app/(features)/(cards)/qrcode.tsx (1)

41-79: Appels de permissions superflus et gestion d'erreurs manquante

Deux observations sur cette implémentation :

  1. Permissions : requestPermissionsAsync() n'est pas requis pour setBrightnessAsync() (luminosité au niveau de l'app). Cette permission est uniquement nécessaire pour setSystemBrightnessAsync() (luminosité système). Les trois appels aux lignes 44-46, 56-57 et 70-71 sont superflus.

  2. Gestion d'erreurs : Les opérations async sur la luminosité ne sont pas encapsulées dans des blocs try-catch. Il est recommandé d'ajouter une gestion d'erreurs pour éviter les rejets non gérés.

♻️ Proposition de refactorisation
 useEffect(() => {
   const enableBrightness = async () => {
-    const { status } = await Brightness.requestPermissionsAsync();
-    if (status !== "granted") return;
-
-    if (previousBrightness.current === null) {
-      previousBrightness.current = await Brightness.getBrightnessAsync();
+    try {
+      if (previousBrightness.current === null) {
+        previousBrightness.current = await Brightness.getBrightnessAsync();
+      }
+      await Brightness.setBrightnessAsync(1);
+    } catch (error) {
+      console.warn("Failed to set brightness:", error);
     }
-
-    await Brightness.setBrightnessAsync(1);
   };

   const restoreBrightness = async () => {
-    if (previousBrightness.current !== null) {
-      const { status } = await Brightness.requestPermissionsAsync();
-      if (status === "granted") {
+    try {
+      if (previousBrightness.current !== null) {
         await Brightness.setBrightnessAsync(previousBrightness.current);
       }
+    } catch (error) {
+      console.warn("Failed to restore brightness:", error);
     }
   };

   enableBrightness();

   const subscription = AppState.addEventListener("change", async (nextAppState) => {
     if (nextAppState.match(/inactive|background/)) {
       await restoreBrightness();
     } else if (nextAppState === "active") {
-      const { status } = await Brightness.requestPermissionsAsync();
-      if (status === "granted") {
+      try {
         await Brightness.setBrightnessAsync(1);
+      } catch (error) {
+        console.warn("Failed to re-enable brightness:", error);
       }
     }
   });
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 41ba703 and 337c94a.

📒 Files selected for processing (2)
  • app/(features)/(cards)/qrcode.tsx
  • package.json
🔇 Additional comments (2)
app/(features)/(cards)/qrcode.tsx (1)

6-7: LGTM - Imports ajoutés pour la gestion de luminosité

Les imports nécessaires pour AppState, useEffect, useRef et expo-brightness sont correctement ajoutés pour implémenter la fonctionnalité.

Also applies to: 22-22

package.json (1)

53-53: L'ajout est conformeexpo-brightness ~14.0.8 est la version groupée avec Expo SDK 54 et garantit une compatibilité optimale. Aucun problème de version détecté.

@THE-lulu57 THE-lulu57 marked this pull request as draft January 9, 2026 09:02
@THE-lulu57
Copy link
Author

@coderabbitai review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 9, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@THE-lulu57 THE-lulu57 marked this pull request as ready for review January 9, 2026 15:49
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
app/(features)/(cards)/qrcode.tsx (1)

53-59: Bloc catch vide et message d'erreur incomplet.

Le bloc catch vide à la ligne 58 masque silencieusement les erreurs. De plus, le message de warning à la ligne 49 ne contient pas l'erreur capturée, ce qui complique le débogage.

♻️ Correction proposée
     const enableBrightness = async () => {
       try {
         if (previousBrightness.current === null) {
           previousBrightness.current = await Brightness.getBrightnessAsync();
         }
         await Brightness.setBrightnessAsync(1);
       } catch (error) {
-        console.warn("Failed to set brightness on value 1");
+        console.warn("Failed to set brightness:", error);
       }
     };

     const restoreBrightness = async () => {
       try {
         if (previousBrightness.current !== null) {
           await Brightness.setBrightnessAsync(previousBrightness.current);
         }
-      } catch (error) {}
+      } catch (error) {
+        console.warn("Failed to restore brightness:", error);
+      }
     };
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 337c94a and c76fbe4.

📒 Files selected for processing (1)
  • app/(features)/(cards)/qrcode.tsx
🔇 Additional comments (2)
app/(features)/(cards)/qrcode.tsx (2)

6-7: LGTM !

Les imports sont appropriés pour la fonctionnalité de contrôle de luminosité ajoutée.

Also applies to: 22-22


71-75: LGTM !

Le nettoyage est correctement implémenté : suppression de l'écouteur AppState et restauration de la luminosité au démontage.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
app/(features)/(cards)/qrcode.tsx (1)

73-76: Le nettoyage est correct mais pourrait être renforcé de manière défensive.

La suppression de la souscription et l'appel à restoreBrightness() sont appropriés. Notez que restoreBrightness() n'est pas awaité (les fonctions de nettoyage React ne peuvent pas être async), donc le composant pourrait se démonter avant que la luminosité ne soit complètement restaurée, mais c'est acceptable en pratique.

🛡️ Suggestion optionnelle : ajout d'une vérification de montage

Pour une approche plus défensive, vous pourriez ajouter un ref pour suivre si le composant est monté et vérifier avant d'appeler les fonctions async :

 const previousBrightness = useRef<number | null>(null);
+const isMounted = useRef(true);

 useEffect(() => {
   const enableBrightness = async () => {
     try {
+      if (!isMounted.current) return;
       if (previousBrightness.current === null) {
         previousBrightness.current = await Brightness.getBrightnessAsync();
       }
+      if (!isMounted.current) return;
       await Brightness.setBrightnessAsync(1);
     } catch (error) {
       console.warn("Failed to set brightness:", error);
     }
   };

   const restoreBrightness = async () => {
     try {
+      if (!isMounted.current) return;
       if (previousBrightness.current !== null) {
         await Brightness.setBrightnessAsync(previousBrightness.current);
       }
     } catch (error) {
       console.warn("Failed to restore brightness:", error);
     }
   };

   // ... rest of the code

   return () => {
+    isMounted.current = false;
     subscription.remove();
     restoreBrightness();
   };
 }, []);

Cependant, cela pourrait être excessif pour ce cas d'usage.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c76fbe4 and c828a09.

📒 Files selected for processing (1)
  • app/(features)/(cards)/qrcode.tsx
🔇 Additional comments (6)
app/(features)/(cards)/qrcode.tsx (6)

6-7: Les imports sont corrects et bien structurés.

Les nouveaux imports nécessaires pour la gestion de la luminosité sont appropriés : AppState pour surveiller le cycle de vie de l'application, les hooks React pour la logique de composant, et expo-brightness pour l'API de luminosité.

Also applies to: 22-22


39-39: Utilisation appropriée de useRef pour stocker la luminosité précédente.

Le choix de useRef est correct pour maintenir la valeur de luminosité sans déclencher de re-rendus, et l'initialisation à null permet de vérifier si la luminosité a déjà été capturée.


53-61: La fonction de restauration de la luminosité est correctement implémentée.

La vérification que la luminosité a été sauvegardée avant de la restaurer est appropriée, et la gestion des erreurs est en place.


65-71: Vérifiez le comportement avec l'état "inactive" sur iOS.

L'écouteur AppState utilise nextAppState.match(/inactive|background/) qui correspond à la fois aux états "inactive" et "background". Sur iOS, l'état "inactive" est un état de transition bref lors du passage entre premier plan et arrière-plan. Cela pourrait causer une brève restauration de la luminosité pendant la transition, puis une réactivation au retour à "active", créant un potentiel scintillement.

Considérez de ne correspondre que l'état "background" si ce comportement pose problème :

if (nextAppState === "background") {
  restoreBrightness();
} else if (nextAppState === "active") {
  enableBrightness();
}

Cela dit, l'implémentation actuelle peut être intentionnelle pour garantir une restauration rapide de la luminosité lors de la sortie de l'écran.


41-77: Le tableau de dépendances vide est approprié.

Le tableau de dépendances vide [] garantit que l'effet s'exécute uniquement au montage et au démontage, ce qui est le comportement souhaité. L'écouteur AppState gère les changements d'état dynamiques pendant la durée de vie du composant.


42-51: L'API expo-brightness supporte correctement les méthodes utilisées.

La fonction enableBrightness implémente correctement l'API expo-brightness version 14.0.8 :

  • getBrightnessAsync() retourne bien un Promise<number> entre 0 et 1
  • setBrightnessAsync(1) définit correctement la luminosité maximale

La logique de capture de la luminosité initiale au premier appel (via la vérification previousBrightness.current === null) est appropriée et garantit la restauration ultérieure vers la luminosité d'origine. La gestion des erreurs avec console.warn est adéquate.

Copy link
Member

@raphckrman raphckrman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello, utilise de préférence le Logger au lieu d'afficher les logs dans la console, où est-ce que tu demandes la permission à l'utilisateur de modifier sa luminosité ? Sur certains téléphones il faut demander la permission

@THE-lulu57
Copy link
Author

Hello, utilise de préférence le Logger au lieu d'afficher les logs dans la console, où est-ce que tu demandes la permission à l'utilisateur de modifier sa luminosité ? Sur certains téléphones il faut demander la permission

Hello, pour les permissions, selon la doc de expo si on utilise "Brightness.setSystemBrightnessAsync(brightnessValue)", on a besoin des perms "SYSTEM_BRIGHTNESS" car on modifie tt la luminiosité du système, mais j'ai utilisé "Brightness.setBrightnessAsync(brightnessValue)" qui modifie seulement la luminosité de l'application utilisé et sur les docs de expo y'a aucune mention à une quelconque permission requise. J'ai testé sur Android : effectivement, "setSystemBrightnessAsync" bloquait sans permissions et il faillait utiliser "Brightness.requestPermissionsAsync()", mais setBrightnessAsync fonctionne nativement sans friction.

@THE-lulu57 THE-lulu57 requested a review from raphckrman January 10, 2026 11:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants