Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
4ab431b
💄 style: 방 만들기 버튼에 + 아이콘 svg 추가
danggin Jan 15, 2025
9bce0ef
✨ feat: 랭킹,회원가입 마무리 페이지 구현
salwwkd Jan 16, 2025
b1748d4
Merge branch 'develop' into feature/ranking
salwwkd Jan 16, 2025
7ed7242
🐛 fix: 푸쉬에러해결
salwwkd Jan 16, 2025
7330ff5
Merge pull request #13 from salwwkd/feature/ranking
salwwkd Jan 16, 2025
71773d3
Merge pull request #87 from salwwkd/develop
salwwkd Jan 16, 2025
21af2da
✨ feat: 게임 시작 기다리기, 상대 턴 기다리기 모달 추가
danggin Jan 16, 2025
ff2b56e
Merge branch 'develop' into feature/ui
danggin Jan 16, 2025
1987346
🍱 assets: 트로피 이미지 수정, 홈 화면 로고 이미지 추가
danggin Jan 16, 2025
1315d47
✨ feat: 홈 화면 추가
danggin Jan 16, 2025
f34d631
💄 style: height 100%로 수정
danggin Jan 16, 2025
aa5b7cd
✨ feat: 홈 화면과 에러 화면에서 쓰이는 애니메이션 배경 추가
danggin Jan 16, 2025
8e81014
➖ remove: 가입 완료 화면 한 파일로 통합
danggin Jan 16, 2025
a80b14e
✨ feat: 에러 페이지 추가
danggin Jan 16, 2025
0621dfc
✨ feat: 가입 완료 페이지 로그인 버튼 클릭 시 로그인 화면으로 이동하도록 수정
danggin Jan 16, 2025
c87d89b
✨ feat: esc 키 누르면 모달 닫기 기능 추가
danggin Jan 16, 2025
267626d
✏️ typos: console.log 코드 삭제
danggin Jan 16, 2025
b9c0851
✨ feat: 모달 외부 클릭 시 모달 닫기 기능 추가
danggin Jan 16, 2025
ca678de
✨ feat: 로딩 컴포넌트 및 관련 라이브러리 추가
danggin Jan 16, 2025
6ac8fb7
✨ feat: 게임 시작 기다리기 모달에 로딩 컴포넌트 추가
danggin Jan 16, 2025
8d77942
✨ feat: App에 suspense 및 로딩 컴포넌트 추가
danggin Jan 16, 2025
231131c
✨ feat: accessToken으로 로그인 여부 구분
danggin Jan 16, 2025
ab5ca47
✨ feat: 회원가입 완료 시 가입 완료 페이지로 이동 기능 추가
danggin Jan 16, 2025
bb9639b
✨ feat: start 버튼 클릭 시 게임 방 목록으로 이동 기능 추가
danggin Jan 16, 2025
02423e8
💄 style: 화면 높이 관련 스타일 수정
danggin Jan 16, 2025
3c57062
✨ feat: 모달 실행 시 스크롤 방지 기능 추가
danggin Jan 16, 2025
44580ad
🚧 cont: 채팅 작업중
danggin Jan 16, 2025
d582e97
Merge pull request #15 from danggin/feature/ui
danggin Jan 16, 2025
6e1241a
Merge pull request #88 from danggin/develop
danggin Jan 16, 2025
5ad74e9
✨ feat: 덱선택, 드로우, 상대 덱 추측
moonhuicheol Jan 16, 2025
2984115
✨ feat: 푸쉬충돌해결
moonhuicheol Jan 16, 2025
b4c8d23
🐛 fix: 푸쉬에러 수정
moonhuicheol Jan 17, 2025
ca79a16
🐛 fix: 푸쉬에러 수정
moonhuicheol Jan 17, 2025
6fd5aac
🐛 fix: 푸쉬에러수정 3
moonhuicheol Jan 17, 2025
f4267a1
Merge pull request #26 from moonhuicheol/gameLogic
moonhuicheol Jan 17, 2025
9bf1129
Merge pull request #89 from moonhuicheol/develop
moonhuicheol Jan 17, 2025
b7e0904
✨ feat: 버튼선택까지 게임구현
moonhuicheol Jan 17, 2025
ef422b7
🐛 fix: 푸쉬에러수정
moonhuicheol Jan 17, 2025
fa573ee
Merge pull request #27 from moonhuicheol/gameLogic
moonhuicheol Jan 17, 2025
c6761cb
Merge pull request #90 from moonhuicheol/develop
moonhuicheol Jan 17, 2025
7138d0c
✨ feat: 셀렉트 턴 모달
moonhuicheol Jan 17, 2025
ab67841
Merge pull request #28 from moonhuicheol/gameLogic
moonhuicheol Jan 17, 2025
6b4a1f9
Merge pull request #91 from moonhuicheol/develop
moonhuicheol Jan 17, 2025
51d7bb5
🐛 fix: NavLink 태그 삭제
danggin Jan 17, 2025
1d1c539
💄 style: flex-shrink 추가
danggin Jan 17, 2025
60d4d2b
💤 chore: 토스트 영역 삭제
danggin Jan 17, 2025
2a8b05b
✨ feat: 로그아웃 상태로 방 만들기 클릭 시 alert 모달 추가
danggin Jan 17, 2025
a88210f
💄 style: 게임방 레이아웃 수정
danggin Jan 17, 2025
a75e3ef
🐛 fix: 사용하지 않는 import 삭제
danggin Jan 17, 2025
d3874ee
✨ feat: badge 상태 구현
moonhuicheol Jan 17, 2025
cc82308
🐛 fix: 푸쉬에러 해결
moonhuicheol Jan 17, 2025
1017a65
Merge pull request #29 from moonhuicheol/gameLogic
moonhuicheol Jan 17, 2025
12f7225
Merge branch 'develop' into feature/ui
danggin Jan 17, 2025
7f04898
🐛 fix: 빌드 에러 수정
danggin Jan 17, 2025
fe22576
Merge pull request #16 from danggin/feature/ui
danggin Jan 17, 2025
33f2807
Merge pull request #92 from moonhuicheol/develop
moonhuicheol Jan 17, 2025
a2f5bf4
Merge branch 'vsCode-Game:develop' into develop
danggin Jan 17, 2025
729de84
Merge pull request #94 from danggin/develop
danggin Jan 17, 2025
081f85e
fix: 배포 에러 수정
hoheesu Jan 17, 2025
f16720b
Merge branch 'develop' of https://github.com/vsCode-Game/FE into develop
hoheesu Jan 17, 2025
db88d20
Merge pull request #95 from vsCode-Game/feat/game
hoheesu Jan 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
"@tanstack/react-query": "4",
"axios": "^1.7.9",
"jwt-decode": "^4.0.0",
"lottie": "^0.0.1",
"lottie-react": "^2.4.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-hook-form": "^7.54.2",
Expand Down
6 changes: 5 additions & 1 deletion src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import "@styles/font.css";
import GlobalStyles from "./styles/GlobalStyle";
import Loading from "./components/ui/loading/Loading";
import { RouterProvider } from "react-router-dom";
import { router } from "./routes/router";
import { Suspense } from "react";

function App() {
return (
<>
<GlobalStyles />
<RouterProvider router={router} />
<Suspense fallback={<Loading overlay={true} />}>
<RouterProvider router={router} />
</Suspense>
</>
);
}
Expand Down
File renamed without changes
15 changes: 10 additions & 5 deletions src/assets/images/icon_trophy.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/images/logo_large.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 0 additions & 2 deletions src/components/layout/footer/FooterStyle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,4 @@ export const StyledFooter = styled.footer<FooterProps>`
justify-content: center;
align-items: center;
color: var(--color-gray-600);
position: fixed;
bottom: 0;
`;
13 changes: 5 additions & 8 deletions src/components/layout/gameRoomHeader/GameRoomHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import iconExit from "@assets/images/icon_close.svg";
import { NavLink, useNavigate, useParams } from "react-router-dom";
import { useNavigate, useParams } from "react-router-dom";
import { Flex, StyledHeader, TextButton } from "./GameRoomHeaderStyle";

import { useSocketStore } from "../../../store/useSocketStore";

export default function GameRoomHeader() {
Expand All @@ -20,12 +19,10 @@ export default function GameRoomHeader() {
return (
<>
<StyledHeader>
<NavLink to="/">
<Flex onClick={() => onClickOut(roomId)}>
<img src={iconExit} alt="게임방 나가기" />
<TextButton>나가기</TextButton>
</Flex>
</NavLink>
<Flex onClick={() => onClickOut(roomId)}>
<img src={iconExit} alt="게임방 나가기" />
<TextButton>나가기</TextButton>
</Flex>
</StyledHeader>
</>
);
Expand Down
11 changes: 3 additions & 8 deletions src/components/layout/header/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import logo from "@assets/images/logo.svg";
import Button from "@components/ui/button/Button.tsx";
import { NavLink, useNavigate } from "react-router-dom";
import { useEffect, useState } from "react";
import { StyledHeader, NavList, Logo } from "./HeaderStyle.ts";

export default function Header() {
const [isLoggedIn, setIsLoggedIn] = useState(false); // 임시 login 상태
const navigate = useNavigate();

useEffect(() => {
setIsLoggedIn(false);
}, []);
const accessToken = localStorage.getItem("accessToken");

const onClickMove = () => {
navigate("./user/signup");
Expand All @@ -22,15 +17,15 @@ export default function Header() {
<>
<StyledHeader>
<Logo>
<NavLink to="/">
<NavLink to="/game">
<img src={logo} />
</NavLink>
</Logo>
<NavList>
<li>
<NavLink to="/rank">랭킹</NavLink>
</li>
{isLoggedIn ? (
{accessToken ? (
<>
<li>
<NavLink to="/user/mypage">마이페이지</NavLink>
Expand Down
16 changes: 12 additions & 4 deletions src/components/layout/layout/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,30 @@ import { Outlet, useLocation } from "react-router-dom";
import { Wrapper, Container } from "./LayoutStyle";
import { useModalStore } from "@store/useModalStore";

const HIDDEN_HEADERS = "/game/room/";
const GAME_ROOM = "/game/room/";
const HIDDEN_HEADER_FOOTER = "/home";

export default function Layout() {
const { showModal } = useModalStore();
const location = useLocation();
const pathname = location.pathname;
const isHiddenHeader = pathname.includes(HIDDEN_HEADERS);
const isGameRoom = pathname.includes(GAME_ROOM);
const isHiddenHeaderFooter = pathname.includes(HIDDEN_HEADER_FOOTER);

return (
<>
<Wrapper>
{!isHiddenHeader ? <Header /> : <GameRoomHeader />}
{isHiddenHeaderFooter ? (
""
) : !isGameRoom ? (
<Header />
) : (
<GameRoomHeader />
)}
<Container>
<Outlet />
</Container>
<Footer />
{!isHiddenHeaderFooter && <Footer />}
</Wrapper>

<Toast />
Expand Down
3 changes: 2 additions & 1 deletion src/components/layout/layout/LayoutStyle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ import styled from "styled-components";

export const Wrapper = styled.div`
width: 100%;
/* height: 100%; */
height: 100%;
`;

export const Container = styled.main`
width: 100%;
height: 100%;
padding: 50px 150px;
min-height: 800px;
`;
32 changes: 31 additions & 1 deletion src/components/ui/DeckChoice/DeckChoice.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
import { useParams } from "react-router-dom";
import { useSocketStore } from "../../../store/useSocketStore";
import MiniDeck from "../miniDeck/MiniDeck";
import * as S from "./deckChoiceStyle";
import { useModal } from "../../../hooks/useModal";

interface IInitialCards {
roomId: number;
blackCount: number;
whiteCount: number;
}

interface IDeckChoiceProps {
whiteCount: number;
blackCount: number;
}

export default function DeckChoice({
whiteCount,
Expand All @@ -10,8 +24,24 @@ export default function DeckChoice({
...Array(blackCount).fill("black"),
];

const { socket } = useSocketStore();
const params = useParams<{ id: string }>();
const roomId = Number(params.id);
const { closeModal } = useModal();

const onClickDeck = ({ roomId, whiteCount, blackCount }: IInitialCards) => {
if (!socket) {
return;
}
console.log(roomId, whiteCount, blackCount, "룸아이디, 와이트덱, 블랙덱");
socket.emit("initialCards", { roomId, whiteCount, blackCount });
closeModal();
};

return (
<S.DeckContainer>
<S.DeckContainer
onClick={() => onClickDeck({ roomId, whiteCount, blackCount })}
>
{deckArray.map((color, index) => (
<MiniDeck key={index} color={color} />
))}
Expand Down
4 changes: 0 additions & 4 deletions src/components/ui/DeckChoice/deckChoiceProps.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +0,0 @@
interface IDeckChoiceProps {
whiteCount: number;
blackCount: number;
}
31 changes: 28 additions & 3 deletions src/components/ui/bigDeck/BigDeck.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,38 @@
import { useParams } from "react-router-dom";
import { useSocketStore } from "../../../store/useSocketStore";
import * as S from "./bigDeckStyle";
import { useModal } from "../../../hooks/useModal";

interface IBigDeck {
roomId: number;
color: "white" | "black";
}
export default function BigDeck() {
// onClick함수 나중에 로직에 따라 만들기
const { socket } = useSocketStore();
const params = useParams();
const roomId = Number(params.id);
const { closeModal } = useModal();

const onClickBigDeck = ({ roomId, color }: IBigDeck) => {
if (!socket) return;
socket.emit("drawCard", { roomId, color });
closeModal();
};

return (
<S.container>
<S.title>가져올 카드의 색을 선택해 주세요.</S.title>
<S.bigDeckContainer>
<S.bigDeckButton type="button" themeType="light"></S.bigDeckButton>
<S.bigDeckButton type="button" themeType="black"></S.bigDeckButton>
<S.bigDeckButton
type="button"
themeType="light"
onClick={() => onClickBigDeck({ roomId, color: "white" })}
></S.bigDeckButton>
<S.bigDeckButton
type="button"
themeType="black"
onClick={() => onClickBigDeck({ roomId, color: "black" })}
></S.bigDeckButton>
</S.bigDeckContainer>
</S.container>
);
Expand Down
2 changes: 2 additions & 0 deletions src/components/ui/button/Button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export default function Button({
disabled,
width,
playerNumber,
...props
}: IButtonProps) {
return (
<S.Button
Expand All @@ -22,6 +23,7 @@ export default function Button({
textcolor={textcolor}
width={width}
playerNumber={playerNumber}
{...props}
>
{children}
</S.Button>
Expand Down
15 changes: 10 additions & 5 deletions src/components/ui/card/cardList/GameRoomCard.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
import { IGameRoom } from "../../../../api/gameRoomApi";
import { useJoinGameRoomMutation } from "../../../../hooks/useMutation";
import { useRoomIdStore } from "../../../../store/useRoomIdStore";
import Badge from "../../badge/Badge";
import Button from "../../button/Button";
import * as S from "./GameRoomCardStyle";

export default function GameRoomCard({ room }: { room: IRoomProps }) {
const { setRoomId } = useRoomIdStore();
export default function GameRoomCard({ room }: { room: IGameRoom }) {
const disabled = room.currentCount === 2 ? true : false;
const mutation = useJoinGameRoomMutation();
const onClickJoin = (roomId: number) => {
setRoomId(roomId);
mutation.mutate(roomId);
};

const roomState = () => {
if (room.currentCount === 1) {
return "waiting...";
} else if (room.currentCount === 2) {
return "playing";
}
};
return (
<S.cardContainer>
<Badge playerNumber={room.currentCount} />
<Badge playerNumber={room.currentCount} status={roomState()} />
<S.titleBox>{room.roomName}</S.titleBox>
<S.buttonContainer>
<Button
Expand Down
3 changes: 2 additions & 1 deletion src/components/ui/card/chatting/Chatting.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import ChatInputBox from "../../chatInput/ChatInputBox";
import * as S from "./ChattingStyle";
import ChatInputBox from "../../chatInput/ChatInputBox";

export default function ChattingBox() {
return (
<S.chat>
Expand Down
8 changes: 4 additions & 4 deletions src/components/ui/card/chatting/ChattingStyle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export const chat = styled.div`
position: relative;
width: 390px;
height: 390px;
padding: 20px;
border-radius: 12px;
border: 1px solid var(--color-gray-999);
box-shadow: 1px 1px 3px 0px #00000080;
Expand All @@ -15,8 +16,7 @@ export const chat = styled.div`
`;

export const chatInputBoxContainer = styled.div`
position: absolute;
bottom: 20px;
padding: 0 10px;
width: 100%;
display: flex;
flex-direction: column;
gap: 10px;
`;
66 changes: 55 additions & 11 deletions src/components/ui/chatInput/ChatInputBox.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,62 @@
import Button from "../button/Button";
import * as S from "./chatInputStyle";
import { useSocketStore } from "@store/useSocketStore";
import { useEffect } from "react";
// import { useParams } from "react-router-dom";

export default function ChatInputBox() {
const { socket } = useSocketStore();

useEffect(() => {
if (!socket) {
console.error("Socket is not connected.");
return;
}
}, []);

console.log("🚀 Socket:", socket);

// const [message, setMessage] = useState("");
// const params = useParams();
// const roomId = Number(params.id);

// useEffect(() => {
// setMessage("");
// }, []);

// console.log(socket);

// const onClickSendMessage = () => {
// if (!socket) {
// console.log("방에 연결할 수 없습니다.");
// return;
// }
// socket.emit("message", { roomId: roomId, message }, (res: any) => {
// console.log(`Message sent: ${JSON.stringify(res)}`);
// });
// };

return (
<S.chatInputBox>
<S.chatInput
type="text"
placeholder="상대방과 채팅을 나눌 수 있습니다."
></S.chatInput>
<S.buttonBox>
<Button size="xs" bgcolor="green" textcolor="black" type="button">
전송
</Button>
</S.buttonBox>
</S.chatInputBox>
<>
<S.chatLog></S.chatLog>
<S.chatInputBox>
<S.chatInput
type="text"
placeholder="상대방과 채팅을 나눌 수 있습니다."
// value={message}
></S.chatInput>
<S.buttonBox>
<Button
size="xs"
bgcolor="green"
textcolor="black"
type="button"
// onClick={onClickSendMessage}
>
전송
</Button>
</S.buttonBox>
</S.chatInputBox>
</>
);
}
Loading