Skip to content

Commit 2ad002e

Browse files
committed
게시판 제외 99% 완성
1 parent 28502da commit 2ad002e

35 files changed

+3306
-118
lines changed

app/(data)/gameData.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
const gameData = [
2+
{
3+
game: "Grand Theft Auto V",
4+
title: "이 스트리머는 gta5 고인물을 꿈꾸는 청정수 입니다.",
5+
desc: [
6+
"카지노를 털며 부자가 되길 원하지만 현실은 슈퍼마켓 털고 전과1범으로 잡히는 잡케,,",
7+
"통장잔고는 백만원 미만,, 고인물이 되어 언젠가는 시청자들을 도와주길 바랍니다만, 현실은 시청자의 도움만 받는,, 만년 뉴비",
8+
],
9+
img: "/gta5.jpg",
10+
},
11+
{
12+
game: "Red Dead Redemption 2",
13+
title: "억까 좀 그만 당하고싶어, 억까 전문 스트리머",
14+
desc: [
15+
"레드 데드 리뎀션 스토리 모드 플레이,, 방대한 스토리 라인 덕분에,, 깨는데 한 세월,,",
16+
"저는,,, 서브 퀘스트 다 깨고 플레이 완 하고 싶다니깐요,,?",
17+
"그래도 스토리가 방대해서 쇼츠는 잘 나와서 좋음.",
18+
],
19+
img: "/rdr2.png",
20+
},
21+
{
22+
game: "화이트데이",
23+
title: "아니 이 게임은 도대체 엔딩이 몇개야?",
24+
desc: [
25+
"화이트데이 플레이 하는 잡케,근데 이거 엔딩이 도대체 몇개인거냐,,,",
26+
"한소영이랑 러브러브 진 엔딩을 원하지만 현실은 버리고 도망가버리는 이 스트리머,, (시청자들에게 많이 혼났다는 후문)",
27+
],
28+
img: "/white.jpg",
29+
},
30+
{
31+
game: "Lethal Company",
32+
title: "쓰레기 줍는 게임 맞아?",
33+
desc: [
34+
"아니 쓰레기 줍는 게임이라서 건설 육성 rpg 같은 게임이라 생각하고 플레이 했지만,,,",
35+
"현실은 팀원들 버리고 도망가버리는 잡케, 소리 지리는건 여성 팀원들보다 더(?) 크다고 한다",
36+
],
37+
img: "/lethal.jpg",
38+
},
39+
{
40+
game: "Goose Goose Duck",
41+
title: "명탐정 오리가 되고싶은 거위",
42+
desc: [
43+
"명탐정이 되고 싶어하는 코난(?) 잡케. 하지만, 내 주변에서 살덕(?)사건만 일어난다,,,",
44+
"언젠가 명탐정이 되는 날이 올 것인가...?",
45+
],
46+
img: "/goose.jpg",
47+
},
48+
];
49+
50+
export default gameData;

app/(data)/makeCalendar.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export default function makeCalendar(month) {
2+
const date = new Date();
3+
const temp = [[], [], [], [], [], []];
4+
for (let i = 0; i < 6; i++) for (let j = 0; j < 7; j++) temp[i][j] = null;
5+
let tempDay = 1;
6+
let tempWeek = 0;
7+
const firstDay = new Date(date.getFullYear(), month - 1, 1).getDay();
8+
const lastDay = new Date(date.getFullYear(), month, 0).getDate();
9+
for (let i = 0; i < firstDay; i++) temp[tempWeek][i] = null;
10+
for (let i = firstDay; i < 7; i++) temp[tempWeek][i] = tempDay++;
11+
tempWeek++;
12+
for (let i = 1; i <= 5; i++) {
13+
for (let j = 0; j < 7; j++) {
14+
temp[tempWeek][j] = tempDay++;
15+
if (tempDay > lastDay) break;
16+
}
17+
tempWeek++;
18+
if (tempDay > lastDay) break;
19+
}
20+
return temp;
21+
}

app/(main)/game.jsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import styles from "../../styles/game.module.css";
2+
3+
export default function Game({ game, desc, img, title }) {
4+
return (
5+
<div className={styles.box} style={{ backgroundImage: `url(${img})` }}>
6+
<div>{game}</div>
7+
<div>"{title}"</div>
8+
<div>
9+
{desc.map((msg, i) => (
10+
<div key={i}>{msg}</div>
11+
))}
12+
</div>
13+
</div>
14+
);
15+
}

app/(main)/page.jsx

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
"use client";
2+
3+
import Link from "next/link";
4+
import { useState, useEffect } from "react";
5+
import { auth } from "../firebase";
6+
import { setPersistence, browserLocalPersistence } from "firebase/auth";
7+
import styles from "../../styles/main.module.css";
8+
import Game from "./game";
9+
import gameData from "../(data)/gameData";
10+
11+
export default function Main() {
12+
const [isLogin, setLogin] = useState(false); // 로그인 되어있는 상태인지 표시
13+
14+
const init = async () => {
15+
// 처음 마운트 될 때 실행되는 함수
16+
// ready 시킨 후 localStorage에 user 존재하면 자동로그인
17+
// 비밀번호가 맞아야 로그인되므로(잡케만 로그인 가능) 로그아웃 구현은 나중에 필요하면 함
18+
await auth.authStateReady();
19+
setPersistence(auth, browserLocalPersistence).then(() => {
20+
auth.onAuthStateChanged((user) => {
21+
if (user) setLogin(true);
22+
});
23+
});
24+
};
25+
26+
useEffect(() => {
27+
init();
28+
}, []);
29+
return (
30+
<div className={styles.main}>
31+
<div className={styles.description}>
32+
<div>
33+
<div className={styles.ment}>
34+
<div>
35+
시청자와 같이 놀고 싶어 하는 종합게임 스트리머&nbsp;
36+
<span className={styles.nick}>잡케</span>입니다!
37+
</div>
38+
<div>
39+
저는 종합게임 스트리머이고, 주 컨텐츠는 GTA5 (GTA6 기다리다 현기증
40+
나는 중), 공포게임, 인디게임 등 스팀게임을 주로 방송하고 있습니다.{" "}
41+
<br />
42+
현재 치지직과 유튜브 동시 송출 중이지만 차후 SOOP까지 송출할
43+
계획이 있습니다. <br />
44+
2월 26일부터 방송 시작하였고 부족한 점이 많지만 이쁘게 봐주세요!
45+
</div>
46+
</div>
47+
<img src="/logo.png" alt="" />
48+
</div>
49+
<div className={styles.links}>
50+
<Link href="https://chzzk.naver.com/cad491fc20e7092e40615955cae88e80">
51+
<img src="/chzzk.jpg" />
52+
</Link>
53+
<Link href="https://discord.com/invite/v2s2F8FHFp">
54+
<img src="/discord.png" />
55+
</Link>
56+
<Link href="https://www.youtube.com/@jobke_game">
57+
<img src="/youtube.png" />
58+
</Link>
59+
</div>
60+
</div>
61+
<div className={styles.game}>
62+
<div>지금까지 했던 게임들</div>
63+
{gameData.map((data, i) => (
64+
<Game
65+
key={i}
66+
game={data.game}
67+
desc={data.desc}
68+
img={data.img}
69+
title={data.title}
70+
/>
71+
))}
72+
</div>
73+
{/* {isLogin ? null : <Link href="/auth">인증하기</Link>} */}
74+
</div>
75+
);
76+
}

app/(page)/articles.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function Articles() {
2+
return <h3>게시판 기능은 곧 구현 예정입니다.</h3>;
3+
}
Lines changed: 18 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,34 @@
11
"use client";
22

3-
import { styled } from "styled-components";
3+
import styles from "../../styles/auth.module.css";
44
import { useEffect, useState } from "react";
5-
import { auth } from "./firebase.js";
5+
import { auth } from "../firebase";
66
import {
77
signInWithEmailAndPassword,
88
setPersistence,
99
browserLocalPersistence,
1010
} from "firebase/auth";
11+
import { useRouter } from "next/navigation";
1112

12-
const Wrap = styled.div`
13-
width: 100vw;
14-
height: 100vh;
15-
box-sizing: border-box;
16-
display: flex;
17-
justify-content: center;
18-
align-items: center;
19-
flex-direction: column;
20-
`;
21-
22-
const Form = styled.form`
23-
display: flex;
24-
flex-direction: column;
25-
gap: 1rem;
26-
`;
27-
28-
const Input = styled.input``;
29-
30-
const Error = styled.div`
31-
color: #ff0000;
32-
margin-top: 1rem;
33-
display: flex;
34-
flex-direction: column;
35-
align-items: center;
36-
`;
37-
38-
export default function Page() {
13+
export default function Auth() {
3914
const [isReady, setReady] = useState(false); // 파이어베이스 로그인 준비 상태
15+
const [isLogin, setLogin] = useState(false);
4016
const [password, setPassword] = useState(""); // 유저가 입력한 비밀번호
4117
const [isLoading, setLoading] = useState(false); // 로그인 버튼 누른 후 로딩되는 상태
4218
const [error, setError] = useState(""); // 로그인 실패 시 나타날 에러
43-
const [isLogin, setLogin] = useState(false); // 로그인 되어있는 상태인지 표시
19+
const route = useRouter();
4420

4521
const init = async () => {
4622
// 처음 마운트 될 때 실행되는 함수
4723
// ready 시킨 후 localStorage에 user 존재하면 자동로그인
4824
// 비밀번호가 맞아야 로그인되므로(잡케만 로그인 가능) 로그아웃 구현은 나중에 필요하면 함
4925
await auth.authStateReady();
50-
setReady(true);
5126
setPersistence(auth, browserLocalPersistence).then(() => {
5227
auth.onAuthStateChanged((user) => {
5328
if (user) setLogin(true);
5429
});
5530
});
56-
return () => temp();
31+
setReady(true);
5732
};
5833

5934
useEffect(() => {
@@ -72,8 +47,7 @@ export default function Page() {
7247
7348
password
7449
).then(() => {
75-
// 매개변수에 credential 들어감
76-
setLogin(true);
50+
route.push("/");
7751
});
7852
} catch (e) {
7953
console.error(e);
@@ -84,31 +58,31 @@ export default function Page() {
8458
}
8559

8660
return (
87-
<Wrap>
61+
<div className={styles.wrap}>
8862
{isReady ? (
8963
isLogin ? (
90-
<>로그인 된 상태</>
64+
<>이미 인증 완료된 상태입니다.</>
9165
) : (
9266
<>
93-
<Form onSubmit={submit}>
94-
<Input
67+
<form onSubmit={submit}>
68+
<input
9569
type="password"
96-
placeholder="비밀번호"
70+
placeholder="인증 코드 입력"
9771
onInput={(e) => setPassword(e.target.value)}
9872
/>
99-
<Input type="submit" value={isLoading ? "인증 중..." : "인증"} />
100-
</Form>
101-
<Error>
73+
<input type="submit" value={isLoading ? "인증 중..." : "인증"} />
74+
</form>
75+
<div className={styles.error}>
10276
{error ? (
10377
<>
10478
<div>인증 도중 오류가 발생하였습니다.</div>
10579
<div>오류 메시지 : {error.message}</div>
10680
</>
10781
) : null}
108-
</Error>
82+
</div>
10983
</>
11084
)
11185
) : null}
112-
</Wrap>
86+
</div>
11387
);
11488
}

0 commit comments

Comments
 (0)