Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
919e65e
[CHORE] 초기 세팅
minseo0614 Mar 26, 2026
1b8d8b8
[CHORE] 프로젝트 초기 파일 구조 설정
minseo0614 Mar 27, 2026
dde1a1a
[CHORE] 디자인 토큰 초기 설정
minseo0614 Mar 27, 2026
9428f2f
[FEAT] 앱 하단 네비게이션 바 UI 구현
minseo0614 Mar 27, 2026
fccca1d
[FEAT] useState 기반 하단 네비게이션 화면 전환 구현
minseo0614 Mar 27, 2026
d66b9b8
[FEAT] 채팅 목록 상단 헤더 UI 구현
minseo0614 Mar 27, 2026
d258af8
[FEAT] Avatar, CountBadge 공통 컴포넌트 구현
minseo0614 Mar 27, 2026
e8bb428
[FEAT] 채팅 목록 리스트 UI 구현
minseo0614 Mar 27, 2026
ae4a1a1
[FEAT] 채팅 목록에서 채팅방 진입 및 뒤로가기 기능 구현
minseo0614 Mar 27, 2026
0667c52
[FEAT] 채팅방 헤더 UI 구현
minseo0614 Mar 27, 2026
c73f0fc
[FEAT] 메시지 입력창 UI 구현
minseo0614 Mar 27, 2026
e34b2e8
[FEAT] MessageBubble 컴포넌트 구현
minseo0614 Mar 27, 2026
0224a28
[FEAT] MessageLine, DateDivider 컴포넌트 구현
minseo0614 Mar 27, 2026
24e2ab8
[FEAT] 메시지 타입 정의 및 샘플 데이터 추가
minseo0614 Mar 27, 2026
2d0c4c5
[FEAT] 채팅방 메시지 데이터 연동
minseo0614 Mar 28, 2026
9926fed
[FIX] 메시지 컴포넌트 수정
minseo0614 Mar 28, 2026
8fa5ffe
[FEAT] 메시지 전송 기능 구현
minseo0614 Mar 28, 2026
a45c251
[FEAT] 유저 전환 기능 구현
minseo0614 Mar 28, 2026
e4a2870
[FEAT] localStorage 기반 메시지 저장
minseo0614 Mar 28, 2026
ec1729e
[REFACTOR] 중복 타입 정의 및 import 경로 정리
minseo0614 Mar 28, 2026
412d84c
[REFACTOR] 미사용 변수 삭제 및 중복 로직 정리
minseo0614 Mar 28, 2026
f734c51
[FEAT] 채팅 목록 데이터 기반 렌더링 및 localStorage 연동
minseo0614 Mar 28, 2026
620ab3c
chore: redeploy
minseo0614 Mar 28, 2026
8d4df1a
[FIX] 파일명 대소문자 수정
minseo0614 Mar 28, 2026
966107b
[FIX] DM 헤더 아이콘 크기 수정
minseo0614 Mar 29, 2026
104f091
[FIX] 채팅 목록 상단 4개만 핀 표시
minseo0614 Mar 29, 2026
6a9db36
[FIX] 네비게이션 선택 아이콘 색상 수정
minseo0614 Mar 29, 2026
5721fd5
[FIX] 채팅 목록 마지막 대화 텍스트 최대 너비 제한
minseo0614 Mar 29, 2026
9a6a63f
[FIX] 메시지 인풋 창 배경 및 스타일 수정
minseo0614 Mar 29, 2026
ca99810
[FIX] 프로필 상태 아이콘 조정
minseo0614 Mar 29, 2026
84f4e0e
[FIX] 채팅방 아바타, 상태 아이콘, 헤더 스타일 수정
minseo0614 Mar 31, 2026
033307e
[FIX] 메시지 인풋 클릭 시 자동 포커스
minseo0614 Mar 31, 2026
6f7a599
[FIX] navigation 타입 파일 복원
minseo0614 Mar 31, 2026
b4eb4f8
[FIX] 아바타-말풍선 간격 조정
minseo0614 Mar 31, 2026
6c99ce5
[FEAT] 채팅 목록 아이템 호버/프레스드 상태 적용
minseo0614 Mar 31, 2026
752b95a
[FEAT] React Router 도입 및 페이지 라우팅 적용
minseo0614 Apr 25, 2026
a07e99b
[FEAT] 홈 페이지 라우트 및 헤더 컴포넌트 추가
minseo0614 Apr 25, 2026
fba6f40
[FEAT] UpdateCard 컴포넌트 추가
minseo0614 Apr 25, 2026
bf51e93
[FEAT] Draft 아이콘 및 UpdateSection 컴포넌트 추가
minseo0614 Apr 25, 2026
907db38
[FEAT] 홈 페이지에 새로운 업데이트 섹션 연결
minseo0614 Apr 25, 2026
b670b00
[FEAT] 토픽/팀원 목록 섹션용 아이콘 정리
minseo0614 Apr 25, 2026
cf9c63f
[FEAT] CollapsibleSectionHeader 컴포넌트 추가
minseo0614 Apr 25, 2026
34841d7
[FEAT] 홈 페이지에 토픽/팀원 목록 섹션 헤더 추가
minseo0614 Apr 25, 2026
f09b289
[FEAT] CollapsibleSectionHeader 토글 prop 추가
minseo0614 Apr 25, 2026
6cd5422
[FEAT] MemberItem 컴포넌트 추가
minseo0614 Apr 25, 2026
91fd3c2
[FEAT] MemberList 컴포넌트 추가
minseo0614 Apr 25, 2026
a972b61
[FEAT] 팀원 목록 아코디언 펼침 동작 구현
minseo0614 Apr 25, 2026
5a24724
[FIX] 팀원 목록 토글 시 헤더 텍스트 위치 고정
minseo0614 Apr 25, 2026
ad045d5
[FEAT] me 유저 프로필 데이터 추가
minseo0614 Apr 25, 2026
a31f2b5
[FEAT] 프로필 페이지 라우트 및 네비게이션 추가
minseo0614 Apr 25, 2026
9b4cf10
[FEAT] ProfileHeader 컴포넌트 추가
minseo0614 Apr 25, 2026
63a1413
[FEAT] 프로필 페이지에 프로필 요약 연결
minseo0614 Apr 25, 2026
f3a3249
[FEAT] StatusRow 컴포넌트 추가
minseo0614 Apr 25, 2026
9b8ca2a
[FEAT] 프로필 페이지에 상태 행 연결
minseo0614 Apr 25, 2026
c822c4d
[FEAT] ProfileActionCard 컴포넌트 추가
minseo0614 Apr 25, 2026
e488372
[FEAT] 프로필 페이지에 액션 카드 두 개 연결
minseo0614 Apr 25, 2026
7c25ac7
[FEAT] IconTextRow 공통 컴포넌트 추가
minseo0614 Apr 25, 2026
5af6c8b
[FEAT] ContactSection 컴포넌트 추가
minseo0614 Apr 25, 2026
6e09b8a
[FEAT] 프로필 페이지에 연락처 섹션 연결
minseo0614 Apr 25, 2026
4b5a865
[FIX] IconTextRow 아이콘-텍스트 간격 12px로 수정
minseo0614 Apr 25, 2026
3d8a3fd
[FEAT] SlackInfoSection 컴포넌트 추가
minseo0614 Apr 25, 2026
a26ec5c
[FEAT] 프로필 페이지에 Slack 정보 섹션 연결 및 gap 수정
minseo0614 Apr 25, 2026
d42009d
[FIX] IconTextRow description 폰트를 c2_11_r로 수정
minseo0614 Apr 25, 2026
65a7cad
[FIX] HomeHeader 우측 프로필 수정
minseo0614 Apr 25, 2026
23346b1
[FIX] UpdateSection 하단 구분선 추가
minseo0614 Apr 25, 2026
0c0a283
[FIX] 메세지 전송 오류 해결
minseo0614 Apr 25, 2026
7607534
[CHORE] Vercel 재배포 트리거
minseo0614 Apr 25, 2026
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
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
2 changes: 2 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules
dist
5 changes: 5 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"semi": false,
"singleQuote": true,
"trailingComma": "all"
}
157 changes: 73 additions & 84 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,84 +1,73 @@
# **서론**

안녕하세요 😻
23기 프론트엔드 운영진 원채영입니다.

이번 주에는 투두리스트를 넘어, 새로운 프로젝트인 **Messenger** 구현을 진행합니다.

이번 과제는 디자이너와 협업하여 진행되는 프로젝트로,
디자인 파트에서 리디자인한 메신저 화면을 직접 구현해보는 경험을 하게 됩니다.

또한, 이번 주부터는 **TypeScript**와 **Tailwind CSS**를 필수로 적용하여 개발을 진행합니다.

프로젝트 규모가 커질수록 컴포넌트의 props도 점점 복잡해지는데요,
이때 TypeScript를 활용하면 props의 구조와 타입을 명확하게 관리할 수 있고,
자동완성을 통해 개발 생산성을 높일 수 있습니다.

아울러, 이번 과제에서는 **React Hooks**에 더욱 익숙해지는 것을 목표로 합니다.
특히 useState, useEffect, useRef를 중심으로 활용해보며, React에서 자주 사용되는 핵심 개념을 확실히 익혀보시길 바랍니다.

그럼 이번 과제도 파이팅입니다!! 🎉


# **과제**

## **목표**

- TypeScript를 사용해봅시다.
- useState로 컴포넌트의 상태를 관리합니다.
- useEffect와 useRef의 사용법을 이해합니다.
- Tailwind CSS의 사용법에 익숙해집니다.

## **기한**

- 2026년 3월 28일 토요일 23:59까지

## **Review Questions**

- 디자이너와 협업하며 전달받은 자료
(피그마 링크, 캡처본, 커뮤니케이션 과정 등)

- JSX / JS / TSX / TS의 개념과 각각의 차이점, 사용 이유

- TypeScript를 사용하는 이유

- SSR과 CSR의 개념 및 차이점


## **필수 구현 기능**

- 피그마 **Dev Mode**를 통해, 매칭된 디자인 파트원의 UI를 구현합니다.
- [🔗 예시 1](https://react-messenger-21th-kwondu.vercel.app/)
- [🔗 예시 2](https://react-messenger-21th-nine.vercel.app/)
- 디자인 시스템을 구축합니다.
- tailwind CSS를 사용합니다.
- 메세지를 보내면 채팅방 하단으로 스크롤을 이동시킵니다.
- 메세지에 유저 정보(프로필 사진, 이름)를 표시합니다.
- user와 message 데이터를 json 파일에 저장합니다.
- UI는 **반응형을 제외**하고 피그마파일을 따라서 진행합니다.

### **추가 구현 기능**

- 채팅방 상단의 프로필을 클릭하면 사용자를 변경할 수 있습니다.
- 더블 클릭 하면 감정표현을 추가합니다.
- 그 외 추가하고 싶은 기능이 있다면 마음껏 추가해 주세요!

<br/>

이번 과제는 다음 과제까지 이어지는 만큼, **확장성**을 충분히 고려해 주세요.
4주차 과제에서는 **유저 및 기능 추가**, **Routing 구현**이 진행될 예정입니다.

이를 대비해, [**zustand**](https://zustand-demo.pmnd.rs/)를 활용한 상태 관리도 미리 적용해보시는 것을 추천드립니다!

## **링크 및 참고자료**

- [React docs - Hook](https://ko.reactjs.org/docs/hooks-intro.html)
- [React의 Hooks 완벽 정복하기](https://velog.io/@velopert/react-hooks#1-usestate)
- [useEffect 완벽 가이드](https://overreacted.io/ko/a-complete-guide-to-useeffect/)
- [코딩 컨벤션](https://ui.toast.com/fe-guide/ko_CODING-CONVENTION)
- [타입스크립트 핸드북](https://joshua1988.github.io/ts/intro.html)
- [리액트 프로젝트에서 타입스크립트 사용하기 (시리즈)](https://velog.io/@velopert/series/react-with-typescript)
- [디자인 시스템 구축기](https://yozm.wishket.com/magazine/detail/1830/)
- [[영상] : 컴포넌트에 대한 이해](https://www.youtube.com/watch?v=21eiJc90ggo)
- [Tailwind CSS 장단점, 사용법](https://wonny.space/writing/dev/hello-tailwind-css)
- [ts 절대경로 설정하기](https://tesseractjh.tistory.com/232)
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)

## React Compiler

The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...

// Remove tseslint.configs.recommended and replace with this
tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
tseslint.configs.stylisticTypeChecked,

// Other configs...
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
])
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...
// Enable lint rules for React
reactX.configs['recommended-typescript'],
// Enable lint rules for React DOM
reactDom.configs.recommended,
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
])
```
23 changes: 23 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import { defineConfig, globalIgnores } from 'eslint/config'

export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs.flat.recommended,
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
},
])
13 changes: 13 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>react-messenger-23rd</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
Loading