Application web (React) de gestion de stock domestique avec:
- Scan de codes‑barres en direct (Quagga2)
- Normalisation intelligente des noms (détection marque / catégorie)
- Objectifs de stock (stock cible)
- Liste de courses générée automatiquement
- Liste de courses manuelle (ajout direct + quantités)
- Auto‑complétion produits (OpenFoodFacts) dans les formulaires
- Décrément automatique de la liste manuelle quand un produit scanné correspond
- Edition rapide (quantités + renommage)
- Interface responsive
| Fonction | Description |
|---|---|
| Auto‑complétion OFF | Champ de saisie avec suggestions (images + Nutri‑Score). |
| Liste manuelle | Ajout d’articles non liés aux objectifs. |
| Synchronisation | Quand un scan ajoute un produit au stock, la ligne manuelle correspondante est décrémentée/supprimée. |
| Badge MANUEL | Différenciation visuelle dans la liste de courses. |
| Matching amélioré | Normalisation + stems pour relier stock / objectifs / manuel. |
git clone https://github.com/Xenox258/HomeStockApp.git
cd HomeStockApp
npm install # ou: yarn
npm start # lance http://localhost:3000Build production:
npm run buildTests:
npm testsrc/
├─ App.js
├─ index.js
├─ assets/
├─ components/
│ ├─ common/
│ │ └─ ProductSuggestInput.jsx # Auto‑complétion OFF
│ └─ scanner/
│ ├─ ScannerStockApp.jsx
│ └─ ScannerDevTool.jsx
├─ context/
│ └─ StockContext.js # State global + décrément liste manuelle
├─ pages/
│ ├─ Home/
│ ├─ Scanner/
│ ├─ Stock/
│ ├─ IdealStock/
│ └─ ShoppingList/
├─ styles/
│ └─ SuggestInput.css # Styles de l’auto‑complétion
├─ utils/
│ └─ normalizeProductName.js
├─ tests/
└─ setupTests.js
Alias: baseUrl: src → imports racine (utils/..., styles/...).
ScannerStockApp.jsx(initialisation + overlay)- Détection EAN → fetch OFF → normalisation (
normalizeOFFProduct) - Après confirmation:
addToStock(déclenche ajustement liste manuelle)
Deux sources fusionnées:
- Objectifs manquants (auto)
- Liste manuelle (items ajoutés directement)
Logique liste manuelle:
addManualShoppingItem(nom, quantite)- Synchronisation:
adjustManualListAfterStockChangedécrémente ou supprime lors d’un ajout au stock (scan ou édition quantité positive). - Pas de dédup cross‑sources pour conserver l’intention utilisateur.
Composant: ProductSuggestInput.jsx
- Requête OFF (
search.pl) après 300 ms de debounce - Cache mémoire simple (clé = query normalisée)
- Affiche image + Nutri‑Score (si dispo)
- Valeurs par défaut si pas de résultats
- Réutilisé dans: Ajout objectifs + Ajout manuel liste de courses
Fichier utils/normalizeProductName.js:
- Tokenisation, accents retirés, troncature (5 chars)
- Stems triés → comparaison stable
- Fonctions:
normalizeProductName,haveCommonStems,matchesShoppingItem,normalizeOFFProduct - Matching multi‑usage (stock ↔ objectifs ↔ manuel)
Expose:
stock,idealStock,manualShoppingList- CRUD:
addToStock,updateStock,removeFromStock - Objectifs:
setIdealStockForProduct,removeFromIdealStock - Liste manuelle:
addManualShoppingItem,updateManualShoppingItem,removeManualShoppingItem,clearPurchasedManualItems - Synchro:
adjustManualListAfterStockChange(productName, delta)interne (appelé dansaddToStock)
- Scan → code détecté
- Fetch OFF → normalisation du nom canonique
- Confirmation →
addToStock - Stock mis à jour
adjustManualListAfterStockChangeréduit la quantité manuelle correspondante- Recalcul liste de courses (auto + manuel restant)
(identique) Scanner nécessite HTTPS pour mobiles.
- Persistance locale (localStorage / IndexedDB)
- Boutons +/- pour quantités (remplacer spin native)
- Fusion intelligente auto + manuel (option)
- PWA offline
- Export / import
- i18n
| Problème | Solution |
|---|---|
| Suggestion OFF ne s’affiche pas | Vérifier réseau / CORS / console |
| Liste manuelle ne décrémente pas après scan | Vérifier nom scanné vs item (accents retirés) |
| Doublons nom objectif / manuel | Comportement attendu (pas fusionné) |
Le reste du document (sections Tests, Scripts, Accessibilité, etc.) reste inchangé.
Bon développement.