diff --git a/package-lock.json b/package-lock.json index 3c65e57..bfa3ce8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@testing-library/user-event": "^13.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" } @@ -3085,6 +3086,14 @@ } } }, + "node_modules/@remix-run/router": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -13971,6 +13980,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "dependencies": { + "@remix-run/router": "1.15.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "dependencies": { + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -18835,6 +18874,11 @@ "source-map": "^0.7.3" } }, + "@remix-run/router": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==" + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -26585,6 +26629,23 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, + "react-router": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "requires": { + "@remix-run/router": "1.15.3" + } + }, + "react-router-dom": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "requires": { + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" + } + }, "react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", diff --git a/package.json b/package.json index 022d9bf..c7d6f77 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "@testing-library/user-event": "^13.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" }, diff --git a/src/App.js b/src/App.js index 3784575..bcd8ddd 100644 --- a/src/App.js +++ b/src/App.js @@ -1,25 +1,27 @@ -import logo from './logo.svg'; -import './App.css'; +// App.js +import React from 'react'; +import { BrowserRouter as Router, Route, Routes, Link } from 'react-router-dom'; +import BeerList from './beerList'; +import BeerDetails from './beerDetails'; +import RandomBeer from './randomBeer'; +import NewBeerForm from './newBeerForm'; -function App() { +const App = () => { return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - -
-
+ + + + } /> + } /> + } /> + } /> + + ); -} +}; -export default App; +export default App; \ No newline at end of file diff --git a/src/beerDetails.js b/src/beerDetails.js new file mode 100644 index 0000000..522d262 --- /dev/null +++ b/src/beerDetails.js @@ -0,0 +1,33 @@ +import React, { useState, useEffect } from 'react'; +import { useParams } from 'react-router-dom'; + +const BeerDetails = () => { + const { beerId } = useParams(); + const [beer, setBeer] = useState(null); + + useEffect(() => { + // Fetch data for the selected beer + fetch(`https://ih-beers-api2.herokuapp.com/beers/${beerId}`) + .then((response) => response.json()) + .then((data) => setBeer(data)) + .catch((error) => console.error('Error fetching beer details:', error)); + }, [beerId]); + + if (!beer) { + return
Loading...
; + } + + return ( +
+

{beer.name}

+ {beer.name} +

{beer.tagline}

+

First Brewed: {beer.first_brewed}

+

Attenuation Level: {beer.attenuation_level}

+

Description: {beer.description}

+

Contributed by: {beer.contributed_by}

+
+ ); +}; + +export default BeerDetails; \ No newline at end of file diff --git a/src/beerList.js b/src/beerList.js new file mode 100644 index 0000000..e69de29 diff --git a/src/newBeerForm.js b/src/newBeerForm.js new file mode 100644 index 0000000..74d4fb0 --- /dev/null +++ b/src/newBeerForm.js @@ -0,0 +1,78 @@ +import React, { useState } from 'react'; + +const NewBeerForm = () => { + const [formData, setFormData] = useState({ + name: '', + tagline: '', + description: '', + first_brewed: '', + brewers_tips: '', + attenuation_level: '', + contributed_by: '', + }); + + const handleInputChange = (e) => { + const { name, value } = e.target; + setFormData({ ...formData, [name]: value }); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + + // Perform POST request to create a new beer + fetch('https://ih-beers-api2.herokuapp.com/beers/new', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(formData), + }) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.json(); + }) + .then((data) => { + console.log('New beer created successfully:', data); + // Optionally, you can redirect to another page or update the UI + }) + .catch((error) => console.error('Error creating new beer:', error)); + }; + + return ( +
+ + + + + + + + +
+ ); +}; + +export default NewBeerForm; \ No newline at end of file diff --git a/src/randomBeer.js b/src/randomBeer.js new file mode 100644 index 0000000..496771c --- /dev/null +++ b/src/randomBeer.js @@ -0,0 +1,31 @@ +import React, { useState, useEffect } from 'react'; + +const RandomBeer = () => { + const [randomBeer, setRandomBeer] = useState(null); + + useEffect(() => { + // Fetch data for a random beer + fetch('https://ih-beers-api2.herokuapp.com/beers/random') + .then((response) => response.json()) + .then((data) => setRandomBeer(data)) + .catch((error) => console.error('Error fetching random beer details:', error)); + }, []); + + if (!randomBeer) { + return
Loading...
; + } + + return ( +
+

{randomBeer.name}

+ {randomBeer.name} +

{randomBeer.tagline}

+

First Brewed: {randomBeer.first_brewed}

+

Attenuation Level: {randomBeer.attenuation_level}

+

Description: {randomBeer.description}

+

Contributed by: {randomBeer.contributed_by}

+
+ ); +}; + +export default RandomBeer; \ No newline at end of file