Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
1872cab
Initial commit from Create Next App
2025314242 May 15, 2025
cd61dc5
chore: initial setting
2025314242 May 15, 2025
e6f97ae
chore: @svgr/webpack
2025314242 May 19, 2025
eb802b9
chore: initial setting
2025314242 May 21, 2025
a261e97
design initial design
2025314242 May 21, 2025
12ee878
design: initial design
2025314242 May 21, 2025
bd5a77c
feat: initial project structure
2025314242 May 21, 2025
a1456a2
Merge branch 'main' into feat/initial-structure
2025314242 May 21, 2025
294c01f
feat: initial project structure
2025314242 May 21, 2025
d32142f
docs: merge readme
2025314242 May 21, 2025
e706220
chore: modify vote layout
only1Ksy May 21, 2025
4e982e2
design: vote button design
only1Ksy May 21, 2025
244ff01
feat: vote store
only1Ksy May 21, 2025
7d6f070
feat: store vote info by zustand
only1Ksy May 21, 2025
15445c8
feat: separate part / demo page UI
only1Ksy May 21, 2025
bd61bd1
feat: change cast to slug folder
only1Ksy May 21, 2025
4ea3186
feat: modify header component
only1Ksy May 21, 2025
18f22ac
feat: cast page candidate card components
only1Ksy May 21, 2025
bf5a0da
design: cast page components design detail
only1Ksy May 21, 2025
41572d0
fix: modify demo to team
only1Ksy May 21, 2025
d1ad256
fix: modify vote page title
only1Ksy May 22, 2025
22f74ad
feat: vote cast page onSubmit Button function
only1Ksy May 22, 2025
9f8020d
chore: add icons for vote aggregate page
only1Ksy May 22, 2025
2afbd45
feat: vote aggregate page
only1Ksy May 22, 2025
72e4699
fix: modify Select vote button logic
only1Ksy May 22, 2025
6b1646f
chore: pull modified code from feat/vote
only1Ksy May 22, 2025
785d213
fix: modify vote aggregate page title
only1Ksy May 22, 2025
00bb965
feat: result page basic structure
only1Ksy May 22, 2025
290116f
design: modify pages design details
only1Ksy May 22, 2025
228c0b3
feat: add result show button in go to vote button component
only1Ksy May 22, 2025
e98be41
feat: add crown to result page
only1Ksy May 22, 2025
04cbd26
design: apply hover color to buttons
only1Ksy May 22, 2025
9d2c2f7
design: modify design details of buttons
only1Ksy May 22, 2025
0e0ed1c
fix: modify header logic for result page
only1Ksy May 22, 2025
765a584
Merge branch 'feat/vote-result' into feat/vote-modal
only1Ksy May 22, 2025
a27b836
feat: logout modal basic structure
only1Ksy May 22, 2025
9bb73e6
design: change modal bg color
only1Ksy May 22, 2025
2dc1c7b
Merge pull request #4 from only1Ksy/feat/vote
only1Ksy May 22, 2025
6fcbbbe
Merge pull request #5 from only1Ksy/feat/vote-type-cast
only1Ksy May 22, 2025
b866f62
Merge pull request #6 from only1Ksy/feat/vote-aggregate
only1Ksy May 22, 2025
383ba47
Merge pull request #7 from only1Ksy/feat/vote-result
only1Ksy May 22, 2025
338a488
Merge pull request #8 from only1Ksy/feat/vote-modal
only1Ksy May 22, 2025
85aed0b
chore: zod, react-hook-form
2025314242 May 24, 2025
ad61d6d
feature: login, sign-up page
2025314242 May 24, 2025
6702ef2
chore: api-setting
2025314242 May 24, 2025
19e15b9
feature: login, sign-up page
2025314242 May 24, 2025
8c7ac99
Merge pull request #1 from Team-Promesa/main
2025314242 May 24, 2025
65a385b
feat: add href to back component
2025314242 May 24, 2025
1d83c9c
feat: add href to back component
2025314242 May 24, 2025
aed59a0
Merge pull request #2 from Team-Promesa/main
2025314242 May 24, 2025
8d7d7bc
fix: modify path alias
2025314242 May 28, 2025
7b9f166
chore: install axios
2025314242 May 28, 2025
f4229f4
Merge remote-tracking branch 'upstream/master' into main
2025314242 May 28, 2025
549e098
fix: merge pull request #3 from Team-Promesa/main
2025314242 May 28, 2025
c9cdf3e
fix: merge pull request #13 from 2025314242/main
2025314242 May 28, 2025
40f56d6
feat: auth store zustand
2025314242 May 28, 2025
93f051f
Merge branch 'main' of graduate:2025314242/ceos.week7to8.next-vote-21…
2025314242 May 28, 2025
dc94eeb
fix: remaining path aliasing error
2025314242 May 28, 2025
6ab8756
fix: deploy error
2025314242 May 28, 2025
39e3832
feat: auth api and user hook
2025314242 May 30, 2025
3737e4f
feat: adapt auth api to auth pages
2025314242 May 30, 2025
a06aec0
fix: indicator tag typo
2025314242 May 30, 2025
9ca853b
fix: indicator tag typo
2025314242 May 30, 2025
fc4a9bc
feat: auth api and user hook
2025314242 May 30, 2025
42cbf34
Merge pull request #17 from 2025314242/feat/auth-page-with-api
2025314242 May 30, 2025
a4eebcc
refactor: member data
2025314242 May 30, 2025
9b61eb0
Merge pull request #18 from 2025314242/refactor/member-data
2025314242 May 30, 2025
bc73b58
feat: add part/team property selection
2025314242 May 30, 2025
6f0eb48
Merge pull request #19 from 2025314242/feat/auth-part-team
2025314242 May 30, 2025
8c727f0
feat: middleware
2025314242 May 30, 2025
03105b2
Merge pull request #20 from 2025314242/feat/middleware
2025314242 May 30, 2025
98482fb
feat: logout modal
2025314242 May 30, 2025
1958f1a
Merge pull request #21 from 2025314242/feat/logout-modal
2025314242 May 30, 2025
b5a532d
fix: useUser hook
2025314242 May 30, 2025
d22c82f
Merge pull request #22 from 2025314242/fix/use-user-hook
2025314242 May 30, 2025
0eee49c
docs: notion url
2025314242 May 30, 2025
2bb8048
Merge branch 'main' of graduate:2025314242/ceos.week7to8.next-vote-21…
2025314242 May 30, 2025
3ac123e
Merge pull request #23 from 2025314242/main
2025314242 May 30, 2025
2afed1b
feat: backend API
2025314242 Jun 20, 2025
db04464
Merge pull request #24 from 2025314242/feat/backend-api
2025314242 Jun 20, 2025
169d2ba
fix: remove NEXT_PUBLIC_BASE_URL
2025314242 Jun 20, 2025
2aed96f
Merge pull request #25 from 2025314242/fix/backend-url
2025314242 Jun 20, 2025
73b7d93
fix: logged in
2025314242 Jun 20, 2025
14404f0
Merge pull request #26 from 2025314242/fix/logged-in
2025314242 Jun 20, 2025
09c11a3
fix: refresh token
2025314242 Jun 21, 2025
49b3198
Merge pull request #27 from 2025314242/fix/refresh-token
2025314242 Jun 21, 2025
020997e
test: remove console log
2025314242 Jun 21, 2025
75de527
fix: axios error
2025314242 Jun 21, 2025
1845b6c
feat: api-auth-me
2025314242 Jun 22, 2025
f9b3082
design: join us -> login
2025314242 Jun 22, 2025
ccff071
feat: backend requirements
2025314242 Jun 24, 2025
e8fee30
Merge pull request #28 from 2025314242/feat/requirements
2025314242 Jun 24, 2025
8d05bd1
feat: backend requirements v2
2025314242 Jun 24, 2025
26863e6
Merge pull request #29 from 2025314242/feat/requirements-v2
2025314242 Jun 24, 2025
00e5bf2
fix: crown only if voteCount > 0
2025314242 Jun 24, 2025
0c7a4a1
Merge pull request #30 from 2025314242/fix/crown
2025314242 Jun 24, 2025
eeff839
fix: z-999 to logout modal
2025314242 Jun 27, 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
41 changes: 41 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
.env*

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
12 changes: 12 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"arrowParens": "always",
"bracketSpacing": true,
"endOfLine": "lf",
"printWidth": 120,
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "all",
"useTabs": false,
"plugins": ["prettier-plugin-tailwindcss"]
}
7 changes: 7 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}
}
96 changes: 8 additions & 88 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,94 +1,14 @@
# next-vote-21th
# 7~8주차 미션 - Next-Vote

## **서론**
## Team 프로메사

안녕하세요! 프론트엔드 운영진 송유선입니다. 🍀
벌써 마지막 과제에 도달했네요. 이번 스터디는 특별히 **백엔드 팀원들과 함께하는 협업 과제**로 준비했습니다.
- 👨‍💻 권동욱
- 👩‍💻 김서연

현대 웹 개발에서는 REST API가 데이터 통신의 핵심으로 자리 잡으면서, 프론트엔드와 백엔드 간의 협업이 더욱 중요해졌습니다. 백엔드는 API를 통해 데이터를 제공하고, 프론트엔드는 이를 기반으로 사용자 경험을 책임집니다. 따라서 API를 잘 활용하고 백엔드 개발자와 원활히 소통하는 능력은 필수적인 스킬입니다.
## Project Structure

이번 과제는 앞으로 팀 프로젝트에서 **실제로 백엔드와 협업하기 전 연습을 해보는 기회**입니다. Next.js를 활용해 **투표 기능**을 가진 애플리케이션을 제작하면서 백엔드와의 소통, 역할 분담, 데이터 흐름을 다루는 경험을 쌓아 보세요. 이 경험은 추후 팀 프로젝트에서 더욱 원활한 협력을 가능하게 할 것입니다.
https://pickle-alarm-35a.notion.site/7-8-1f39c22f061f801db81ef32ba493e9f0

여러분의 멋진 결과물을 기대하며 마지막 과제를 응원합니다. 화이팅! 🔥
## Usage

---

## **미션**

### **목표**

- REST API를 활용하여 서버와의 통신 방식을 이해합니다.
- JavaScript의 비동기 처리 방식(`async/await`, Promise)을 익힙니다.
- API 문서를 바탕으로 백엔드와 소통하는 방법을 학습합니다.
- 팀 내 협업을 통해 효율적인 역할 분담을 고민하고 적용합니다.

---

### **기한**

- **2025년 6월 28일 토요일**까지 2차 필수 구현 사항까지 전부 적용된 최종 결과물을 제출해주세요.

---

### **1차 필수 구현 사항**

1. **프로젝트 세팅**
- Next.js의 특성을 고려하여 효과적인 폴더 구조를 고민해 봅니다.
- API 통신, 스타일링, 전역 상태 관리 및 기타 라이브러리 등을 팀원과 상의하여 세팅합니다.

2. **퍼블리싱**
- 프로젝트에 필요한 모든 화면을 퍼블리싱합니다.
- 다양한 디바이스에서 최적의 사용자 경험을 제공하기 위해 반응형 디자인을 적용합니다.

3. **로그인 기능**
- 사용자는 아이디와 비밀번호를 입력하여 로그인할 수 있습니다.
- 로그인 시 JWT를 통해 인증을 처리합니다.
- 아이디 또는 비밀번호가 틀렸을 경우, 에러 메시지를 표시합니다.
- 로그아웃 기능을 구현합니다.
- **백에서 서버 배포가 안 되었을 경우**에는 다음 주로 넘겨도 괜찮습니다.

### **2차 필수 구현 사항**

1. **투표 기능**
- 로그인한 사용자는 투표에 참여할 수 있습니다.
- 각 후보에 대한 투표 수를 실시간으로 확인할 수 있습니다.
- 사용자는 한 번만 투표할 수 있으며, 중복 투표를 방지합니다.

2. **후보 목록 조회**
- 모든 사용자는 후보자의 목록과 상세 정보를 확인할 수 있습니다.
- 후보자의 이름, 사진, 소개 등을 표시합니다.

3. **투표 결과 조회**
- 투표 종료 후, 모든 사용자는 최종 투표 결과를 확인할 수 있습니다.
- 각 후보자의 득표 수와 득표율을 시각적으로 표현합니다.

4. **에러 처리**
- 서버 오류, 네트워크 문제 등 다양한 에러 상황에 대한 처리를 구현합니다.
- 사용자에게 이해하기 쉬운 에러 메시지를 제공합니다.

---

### **디자인 참고**

다음의 리소스를 참고해 UI/UX를 개선해보세요:
- [디자인 레퍼런스1](https://www.figma.com/design/7xoPYTjMHcwPk2yl92Eynx/%ED%98%91%EB%8F%99%EA%B3%BC%EC%A0%9C-%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4?node-id=0-1&node-type=canvas)
- [디자인 레퍼런스2](https://www.figma.com/design/XpKkyWcguIFY9QzWWJHOyL/%ED%98%91%EB%8F%99%EA%B3%BC%EC%A0%9C-%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4?node-id=0-1)
- [디자인 레퍼런스3](https://www.figma.com/design/12WK4MEhjwNmt89HkRu8Gp/%EB%B0%94%EB%A6%AC%EB%B0%94%EB%A6%AC-%ED%88%AC%ED%91%9C)
- [디자인 레퍼런스4](https://www.figma.com/design/qsTGeBRrKWiWE04eVOTFQ9/CEOS-CupfeeDeal-Vote?node-id=38-503&p=f&t=sM5p1Gw4hA5G5H5D-0)

20기 과제
- [CupfeeDeal](https://github.com/CEOS-Developers/next-vote-20th/pull/6)
- [페달지니](https://github.com/CEOS-Developers/next-vote-20th/pull/2)
- [케이크WAY](https://github.com/CEOS-Developers/next-vote-20th/pull/5)


### **선택 사항**

- API 요청 방식은 자유롭게 선택 가능 (예: Fetch API, axios 등).
- 최신 자바스크립트 스타일에 익숙해지기 위해 `Promise.then()` 대신 `async/await`를 사용해 보세요.


## **Key Question**

- Zod 스키마가 무엇인지, 어떻게 활용할 수 있는지 알아봅시다.
- 이번 프로젝트에서 토큰 관리를 어떻게 할 예정인지, 그리고 왜 그런 방법을 선택했는지에 대해 설명해 주세요.
https://next-vote-21th-promesa.vercel.app/
36 changes: 36 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { FlatCompat } from '@eslint/eslintrc';
import simpleImportSort from 'eslint-plugin-simple-import-sort';
import { dirname } from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const compat = new FlatCompat({
baseDirectory: __dirname,
});

const eslintConfig = [
...compat.extends(
'next/core-web-vitals',
'next/typescript',
'plugin:prettier/recommended',
'plugin:@tanstack/eslint-plugin-query/recommended',
),
{
plugins: {
'simple-import-sort': simpleImportSort,
},
rules: {
'simple-import-sort/imports': [
'error',
{
groups: [['^\\u0000'], ['^node:'], ['^react', '^@?\\w'], ['^(@|~)/'], ['^\\.'], ['\\.s?css$']],
},
],
'simple-import-sort/exports': 'error',
},
},
];

export default eslintConfig;
29 changes: 29 additions & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
async rewrites() {
return {
beforeFiles: [
{ source: '/api/vote/:path*', destination: `${process.env.BACKEND_URL}/vote/:path*` },
{ source: '/api/:path*', destination: `${process.env.BACKEND_URL}/api/:path*` },
],
};
},
webpack(config) {
config.module.rules.push({
test: /\.svg$/i,
use: ['@svgr/webpack'],
});
return config;
},
turbopack: {
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.ts',
},
},
},
};

export default nextConfig;
Loading