Skip to content

Instantly share code, notes, and snippets.

@codecademydev
Created August 16, 2022 12:45
Show Gist options
  • Save codecademydev/35bfdf9acd8370193d93c43d66986e73 to your computer and use it in GitHub Desktop.
Save codecademydev/35bfdf9acd8370193d93c43d66986e73 to your computer and use it in GitHub Desktop.
Codecademy export
import { addRecipe } from '../favoriteRecipes/favoriteRecipesSlice.js';
import { loadData } from './allRecipesSlice'
import React, { useEffect } from 'react';
import FavoriteButton from "../../components/FavoriteButton";
import Recipe from "../../components/Recipe";
const favoriteIconURL = 'https://static-assets.codecademy.com/Courses/Learn-Redux/Recipes-App/icons/favorite.svg'
export const AllRecipes = (props) => {
const { allRecipes, dispatch } = props;
const onFirstRender = () => {
dispatch(loadData());
}
useEffect(onFirstRender, [])
const onAddRecipeHandler = (recipe) => {
dispatch(addRecipe(recipe));
};
return (
<div className="recipes-container">
{allRecipes.map((recipe) => (
<Recipe recipe={recipe} key={recipe.id}>
<FavoriteButton
onClickHandler={() => onAddRecipeHandler(recipe)}
icon={favoriteIconURL}
>
Add to Favorites
</FavoriteButton>
</Recipe>
))}
</div>
);
};
import allRecipesData from '../../../data.js'
export const loadData = () => {
return {
type: 'allRecipes/loadData',
payload: allRecipesData
}
}
const initialState = [];
export const allRecipesReducer = (allRecipes = initialState, action) => {
switch (action.type) {
case 'allRecipes/loadData':
return action.payload;
case 'favoriteRecipes/addRecipe':
return allRecipes.filter(recipe => recipe.id !== action.payload.id);
case 'favoriteRecipes/removeRecipe':
return [...allRecipes, action.payload]
default:
return allRecipes;
}
}
import React from 'react';
import { AllRecipes } from '../features/allRecipes/AllRecipes.js';
import { SearchTerm } from '../features/searchTerm/SearchTerm.js';
// Import the FavoriteRecipes component here.
import { FavoriteRecipes } from '../features/favoriteRecipes/FavoriteRecipes.js';
export function App(props) {
const {state, dispatch} = props;
const visibleAllRecipes = getFilteredRecipes(state.allRecipes, state.searchTerm);
const visibleFavoriteRecipes = getFilteredRecipes(state.favoriteRecipes, state.searchTerm);
// Render the <FavoriteRecipes /> component.
// Pass `dispatch` and `favoriteRecipes` props.
return (
<main>
<section>
<SearchTerm
searchTerm={state.searchTerm}
dispatch={dispatch}
/>
</section>
<section>
<h2>Favorite Recipes</h2>
<FavoriteRecipes
favoriteRecipes={visibleFavoriteRecipes}
dispatch={dispatch}
/>
</section>
<hr />
<section>
<h2>All Recipes</h2>
<AllRecipes
allRecipes={visibleAllRecipes}
dispatch={dispatch}
/>
</section>
</main>
)
}
/* Utility Helpers */
function getFilteredRecipes(recipes, searchTerm) {
return recipes.filter(recipe => recipe.name.toLowerCase().includes(searchTerm.toLowerCase()));
}
const allRecipesData = [
{ id: 0, name: 'Biscuits', img: 'img/biscuits.jpg'},
{ id: 1, name: 'Bulgogi', img: 'img/bulgogi.jpg'},
{ id: 2, name: 'Calamari', img: 'img/calamari.jpg'},
{ id: 3, name: 'Ceviche', img: 'img/ceviche.jpg'},
{ id: 4, name: 'Cheeseburger', img: 'img/cheeseburger.jpg'},
{ id: 5, name: 'Churrasco', img: 'img/churrasco.jpg'},
{ id: 6, name: 'Dumplings', img: 'img/dumplings.jpg'},
{ id: 7, name: 'Fish & Chips', img: 'img/fishnchips.jpg'},
{ id: 8, name: 'Hummus', img: 'img/hummus.jpg'},
{ id: 9, name: 'Masala Dosa', img: 'img/masaladosa.jpg'},
{ id: 10, name: 'Pad Thai', img: 'img/padthai.jpg'},
];
export default allRecipesData;
import React from "react";
export default function Recipe({ recipe, children }) {
return (
<div key={recipe.id} className="recipe" tabIndex={0}>
<span className="recipe-container">
<h3 className="recipe-name">{recipe.name}</h3>
<div className="image-container">
<img src={recipe.img} alt="" className="recipe-image" />
</div>
</span>
{children}
</div>
);
}
import { createStore, combineReducers } from 'redux';
import { favoriteRecipesReducer } from '../features/favoriteRecipes/favoriteRecipesSlice.js';
import { searchTermReducer } from '../features/searchTerm/searchTermSlice.js';
import { allRecipesReducer } from '../features/allRecipes/allRecipesSlice.js';
export const store = createStore(combineReducers({
favoriteRecipes: favoriteRecipesReducer,
searchTerm: searchTermReducer,
allRecipes: allRecipesReducer
}));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment