├── .gitignore ├── README.md ├── package.json ├── public └── index.html ├── src ├── App.css ├── App.js ├── components │ ├── AddUser.js │ ├── LandingPage.js │ ├── User.js │ └── Users.js └── index.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # React form with hooks 3 | 4 | you can run: 5 | 6 | ### `yarn start` 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-hooks", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^4.2.4", 7 | "@testing-library/react": "^9.3.2", 8 | "@testing-library/user-event": "^7.1.2", 9 | "axios": "^0.19.2", 10 | "react": "^16.13.0", 11 | "react-dom": "^16.13.0", 12 | "react-router-dom": "^5.1.2", 13 | "react-scripts": "3.4.0" 14 | }, 15 | "scripts": { 16 | "start": "react-scripts start", 17 | "build": "react-scripts build", 18 | "test": "react-scripts test", 19 | "eject": "react-scripts eject" 20 | }, 21 | "eslintConfig": { 22 | "extends": "react-app" 23 | }, 24 | "browserslist": { 25 | "production": [ 26 | ">0.2%", 27 | "not dead", 28 | "not op_mini all" 29 | ], 30 | "development": [ 31 | "last 1 chrome version", 32 | "last 1 firefox version", 33 | "last 1 safari version" 34 | ] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | React from with hooks 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | * { 2 | padding: 0; 3 | margin: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | 8 | 9 | .App { 10 | width: 75%; 11 | display: flex; 12 | flex-direction: column; 13 | text-align: center; 14 | height: 100vh; 15 | margin: auto; 16 | } 17 | 18 | form { 19 | width: 100%; 20 | margin: auto; 21 | } 22 | 23 | input { 24 | width: 35%; 25 | padding: 5px; 26 | margin: 3px 0; 27 | } 28 | 29 | button { 30 | width: 150px; 31 | height: 30px; 32 | cursor: pointer; 33 | padding: 5px; 34 | margin: 10px 0; 35 | color: #444; 36 | border: 1px solid gray; 37 | } 38 | 39 | li { 40 | list-style: none; 41 | } 42 | 43 | a { 44 | text-decoration: none; 45 | display: inline-block; 46 | border: 1px solid gray; 47 | width: 150px; 48 | height: 30px; 49 | cursor: pointer; 50 | padding: 5px; 51 | margin: 10px 0; 52 | color: #444; 53 | } -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | import { BrowserRouter, Route, Switch } from 'react-router-dom' 3 | import './App.css' 4 | import AddUser from './components/AddUser' 5 | import Users from './components/Users' 6 | import LandingPage from './components/LandingPage' 7 | 8 | const App = () => { 9 | const [users, setUsers] = useState([]) 10 | const addUser = user => { 11 | // const newUser2 = users.slice() 12 | // newUser2.push(user) 13 | // setUsers(newUser2) 14 | const newUser = [...users, user] 15 | setUsers(newUser) 16 | } 17 | return ( 18 | 19 |
20 | 21 | } 24 | /> 25 | } 28 | /> 29 | 30 | 31 |
32 |
33 | ) 34 | } 35 | 36 | export default App 37 | -------------------------------------------------------------------------------- /src/components/AddUser.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | 3 | const AddUser = ({ addUser, history }) => { 4 | const initialState = { 5 | firstName: '', 6 | lastName: '', 7 | email: '', 8 | country: '' 9 | } 10 | const [formData, setFormData] = useState(initialState) 11 | 12 | const handleChange = e => { 13 | const { name, value } = e.target 14 | const newData = { ...formData, [name]: value } 15 | setFormData(newData) 16 | } 17 | const handleSubmit = e => { 18 | e.preventDefault() 19 | addUser(formData) 20 | history.push('/users') 21 | } 22 | 23 | return ( 24 |
25 |
26 | 33 |
34 |
35 | 42 |
43 |
44 | 51 |
52 |
53 | 60 |
61 |
62 | 63 |
64 |
65 | ) 66 | } 67 | 68 | export default AddUser 69 | -------------------------------------------------------------------------------- /src/components/LandingPage.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { NavLink } from 'react-router-dom' 3 | import PropTypes from 'prop-types' 4 | 5 | const LandingPage = props => { 6 | return ( 7 |
8 |

Home Sweet Home

9 |
  • 10 | Go to users 11 |
  • 12 |
    13 | ) 14 | } 15 | 16 | LandingPage.propTypes = {} 17 | 18 | export default LandingPage 19 | -------------------------------------------------------------------------------- /src/components/User.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | 4 | const User = ({ user }) => { 5 | const { firstName, lastName, email, country } = user 6 | return ( 7 |
    8 |

    9 | {firstName} {lastName} 10 |

    11 |

    {email}

    12 |

    {country}

    13 |
    14 |
    15 | ) 16 | } 17 | 18 | User.propTypes = { 19 | user: PropTypes.object.isRequired 20 | } 21 | 22 | export default User 23 | -------------------------------------------------------------------------------- /src/components/Users.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | import { NavLink } from 'react-router-dom' 3 | import User from './User' 4 | import PropTypes from 'prop-types' 5 | 6 | const Users = ({ users }) => { 7 | const userList = users.map(user => ) 8 | return ( 9 | <> 10 |
    11 |

    {users.length}

    12 | 17 |
    18 |
    {userList}
    19 | 20 | ) 21 | } 22 | 23 | Users.propTypes = { 24 | users: PropTypes.array.isRequired 25 | } 26 | 27 | export default Users 28 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import App from './App' 4 | 5 | ReactDOM.render(, document.getElementById('root')) 6 | --------------------------------------------------------------------------------