Skip to content

⚡ Bolt: [debounce tech search in onboarding stepper]#118

Open
KxlSys wants to merge 2 commits into
mainfrom
bolt-performance-improvement-tech-search-255243690563099908
Open

⚡ Bolt: [debounce tech search in onboarding stepper]#118
KxlSys wants to merge 2 commits into
mainfrom
bolt-performance-improvement-tech-search-255243690563099908

Conversation

@KxlSys

@KxlSys KxlSys commented Jun 5, 2026

Copy link
Copy Markdown
Owner

💡 What: Implemented a debounced local state (localTechSearch) for the tech search input in the onboarding stepper, decoupling it from the main techSearch state that triggers re-renders and re-filters.
🎯 Why: Previously, typing in the tech search input synchronously filtered a large list (TECH_OPTIONS) and triggered a root component re-render on every keystroke, causing noticeable UI lag.
📊 Impact: Eliminates input latency when searching for technologies. The UI is much more responsive as filtering logic and re-renders only happen 300ms after the user stops typing.
🔬 Measurement: Open the onboarding flow and type rapidly in the "Rechercher..." input under the technology step. The input should feel instantaneous without blocking the main thread.


PR created automatically by Jules for task 255243690563099908 started by @KxlSys

Summary by CodeRabbit

  • Improvements
    • Technology search in onboarding now debounces input. Search results update after a brief pause in typing rather than on every keystroke, improving performance when searching for available technologies.

Co-authored-by: KxlSys <116387953+KxlSys@users.noreply.github.com>
@google-labs-jules

Copy link
Copy Markdown
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@vercel

vercel Bot commented Jun 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
bisomaptech Ready Ready Preview, Comment Jun 5, 2026 3:29pm

@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e1bed9e2-5dda-4084-9632-029309ed0858

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR adds input debouncing to the onboarding stepper's technology search field. A separate immediate-input state (localTechSearch) is managed independently, while a useEffect debounces changes into the existing filtering state (techSearch) after approximately 300ms. The UI input is rewired to use the immediate state, and the pattern is documented in the project journal.

Changes

Tech Search Input Debouncing

Layer / File(s) Summary
Debounce state and input integration
src/components/onboarding/onboarding-stepper.tsx, .jules/bolt.md
A new localTechSearch state captures immediate keystroke input, and a useEffect debounces it into techSearch after ~300ms. The <Input> component is updated to bind to localTechSearch for value and onChange, while filtering operations continue to use the debounced techSearch. The pattern is documented as a journal entry.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • KxlSys/BisoMapTech#44: Implements the same local immediate input state + ~300ms debounced update pattern for global search filtering.
  • KxlSys/BisoMapTech#108: Applies the same state-splitting and debounce pattern to search inputs in different components.

Poem

🐰 A hop through the keys, so swift and so light,
But the search takes its time—a debounce done right.
Fast fingers update, the state splits in two,
Three hundred ms later, the filter runs true!

🚥 Pre-merge checks | ✅ 4 | ❌ 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 (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: debouncing the tech search in the onboarding stepper component, which is the primary focus of the changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch bolt-performance-improvement-tech-search-255243690563099908

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.

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown

En tant qu'expert en sécurité et qualité de code pour le projet BisoMapTech, je vais analyser ce diff de Pull Request.


Analyse de la Pull Request

Cette Pull Request introduit un mécanisme de "debouncing" pour le champ de recherche technique dans le composant OnboardingStepper. L'objectif est d'améliorer les performances de l'interface utilisateur en évitant des re-rendus coûteux et fréquents lors de la saisie rapide de texte dans le champ de recherche. Le .jules/bolt.md explique clairement la justification et l'action.

Le changement principal est le découplage de l'état du champ de saisie (localTechSearch) de l'état utilisé pour le filtrage (techSearch), avec une synchronisation via un useEffect après un délai de 300ms.


1. Failles de sécurité

Aucune faille de sécurité directe n'est introduite ou exposée par ce diff. Le changement concerne uniquement la gestion de l'état local côté client et les performances de l'UI pour un champ de recherche.

  • Exposition de données sensibles / Secrets exposés : Non pertinent, aucune donnée sensible ou secret n'est manipulé ou exposé par ce changement.
  • Injections (XSS, SQL, etc.) : Le champ de saisie (Input) est un composant UI standard. Le diff ne montre pas comment la valeur de techSearch est utilisée pour filtrer les TECH_OPTIONS ou si cette valeur est ensuite envoyée au backend. Cependant, le diff lui-même n'introduit pas de vecteur d'injection. La prévention des XSS devrait être gérée au niveau de l'affichage des résultats et de toute communication avec le serveur (si applicable), ce qui n'est pas le périmètre de cette PR.

Verdict Sécurité :
🟢 Faible - Aucun problème de sécurité direct n'est détecté dans ce diff.


2. Bugs potentiels

Le mécanisme de debouncing est correctement implémenté et ne devrait pas introduire de bugs logiques majeurs.

  • Logique du Debounce : L'utilisation de useState pour localTechSearch, un useEffect avec setTimeout et une fonction de nettoyage clearTimeout est la manière idiomatique et correcte d'implémenter un debouncing en React.
    • Le clearTimeout dans la fonction de nettoyage garantit que le timer précédent est annulé si localTechSearch change avant que le délai de 300ms ne soit écoulé, évitant ainsi des mises à jour multiples ou incorrectes de techSearch.
    • Le clearTimeout est également appelé lors du démontage du composant, prévenant les fuites de mémoire.
  • Désynchronisation initiale : Au chargement, techSearch et localTechSearch sont tous deux à "". Le premier useEffect ne se déclenchera qu'après le premier changement de localTechSearch. Cela est le comportement attendu et ne constitue pas un bug.
  • Cas limites non gérés : Le debounce gère bien la saisie rapide, la saisie unique et la suppression complète du texte.

Potentiel de régression :
Le principal changement est une modification de l'expérience utilisateur : les résultats de recherche apparaîtront avec un léger délai (300ms). C'est le comportement attendu pour un debounce et non une régression fonctionnelle, mais une chose à noter pour les tests. Il est crucial que la logique de filtrage des TECH_OPTIONS utilise bien la variable techSearch (la valeur débouncée) et non localTechSearch (la valeur instantanée), ce qui est l'intention de ce changement. Le diff ne montre pas cette partie du code, mais c'est une hypothèse clé pour la validité de l'amélioration de performance.

Verdict Bugs Potentiels :
🟢 Faible - L'implémentation du debounce est robuste. Le seul point est de s'assurer que techSearch est bien utilisé en aval pour le filtrage.


3. Qualité du code

La qualité du code est globalement bonne pour cette modification.

  • Lisibilité et Maintenabilité :
    • Les noms de variables techSearch et localTechSearch sont clairs et distinguent bien leurs rôles respectifs.
    • Le pattern useEffect pour le debounce est standard et facilement reconnaissable.
    • L'entrée dans .jules/bolt.md est excellente, elle documente le "pourquoi" et le "comment" de cette modification, ce qui est une excellente pratique pour la maintenabilité future et la compréhension de l'historique du projet.
  • Respect du typage strict TypeScript :
    • Le typage est correctement inféré (string) par useState("").
    • Aucun problème de typage n'est introduit.
  • Bonnes pratiques React :
    • Utilisation correcte de useState et useEffect.
    • La fonction de nettoyage de useEffect est correctement utilisée pour clearTimeout, évitant les fuites de mémoire.
    • Séparation de l'état de l'UI immédiate (localTechSearch) et de l'état logique débouncé (techSearch).
  • Clarté du délai : Le délai de 300 ms est un "nombre magique". Bien que 300ms soit un standard courant pour le debounce, il pourrait être extrait dans une constante nommée pour une meilleure lisibilité et si ce délai devait être réutilisé ou modifié.

Verdict Qualité du Code :
🟡 Moyenne - Globalement bonne, avec une suggestion mineure pour la clarté du délai.

Suggestion de correction (Qualité du code) :
Extraire le délai de debounce dans une constante nommée.

diff --git a/src/components/onboarding/onboarding-stepper.tsx b/src/components/onboarding/onboarding-stepper.tsx
index 887374f..8467305 100644
--- a/src/components/onboarding/onboarding-stepper.tsx
+++ b/src/components/onboarding/onboarding-stepper.tsx
@@ -68,6 +68,8 @@ export function OnboardingStepper() {
   const [isSubmitting, setIsSubmitting] = useState(false);
   const [submitError, setSubmitError] = useState<string | null>(null);
   const [techSearch, setTechSearch] = useState("");
+
+  const DEBOUNCE_DELAY = 300; // ms
   const [localTechSearch, setLocalTechSearch] = useState("");
  
  
   const draft = useMemo(() => (user ? loadDraft(user.id) : null), [user]);
 
   useEffect(() => {
     const t = setTimeout(() => {
       setTechSearch(localTechSearch);
-    }, 300);
+    }, DEBOUNCE_DELAY);
     return () => clearTimeout(t);
   }, [localTechSearch]);
 

Résumé Général et Conclusion

Cette Pull Request est bien conçue et implémente une amélioration de performance nécessaire et correctement documentée.

  • Sécurité : Aucun problème direct.
  • Bugs potentiels : L'implémentation du debounce est solide. Il est juste important de confirmer que la logique de filtrage utilise bien l'état techSearch (débouncé).
  • Qualité du code : Bonne, respecte les bonnes pratiques React et TypeScript. Une petite amélioration possible pour la clarté du délai de debounce.

Recommandation Finale :
J'approuve cette Pull Request avec la suggestion mineure d'extraire le délai de debounce dans une constante, ce qui peut être considéré comme une amélioration non bloquante. Le changement apporte une valeur claire en termes d'expérience utilisateur et de performance, et est réalisé de manière propre et idiomatique.

Co-authored-by: KxlSys <116387953+KxlSys@users.noreply.github.com>
@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown

Bonjour l'équipe BisoMapTech,

En tant qu'expert en sécurité et qualité de code, j'ai analysé en détail la Pull Request soumise.

Résumé général :
Cette PR est globalement très bien exécutée et apporte une amélioration significative de la performance de l'interface utilisateur sans introduire de nouveaux problèmes. L'implémentation du debouncing est correcte et suit les bonnes pratiques React/TypeScript. Les mises à jour de dépendances sont également un signe positif de maintenance.


1. Failles de sécurité

  • Analyse :

    • La PR inclut des mises à jour de dépendances (par exemple, @remix-run/router, react-router, react-router-dom). Ces mises à jour sont des versions patch (ex: 1.23.2 -> 1.23.3, 6.30.3 -> 6.30.4). Les versions patch incluent souvent des correctifs de sécurité mineurs ou des améliorations de stabilité. La mise à jour régulière des dépendances est une bonne pratique de sécurité.
    • Le code modifié dans onboarding-stepper.tsx concerne la gestion d'un champ de recherche avec un debounce. Il n'implique pas de nouvelles interactions avec des données sensibles, de manipulation de l'authentification, d'appels API non sécurisés ou de rendu de contenu potentiellement dangereux (XSS). L'input est géré en interne par le composant.
    • Aucun secret (clés API, identifiants) n'est exposé dans le diff.
  • Sévérité : 🟢 Faible

    • Aucune faille de sécurité n'est introduite par cette PR. Au contraire, les mises à jour de dépendances peuvent contenir des correctifs de sécurité, ce qui est positif.
  • Suggestions :

    • Maintenir la pratique de mise à jour régulière des dépendances est crucial pour la sécurité. Considérez d'intégrer des outils de scanning de vulnérabilités pour les dépendances (ex: npm audit, Snyk, Dependabot) dans votre CI/CD pour détecter automatiquement les vulnérabilités connues.

2. Bugs potentiels

  • Analyse :

    • La PR vise explicitement à résoudre un problème de performance (UI lag) en introduisant un debounce sur la recherche technologique. Le problème initial est clairement décrit dans le fichier .jules/bolt.md.
    • L'implémentation du debounce avec useState pour localTechSearch et techSearch, couplée à un useEffect avec un setTimeout et une fonction de nettoyage (clearTimeout), est la méthode standard et recommandée en React.
    • La durée de 300ms est un délai classique et approprié pour le debouncing d'une recherche.
    • Il n'y a pas de cas limite non géré apparent. Le useEffect se déclenchera correctement chaque fois que localTechSearch change, et le clearTimeout gérera les frappes rapides en annulant les timers précédents.
    • Aucune régression n'est attendue, car le changement isole la gestion de l'entrée de la logique de recherche coûteuse.
  • Sévérité : 🟢 Faible

    • Aucun bug potentiel n'est introduit. La PR corrige un bug de performance existant.
  • Suggestions :

    • Excellent travail pour avoir identifié et résolu le problème de performance de manière propre et idiomatique.
    • Assurez-vous que l'effet de ce debounce est bien mesuré (par exemple, avec les outils de développement du navigateur) pour confirmer l'amélioration de la performance sur des listes de TECH_OPTIONS particulièrement volumineuses.

3. Qualité du code

  • Analyse :

    • Lisibilité et Maintenabilité : Le code est très lisible. La séparation de localTechSearch (pour l'affichage immédiat de l'input) et techSearch (pour la valeur réellement utilisée pour le filtrage) est une excellente pratique pour le debouncing. L'utilisation de useEffect avec sa fonction de nettoyage rend la logique de debounce claire et robuste.
    • Typage Strict TypeScript : L'ajout de localTechSearch avec useState("") infère correctement le type string, ce qui est en accord avec le typage strict. Les fonctions setLocalTechSearch et setTechSearch sont utilisées conformément à leurs types.
    • Bonnes Pratiques React :
      • Utilisation correcte des Hooks useState et useEffect.
      • La fonction de nettoyage dans useEffect (return () => clearTimeout(t);) est essentielle et correctement implémentée, évitant les fuites de mémoire et les comportements indésirables.
      • Le fichier .jules/bolt.md est un excellent ajout. Documenter les "apprentissages" et les "actions" est une pratique formidable pour le partage de connaissances et la maintenabilité à long terme du projet. Cela montre une culture d'amélioration continue et de résolution de problèmes.
    • TailwindCSS : Les classes Tailwind existantes ne sont pas modifiées, et le style reste cohérent.
  • Sévérité : 🟢 Faible

    • La qualité du code est très élevée. Aucune amélioration significative n'est nécessaire.
  • Suggestions :

    • Continuez sur cette lancée ! L'approche de documentation des apprentissages dans .jules/bolt.md est particulièrement appréciée et devrait être encouragée pour d'autres problèmes ou solutions importantes.
    • (Mineur) Pour des logiques de debounce plus complexes ou réutilisables, un hook personnalisé comme useDebounce pourrait être envisagé, mais pour ce cas spécifique, l'implémentation directe dans le useEffect est tout à fait adéquate et compréhensible.

Conclusion Générale

Cette Pull Request est exemplaire. Elle résout un problème réel de performance avec une solution technique solide, maintient une haute qualité de code, et ne présente aucune faille de sécurité ou bug potentiel. L'ajout à la documentation des apprentissages est un bonus significatif.

Approbation fortement recommandée.


Cordialement,
L'expert en sécurité et qualité de code de BisoMapTech

@KxlSys KxlSys enabled auto-merge (squash) June 14, 2026 15:53
@KxlSys KxlSys disabled auto-merge June 15, 2026 12:07
@KxlSys KxlSys enabled auto-merge (squash) June 15, 2026 12:07
@KxlSys KxlSys disabled auto-merge June 15, 2026 12:08
@KxlSys KxlSys enabled auto-merge (squash) June 15, 2026 12:08
KxlSys added a commit that referenced this pull request Jun 15, 2026
Reprend proprement la PR #118 (Bolt/Jules) sur main à jour, sans
réintroduire le doublon de casse .jules/.Jules.

Découple l'état du champ (localTechSearch, instantané) de l'état qui
déclenche le filtrage coûteux de TECH_OPTIONS (techSearch), synchronisés
via un useEffect debounce de 300ms. Supprime le lag de saisie.

Note de doc ajoutée dans .Jules/bolt.md (casse canonique). Le bump
react-router 6.30.4 de la PR est déjà présent sur main.

Co-authored-by: Kalel <116387953+KalelDAMBA@users.noreply.github.com>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

1 participant