diff --git a/hustle_web/package-lock.json b/hustle_web/package-lock.json index 7358342..53d8596 100644 --- a/hustle_web/package-lock.json +++ b/hustle_web/package-lock.json @@ -22,6 +22,7 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.45.1", "react-icons": "^4.10.1", + "react-kakao-login": "^2.1.1", "react-query": "^3.39.3", "react-router-dom": "^6.15.0", "react-scripts": "5.0.0", @@ -20864,6 +20865,14 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-kakao-login": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-kakao-login/-/react-kakao-login-2.1.1.tgz", + "integrity": "sha512-t9htk41/i0zUY7q92mtqdqVZZ018BPi1DgbSVVrPCmuMKhZGJOnZ9OfaKLVPu3sn8QXbJc3dPwqKOiElpb44hQ==", + "peerDependencies": { + "react": ">= 15.3.0" + } + }, "node_modules/react-query": { "version": "3.39.3", "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", diff --git a/hustle_web/package.json b/hustle_web/package.json index 22e95f7..fc55950 100644 --- a/hustle_web/package.json +++ b/hustle_web/package.json @@ -17,6 +17,7 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.45.1", "react-icons": "^4.10.1", + "react-kakao-login": "^2.1.1", "react-query": "^3.39.3", "react-router-dom": "^6.15.0", "react-scripts": "5.0.0", diff --git a/hustle_web/src/Router.tsx b/hustle_web/src/Router.tsx index 3186b5d..3125bba 100644 --- a/hustle_web/src/Router.tsx +++ b/hustle_web/src/Router.tsx @@ -39,7 +39,7 @@ const Router = () => { } /> } /> } /> - }/> + }/> } /> { - useEffect(() => { - const code = new URL(window.location.href).searchParams.get('code'); - const grantType = 'authorization_code'; - const REST_API_KEY = process.env.REACT_API_KEY; - const REDIRECT_URI = process.env.REDIRECT_URI; - - axios.post( - `https://kauth.kakao.com/oauth/token?grant_type=${grantType}&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&code=${code}`, - {}, - { headers: { 'Content-type': 'application/x-www-form-urlencoded;charset=utf-8' }} - ) +const KakaoLoginRedirect = () => { + const navigate = useNavigate(); + const { setIsLoggedIn, setAccessToken, refreshAccessToken } = useContext(AuthContext); + const code = new URL(window.location.href).searchParams.get('code'); + const [selectedUniversity, setSelectedUniversity] = useState(''); + + const handleUniversitySelection = (universityId: number) => { + const university = `${universityId}`; + setSelectedUniversity(university); + console.log(selectedUniversity); + }; + + const handleSubmit = () => { + axios.get(`https://api.sport-hustle.com/api/oauth/kakao/token?code=${code}`) .then((res) => { - console.log(res); - const accessToken = res.data.accessToken; - axios.post('https://api.sport-hustle.com/api/auth/signin/oauth', - {}, - { + console.log('카카오 정보 : ',res.data); + console.log('카카오 accessToken : ',res.data.accessToken); + const token = res.data.accessToken; + const postData = { + kakaoInfo : res.data, + university : selectedUniversity, // 선택된 대학교 아이디 값 + }; + axios.post('카카오 회원가입 정보 api', postData,{ headers : { - Authorization : `Bearer ${accessToken}`, - 'Content-type' : 'application/x-www-form-urlencoded;charset=utf-8', + 'Authorization' : `Bearer ${token}` } }) - .then((res: any) => { - console.log('seconde : ', res.data.accessToken); + .then((res) => { + console.log('회원가입 성공 : ', res); + setIsLoggedIn(true); + const accessToken = res.data.accessToken; + localStorage.setItem('카카오 허슬 토큰', accessToken); + localStorage.setItem('카카오 허슬 리프레시 토큰', res.data.refreshToken); + setAccessToken(accessToken); + navigate('/'); }) + }).catch((error) => { + console.log('카카오 정보 가져오기 실패',error); + if(error.res && error.res.status === 400){ + refreshAccessToken(); + } else { + navigate('/login'); + } }) - .catch((error) => { - console.log(error); - }) - },[]) + } + return (
- 로그인 중입니다. 잠시만 기다려주세요 +
카카오 추가 정보
+ +
); }; -export default kakaoLogin; \ No newline at end of file +export default KakaoLoginRedirect; \ No newline at end of file diff --git a/hustle_web/src/components/Login/Login.tsx b/hustle_web/src/components/Login/Login.tsx index 1ad4133..d315d21 100644 --- a/hustle_web/src/components/Login/Login.tsx +++ b/hustle_web/src/components/Login/Login.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import * as L from './LoginStyle'; import { useNavigate } from 'react-router-dom'; import { LoginProps } from '../../constants/interfaces'; @@ -7,8 +7,6 @@ import { defaultLoginValue } from '../../constants/defaultFormOption'; import FormRequirements from '../../constants/FormRequirements'; import axios from 'axios'; import { AuthContext } from '../Auth/AuthProvider'; -import { userAtom } from '../../recoil/login/login'; -import { useRecoilState } from 'recoil'; const { idRequirements, passwordRequirements } = FormRequirements; const defaultValue = defaultLoginValue; @@ -73,14 +71,12 @@ const LoginMain = () => { } }; - const kakaoLoginHandler = () => { - const REST_API_KEY = process.env.REACT_API_KEY; - const REDIRECT_URL = process.env.REDIRECT_URI; - const kakaoUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URL}&response_type=code` - - window.location.href = kakaoUrl; - - } + function loginwithKakao() { + const REST_API_KEY = '170a8a097251697cc023f05857280065'; + const REDIRECT_URL = 'http://localhost:3000/oauth/kakaoLogin'; + const kakaoUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URL}&response_type=code`; + window.location.href = kakaoUrl; + } return ( @@ -116,7 +112,7 @@ const LoginMain = () => { 카카오 로그인 diff --git a/hustle_web/src/components/SignIn/UniversitySearch.tsx b/hustle_web/src/components/SignIn/UniversitySearch.tsx index ef7c0b1..edefd9a 100644 --- a/hustle_web/src/components/SignIn/UniversitySearch.tsx +++ b/hustle_web/src/components/SignIn/UniversitySearch.tsx @@ -4,68 +4,53 @@ import { useState, useEffect } from 'react'; import { UniversityProps } from '../../constants/interfaces'; import Select from 'react-select'; -// interface UniversitySearchProps { -// onSelectUniversity: (universityName: string) => void; -// } - const UniversitySearch = ({ onSelecteUniversity }: { onSelecteUniversity: (UniversityId: number) => void; }) => { const [universityList, setUniversityList] = useState([]); - const [searchQuery, setSearchQuery] = useState(''); // 검색어 상태 추가 - const [selectedId, setSelectedId] = useState(0); + const [searchQuery,] = useState(''); // 검색어 상태 추가 + const [selectedUniversity, setSelectedUniversity] = useState(null); const handleSearchUniversity = async () => { - // setUniversityList(dummyUniversityData); try { const response = await axios.get( `https://api.sport-hustle.com/api/university?keyword=${searchQuery}` ); - setUniversityList(response.data.universities); + setUniversityList(response.data.data); } catch (error) { console.error('대학교 검색 오류:', error); setUniversityList([]); } }; - const options = universityList.map((university) => ({ + const options = universityList + .filter((university) => typeof university.id === 'number') + .map((university) => ({ value: university.id, - label: university.name + label: university.name, + address : university.address })); - // const handleUniversitySelection = (universityId: number) => { - // const selectedUniversity = universityList.find(university => university.id === universityId); - - // if(selectedUniversity){ - // setSearchQuery(selectedUniversity.name); // 선택된 대학교 이름을 검색창에 표시 - // onSelecteUniversity(selectedUniversity.id); // 선택된 대학교 이름을 부모 컴포넌트로 전달 - // } - // }; - const handleUniversitySelection = (selectedOption: any) => { - if (selectedOption) { - setSearchQuery(selectedOption.label); // 선택된 대학교 이름을 검색창에 표시 - onSelecteUniversity(selectedOption.value); // 선택된 대학교 ID를 부모 컴포넌트로 전달 - } + setSelectedUniversity(selectedOption); }; useEffect(() => { handleSearchUniversity(); - }); + },[searchQuery]); + + useEffect(() => { + if (selectedUniversity !== null) { + onSelecteUniversity(selectedUniversity.id); + } + }, [selectedUniversity, onSelecteUniversity]); + return ( <> 소속 대학교 - {/* ) => { - setSearchQuery(e.target.value); - }} - /> */} {universityList.length > 0 && (