Skip to content

Commit 0011eaa

Browse files
added cocktails page
1 parent 5dd79a4 commit 0011eaa

15 files changed

+234
-595
lines changed

package-lock.json

+29-578
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"private": true,
55
"dependencies": {
66
"axios": "^0.21.1",
7+
"normalize.css": "^8.0.1",
78
"react": "^17.0.1",
89
"react-dom": "^17.0.1",
910
"react-redux": "^7.2.2",
@@ -35,13 +36,13 @@
3536
},
3637
"devDependencies": {
3738
"@types/axios": "^0.14.0",
39+
"@types/node": "^12.19.9",
40+
"@types/react": "^16.14.2",
41+
"@types/react-dom": "^16.9.10",
3842
"@types/react-redux": "^7.1.12",
3943
"@types/react-router-dom": "^5.1.6",
4044
"@types/redux": "^3.6.0",
4145
"@types/redux-saga": "^0.10.5",
42-
"@types/node": "^12.19.9",
43-
"@types/react": "^16.14.2",
44-
"@types/react-dom": "^16.9.10",
4546
"redux-devtools-extension": "^2.13.8",
4647
"sass": "^1.30.0",
4748
"typescript": "^4.1.3"

src/App.tsx

+21-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
1-
import React from 'react';
1+
import {useEffect} from "react";
2+
import {Route, Switch} from "react-router-dom";
23
import style from './styles/App.module.scss';
4+
import {Nav} from "./components/Nav";
5+
import {Cocktails} from "./pages/Cocktails";
6+
import {Details} from "./pages/Details";
7+
import {NotFound} from "./pages/NotFound";
8+
9+
export function App() {
10+
useEffect(() => {
11+
window.addEventListener("unhandledrejection", (reason: PromiseRejectionEvent) => {
12+
alert(reason.reason.message)
13+
})
14+
}, [])
315

4-
function App() {
516
return (
6-
<div className={style.container}>
7-
</div>
17+
<main className={style.container}>
18+
<Nav/>
19+
<Switch>
20+
<Route exact path={'/'} component={Cocktails}/>
21+
<Route path={'/details'} component={Details}/>
22+
<Route component={NotFound}/>
23+
</Switch>
24+
</main>
825
)
926
}
10-
11-
export default App

src/components/Nav.tsx

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import style from '../styles/Nav.module.scss';
2+
import {NavLink} from "react-router-dom";
3+
4+
export function Nav() {
5+
return (
6+
<nav className={style.container}>
7+
<NavLink activeClassName={style.active} exact to={'/'}>Cocktails</NavLink>
8+
<NavLink activeClassName={style.active} to={'/details'}>Details</NavLink>
9+
</nav>
10+
)
11+
}

src/index.tsx

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1-
import React from 'react';
21
import ReactDOM from 'react-dom';
2+
import {StrictMode} from "react";
3+
import 'normalize.css';
34
import './styles/index.scss';
4-
import App from './App';
5+
import {App} from './App';
56
import {Provider} from "react-redux";
67
import {store} from "./redux/store";
8+
import {BrowserRouter} from "react-router-dom";
79

810
ReactDOM.render(
9-
<React.StrictMode>
11+
<StrictMode>
1012
<Provider store={store}>
11-
<App/>
13+
<BrowserRouter>
14+
<App/>
15+
</BrowserRouter>
1216
</Provider>
13-
</React.StrictMode>,
17+
</StrictMode>,
1418
document.getElementById('root')
1519
)

src/pages/Cocktails.tsx

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import style from '../styles/Cocktails.module.scss';
2+
import {useDispatch, useSelector} from "react-redux";
3+
import {stateType} from "../interfaces/stateType";
4+
import {useEffect, useState} from "react";
5+
import {requestFilterIsAlcoholic} from "../redux/drinksActions";
6+
7+
export function Cocktails() {
8+
const dispatch = useDispatch()
9+
const state = useSelector((state: stateType) => state.drinks)
10+
const [isAlcoholic, setIsAlcoholic] = useState(false)
11+
12+
useEffect(() => {
13+
dispatch(requestFilterIsAlcoholic(isAlcoholic))
14+
}, [isAlcoholic, dispatch])
15+
16+
return (
17+
<div className={style.container}>
18+
{isAlcoholic ? <h2>Alcoholic Cocktails</h2> : <h2>Non-Alcoholic Cocktails</h2>}
19+
<section className={style.drinksFilter}>
20+
<span>
21+
<input type="radio" id="non-alcoholic" name="cocktails" checked={!isAlcoholic}
22+
onChange={() => setIsAlcoholic(!isAlcoholic)}/>
23+
<label htmlFor="non-alcoholic">Non-alcoholic</label>
24+
</span>
25+
<span>
26+
<input type="radio" id="alcoholic" name="cocktails" checked={isAlcoholic}
27+
onChange={() => setIsAlcoholic(!isAlcoholic)}/>
28+
<label htmlFor="alcoholic">Alcoholic</label>
29+
</span>
30+
</section>
31+
<section className={style.drinksSection}>
32+
{state.drinks.length && state.drinks.map(item => {
33+
return (
34+
<div key={item.idDrink} className={style.drinkItem}>
35+
<p>{item.strDrink}</p>
36+
<img src={item.strDrinkThumb} alt={item.strDrink}/>
37+
</div>
38+
)
39+
})}
40+
</section>
41+
</div>
42+
)
43+
}

src/pages/Details.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import style from '../styles/Details.module.scss';
2+
3+
export function Details() {
4+
return (
5+
<div className={style.container}>Details</div>
6+
)
7+
}

src/pages/NotFound.tsx

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import style from '../styles/NotFound.module.scss';
2+
import {NavLink} from "react-router-dom";
3+
4+
export function NotFound() {
5+
return (
6+
<div className={style.container}>
7+
<p>Page was not found :(</p>
8+
<NavLink exact to={'/'}>
9+
<button>
10+
Back
11+
</button>
12+
</NavLink>
13+
</div>
14+
)
15+
}

src/redux/store.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const rootReducer = combineReducers({
1010

1111
const sagaMiddleware = createSagaMiddleware()
1212

13-
export const store = createStore(drinksReducer, compose(
13+
export const store = createStore(rootReducer, compose(
1414
applyMiddleware(sagaMiddleware),
1515
composeWithDevTools() ? composeWithDevTools() : (f: () => void) => f
1616
))

src/styles/App.module.scss

+7-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
.container {}
1+
.container {
2+
display: grid;
3+
grid-template-rows: 70px 1fr;
4+
min-height: 100vh;
5+
min-width: 320px;
6+
background-color: #8080802D;
7+
}

src/styles/Cocktails.module.scss

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
.container {
2+
h2 {
3+
text-align: center;
4+
}
5+
6+
.drinksFilter {
7+
margin: auto;
8+
width: fit-content;
9+
10+
span {
11+
padding: 0 10px;
12+
}
13+
14+
input, label {
15+
cursor: pointer;
16+
}
17+
18+
label {
19+
margin-left: 5px;
20+
}
21+
}
22+
23+
.drinksSection {
24+
margin: 20px 10%;
25+
justify-content: center;
26+
display: grid;
27+
grid-template-columns: repeat(auto-fit, 175px);
28+
grid-auto-rows: 250px;
29+
grid-gap: 30px;
30+
31+
.drinkItem {
32+
p {
33+
display: flex;
34+
justify-content: center;
35+
align-items: center;
36+
text-align: center;
37+
height: 43px;
38+
overflow: hidden;
39+
}
40+
41+
img {
42+
width: 175px;
43+
height: 175px;
44+
}
45+
}
46+
}
47+
}

src/styles/Details.module.scss

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.container {}

src/styles/Nav.module.scss

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
.container {
2+
display: flex;
3+
justify-content: space-between;
4+
align-items: center;
5+
font-size: 24px;
6+
padding: 0 30px;
7+
background-color: #000;
8+
9+
a {
10+
text-decoration: none;
11+
color: #fff;
12+
13+
&:hover {
14+
color: #fff;
15+
}
16+
17+
&.active {
18+
color: #7fff00;
19+
20+
&:hover {
21+
color: #7fff00;
22+
}
23+
}
24+
}
25+
}

src/styles/NotFound.module.scss

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
.container {
2+
display: flex;
3+
flex-direction: column;
4+
justify-content: center;
5+
align-items: center;
6+
font-size: 26px;
7+
font-weight: 700;
8+
height: calc(100vh - 70px);
9+
10+
button {
11+
cursor: pointer;
12+
padding: 5px 10px;
13+
}
14+
}

src/styles/index.scss

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
body {
2-
margin: 0;
32
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
43
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
54
sans-serif;

0 commit comments

Comments
 (0)