Skip to content

03. Książka przepisów kulinarnych

This content is not available in your language yet.

Zbudujesz aplikację do przeglądania i zarządzania przepisami kulinarnymi — z listą przepisów, wyszukiwarką, filtrowaniem po kategorii (śniadanie, obiad, kolacja, deser) i szczegółowym widokiem każdego przepisu.

Czego się nauczycie?

  • Praca z zewnętrznym API (MealDB lub własne dane JSON)
  • Wyszukiwanie i filtrowanie listy z useState
  • Routing z parametrami URL (/recipe/:id)
  • Ulubione przepisy zapisywane w localStorage
  • Praca zespołowa — jeden robi listing + filtry, drugi szczegóły + ulubione

W prawdziwej firmie...

Aplikacje z listami, wyszukiwaniem i filtrowaniem to chleb powszedni Front-End developera. Każdy e-commerce, CMS czy panel administracyjny ma tę samą strukturę co ta aplikacja.

Umiejętności rynkowe

  • Filtrowanie i wyszukiwanie danych
  • Routing z parametrami
  • Zewnętrzne API z obrazkami
  • localStorage jako magazyn ulubionych
  1. Lista przepisów — siatka kart z miniaturą, nazwą i kategorią

  2. Wyszukiwarka — filtrowanie przepisów po nazwie w czasie rzeczywistym

  3. Filtrowanie — po kategorii (śniadanie, obiad, kolacja, deser, wegetariańskie)

  4. Szczegóły przepisu — lista składników, opis przygotowania krok po kroku, czas przygotowania

  5. Ulubione — możliwość dodania przepisu do ulubionych (zapisane w localStorage)

Strona główna

Wyszukiwarka + filtr kategorii + siatka przepisów. Każda karta pokazuje zdjęcie, nazwę i czas przygotowania.

Szczegóły przepisu

Duże zdjęcie, lista składników z ilościami, kroki przygotowania, czas i trudność. URL: /recipe/:id.

Ulubione

Lista ulubionych przepisów (karty z opcją usunięcia z ulubionych).

{
"id": "52772",
"name": "Teriyaki Chicken Casserole",
"category": "Chicken",
"area": "Japanese",
"thumbnail": "https://www.themealdb.com/images/media/meals/wvpsxx1468256321.jpg",
"prepTime": 30,
"servings": 4,
"difficulty": "medium",
"ingredients": [
{ "name": "soy sauce", "amount": "3/4 cup" },
{ "name": "water", "amount": "1/2 cup" }
],
"instructions": [
"Preheat oven to 350° F.",
"Spray a 9x13-inch baking pan with non-stick spray."
]
}

Minimalne wymagania:

  • Lista przepisów z danych lokalnych (minimum 10 przepisów w mockData.js)
  • Wyszukiwarka po nazwie
  • Filtrowanie po kategorii
  • Widok szczegółów przepisu (osobna strona)
  • Routing: /, /recipe/:id, /favorites
  • Dodawanie do ulubionych (bez persystencji)
  • Directorysrc/
    • Directorydata/
      • recipes.js
    • Directorycomponents/
      • RecipeCard.jsx
      • SearchBar.jsx
      • CategoryFilter.jsx
    • Directorypages/
      • HomePage.jsx
      • RecipePage.jsx
      • FavoritesPage.jsx
Ocena: 3.0
src/hooks/useFilteredRecipes.js
import { useMemo } from 'react';
function useFilteredRecipes(recipes, { search, category }) {
return useMemo(() => {
return recipes.filter((recipe) => {
const matchesSearch = recipe.name
.toLowerCase()
.includes(search.toLowerCase());
const matchesCategory = category === 'all' || recipe.category === category;
return matchesSearch && matchesCategory;
});
}, [recipes, search, category]);
}
export default useFilteredRecipes;
src/hooks/useRecipeDetail.js
import { useState, useEffect } from 'react';
function useRecipeDetail(id) {
const [recipe, setRecipe] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
if (!id) return;
setLoading(true);
fetch(`https://www.themealdb.com/api/json/v1/1/lookup.php?i=${id}`)
.then((res) => res.json())
.then((data) => {
if (!data.meals) throw new Error('Recipe not found');
setRecipe(data.meals[0]);
})
.catch((err) => setError(err.message))
.finally(() => setLoading(false));
}, [id]);
return { recipe, loading, error };
}
export default useRecipeDetail;

Powodzenia!

Książka przepisów to świetny projekt do portfolio — wygląda atrakcyjnie, ma prawdziwe dane z API i pokazuje że umiecie budować kompletne aplikacje. Zacznijcie od lokalnych danych, a potem podmieńcie na MealDB!