diff --git a/src/App.jsx b/src/App.jsx index dff16d3..ebffb55 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -6,11 +6,20 @@ import LoginPage from "./components/LoginPage" function App() { return ( +
+ + + } /> } /> +
); } diff --git a/src/components/LoginPage.jsx b/src/components/LoginPage.jsx index e3e484c..128b6a0 100644 --- a/src/components/LoginPage.jsx +++ b/src/components/LoginPage.jsx @@ -3,24 +3,63 @@ import axios from "axios"; import { useNavigate } from "react-router-dom"; import "../styles/LoginPage.css"; -function LoginForm() { - +function LoginPage() { + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const navigate = useNavigate(); const handleLogin = async (e) => { e.preventDefault(); + try { + const response = await axios.post( + "https://reqres.in/api/login", + { + email: email, + password: password, + }, + { + headers: { + "Content-Type": "application/json", + "x-api-key": "reqres-free-v1", + }, + } + ); - + const { token } = response.data; + + localStorage.setItem("email", email); + localStorage.setItem("token", token); + + navigate("/userlist"); + } catch (error) { + if (error.response && error.response.data && error.response.data.error) { + alert(error.response.data.error); + } else { + alert("로그인 실패"); + } + console.error(error); + } }; return (

🔐 로그인

- - + setEmail(e.target.value)} + /> + setPassword(e.target.value)} + />
); } -export default LoginForm; +export default LoginPage; diff --git a/src/components/UserList.jsx b/src/components/UserList.jsx index 21539fc..968aabe 100644 --- a/src/components/UserList.jsx +++ b/src/components/UserList.jsx @@ -3,23 +3,70 @@ import axios from "axios"; import "../styles/UserList.css"; function UserList() { + const [users, setUsers] = useState([]); + const [searchTerm, setSearchTerm] = useState(""); + + + const email = localStorage.getItem("email"); + const token = localStorage.getItem("token"); + + useEffect(() => { + axios + .get("https://reqres.in/api/users", { + headers: { + "x-api-key": "reqres-free-v1", + }, + }) + .then((response) => { + setUsers(response.data.data); + }) + .catch((error) => { + if (error.response && error.response.data && error.response.data.error) { + alert(error.response.data.error); + } else { + alert("유저 정보를 불러오는 데 실패했습니다."); + } + console.error(error); + }); + }, []); + + const filteredUsers = users.filter((user) => { + const keyword = searchTerm.toLowerCase(); + return ( + user.email.toLowerCase().includes(keyword) || + `${user.first_name} ${user.last_name}`.toLowerCase().includes(keyword) + ); +}); + + return (
-

이메일: { }

-

토큰: { }

+

이메일: { email}

+

토큰: {token }

-

👥 유저 목록

+

유저 목록

setSearchTerm(e.target.value)} />
- + {filteredUsers.map((user) => ( +
+ {`${user.first_name} +

{user.first_name} {user.last_name}

+

{user.email}

+
+ ))} +
); }