From 44ff07ef3c2d77695a4ff653256cf59afde5830c Mon Sep 17 00:00:00 2001 From: Aytac Date: Fri, 23 Feb 2024 02:41:09 +0400 Subject: [PATCH] coctails --- src/App.js | 2 + src/Components/Cocktails/Cocktail.js | 20 ++++ src/Components/Cocktails/CocktailList.js | 33 ++++++ src/Components/Cocktails/CocktailMenu.js | 19 +++ src/Components/Cocktails/Loading.js | 10 ++ src/Components/Cocktails/Search.js | 41 +++++++ src/Components/Cocktails/context.js | 63 ++++++++++ src/Components/Cocktails/pages/About.js | 16 +++ src/Components/Cocktails/pages/Error.js | 14 +++ src/Components/Cocktails/pages/Home.js | 11 ++ src/Components/Cocktails/pages/OneCoctails.js | 109 ++++++++++++++++++ src/Components/Menu/Menu.js | 1 + 12 files changed, 339 insertions(+) create mode 100644 src/Components/Cocktails/Cocktail.js create mode 100644 src/Components/Cocktails/CocktailList.js create mode 100644 src/Components/Cocktails/CocktailMenu.js create mode 100644 src/Components/Cocktails/Loading.js create mode 100644 src/Components/Cocktails/Search.js create mode 100644 src/Components/Cocktails/context.js create mode 100644 src/Components/Cocktails/pages/About.js create mode 100644 src/Components/Cocktails/pages/Error.js create mode 100644 src/Components/Cocktails/pages/Home.js create mode 100644 src/Components/Cocktails/pages/OneCoctails.js diff --git a/src/App.js b/src/App.js index 5aaf1bd..aa2e0e3 100644 --- a/src/App.js +++ b/src/App.js @@ -11,6 +11,7 @@ import NewModelApp from './Components/NewModelApp/RedInc.js'; import Word from './Components/WordReverseApp/Word.js'; import { PiMoonStarsLight } from "react-icons/pi"; import Calc from "./Components/Calculator/Calc.js"; +import CocktailMenu from "./Components/Cocktails/CocktailMenu.js"; const getStorageTheme = () => { let theme = 'light-theme'; @@ -58,6 +59,7 @@ function App() { } /> } /> } /> + } /> diff --git a/src/Components/Cocktails/Cocktail.js b/src/Components/Cocktails/Cocktail.js new file mode 100644 index 0000000..755b132 --- /dev/null +++ b/src/Components/Cocktails/Cocktail.js @@ -0,0 +1,20 @@ +import React from "react"; +import {Link} from "react-router-dom" + +export default function Cocktail({ image, name, id, info, glass }) { + return ( +
+
+ {name} +
+
+

{name}

+

{glass}

+

{info}

+ + details + +
+
+ ); +} diff --git a/src/Components/Cocktails/CocktailList.js b/src/Components/Cocktails/CocktailList.js new file mode 100644 index 0000000..cbf2458 --- /dev/null +++ b/src/Components/Cocktails/CocktailList.js @@ -0,0 +1,33 @@ +import React from 'react' +import { useGlobalContext } from './context'; +import Loading from './Loading'; +import Cocktail from './Cocktail'; + +export default function CocktailList() { + + const { cocktails, loading } = useGlobalContext(); + + if(loading){ + return + }; + + if(cocktails.lenght < 1){ + return( +

no cocktails matched your search criteria

+ ) + } + + + return ( +
+

Cocktails

+
+ {cocktails.map((item) => { + return + })} +
+
+ ) +} + + diff --git a/src/Components/Cocktails/CocktailMenu.js b/src/Components/Cocktails/CocktailMenu.js new file mode 100644 index 0000000..51f60ff --- /dev/null +++ b/src/Components/Cocktails/CocktailMenu.js @@ -0,0 +1,19 @@ +import React from "react"; +import { Link } from "react-router-dom"; +import Home from "./pages/Home.js"; +import About from "./pages/About"; +import OneCoctails from "./pages/OneCoctails"; +import Error from "./pages/Error"; + +function CocktailMenu() { + return ( +
+ } /> + } /> + } /> + } /> +
+ ); +} + +export default CocktailMenu; diff --git a/src/Components/Cocktails/Loading.js b/src/Components/Cocktails/Loading.js new file mode 100644 index 0000000..9819c48 --- /dev/null +++ b/src/Components/Cocktails/Loading.js @@ -0,0 +1,10 @@ +import React from 'react' + +const Loading = () => { + return ( +
+
+ ) +} + +export default Loading diff --git a/src/Components/Cocktails/Search.js b/src/Components/Cocktails/Search.js new file mode 100644 index 0000000..732ae37 --- /dev/null +++ b/src/Components/Cocktails/Search.js @@ -0,0 +1,41 @@ +import React, {useEffect, useRef} from "react"; +import { useGlobalContext } from './context'; + + +export default function Search() { + + + const { setSearchTerm } = useGlobalContext(); + const searchValue = useRef(""); + + useEffect(()=>{ + searchValue.current.focus(); + },[]); + + const searchCocktail = ()=>{ + setSearchTerm(searchValue.current.value) + }; + + const handleSubmit = (e) => { + e.preventDefault(); + } + + + + return ( +
+
+
+ + +
+
+
+ ); +} diff --git a/src/Components/Cocktails/context.js b/src/Components/Cocktails/context.js new file mode 100644 index 0000000..3fcf924 --- /dev/null +++ b/src/Components/Cocktails/context.js @@ -0,0 +1,63 @@ +import React, { + useState, + useContext, + createContext, + useCallback, + useEffect, +} from "react"; + +const url = "https://www.thecocktaildb.com/api/json/v1/1/search.php?s="; +const AppContext = createContext(); + +const AppProvider = ({ children }) => { + const [loading, setLoading] = useState(true); + const [searchTerm, setSearchTerm] = useState("a"); + const [coctails, setCoctails] = useState([]); + + const fetchDrinks = useCallback(async () => { + setLoading(true); + + try { + const response = await fetch(`${url} ${searchTerm}`); + const data = await response.json(); + + const { drinks } = data; + if (drinks) { + const newcoctails = drinks.map((item) => { + const { idDrink, strDrink, strDrinkThumb, strAlcoholic, strGlass } = + item; + + return { + id: idDrink, + name: strDrink, + image: strDrinkThumb, + info: strAlcoholic, + glass: strGlass, + }; + }); + setCoctails(newcoctails); + } else { + setCoctails([]); + } + setLoading(false); + } catch (error) { + setLoading(false); + } + }, [searchTerm]); + + useEffect(() => { + fetchDrinks(); + }, [searchTerm, fetchDrinks]); + + return ( + + {children} + + ); +}; + +export const useGlobalContext = () => { + return useContext(AppContext); +}; + +export { AppContext, AppProvider }; diff --git a/src/Components/Cocktails/pages/About.js b/src/Components/Cocktails/pages/About.js new file mode 100644 index 0000000..62a347c --- /dev/null +++ b/src/Components/Cocktails/pages/About.js @@ -0,0 +1,16 @@ +import React from "react"; + +export default function About() { + return ( +
+

about us

+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae + repudiandae architecto qui adipisci in officiis, aperiam sequi atque + perferendis eos, autem maiores nisi saepe quisquam hic odio consectetur + nobis veritatis quasi explicabo obcaecati doloremque? Placeat ratione + hic aspernatur error blanditiis? +

+
+ ); +} diff --git a/src/Components/Cocktails/pages/Error.js b/src/Components/Cocktails/pages/Error.js new file mode 100644 index 0000000..a207d00 --- /dev/null +++ b/src/Components/Cocktails/pages/Error.js @@ -0,0 +1,14 @@ +import React from "react"; +import { Link } from "react-router-dom"; +export default function Error() { + return ( +
+
+

oops! it's a dead end

+ + back home + +
+
+ ); +} diff --git a/src/Components/Cocktails/pages/Home.js b/src/Components/Cocktails/pages/Home.js new file mode 100644 index 0000000..2e6ddcd --- /dev/null +++ b/src/Components/Cocktails/pages/Home.js @@ -0,0 +1,11 @@ +import React from 'react' +import CocktailList from '../CocktailList' +import Search from '../Search' +export default function Home() { + return ( +
+ + +
+ ) +} diff --git a/src/Components/Cocktails/pages/OneCoctails.js b/src/Components/Cocktails/pages/OneCoctails.js new file mode 100644 index 0000000..1bada11 --- /dev/null +++ b/src/Components/Cocktails/pages/OneCoctails.js @@ -0,0 +1,109 @@ +import React from 'react' +import Loading from '../Loading' +import { useParams, Link } from 'react-router-dom' + +export default function SingleCocktail() { + const { id } = useParams() + const [loading, setLoading] = React.useState(false) + const [cocktail, setCocktail] = React.useState(null) + + React.useEffect(() => { + setLoading(true) + async function getCocktail() { + try { + const response = await fetch( + `https://www.thecocktaildb.com/api/json/v1/1/lookup.php?i=${id}` + ) + const data = await response.json() + if (data.drinks) { + const { + strDrink: name, + strDrinkThumb: image, + strAlcoholic: info, + strCategory: category, + strGlass: glass, + strInstructions: instructions, + strIngredient1, + strIngredient2, + strIngredient3, + strIngredient4, + strIngredient5, + } = data.drinks[0] + const ingredients = [ + strIngredient1, + strIngredient2, + strIngredient3, + strIngredient4, + strIngredient5, + ] + const newCocktail = { + name, + image, + info, + category, + glass, + instructions, + ingredients, + } + setCocktail(newCocktail) + } else { + setCocktail(null) + } + } catch (error) { + console.log(error) + } + setLoading(false) + } + getCocktail() + }, [id]) + if (loading) { + return + } + if (!cocktail) { + return

no cocktail to display

+ } else { + const { + name, + image, + category, + info, + glass, + instructions, + ingredients, + } = cocktail + return ( +
+ + back home + +

{name}

+
+ {name} +
+

+ name : {name} +

+

+ category : {category} +

+

+ info : {info} +

+

+ glass : {glass} +

+

+ instructons : {instructions} +

+

+ ingredients : + {ingredients.map((item, index) => { + return item ? {item} : null + })} +

+
+
+
+ ) + } +} diff --git a/src/Components/Menu/Menu.js b/src/Components/Menu/Menu.js index 1835cc3..92bedcd 100644 --- a/src/Components/Menu/Menu.js +++ b/src/Components/Menu/Menu.js @@ -14,6 +14,7 @@ function Menu() { { to: "/modelapp", name: "Redux App", icon: }, { to: "/reverseapp", name: "Word Reverse App", icon: }, { to: "/calculator", name: "Calculator App", icon: }, + { to: "/cocktails", name: "Cocktails ", icon: } ]; return (