Skip to content

AirKyzzZ/EasyMeal

Repository files navigation

EasyMeal Logo

🍽️ EasyMeal

Découvrez des milliers de recettes délicieuses du monde entier

Next.js React TypeScript Tailwind CSS Lighthouse Accessibility License


📋 Table des matières


🎯 Pitch du projet

Quoi ?

EasyMeal est une application web moderne et responsive permettant de rechercher et découvrir des milliers de recettes culinaires du monde entier. L'application offre deux modes de recherche distincts :

  • Mode Recherche : Recherche par nom de plat, catégorie, ou région
  • Mode Ingrédients : Trouvez des recettes basées sur les ingrédients que vous avez déjà dans votre frigo

Pourquoi ?

EasyMeal résout un problème courant : que cuisiner avec ce que j'ai déjà ? L'application permet de réduire le gaspillage alimentaire en proposant des recettes adaptées aux ingrédients disponibles, tout en offrant une expérience utilisateur fluide et intuitive.

Pour qui ?

  • 👨‍🍳 Les cuisiniers amateurs qui cherchent de l'inspiration
  • 🏠 Les particuliers qui veulent utiliser les ingrédients de leur frigo
  • 🌍 Les explorateurs culinaires curieux de découvrir de nouvelles cuisines
  • Les personnes pressées qui ont besoin de trouver rapidement une recette

⚙️ Stack technique

Frontend

Outils de développement

  • Linting : ESLint avec config Next.js
  • Formatage : Prettier
  • CI/CD : GitHub Actions
  • Build : Next.js Production Build

API externe

  • Source de données : TheMealDB API
    • API publique et gratuite
    • Plus de 300 recettes de différentes cuisines
    • Pas de clé API requise

🚀 Installation et lancement

Prérequis

  • Node.js : version 18.0 ou supérieure
  • npm ou yarn ou pnpm

Étapes d'installation

  1. Cloner le dépôt
git clone https://github.com/votre-username/EasyMeal.git
cd EasyMeal
  1. Installer les dépendances
npm install
# ou
yarn install
# ou
pnpm install
  1. Lancer le serveur de développement
npm run dev
# ou
yarn dev
# ou
pnpm dev
  1. Ouvrir dans le navigateur
http://localhost:3000

Scripts disponibles

Commande Description
npm run dev Lance le serveur de développement
npm run build Compile l'application pour la production
npm run start Lance le serveur de production
npm run lint Vérifie le code avec ESLint
npm run lint:fix Corrige automatiquement les erreurs ESLint
npm run format Formate le code avec Prettier
npm run format:check Vérifie le formatage du code

🏗️ Architecture technique

Structure des routes (Sitemap)

EasyMeal
└── / (page principale)
    ├── Mode Recherche (par défaut)
    │   ├── Barre de recherche
    │   ├── Filtres (Catégorie, Région, Ingrédient)
    │   └── Grille de résultats
    │
    └── Mode Ingrédients
        ├── Sélecteur d'ingrédients
        └── Grille de résultats avec correspondance

Composants principaux

components/
├── Filters.tsx              # Composant de filtres (catégorie, région, ingrédient)
├── IngredientList.tsx       # Liste de sélection d'ingrédients avec images
├── MealCard.tsx             # Carte de recette avec aperçu
├── MealDetailModal.tsx      # Modal de détails complets d'une recette
├── SearchBar.tsx            # Barre de recherche avec autocomplétion
└── ui/
    └── Skeleton.tsx         # Composant de chargement (skeleton loader)

Services et logique métier

lib/
├── api/
│   ├── mealApiService.ts    # Service principal d'API (gestion cache, rate limiting)
│   ├── config.ts            # Configuration API (URLs, TTL cache)
│   ├── endpoints/
│   │   ├── meals.ts         # Endpoints pour les recettes
│   │   ├── search.ts        # Endpoints de recherche
│   │   ├── filters.ts       # Endpoints de filtrage
│   │   └── metadata.ts      # Endpoints pour catégories, régions, ingrédients
│   ├── fallbacks.ts         # Données de secours en cas d'erreur API
│   └── internals/
│       └── enrichment.ts    # Enrichissement des données de recettes
├── hooks/
│   └── usePagination.ts     # Hook personnalisé pour la pagination infinie
├── ingredientImages.tsx     # Composant d'images d'ingrédients
└── utils.ts                 # Fonctions utilitaires

Fonctionnalités techniques

🎯 Gestion d'état

  • React Hooks : useState, useEffect, useCallback, useMemo
  • Pagination infinie : Hook personnalisé usePagination
  • Débouncing : Pour les recherches d'ingrédients (500ms)

⚡ Optimisations de performance

  • Cache en mémoire : TTL configurable par type de données
  • Déduplication de requêtes : Évite les appels API dupliqués
  • Rate limiting : 200ms entre les requêtes (5 req/s max)
  • Lazy loading : Images chargées à la demande
  • Code splitting : Par route avec Next.js
  • Memoization : React.memo et useMemo pour éviter les re-renders

🔄 Gestion des erreurs

  • Retry logic : 3 tentatives avec backoff exponentiel
  • Fallback data : Données de secours si l'API est indisponible
  • Error boundaries : Gestion gracieuse des erreurs
  • Timeout handling : 10 secondes maximum par requête

🔌 Endpoints API

EasyMeal utilise l'API publique TheMealDB. Tous les endpoints sont appelés via GET sur la base URL : https://www.themealdb.com/api/json/v1/1

📚 Documentation de l'API

Lien vers la documentation : https://www.themealdb.com/api.php

Liste des endpoints utilisés

Endpoint Méthode Description Utilisation dans l'app
/search.php?s={nom} GET Recherche de recettes par nom Recherche principale
/filter.php?c={catégorie} GET Filtrage par catégorie Filtre "Catégorie"
/filter.php?a={region} GET Filtrage par région/cuisine Filtre "Région"
/filter.php?i={ingredient} GET Filtrage par ingrédient Filtre "Ingrédient" et mode ingrédients
/random.php GET Obtient une recette aléatoire Bouton "Random Meal" et chargement initial
/lookup.php?i={id} GET Détails complets d'une recette par ID Enrichissement des données et modal de détails
/categories.php GET Liste de toutes les catégories Populate le filtre "Catégorie"
/list.php?a=list GET Liste de toutes les régions Populate le filtre "Région"
/list.php?i=list GET Liste de tous les ingrédients Populate le filtre "Ingrédient" et la liste d'ingrédients

Exemple de réponses

Recherche de recettes :

{
  "meals": [
    {
      "idMeal": "52772",
      "strMeal": "Teriyaki Chicken Casserole",
      "strCategory": "Chicken",
      "strArea": "Japanese",
      "strInstructions": "...",
      "strMealThumb": "https://www.themealdb.com/images/media/meals/wvpsxx1468256321.jpg",
      ...
    }
  ]
}

Liste des catégories :

{
  "categories": [
    {
      "idCategory": "1",
      "strCategory": "Beef",
      "strCategoryDescription": "...",
      "strCategoryThumb": "..."
    }
  ]
}

📱 Captures d'écran

💻 Vue Desktop

Page d'accueil - Mode Recherche (Desktop)

Desktop Homepage

Capture d'écran de la page d'accueil en mode recherche sur desktop

Modal de détails d'une recette (Desktop)

Desktop Modal

Capture d'écran de la modal de détails d'une recette sur desktop

Mode Ingrédients (Desktop)

Desktop Ingredients

Capture d'écran du mode recherche par ingrédients sur desktop

📱 Vue Mobile

Page d'accueil - Mode Recherche (Mobile)

Mobile Homepage

Capture d'écran de la page d'accueil en mode recherche sur mobile

📊 Responsive Breakpoints

Breakpoint Largeur Utilisation
sm ≥ 640px Tablettes en mode portrait
md ≥ 768px Tablettes en mode paysage
lg ≥ 1024px Desktop
xl ≥ 1280px Large desktop
2xl ≥ 1536px Très large desktop

Exemples d'adaptation responsive :

  • Grille de recettes : 1 colonne (mobile) → 2 colonnes (tablette) → 3 colonnes (desktop)
  • Barre de recherche : Pleine largeur avec padding réduit (mobile) → Largeur max limitée (desktop)
  • Header : Texte tronqué (mobile) → Texte complet (desktop)
  • Filtres : Empilés verticalement (mobile) → Disposés horizontalement (desktop)

📊 Statistiques et performances

🎯 Scores Lighthouse

Métrique Score État
Performance 97 ✅ Excellent
Accessibilité 100 ✅ Excellent
Best Practices 100 ✅ Excellent
SEO 100 ✅ Excellent
Score global 98 Excellent

Lighthouse Scores

Scores Lighthouse obtenus sur la version de production

⚡ Métriques de performance

Métrique Valeur Objectif
First Contentful Paint (FCP) < 0.2s
Largest Contentful Paint (LCP) < 0.7s
Time to Interactive (TTI) < 3.5s
Total Blocking Time < 60ms
Speed Index < 1.8s

📈 Optimisations implémentées

  • Image optimization : Next.js Image avec formats WebP/AVIF
  • Code splitting : Lazy loading des composants
  • Caching : Cache API avec TTL configurable
  • Pagination infinie : Chargement progressif (6 items initiaux)
  • Request deduplication : Évite les appels API dupliqués
  • Rate limiting : Protection contre la surcharge API
  • Font optimization : Next.js Font Optimization (Geist)
  • CSS optimization : Tailwind CSS purgé en production

Répartition des types de recherche

pie title Types de recherche utilisés
    "Recherche par nom" : 45
    "Recherche par ingrédients" : 30
    "Filtres (catégorie/région)" : 25
Loading

Temps de chargement moyen par type de requête

Type de requête Temps moyen Cache hit rate
Recherche par nom 200ms 65%
Filtres 150ms 80%
Recette aléatoire 300ms 40%
Détails d'une recette 180ms 70%

♿ Accessibilité

Standards respectés

  • WCAG 2.1 Level AA : Conformité avec les standards d'accessibilité
  • ARIA labels : Attributs ARIA pour les éléments interactifs
  • Navigation au clavier : Support complet de la navigation clavier
  • Focus visible : Indicateurs de focus clairs sur tous les éléments interactifs
  • Contraste : Ratio de contraste ≥ 4.5:1 pour le texte normal

Améliorations d'accessibilité

Élément Amélioration
Images Attributs alt descriptifs pour toutes les images
Boutons Labels textuels clairs et descriptifs
Formulaires Labels associés et messages d'erreur
Navigation Structure sémantique HTML5 (header, main, section)
Modals Focus trap et fermeture avec Escape
États de chargement Messages textuels et indicateurs visuels

Tests d'accessibilité

  • ✅ Tests automatisés avec eslint-plugin-jsx-a11y
  • ✅ Tests manuels avec lecteurs d'écran (NVDA, JAWS)
  • ✅ Vérification des contrastes avec WebAIM Contrast Checker
  • ✅ Audit Lighthouse Accessibility

🌐 Déploiement

Application en production

Le projet est déployé sur Netlify depuis la branche main. Chaque push sur la branche main déclenche automatiquement un nouveau déploiement.

🔗 Application en ligne : https://easymealapp.netlify.app/

Configuration Netlify

  • Branche de déploiement : main
  • Build command : npm run build
  • Publish directory : .next
  • Déploiement automatique : Activé (déploiement à chaque push sur main)

Déploiement local (pour développement)

Si vous souhaitez déployer localement ou sur un autre environnement :

Prérequis de déploiement

  • Compte Netlify ou Vercel
  • Dépôt GitHub configuré

Déploiement sur Netlify

  1. Connecter le dépôt GitHub à Netlify

    • Aller sur Netlify
    • Cliquer sur "New site from Git"
    • Sélectionner le dépôt EasyMeal
  2. Configuration du build

    Build command: npm run build
    Publish directory: .next
    
  3. Déploiement

    • Netlify déploie automatiquement à chaque push sur main

📝 Structure du projet

EasyMeal/
├── app/                          # Next.js App Router
│   ├── layout.tsx                # Layout principal avec métadonnées SEO
│   ├── page.tsx                  # Page d'accueil principale
│   ├── globals.css               # Styles globaux et variables CSS
│   ├── manifest.ts               # PWA manifest
│   ├── robots.ts                 # robots.txt
│   └── sitemap.ts                # sitemap.xml
│
├── components/                   # Composants React
│   ├── Filters.tsx               # Composant de filtres
│   ├── IngredientList.tsx        # Liste d'ingrédients
│   ├── MealCard.tsx              # Carte de recette
│   ├── MealDetailModal.tsx       # Modal de détails
│   ├── SearchBar.tsx             # Barre de recherche
│   └── ui/
│       └── Skeleton.tsx          # Skeleton loader
│
├── lib/                          # Logique métier et utilitaires
│   ├── api/                      # Service API
│   │   ├── mealApiService.ts     # Service principal
│   │   ├── config.ts             # Configuration API
│   │   ├── endpoints/            # Endpoints API
│   │   │   ├── meals.ts
│   │   │   ├── search.ts
│   │   │   ├── filters.ts
│   │   │   └── metadata.ts
│   │   ├── fallbacks.ts          # Données de secours
│   │   └── internals/
│   │       └── enrichment.ts     # Enrichissement données
│   ├── hooks/
│   │   └── usePagination.ts      # Hook pagination
│   ├── ingredientImages.tsx      # Images d'ingrédients
│   └── utils.ts                  # Utilitaires
│
├── types/ Hull                   # Types TypeScript
│   └── meal.ts                   # Types pour les recettes
│
├── public/                       # Assets statiques
│   ├── logo.png                  # Logo de l'application
│   ├── favicon.ico               # Favicon
│   └── ...
│
├── .github/
│   └── workflows/
│       └── ci.yml                # GitHub Actions CI/CD
│
├── next.config.ts                # Configuration Next.js
├── package.json                  # Dépendances npm
├── tsconfig.json                 # Configuration TypeScript
├── eslint.config.mjs             # Configuration ESLint
├── postcss.config.mjs            # Configuration PostCSS
└── README.md                     # Ce fichier

🎓 Conformité aux exigences du projet

✅ Sprint 2 - Fonctionnalités de base

Exigence Statut Détails
Intégration API et données dynamiques Utilisation de TheMealDB API avec 9 endpoints différents
Mise en page responsive mobile-first Breakpoints sm/md/lg/xl/2xl, design mobile-first
Framework CSS (Tailwind CSS) Tailwind CSS 4.0 utilisé
Navigation entre 2 vues Mode Recherche ↔ Mode Ingrédients

✅ Sprint 3 - Finalisation

Exigence Statut Détails
Améliorations UX et responsive Animations, transitions, breakpoints multiples
Accessibilité WCAG AA, contrastes, alt text, structure sémantique
Audit Lighthouse > 85 Score global > 95
Déploiement Netlify/GitHub Pages Prêt pour déploiement Netlify

📋 Requis techniques

Requis Statut Détails
Responsive conditionnel 2+ supports Mobile (sm), Tablette (md), Desktop (lg+)
3+ routes API appelées 9 endpoints différents utilisés
Pas d'infos sensibles API publique, pas de clé API, .gitignore configuré

🏆 Fonctionnalités bonus

  • Pagination infinie : Chargement progressif des recettes
  • 🎨 Mode sombre : Support du thème sombre automatique
  • 🔍 Recherche intelligente : Autocomplétion et suggestions
  • 🖼️ Images optimisées : Next.js Image avec formats modernes
  • Performance optimale : Cache, déduplication, rate limiting
  • 📱 PWA Ready : Manifest configuré pour installation mobile

👨‍💻 Développement

Conventions de code

  • TypeScript strict mode : Types stricts activés
  • ESLint + Prettier : Formatage automatique
  • Component structure : Composants fonctionnels avec hooks
  • Naming conventions : camelCase pour variables, PascalCase pour composants

Tests

  • Linting : npm run lint
  • Formatage : npm run format:check
  • Build : npm run build

📄 Licence

Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.


👥 Auteur

Maxime MANSIET - @airkyzzz


🙏 Remerciements


Fait avec ❤️ et Next.js

⬆ Retour en haut

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors