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 && (
)}
- {/* {
- handleSearchUniversity();
- }} // 검색 버튼 클릭 시 대학교 목록 검색
- >
- 검색
- */}
-
- {/* {universityList.length > 0 && (
-
- {universityList.map((university, id) => (
-
-
{university.name}
-
- {university.address}
-
-
-
-
-
- ))}
-
- )} */}
>
);
};
diff --git a/hustle_web/src/constants/interfaces.ts b/hustle_web/src/constants/interfaces.ts
index 0e7d06b..ca78725 100644
--- a/hustle_web/src/constants/interfaces.ts
+++ b/hustle_web/src/constants/interfaces.ts
@@ -12,6 +12,10 @@ export interface kakaoLoginProps {
onSuccess: string;
}
+export interface kakaoSignupProps {
+ locationaddress: string;
+}
+
export interface AuthContextType {
isLoggedIn: boolean;
setIsLoggedIn: (value: boolean) => void;
diff --git a/hustle_web/src/recoil/login/loginState.tsx b/hustle_web/src/recoil/login/loginState.tsx
index ec1f611..19018bd 100644
--- a/hustle_web/src/recoil/login/loginState.tsx
+++ b/hustle_web/src/recoil/login/loginState.tsx
@@ -27,4 +27,3 @@ export const TokenState = atom({
default: null,
effects_UNSTABLE: [persistAtom],
});
-
diff --git a/hustle_web/src/routes.ts b/hustle_web/src/routes.ts
index 1f0085e..687e5d3 100644
--- a/hustle_web/src/routes.ts
+++ b/hustle_web/src/routes.ts
@@ -104,7 +104,7 @@ const routes = [
{ path: '/maincompetition', element: MainCompetition },
{ path: '/maincompetition/apply', element: ApplyCompetition },
{ path: '/ranking', element: RankingPage },
- { path: '/kakaoLogin', element: KakaoLoginRedirect }
+ { path: '/oauth/kakaoLogin', element: KakaoLoginRedirect }
];
export default routes;