Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
34c7246
chore: 프로젝트 환경 설정 및 폴더 구조 분리
minnngo Mar 26, 2026
ba3323d
feat: 1대1 채팅방 UI 구현 및 메시지 입력·자동스크롤·localStorage 저장 추가
minnngo Mar 26, 2026
0ac2b1c
feat: 1대1 채팅방 세부 디자인 보완 및 날짜바 표시
minnngo Mar 26, 2026
7f5ee7f
chore: trigger vercel redeploy
minnngo Mar 26, 2026
882d1c5
chore: remove node_modules from repo
minnngo Mar 26, 2026
b7cc006
chore: trigger vercel redeploy
minnngo Mar 26, 2026
848c128
chore: trigger vercel redeploy
minnngo Mar 26, 2026
5e046f1
style: 채팅 입력바 세부 디자인 수정
minnngo Mar 27, 2026
cf7ac21
feat: 이미지 전송 기능 구현
minnngo Mar 27, 2026
81dca7a
fix: 사진 여러장전송시 생기던 에러 해결
minnngo Mar 27, 2026
47ae614
feat: 개수에 따른 이모지 전송 기능 구현
minnngo Mar 27, 2026
c92607d
feat: 텍스트 전체보기 기능 추가 및 세부 QA 바탕 세부 레이아웃 수정
minnngo Mar 27, 2026
678fc71
style: 모바일 화면 사이즈 수정
minnngo Mar 27, 2026
debd3dc
chore: trigger vercel redeploy
minnngo Mar 28, 2026
5a399de
style: 모바일 화면에서 채팅버블 패딩값 수정
minnngo Apr 11, 2026
303208d
refactor: 이미지 관련 유틸 함수 분리 등 코드 구조 개선
minnngo Apr 11, 2026
ea0cb47
feat: 채팅목록 창 작업
minnngo Apr 11, 2026
f4beeb1
design: 채팅 리스트 디자인 보완
minnngo Apr 11, 2026
acc562f
fix: ChatRoomList 반환 타입 오류 해결
minnngo Apr 11, 2026
1e09b65
docs: json 더미 데이터 수정
minnngo Apr 11, 2026
6172590
style: 모바일에서는 StatusBar, IosHomeIndicator 안보이도록 수정
minnngo Apr 11, 2026
19c8fdd
design: BottomNavigator 디자인 수정
minnngo Apr 11, 2026
a7d2b53
feat: 친구 목록창 및 내 프로필 화면 추가
minnngo Apr 12, 2026
8493e4b
feat: 스플래시 화면 추가
minnngo Apr 12, 2026
9177038
style: 모바일에서 상태 바 색이 페이지 대표 상단색을 따라가도록 수정
minnngo Apr 12, 2026
762f518
style: 디자인 QA 반영 및 전체적인 세부 디테일 수정
minnngo Apr 13, 2026
9b25658
style: figma make 애니메이션 반영
minnngo Apr 13, 2026
abaf342
style: 채팅방 입창 패딩 조정 및 이미지 전송 스타일 수정
minnngo Apr 24, 2026
6bd8944
style: 코드 구조 개선
minnngo Apr 24, 2026
551501c
chore: trigger vercel redeploy
minnngo Apr 24, 2026
de60f24
chore: trigger vercel redeploy
minnngo 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
29 changes: 29 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Local font downloads
/카카오작은글씨/
/카카오큰글씨/

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.codex
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
12 changes: 12 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
],
"css.lint.unknownAtRules": "ignore"
}
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,
},
},
])
25 changes: 25 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import reactHooks from "eslint-plugin-react-hooks";
import { defineConfig } from "eslint/config";

export default defineConfig(
{
ignores: ["dist", "node_modules"],
},

js.configs.recommended,
...tseslint.configs.recommended,
...tseslint.configs.stylistic,

{
files: ["**/*.{ts,tsx}"],
plugins: {
"react-hooks": reactHooks,
},
rules: {
...reactHooks.configs.recommended.rules,
"no-console": "warn",
},
}
);
15 changes: 15 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!doctype html>
<html lang="ko">
<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, viewport-fit=cover" />
<meta name="theme-color" content="#FFFFFF" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<title>react-messenger-23rd</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
Loading