Login.js 2.81 KB
Newer Older
1
2
import { useEffect, useState} from 'react'
import { Link } from 'react-router-dom'
seoyeon's avatar
0726    
seoyeon committed
3
import userApi from '../apis/user.api'
seoyeon's avatar
useRef    
seoyeon committed
4
5
import catchErrors from '../context/catchError'
import { handleLogin } from '../context/auth'
Kim, Chaerin's avatar
Kim, Chaerin committed
6
const INIT_USER = {
seoyeon's avatar
0726    
seoyeon committed
7
8
9
  email: '',
  password: '',
}
Kim, Chaerin's avatar
Kim, Chaerin committed
10

Kim, Chaerin's avatar
Kim, Chaerin committed
11
const Login = () => {
seoyeon's avatar
0726    
seoyeon committed
12
13
14
15
  const [user, setUser] = useState(INIT_USER)
  const [disabled, setDisabled] = useState(true)
  const [error, setError] = useState('')
  const [success, setSuccess] = useState(false)
Kim, Chaerin's avatar
Kim, Chaerin committed
16
17

  useEffect(() => {
seoyeon's avatar
0726    
seoyeon committed
18
19
20
    const isUser = Object.values(user).every((el) => Boolean(el))
    isUser ? setDisabled(false) : setDisabled(true)
  }, [user])
Kim, Chaerin's avatar
Kim, Chaerin committed
21
22

  function handleChange(event) {
seoyeon's avatar
0726    
seoyeon committed
23
24
    const { name, value } = event.target
    setUser({ ...user, [name]: value })
Kim, Chaerin's avatar
Kim, Chaerin committed
25
26
  }

Kim, Chaerin's avatar
.    
Kim, Chaerin committed
27
  async function handleSubmit(e) {
seoyeon's avatar
0726    
seoyeon committed
28
    e.preventDefault()
Kim, Chaerin's avatar
Kim, Chaerin committed
29
30
31
    try {
      // setLoading(true);
      // setError("");
seoyeon's avatar
0726    
seoyeon committed
32
      const data = await userApi.login(user)
seoyeon's avatar
seoyeon committed
33
      handleLogin(data.id)
seoyeon's avatar
0726    
seoyeon committed
34
      setSuccess(true)
Kim, Chaerin's avatar
Kim, Chaerin committed
35
    } catch (error) {
seoyeon's avatar
0726    
seoyeon committed
36
37
      console.log('error in login', error)
      catchErrors(error, setError)
Kim, Chaerin's avatar
Kim, Chaerin committed
38
39
40
41
    } finally {
      // setLoading(false);
    }
  }
seoyeon's avatar
0716    
seoyeon committed
42
  if (success) {
이재연's avatar
이재연 committed
43
44
    alert('로그인 되었습니다');
    window.location.href='/user'
seoyeon's avatar
0716    
seoyeon committed
45
46
  }

seoyeon's avatar
0726    
seoyeon committed
47
  const { email, password } = user
Kim, Chaerin's avatar
Kim, Chaerin committed
48
49

  return (
seoyeon's avatar
seoyeon committed
50
    <div className="container">
Kim, Chaerin's avatar
Kim, Chaerin committed
51
      <form onSubmit={handleSubmit}>
seoyeon's avatar
seoyeon committed
52
53
54
55
        <div className="m-3 d-flex justify-content-center">
          <Link to="/">
            <img src="/BORA.png" style={{ width: '160px' }} />
          </Link>
Kim, Chaerin's avatar
Kim, Chaerin committed
56
        </div>
seoyeon's avatar
seoyeon committed
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
        <div className="row mt-5 d-flex align-items-center">
          <h2 style={{ textAlign: 'center' }}>로그인</h2>
          {error && <div className="alert alert-danger">{error}</div>}
          <div className="form-group">
            <div className="mt-5">
              <label>아이디</label>
              <input
                className="form-control"
                id="email"
                type="text"
                name="email"
                placeholder="아이디를 입력하세요"
                value={email}
                onChange={handleChange}
              />
            </div>
            <div className="mt-3">
              <label>비밀번호</label>
              <input
                className="form-control"
                id="password"
                type="password"
                name="password"
                placeholder="비밀번호를 입력하세요"
                value={password}
                onChange={handleChange}
              />
            </div>
Kim, Chaerin's avatar
Kim, Chaerin committed
85
          </div>
seoyeon's avatar
seoyeon committed
86
87
88
89
90
91
92
93
          <div className="mt-4 d-flex justify-content-center">
            <button
              type="submit"
              className="btn btn-primary"
              disabled={disabled}
            >
              로그인
            </button>
Kim, Chaerin's avatar
Kim, Chaerin committed
94
95
96
97
          </div>
        </div>
      </form>
    </div>
seoyeon's avatar
0726    
seoyeon committed
98
99
  )
}
Kim, Chaerin's avatar
Kim, Chaerin committed
100

seoyeon's avatar
0726    
seoyeon committed
101
export default Login