Skip to content

Commit bf4a9f4

Browse files
author
Ivan Franchin
committed
Convert React Class Components into Functional Components using React Hooks
1 parent 7f25209 commit bf4a9f4

File tree

6 files changed

+376
-411
lines changed

6 files changed

+376
-411
lines changed
Lines changed: 78 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,163 +1,145 @@
1-
import React, { Component } from 'react'
1+
import React, { useEffect, useState } from 'react'
22
import { Navigate } from 'react-router-dom'
33
import { Container } from 'semantic-ui-react'
4-
import AuthContext from '../context/AuthContext'
5-
import { orderApi } from '../misc/OrderApi'
4+
import { useAuth } from '../context/AuthContext'
65
import AdminTab from './AdminTab'
6+
import { orderApi } from '../misc/OrderApi'
77
import { handleLogError } from '../misc/Helpers'
88

9-
class AdminPage extends Component {
10-
static contextType = AuthContext
11-
12-
state = {
13-
users: [],
14-
orders: [],
15-
orderDescription: '',
16-
orderTextSearch: '',
17-
userUsernameSearch: '',
18-
isAdmin: true,
19-
isUsersLoading: false,
20-
isOrdersLoading: false,
21-
}
22-
23-
componentDidMount() {
24-
const Auth = this.context
25-
const user = Auth.getUser()
26-
const isAdmin = user.data.rol[0] === 'ADMIN'
27-
this.setState({ isAdmin })
28-
29-
this.handleGetUsers()
30-
this.handleGetOrders()
31-
}
32-
33-
handleInputChange = (e, { name, value }) => {
34-
this.setState({ [name]: value })
9+
function AdminPage() {
10+
const Auth = useAuth()
11+
const user = Auth.getUser()
12+
13+
const [users, setUsers] = useState([])
14+
const [orders, setOrders] = useState([])
15+
const [orderDescription, setOrderDescription] = useState('')
16+
const [orderTextSearch, setOrderTextSearch] = useState('')
17+
const [userUsernameSearch, setUserUsernameSearch] = useState('')
18+
const [isAdmin, setIsAdmin] = useState(true)
19+
const [isUsersLoading, setIsUsersLoading] = useState(false)
20+
const [isOrdersLoading, setIsOrdersLoading] = useState(false)
21+
22+
useEffect(() => {
23+
setIsAdmin(user.data.rol[0] === 'ADMIN')
24+
handleGetUsers()
25+
handleGetOrders()
26+
}, [])
27+
28+
const handleInputChange = (e, { name, value }) => {
29+
if (name === 'userUsernameSearch') {
30+
setUserUsernameSearch(value)
31+
} else if (name === 'orderDescription') {
32+
setOrderDescription(value)
33+
} else if (name === 'orderTextSearch') {
34+
setOrderTextSearch(value)
35+
}
3536
}
3637

37-
handleGetUsers = async () => {
38-
const user = this.context.getUser()
39-
40-
this.setState({ isUsersLoading: true })
38+
const handleGetUsers = async () => {
39+
setIsUsersLoading(true)
4140
try {
4241
const response = await orderApi.getUsers(user)
43-
this.setState({ users: response.data })
42+
setUsers(response.data)
4443
} catch (error) {
4544
handleLogError(error)
4645
} finally {
47-
this.setState({ isUsersLoading: false })
46+
setIsUsersLoading(false)
4847
}
4948
}
5049

51-
handleDeleteUser = async (username) => {
52-
const user = this.context.getUser()
53-
50+
const handleDeleteUser = async (username) => {
5451
try {
5552
await orderApi.deleteUser(user, username)
56-
await this.handleGetUsers()
53+
handleGetUsers()
5754
} catch (error) {
5855
handleLogError(error)
5956
}
6057
}
6158

62-
handleSearchUser = async () => {
63-
const user = this.context.getUser()
64-
65-
const username = this.state.userUsernameSearch
59+
const handleSearchUser = async () => {
60+
const username = userUsernameSearch
6661
try {
6762
const response = await orderApi.getUsers(user, username)
6863
const data = response.data
6964
const users = data instanceof Array ? data : [data]
70-
this.setState({ users })
65+
setUsers(users)
7166
} catch (error) {
7267
handleLogError(error)
73-
this.setState({ users: [] })
68+
setUsers([])
7469
}
7570
}
7671

77-
handleGetOrders = async () => {
78-
const user = this.context.getUser()
79-
80-
this.setState({ isOrdersLoading: true })
72+
const handleGetOrders = async () => {
73+
setIsOrdersLoading(true)
8174
try {
8275
const response = await orderApi.getOrders(user)
83-
this.setState({ orders: response.data })
76+
setOrders(response.data)
8477
} catch (error) {
8578
handleLogError(error)
8679
} finally {
87-
this.setState({ isOrdersLoading: false })
80+
setIsOrdersLoading(false)
8881
}
8982
}
9083

91-
handleDeleteOrder = async (isbn) => {
92-
const user = this.context.getUser()
93-
84+
const handleDeleteOrder = async (isbn) => {
9485
try {
9586
await orderApi.deleteOrder(user, isbn)
96-
await this.handleGetOrders()
87+
handleGetOrders()
9788
} catch (error) {
9889
handleLogError(error)
9990
}
10091
}
10192

102-
handleCreateOrder = async () => {
103-
const user = this.context.getUser()
104-
105-
let { orderDescription } = this.state
106-
orderDescription = orderDescription.trim()
107-
if (!orderDescription) {
93+
const handleCreateOrder = async () => {
94+
let description = orderDescription.trim()
95+
if (!description) {
10896
return
10997
}
11098

111-
const order = { description: orderDescription }
99+
const order = { description }
112100
try {
113101
await orderApi.createOrder(user, order)
114-
await this.handleGetOrders()
115-
this.setState({ orderDescription: '' })
102+
handleGetOrders()
103+
setOrderDescription('')
116104
} catch (error) {
117105
handleLogError(error)
118106
}
119107
}
120108

121-
handleSearchOrder = async () => {
122-
const user = this.context.getUser()
123-
124-
const text = this.state.orderTextSearch
109+
const handleSearchOrder = async () => {
110+
const text = orderTextSearch
125111
try {
126112
const response = await orderApi.getOrders(user, text)
127-
const orders = response.data
128-
this.setState({ orders })
113+
setOrders(response.data)
129114
} catch (error) {
130115
handleLogError(error)
131-
this.setState({ orders: [] })
116+
setOrders([])
132117
}
133118
}
134119

135-
render() {
136-
if (!this.state.isAdmin) {
137-
return <Navigate to='/' />
138-
}
139-
140-
const { isUsersLoading, users, userUsernameSearch, isOrdersLoading, orders, orderDescription, orderTextSearch } = this.state
141-
return (
142-
<Container>
143-
<AdminTab
144-
isUsersLoading={isUsersLoading}
145-
users={users}
146-
userUsernameSearch={userUsernameSearch}
147-
handleDeleteUser={this.handleDeleteUser}
148-
handleSearchUser={this.handleSearchUser}
149-
isOrdersLoading={isOrdersLoading}
150-
orders={orders}
151-
orderDescription={orderDescription}
152-
orderTextSearch={orderTextSearch}
153-
handleCreateOrder={this.handleCreateOrder}
154-
handleDeleteOrder={this.handleDeleteOrder}
155-
handleSearchOrder={this.handleSearchOrder}
156-
handleInputChange={this.handleInputChange}
157-
/>
158-
</Container>
159-
)
120+
if (!isAdmin) {
121+
return <Navigate to='/' />
160122
}
123+
124+
return (
125+
<Container>
126+
<AdminTab
127+
isUsersLoading={isUsersLoading}
128+
users={users}
129+
userUsernameSearch={userUsernameSearch}
130+
handleDeleteUser={handleDeleteUser}
131+
handleSearchUser={handleSearchUser}
132+
isOrdersLoading={isOrdersLoading}
133+
orders={orders}
134+
orderDescription={orderDescription}
135+
orderTextSearch={orderTextSearch}
136+
handleCreateOrder={handleCreateOrder}
137+
handleDeleteOrder={handleDeleteOrder}
138+
handleSearchOrder={handleSearchOrder}
139+
handleInputChange={handleInputChange}
140+
/>
141+
</Container>
142+
)
161143
}
162144

163145
export default AdminPage

order-ui/src/components/context/AuthContext.js

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,57 @@
1-
import React, { Component, useContext } from 'react'
1+
import React, { createContext, useContext, useState, useEffect } from 'react'
22

3-
const AuthContext = React.createContext()
3+
const AuthContext = createContext()
44

5-
class AuthProvider extends Component {
6-
state = {
7-
user: null
8-
}
5+
function AuthProvider({ children }) {
6+
const [user, setUser] = useState(null)
97

10-
componentDidMount() {
11-
const user = localStorage.getItem('user')
12-
this.setState({ user })
13-
}
8+
useEffect(() => {
9+
const storedUser = JSON.parse(localStorage.getItem('user'))
10+
setUser(storedUser)
11+
}, [])
1412

15-
getUser = () => {
13+
const getUser = () => {
1614
return JSON.parse(localStorage.getItem('user'))
1715
}
1816

19-
userIsAuthenticated = () => {
20-
let user = localStorage.getItem('user')
21-
if (!user) {
17+
const userIsAuthenticated = () => {
18+
let storedUser = localStorage.getItem('user')
19+
if (!storedUser) {
2220
return false
2321
}
24-
user = JSON.parse(user)
25-
22+
storedUser = JSON.parse(storedUser)
23+
2624
// if user has token expired, logout user
27-
if (Date.now() > user.data.exp * 1000) {
28-
this.userLogout()
25+
if (Date.now() > storedUser.data.exp * 1000) {
26+
userLogout()
2927
return false
3028
}
3129
return true
3230
}
3331

34-
userLogin = user => {
32+
const userLogin = user => {
3533
localStorage.setItem('user', JSON.stringify(user))
36-
this.setState({ user })
34+
setUser(user)
3735
}
3836

39-
userLogout = () => {
37+
const userLogout = () => {
4038
localStorage.removeItem('user')
41-
this.setState({ user: null })
39+
setUser(null)
4240
}
4341

44-
render() {
45-
const { children } = this.props
46-
const { user } = this.state
47-
const { getUser, userIsAuthenticated, userLogin, userLogout } = this
48-
49-
return (
50-
<AuthContext.Provider value={{ user, getUser, userIsAuthenticated, userLogin, userLogout, }}>
51-
{children}
52-
</AuthContext.Provider>
53-
)
42+
const contextValue = {
43+
user,
44+
getUser,
45+
userIsAuthenticated,
46+
userLogin,
47+
userLogout,
5448
}
49+
50+
return (
51+
<AuthContext.Provider value={contextValue}>
52+
{children}
53+
</AuthContext.Provider>
54+
)
5555
}
5656

5757
export default AuthContext

0 commit comments

Comments
 (0)