Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
d7872f7
[FEAT] 메인 레이아웃 구현
DDINGJOO Jan 6, 2026
5f8211e
Merge pull request #19 from Language-Study-Prooject/feature/1/2/6/log…
DDINGJOO Jan 6, 2026
c0f1a72
[FEAT] Sidebar 메뉴 계층 구조 개선
DDINGJOO Jan 6, 2026
3de5b6b
[FEAT] 면접 시뮬레이션 메뉴 제거
DDINGJOO Jan 6, 2026
6bdb2b5
[FEAT] 프리토킹(사람들과) 채팅방 리스트 페이지 구현
DDINGJOO Jan 6, 2026
7b29d50
Merge pull request #27 from Language-Study-Prooject/feature/24/25/26/…
DDINGJOO Jan 6, 2026
6f3ed4e
[FEAT] Sidebar 메뉴 카테고리 구조 변경
DDINGJOO Jan 6, 2026
3c7d786
[FEAT] Dashboard 카드 카테고리 구조 변경
DDINGJOO Jan 6, 2026
aeb3e5e
[FEAT] Dashboard 카드 호버 시 하위 카테고리 표시
DDINGJOO Jan 6, 2026
c3e1729
[FIX] Dashboard 카드 레이아웃 Grid로 변경
DDINGJOO Jan 6, 2026
0c9a8cc
Merge pull request #30 from Language-Study-Prooject/feature/28/menu-c…
DDINGJOO Jan 6, 2026
b5ee18f
[FEAT] ChatRoomCard 높이 일정하게 변경
DDINGJOO Jan 6, 2026
26ce9b0
[FIX] ChatRoomCard 가로/세로 크기 통일
DDINGJOO Jan 6, 2026
37ea06a
[FIX] ChatRoomCard 고정 높이 적용
DDINGJOO Jan 6, 2026
4402051
[FIX] ChatRoomCard 참여자 프로필 제거 및 너비 고정
DDINGJOO Jan 6, 2026
db07f45
[FIX] ChatRoomCard 레이아웃 개선
DDINGJOO Jan 6, 2026
f06bfae
[FIX] 생성일 라벨 추가
DDINGJOO Jan 6, 2026
34dc7dd
[FEAT] ChatRoomCard UI 개선
DDINGJOO Jan 6, 2026
c758b49
[FEAT] 채팅방 입장 모달 및 필터 추가
DDINGJOO Jan 6, 2026
0a47451
Merge pull request #32 from Language-Study-Prooject/fix/31/chatroom-c…
DDINGJOO Jan 6, 2026
d59ea7f
[FEAT] Chat API 연동 기반 구축
DDINGJOO Jan 6, 2026
379820f
[FEAT] 채팅방 목록/생성/입장 API 연동 및 채팅 UI 구현
DDINGJOO Jan 6, 2026
4d1cc2a
[FEAT] 전역 채팅 모달 및 TTS 기능 구현
DDINGJOO Jan 6, 2026
1a0bf22
Merge pull request #46 from Language-Study-Prooject/feature/40/41/42/…
DDINGJOO Jan 6, 2026
9792cd3
[FIX] 채팅 모달 최소화 시 우측 하단 이동
DDINGJOO Jan 6, 2026
bc76986
Merge pull request #48 from Language-Study-Prooject/fix/47/chat-modal…
DDINGJOO Jan 6, 2026
c9b4e35
[FEAT] TTS 음성 선택 기능 구현
DDINGJOO Jan 6, 2026
7fa39ad
Merge pull request #50 from Language-Study-Prooject/feature/49/tts-vo…
DDINGJOO Jan 6, 2026
6185619
[CR] TTS API 변경 대응 (#53)
DDINGJOO Jan 7, 2026
442a8e5
Merge pull request #54 from Language-Study-Prooject/feature/53/tts-ap…
DDINGJOO Jan 7, 2026
03ac906
[FIX] 채팅 모달 최소화 후 펼칠 때 스크롤 맨 아래로 유지 (#55)
DDINGJOO Jan 7, 2026
74cb7aa
Merge pull request #56 from Language-Study-Prooject/fix/55/chat-modal…
DDINGJOO Jan 7, 2026
002b09d
[FEAT] Vocab API 서비스 레이어 구축 (#58) (#99)
DDINGJOO Jan 7, 2026
6407921
[FEAT] 단어 학습 대시보드 구현 (#59) (#100)
DDINGJOO Jan 7, 2026
d47a214
[FEAT] 일일 학습 (플래시카드) 구현 (#60) (#101)
DDINGJOO Jan 7, 2026
839a8f8
[FEAT] 단어 시험 기능 구현 (#61) (#102)
DDINGJOO Jan 7, 2026
677cbe6
[FEAT] 단어장 (Word List) 기능 구현 (#62) (#104)
DDINGJOO Jan 7, 2026
cc202b3
[FEAT] 학습 통계 페이지 구현 (#63) (#105)
DDINGJOO Jan 7, 2026
b12178a
[FEAT] 단어장 학습 통계 및 UI/UX 개선 (#57, #63) (#106)
DDINGJOO Jan 13, 2026
13e07ad
feat(grammar): 문법 검사 페이지 UI 구현 (#120)
DDINGJOO Jan 14, 2026
e7b58b4
[FEAT] 배지 시스템 구현 (#121, #122) (#126)
DDINGJOO Jan 14, 2026
2c62035
[FEAT] 문법 교정 채팅 스트리밍 UI 구현 (#128) (#130)
DDINGJOO Jan 14, 2026
98fbd24
[FEAT] Grammar WebSocket 스트리밍 서비스 구현 (#127) (#129)
DDINGJOO Jan 14, 2026
541cb4c
feature : jira issue, PR 연동 workflow 작성 (#131)
hye-inA Jan 14, 2026
8dd84c1
refactor : jira issue, pr workflow refactorting (#133)
hye-inA Jan 14, 2026
4478095
[REFACTOR] Adjust code formatting for improved readability and consis…
DDINGJOO Jan 15, 2026
c8f53c2
feat : issue 수정/병합시 JIra에 반영 workflow 코드 추가 (#134)
hye-inA Jan 15, 2026
7232732
refactor : Update Jira Issue 단계 환경변수 설정 리팩토링 (#140)
hye-inA Jan 15, 2026
659fc05
Merge branch 'main' into develop
hye-inA Jan 15, 2026
edee86b
refactor : issue 본문 특수문자 에러 수정 (#145)
hye-inA Jan 15, 2026
3450857
feat(freetalk): 채팅방 투명도 조절 기능 구현 (#150) (#152)
DDINGJOO Jan 15, 2026
8d8dd16
feat(freetalk): 채팅방 투명도 조절 기능 구현 (#154)
DDINGJOO Jan 15, 2026
2ab86ed
feat : 로그인 기능 구현 및 JWT 토큰 관리 (#155)
hye-inA Jan 16, 2026
020817c
refactor : 본문에 특수문자 에러 처리 (#156)
hye-inA Jan 16, 2026
3e22587
feat : 회원가입 UI 구현 (#157)
hye-inA Jan 16, 2026
db0fafc
[FEAT] Real-time chat WebSocket integration and related enhancements …
DDINGJOO Jan 16, 2026
67326e8
[FIX] 채팅 메시지 중복 표시 버그 수정 (#161)
DDINGJOO Jan 16, 2026
036cec1
[FIX] 게임 시작 버튼이 WebSocket 명령어와 동일하게 동작하도록 수정 (#160)
DDINGJOO Jan 16, 2026
d290c1d
feat : 회원가입, 이메일 인증 UI 및 기능, 상태관리 추가 (#162)
hye-inA Jan 16, 2026
4634b58
fix : 회원가입 페이지 에러 수정 (#163)
hye-inA Jan 16, 2026
3f380e9
[REFACTOR] Standardize import formatting and spacing across components
DDINGJOO Jan 16, 2026
92cff27
[FIX] 캐치마인드 게임 라운드 전환 및 WebSocket 이벤트 처리 개선 (#165) (#166)
DDINGJOO Jan 20, 2026
74fcd7a
[FIX] Update game state management and remove redundant `/skip` logic
DDINGJOO Jan 20, 2026
0b0706e
[STYLE] Update color scheme for consistency and better visual appeal
DDINGJOO Jan 20, 2026
f7a55db
[FEAT] Implement lobby and gameplay pages for Catchmind (#187)
DDINGJOO Jan 21, 2026
4e00acd
[FEAT] Implement lobby and gameplay pages for Catchmind
DDINGJOO Jan 21, 2026
6f1b59b
[STYLE] Add comprehensive dark mode CSS support
DDINGJOO Jan 22, 2026
c8d4ca6
[STYLE] Adjust dark theme colors for better contrast
DDINGJOO Jan 22, 2026
43b06b1
[STYLE] Add dark mode background support to MainLayout
DDINGJOO Jan 22, 2026
bb30b47
[STYLE] Unify header dark mode background color
DDINGJOO Jan 22, 2026
5dff41e
[STYLE] Unify navigation dropdown dark mode colors
DDINGJOO Jan 22, 2026
9258795
[STYLE] Add dark mode support to Footer
DDINGJOO Jan 22, 2026
79da057
[STYLE] Add dark mode support to GameChat component
DDINGJOO Jan 22, 2026
df055cd
[STYLE] Add dark mode support to WaitingChat component
DDINGJOO Jan 22, 2026
de9c889
[FIX] Add client-side filtering for game room list
DDINGJOO Jan 22, 2026
c82ced3
[REFACTOR] Remove game features from chat room page
DDINGJOO Jan 22, 2026
d6bb517
[FIX] Clear error state on successful WebSocket connection
DDINGJOO Jan 22, 2026
cc2450b
[STYLE] Improve dark mode support in VocabDashboard
DDINGJOO Jan 22, 2026
5ba00d0
[FEAT] Implement lobby and gameplay pages for Catchmind
DDINGJOO Jan 22, 2026
2dae08d
[REFACTOR] Remove hardcoded fallback URLs from services
DDINGJOO Jan 22, 2026
17de590
Merge remote-tracking branch 'origin/main' into develop
DDINGJOO Jan 22, 2026
1d40e6b
[FIX] Add fallback to VITE_API_URL for chat and vocab APIs
DDINGJOO Jan 22, 2026
2937866
feat: 뉴스 영어 학습 기능 구현 (#189)
DDINGJOO Jan 23, 2026
dbf7271
feat: Add news badge types, category filtering, and keyword collectio…
DDINGJOO Jan 23, 2026
05b7d58
Merge origin/develop into feature/189-news-english-learning
DDINGJOO Jan 23, 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
414 changes: 364 additions & 50 deletions src/App.jsx

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/api/chatApi.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import axios from 'axios'

const chatApi = axios.create({
baseURL: import.meta.env.VITE_CHAT_API_URL,
baseURL: import.meta.env.VITE_CHAT_API_URL || import.meta.env.VITE_API_URL,
timeout: 10000,
headers: {
'Content-Type': 'application/json',
Expand Down
2 changes: 1 addition & 1 deletion src/api/vocabApi.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import axios from 'axios'

const vocabApi = axios.create({
baseURL: import.meta.env.VITE_VOCAB_API_URL,
baseURL: import.meta.env.VITE_VOCAB_API_URL || import.meta.env.VITE_API_URL,
timeout: 10000,
headers: {
'Content-Type': 'application/json',
Expand Down
17 changes: 11 additions & 6 deletions src/domains/badge/components/BadgeCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import {Box, Fade, LinearProgress, Tooltip, Typography,} from '@mui/material'
import {EmojiEvents as TrophyIcon, Lock as LockIcon,} from '@mui/icons-material'
import {useSettings} from '../../../contexts/SettingsContext'
import {useThemeMode} from '../../../contexts/ThemeContext'
import {BADGE_CATEGORY_COLORS, BADGE_DESCRIPTIONS_EN, BADGE_NAMES_EN,} from '../constants/badgeConstants'
import {BADGE_CATEGORY_COLORS, BADGE_DESCRIPTIONS_EN, BADGE_NAMES_EN, NEWS_BADGE_TYPES,} from '../constants/badgeConstants'

// 뉴스 뱃지 색상
const NEWS_BADGE_COLOR = '#10b981'

export default function BadgeCard({badge, size = 'medium'}) {
const {isKorean} = useSettings()
Expand All @@ -13,6 +16,8 @@ export default function BadgeCard({badge, size = 'medium'}) {

const isEarned = badge.earned
const progress = Math.min((badge.progress / badge.threshold) * 100, 100)
const isNewsBadge = NEWS_BADGE_TYPES.includes(badge.badgeType) || badge.badgeType?.startsWith('NEWS_')
const badgeColor = isNewsBadge ? NEWS_BADGE_COLOR : BADGE_CATEGORY_COLORS[badge.category]

// Size configurations
const sizes = {
Expand Down Expand Up @@ -66,7 +71,7 @@ export default function BadgeCard({badge, size = 'medium'}) {
backgroundColor: '#e5e7eb',
'& .MuiLinearProgress-bar': {
borderRadius: 3,
background: `linear-gradient(135deg, ${BADGE_CATEGORY_COLORS[badge.category]} 0%, ${BADGE_CATEGORY_COLORS[badge.category]}99 100%)`,
background: `linear-gradient(135deg, ${badgeColor} 0%, ${badgeColor}99 100%)`,
},
}}
/>
Expand Down Expand Up @@ -143,11 +148,11 @@ export default function BadgeCard({badge, size = 'medium'}) {
justifyContent: 'center',
position: 'relative',
background: isEarned
? `linear-gradient(135deg, ${BADGE_CATEGORY_COLORS[badge.category]}20 0%, ${BADGE_CATEGORY_COLORS[badge.category]}10 100%)`
? `linear-gradient(135deg, ${badgeColor}20 0%, ${badgeColor}10 100%)`
: isDark ? '#3f3f46' : '#f3f4f6',
border: isEarned ? `3px solid ${BADGE_CATEGORY_COLORS[badge.category]}` : '3px solid #d1d5db',
border: isEarned ? `3px solid ${badgeColor}` : '3px solid #d1d5db',
boxShadow: isEarned
? `0 8px 24px -4px ${BADGE_CATEGORY_COLORS[badge.category]}40`
? `0 8px 24px -4px ${badgeColor}40`
: 'none',
overflow: 'hidden',
}}
Expand All @@ -171,7 +176,7 @@ export default function BadgeCard({badge, size = 'medium'}) {
<TrophyIcon
sx={{
fontSize: config.icon,
color: isEarned ? BADGE_CATEGORY_COLORS[badge.category] : '#9ca3af',
color: isEarned ? badgeColor : '#9ca3af',
filter: isEarned ? 'none' : 'grayscale(100%)',
opacity: isEarned ? 1 : 0.4,
}}
Expand Down
29 changes: 29 additions & 0 deletions src/domains/badge/constants/badgeConstants.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,21 @@ export const BADGE_TYPES = {
QUICK_GUESSER: 'QUICK_GUESSER',
PERFECT_DRAWER: 'PERFECT_DRAWER',
MASTER: 'MASTER',
// 뉴스 관련 뱃지
NEWS_FIRST_READ: 'NEWS_FIRST_READ',
NEWS_10_READ: 'NEWS_10_READ',
NEWS_50_READ: 'NEWS_50_READ',
NEWS_100_READ: 'NEWS_100_READ',
NEWS_QUIZ_FIRST: 'NEWS_QUIZ_FIRST',
NEWS_QUIZ_PERFECT: 'NEWS_QUIZ_PERFECT',
NEWS_QUIZ_10: 'NEWS_QUIZ_10',
NEWS_QUIZ_50: 'NEWS_QUIZ_50',
NEWS_WORDS_10: 'NEWS_WORDS_10',
NEWS_WORDS_50: 'NEWS_WORDS_50',
NEWS_WORDS_100: 'NEWS_WORDS_100',
NEWS_STREAK_7: 'NEWS_STREAK_7',
NEWS_STREAK_30: 'NEWS_STREAK_30',
NEWS_MASTER: 'NEWS_MASTER',
}

// 배지 카테고리
Expand All @@ -35,8 +50,22 @@ export const BADGE_CATEGORIES = {
QUICK_GUESSES: 'QUICK_GUESSES',
PERFECT_DRAWS: 'PERFECT_DRAWS',
ALL_BADGES: 'ALL_BADGES',
// 뉴스 관련 카테고리
NEWS_READ: 'NEWS_READ',
NEWS_QUIZ: 'NEWS_QUIZ',
NEWS_WORDS: 'NEWS_WORDS',
NEWS_STREAK: 'NEWS_STREAK',
NEWS_MASTER: 'NEWS_MASTER',
}

// 뉴스 뱃지 타입 목록 (초록색 테두리 적용용)
export const NEWS_BADGE_TYPES = [
'NEWS_FIRST_READ', 'NEWS_10_READ', 'NEWS_50_READ', 'NEWS_100_READ',
'NEWS_QUIZ_FIRST', 'NEWS_QUIZ_PERFECT', 'NEWS_QUIZ_10', 'NEWS_QUIZ_50',
'NEWS_WORDS_10', 'NEWS_WORDS_50', 'NEWS_WORDS_100',
'NEWS_STREAK_7', 'NEWS_STREAK_30', 'NEWS_MASTER',
]

// 배지 카테고리 라벨 (한국어)
export const BADGE_CATEGORY_LABELS_KO = {
FIRST_STUDY: '첫 시작',
Expand Down
8 changes: 4 additions & 4 deletions src/domains/games/theme/gameTheme.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
*/

export const GAME_COLORS = {
// 브랜드
primary: '#8B5CF6',
primaryLight: '#A78BFA',
primaryBg: '#F3E8FF',
// 브랜드 (청록색 - 사이드바와 통일)
primary: '#06b6d4',
primaryLight: '#22d3ee',
primaryBg: '#ecfeff',

// 게임 상태
status: {
Expand Down
9 changes: 9 additions & 0 deletions src/domains/news/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Pages
export { default as NewsListPage } from './pages/NewsListPage'
export { default as NewsDetailPage } from './pages/NewsDetailPage'
export { default as NewsQuizPage } from './pages/NewsQuizPage'
export { default as NewsWordsPage } from './pages/NewsWordsPage'
export { default as NewsStatsPage } from './pages/NewsStatsPage'

// Services
export * from './services/newsService'
Loading