Skip to content

Commit

Permalink
Merge pull request #7 from LeHiHo/feature/#4
Browse files Browse the repository at this point in the history
게임 방 생성, 게임 방 입장, 게임 방 내 4명 입장 시 block 처리
  • Loading branch information
yangjaehyuk authored Nov 8, 2023
2 parents e961f68 + d0dc77e commit a9500ec
Show file tree
Hide file tree
Showing 12 changed files with 440 additions and 25 deletions.
109 changes: 106 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.18.0",
"recoil": "^0.7.7",
"socket.io-client": "^4.7.2",
"styled-components": "^6.1.0"
},
"devDependencies": {
Expand Down
11 changes: 7 additions & 4 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@ import { BrowserRouter } from 'react-router-dom';
import { ChakraProvider } from '@chakra-ui/react';
import MainRouter from './router/MainRouter';
import LoginRouter from './router/LoginRouter';
import { RecoilRoot } from 'recoil';

function App() {
return (
<ChakraProvider>
<BrowserRouter>
<LoginRouter />
<MainRouter />
</BrowserRouter>
<RecoilRoot>
<BrowserRouter>
<LoginRouter />
<MainRouter />
</BrowserRouter>
</RecoilRoot>
</ChakraProvider>
);
}
Expand Down
62 changes: 57 additions & 5 deletions src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ export const signup = async (
name,
picture,
};
console.log(authData);

try {
return await axios.post(`${SERVER_URL}/signup`, authData, {
headers: {
Expand All @@ -41,23 +39,77 @@ export const login = async (id: string, password: string) => {
});
const { accessToken } = response.data;
localStorage.setItem('jwt', accessToken);
console.log('Login successful');
return accessToken;
} catch (error) {
console.error('Login failed:', error);
}
};

export const getAllUsers = async (accessToken: string) => {
const response = await axios.get(`${SERVER_URL}/users`, {
headers: {
'content-type': CONTENT_TYPE,
serverId: SERVER_ID,
Authorization: `Bearer ${accessToken}`,
},
});
return response.data;
};

export const createGameRooms = async (
accessToken: string,
name: string,
users: string[],
isPrivate: boolean,
) => {
const authData = {
name,
users,
isPrivate,
};
try {
const response = await axios.get(`${SERVER_URL}/users`, {
const response = await axios.post(`${SERVER_URL}/chat`, authData, {
headers: {
'content-type': CONTENT_TYPE,
serverId: SERVER_ID,
Authorization: `Bearer ${accessToken}`,
},
});
console.log(response.data);
return response.data;
} catch (error) {
console.log(error);
}
};

export const getAllGameRooms = async (accessToken: string) => {
const response = await axios.get(`${SERVER_URL}/chat/all`, {
headers: {
'content-type': CONTENT_TYPE,
serverId: SERVER_ID,
Authorization: `Bearer ${accessToken}`,
},
});
return response.data;
};

export const participateGameRoom = async (
chatId: string,
accessToken: string,
) => {
const authData = {
chatId,
};
const response = await axios.patch(
`${SERVER_URL}/chat/participate`,
authData,
{
headers: {
'content-type': CONTENT_TYPE,
serverId: SERVER_ID,
Authorization: `Bearer ${accessToken}`,
},
},
);
console.log(response.data);
return response.data;
};
11 changes: 11 additions & 0 deletions src/api/socket.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { SERVER_ID, CONTENT_TYPE, SERVER_URL } from '../constant';
import io from 'socket.io-client';
export const socketLogin = (accessToken: string) => {
const socket = io(`${SERVER_URL}/server`, {
extraHeaders: {
Authorization: `Bearer ${accessToken}`,
serverId: SERVER_ID,
},
});
return socket;
};
54 changes: 54 additions & 0 deletions src/components/layout/checkGameRoom.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { useEffect } from 'react';
import { useRecoilState } from 'recoil';
import { allRoomState } from '../../states/atom';
import { getAllGameRooms, participateGameRoom } from '../../api';
import { useNavigate } from 'react-router-dom';

const CheckGameRoom = () => {
const token: any = localStorage.getItem('jwt');
const navigate = useNavigate();
const [allRooms, setAllRooms] = useRecoilState(allRoomState);
const fetchData = async () => {
try {
const allRoomsData = await getAllGameRooms(token);
setAllRooms(allRoomsData.chats);
} catch (error) {
console.error('데이터 가져오기 오류:', error);
}
};

useEffect(() => {
fetchData();
}, [allRooms.length]);

if (allRooms.length === 0) {
return <div>No rooms available or an error occurred.</div>;
}

const handleParticipate = async (numberOfPeople: number, chatId: any) => {
if (numberOfPeople === 4) {
alert('방이 꽉 찼어요.');
} else {
await participateGameRoom(chatId, token);
navigate(`/room/${chatId}`);
}
};

return (
<>
<button onClick={fetchData}>Refresh Data</button>
{allRooms.map((element, index) => (
<div
key={index}
onClick={() => handleParticipate(element.users.length, element.id)}>
{element.name}
<div>{element.users.length}</div>
{element.users.length === 4 && <div>Four users in this room</div>}
<div>{element.users[0].id}</div>
</div>
))}
</>
);
};

export default CheckGameRoom;
Loading

0 comments on commit a9500ec

Please sign in to comment.