Skip to content

Commit 46d1e98

Browse files
Day 14 Cocktails | Setup
1 parent 96bdb0c commit 46d1e98

File tree

10 files changed

+292
-51
lines changed

10 files changed

+292
-51
lines changed

15-cocktails/setup/src/App.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,34 @@
11
import React from 'react'
22
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'
3+
34
// import pages
45
import Home from './pages/Home'
56
import About from './pages/About'
67
import SingleCocktail from './pages/SingleCocktail'
78
import Error from './pages/Error'
9+
810
// import components
911
import Navbar from './components/Navbar'
12+
1013
function App() {
1114
return (
12-
<div>
13-
<h2>app component</h2>
14-
</div>
15+
<Router>
16+
<Navbar />
17+
<Switch>
18+
<Route exact path="/">
19+
<Home />
20+
</Route>
21+
<Route path="/about">
22+
<About />
23+
</Route>
24+
<Route path="/cocktail/:id">
25+
<SingleCocktail />
26+
</Route>
27+
<Route path="*">
28+
<Error />
29+
</Route>
30+
</Switch>
31+
</Router>
1532
)
1633
}
1734

15-cocktails/setup/src/components/Cocktail.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
import React from 'react'
22
import { Link } from 'react-router-dom'
33

4-
const Cocktail = () => {
4+
const Cocktail = ({image,name,id,info,glass}) => {
55
return (
6-
<div>
7-
<h2>cocktail component</h2>
8-
</div>
6+
<article className='cocktail'>
7+
<div className="img-container">
8+
<img src={image} alt={name} />
9+
</div>
10+
<div className="cocktail-footer">
11+
<h3>{name}</h3>
12+
<h4>{glass}</h4>
13+
<p>{info}</p>
14+
<Link to={`/cocktail/${id}`} className="btn btn-primary">
15+
details
16+
</Link>
17+
</div>
18+
</article>
919
)
1020
}
1121

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,33 @@
1-
import React from 'react'
2-
import Cocktail from './Cocktail'
3-
import Loading from './Loading'
4-
import { useGlobalContext } from '../context'
1+
import React from "react";
2+
import Cocktail from "./Cocktail";
3+
import Loading from "./Loading";
4+
import { useGlobalContext } from "../context";
55

66
const CocktailList = () => {
7+
const { cocktails, loading } = useGlobalContext();
8+
9+
if (loading) return <Loading />;
10+
11+
if (cocktails.length < 1) {
12+
return (
13+
<h2 className="section-title">
14+
no cocktails matched your search criteria
15+
</h2>
16+
);
17+
}
18+
719
return (
8-
<div>
9-
<h2>cocktail list component</h2>
10-
</div>
11-
)
12-
}
20+
<section className="section">
21+
<h2 className="section-title">Cocktails</h2>
22+
<div className="cocktails-center">
23+
{
24+
cocktails.map((item)=>{
25+
return <Cocktail key={item.id} {...item}></Cocktail>
26+
})
27+
}
28+
</div>
29+
</section>
30+
);
31+
};
1332

14-
export default CocktailList
33+
export default CocktailList;

15-cocktails/setup/src/components/Navbar.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,25 @@ import logo from '../logo.svg'
44

55
const Navbar = () => {
66
return (
7-
<div>
8-
<h2>navbar component</h2>
9-
</div>
7+
<nav className="navbar">
8+
<div className="nav-center">
9+
<Link to="/">
10+
<img src={logo} alt="cocktail db logo" className="logo"/>
11+
</Link>
12+
<ul className="nav-links">
13+
<li>
14+
<Link to="/">
15+
Home
16+
</Link>
17+
</li>
18+
<li>
19+
<Link to="/about">
20+
About
21+
</Link>
22+
</li>
23+
</ul>
24+
</div>
25+
</nav>
1026
)
1127
}
1228

15-cocktails/setup/src/components/SearchForm.js

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,31 @@ import React from 'react'
22
import { useGlobalContext } from '../context'
33

44
const SearchForm = () => {
5+
6+
const {setSearchTerm} = useGlobalContext();
7+
const searchValue = React.useRef('');
8+
9+
React.useEffect(()=>{
10+
searchValue.current.focus();
11+
},[])
12+
13+
const searchCocktail = () => {
14+
setSearchTerm(searchValue.current.value);
15+
}
16+
17+
const handleSubmit = (e) => {
18+
e.preventDefault();
19+
}
20+
521
return (
6-
<div>
7-
<h2>search form component</h2>
8-
</div>
22+
<section className="section search">
23+
<form className="search-form" onSubmit={handleSubmit}>
24+
<div className="form-control">
25+
<label htmlFor="name">Search your favourite cocktail</label>
26+
<input type="text" id="name" ref={searchValue} onChange={searchCocktail}/>
27+
</div>
28+
</form>
29+
</section>
930
)
1031
}
1132

15-cocktails/setup/src/context.js

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,65 @@
1-
import React, { useState, useContext, useEffect } from 'react'
2-
import { useCallback } from 'react'
1+
import React, { useState, useContext, useEffect } from "react";
2+
import { useCallback } from "react";
33

4-
const url = 'https://www.thecocktaildb.com/api/json/v1/1/search.php?s='
5-
const AppContext = React.createContext()
4+
const url = "https://www.thecocktaildb.com/api/json/v1/1/search.php?s=";
5+
const AppContext = React.createContext();
66

77
const AppProvider = ({ children }) => {
8-
return <AppContext.Provider value='hello'>{children}</AppContext.Provider>
9-
}
8+
const [loading, setLoading] = useState(true);
9+
const [searchTerm, setSearchTerm] = useState("a");
10+
const [cocktails, setCocktails] = useState([]);
11+
12+
const fetchDrinks = useCallback(async () => {
13+
setLoading(true);
14+
try {
15+
const response = await fetch(`${url}${searchTerm}`);
16+
const data = await response.json();
17+
const { drinks } = data;
18+
if (drinks) {
19+
const newCocktails = drinks.map((item) => {
20+
const {
21+
idDrink,
22+
strDrink,
23+
strDrinkThumb,
24+
strAlcoholic,
25+
strGlass,
26+
} = item;
27+
return {
28+
id: idDrink,
29+
name: strDrink,
30+
image: strDrinkThumb,
31+
info: strAlcoholic,
32+
glass: strGlass,
33+
};
34+
});
35+
setCocktails(newCocktails);
36+
} else setCocktails([]);
37+
setLoading(false);
38+
} catch (error) {
39+
console.log(error);
40+
setLoading(false);
41+
}
42+
},[searchTerm]);
43+
44+
useEffect(() => {
45+
fetchDrinks();
46+
}, [searchTerm,fetchDrinks]);
47+
48+
return (
49+
<AppContext.Provider
50+
value={{
51+
loading,
52+
cocktails,
53+
setSearchTerm,
54+
}}
55+
>
56+
{children}
57+
</AppContext.Provider>
58+
);
59+
};
1060
// make sure use
1161
export const useGlobalContext = () => {
12-
return useContext(AppContext)
13-
}
62+
return useContext(AppContext);
63+
};
1464

15-
export { AppContext, AppProvider }
65+
export { AppContext, AppProvider };

15-cocktails/setup/src/pages/About.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,18 @@ import React from 'react'
22

33
const About = () => {
44
return (
5-
<div>
6-
<h2>about page</h2>
7-
</div>
5+
<section className="section about-section">
6+
<h1 className="section-title">about us</h1>
7+
<p>
8+
Lorem ipsum dolor sit amet consectetur adipisicing elit.
9+
Quasi quis temporibus nisi ducimus laudantium voluptatem.
10+
Inventore deleniti explicabo reprehenderit blanditiis natus nam minus voluptatum aliquid vero illum,
11+
autem accusantium sequi.Lorem ipsum dolor sit amet consectetur adipisicing elit.
12+
Quasi quis temporibus nisi ducimus laudantium voluptatem.
13+
Inventore deleniti explicabo reprehenderit blanditiis natus nam minus voluptatum aliquid vero illum,
14+
autem accusantium sequi.
15+
</p>
16+
</section>
817
)
918
}
1019

15-cocktails/setup/src/pages/Error.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@ import { Link } from 'react-router-dom'
33

44
const Error = () => {
55
return (
6-
<div>
7-
<h2>error page</h2>
8-
</div>
6+
<section className="section error-page">
7+
<div className="error-container">
8+
<h1>Oops! It's dead end</h1>
9+
<Link to="/" className="btn btn-primary">
10+
back home
11+
</Link>
12+
</div>
13+
</section>
914
)
1015
}
1116

15-cocktails/setup/src/pages/Home.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import SearchForm from '../components/SearchForm'
44

55
const Home = () => {
66
return (
7-
<div>
8-
<h2>home page</h2>
9-
</div>
7+
<main>
8+
<SearchForm />
9+
<CocktailList />
10+
</main>
1011
)
1112
}
1213

0 commit comments

Comments
 (0)