Skip to content

[Feat/77] 공지 팝업 기능 및 보안 강화 - #78

Merged
hamlsy merged 16 commits into
mainfrom
feat/77
Dec 25, 2025
Merged

[Feat/77] 공지 팝업 기능 및 보안 강화#78
hamlsy merged 16 commits into
mainfrom
feat/77

Conversation

@hamlsy

@hamlsy hamlsy commented Dec 25, 2025

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Added SEO infrastructure: sitemap, robots.txt, structured data, and meta tags.
    • Launched public welcome landing page with game overview and marketing content.
    • Introduced round/time limit controls when creating multiplayer rooms.
    • Added chat message timestamp filtering and unread notification badges.
    • Multiple design variants for lobby room cards and round results screens.
  • Documentation

    • New SEO setup guide documenting configuration and validation steps.
  • Improvements

    • Enhanced error messaging for room operations.
    • Simplified game startup flow for better performance.
  • Chores

    • Added Google Analytics and AdSense integration.
    • Removed debug logging for production builds.

✏️ Tip: You can customize this high-level summary in your review settings.

@hamlsy
hamlsy merged commit 5680b7f into main Dec 25, 2025
1 of 2 checks passed
@hamlsy
hamlsy deleted the feat/77 branch December 25, 2025 11:48
@coderabbitai

coderabbitai Bot commented Dec 25, 2025

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

This PR introduces a production-ready frontend with SEO configuration, a welcoming landing page, a complete design system for multiplayer lobbies with multiple UI card variants (A–I), redesigned round-results screens, a light-only theme system, centralized marker sizing for Kakao Maps, and cleanup of voting-related UI and logging statements across the multiplayer game experience.

Changes

Cohort / File(s) Summary
SEO & Documentation
.cursor/rules/SKILL.md, public/SEO-SETUP.md, public/robots.txt, public/sitemap.xml
Added production frontend design guidelines, comprehensive SEO setup documentation, crawl rules for search engines, and XML sitemap with indexed routes and update frequencies.
Welcome Landing Page
public/welcome/index.html, public/welcome/styles.css
New full-featured landing page with hero section, game info cards, image slider, SEO metadata, JSON-LD structured data, and responsive styling with animations and custom design system.
Public Index & Analytics
public/index.html
Added Google AdSense meta tag, PNG favicon link, and Google Analytics gtag initialization script.
Core System & Theming
src/App.vue, src/core/composables/useTheme.js, src/core/components/NavigationBar.vue
Introduced light-only theme system via useTheme composable with CSS variable generation; updated NavigationBar to use theme initialization and composition API; removed global baseline CSS styles from App.vue.
Configuration & Constants
src/config/seo.js, src/core/constants/markerSizes.js, package.json
Added centralized SEO config with meta tag generator, Kakao Maps marker size constants with factory helpers, and marked (^17.0.1) dependency.
Multiplayer Lobby Room Cards
src/features/game/multiplayer/lobby/components/designs/RoomCardDesign[A-I].vue
Nine new room card design variants (A–I) with distinct aesthetic styles (neon, flat, gradient, HUD, explorer, board-game, etc.), dynamic class bindings for room status (public/private/playing), and computed player fill percentages.
Lobby UI Creation & List
src/features/game/multiplayer/lobby/components/designs/CreateRoomModalDesignF.vue, src/features/game/multiplayer/lobby/components/CreateRoomModal.vue, src/features/game/multiplayer/lobby/components/RoomList.vue
Enhanced CreateRoomModal with round count and time limit controls (2–10 rounds, 30–300 sec); updated RoomList with dynamic status indicators, metadata display restructuring, and helper methods for room state determination and UI formatting.
Lobby HUD Components
src/features/game/multiplayer/lobby/components/hud/CreateRoomModalHUD.vue, src/features/game/multiplayer/lobby/components/hud/RoomListHUD.vue
New HUD-styled lobby components with arcade aesthetic, password modal flow for private rooms, search functionality, and refresh/join event emission.
Lobby View Variants
src/features/game/multiplayer/lobby/views/LobbyViewDesignF.vue, src/features/game/multiplayer/lobby/views/LobbyViewHUD.vue, src/features/game/multiplayer/lobby/views/RoomCardDesignTest.vue
New lobby view designs with two-panel layouts (room list + chat), mobile-responsive chat drawer, room creation modals, and a design test harness for comparing room card variants.
Round Results Redesigns
src/features/game/multiplayer/roadview/components/results/RoundResults.vue, src/features/game/multiplayer/roadview/components/results/RoundResultsDesign[A-D].vue, src/features/game/multiplayer/roadview/components/results/RoundResultsDesignB2.vue
Complete redesign of round-results screens with new layouts: scoreboard header, circular progress indicator, side player rankings, map integration, countdown timers, and device-specific overlays; removed voting progress and team-voting UI.
Roadview & Game Views
src/features/game/multiplayer/roadview/views/DesignTestView.vue, src/features/game/multiplayer/roadview/views/BaseGameView.vue, src/features/game/multiplayer/roadview/views/SoloGameView.vue, src/features/game/multiplayer/roadview/views/TeamGameView.vue
Added design test harness for RoundResults variants; updated BaseGameView with chat unread badge, removed voting timers; simplified SoloGameView round progression; removed extensive voting logic from TeamGameView (voting state, computed properties, watchers, UI).
Voting Feature Removal
src/features/game/multiplayer/roadview/components/playerlist/TeamPlayersList.vue
Removed team-level and per-player voting UI, badges, indicators, and related helper methods (isTeamVoting, isPlayerVoting, getPlayerVoteChoice, getTeamVotingProgress).
Room & Composables
src/features/game/multiplayer/room/components/header/RoomHeader.vue, src/features/game/multiplayer/room/components/player/PlayerDetailsModal.vue, src/features/game/multiplayer/room/composables/useRoom.js, src/features/game/multiplayer/room/services/roomApi.service.js
Updated RoomHeader to display totalRounds instead of rounds; commented out Photo Mode Card in PlayerDetailsModal; simplified useRoom.startGame to rely on server configuration; changed roomApi.startGame signature from (roomId, startPayload) to (roomId) and added centralized error handling.
Lobby & WebSocket Services
src/features/game/multiplayer/lobby/composables/useLobbyRoom.js, src/features/game/multiplayer/lobby/services/useGlobalLobbyWebSocketService.js, src/features/game/multiplayer/roadview/services/soloGameWebSocket.js, src/core/composables/useWebSocket.js, src/features/game/multiplayer/room/composables/useRoomWebSocket.js
Removed console logging statements across WebSocket lifecycle hooks and API calls; cleaned up debug output while preserving functional behavior and error handling; improved error message resolution in joinRoom (prioritize server message over status fallback).
Submodule & Cleanup
KoSpot-frontend-private, .github/workflows/deploy.yml, src/dummy/ComponentTest.vue
Updated KoSpot-frontend-private submodule pointer; adjusted S3 deployment path from "/" to ""; removed ComponentTest.vue dummy component.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Poem

🐰 A lobby blooming in designs A through I,
Where room cards dance with styles beneath the sky.
The votes have faded, but the rounds still flow,
With themes of light and cards that steal the show!
Welcome, dear players, to a polished place—
Nine card designs now greet you face to face. 🎨✨

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/77

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2453eac and 8192616.

⛔ Files ignored due to path filters (8)
  • package-lock.json is excluded by !**/package-lock.json
  • public/images/icon/kospot_icon_1-removebg.png is excluded by !**/*.png
  • public/images/logo/kospot_logo_1-removebg.png is excluded by !**/*.png
  • public/images/tutorial/practice/tutorial_1.png is excluded by !**/*.png
  • public/images/tutorial/practice/tutorial_2.png is excluded by !**/*.png
  • public/images/tutorial/practice/tutorial_3.png is excluded by !**/*.png
  • public/images/tutorial/practice/tutorial_4.png is excluded by !**/*.png
  • public/images/tutorial/practice/tutorial_5.png is excluded by !**/*.png
📒 Files selected for processing (103)
  • .cursor/rules/SKILL.md
  • .github/workflows/deploy.yml
  • KoSpot-frontend-private
  • package.json
  • public/SEO-SETUP.md
  • public/index.html
  • public/robots.txt
  • public/sitemap.xml
  • public/welcome/index.html
  • public/welcome/styles.css
  • src/App.vue
  • src/config/seo.js
  • src/core/components/NavigationBar.vue
  • src/core/composables/useTheme.js
  • src/core/composables/useWebSocket.js
  • src/core/constants/markerSizes.js
  • src/dummy/ComponentTest.vue
  • src/features/game/multiplayer/chat/components/Lobby/ChatWindow.vue
  • src/features/game/multiplayer/lobby/components/CreateRoomModal.vue
  • src/features/game/multiplayer/lobby/components/RoomList.vue
  • src/features/game/multiplayer/lobby/components/designs/CreateRoomModalDesignF.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignA.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignB.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignC.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignD.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignE.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignF.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignG.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignH.vue
  • src/features/game/multiplayer/lobby/components/designs/RoomCardDesignI.vue
  • src/features/game/multiplayer/lobby/components/hud/CreateRoomModalHUD.vue
  • src/features/game/multiplayer/lobby/components/hud/RoomListHUD.vue
  • src/features/game/multiplayer/lobby/composables/useLobbyRoom.js
  • src/features/game/multiplayer/lobby/services/useGlobalLobbyWebSocketService.js
  • src/features/game/multiplayer/lobby/views/LobbyView.vue
  • src/features/game/multiplayer/lobby/views/LobbyViewDesignF.vue
  • src/features/game/multiplayer/lobby/views/LobbyViewHUD.vue
  • src/features/game/multiplayer/lobby/views/RoomCardDesignTest.vue
  • src/features/game/multiplayer/roadview/components/playerlist/TeamPlayersList.vue
  • src/features/game/multiplayer/roadview/components/results/RoundResults.vue
  • src/features/game/multiplayer/roadview/components/results/RoundResultsDesignA.vue
  • src/features/game/multiplayer/roadview/components/results/RoundResultsDesignB.vue
  • src/features/game/multiplayer/roadview/components/results/RoundResultsDesignB2.vue
  • src/features/game/multiplayer/roadview/components/results/RoundResultsDesignC.vue
  • src/features/game/multiplayer/roadview/components/results/RoundResultsDesignD.vue
  • src/features/game/multiplayer/roadview/services/soloGameWebSocket.js
  • src/features/game/multiplayer/roadview/views/BaseGameView.vue
  • src/features/game/multiplayer/roadview/views/DesignTestView.vue
  • src/features/game/multiplayer/roadview/views/SoloGameView.vue
  • src/features/game/multiplayer/roadview/views/TeamGameView.vue
  • src/features/game/multiplayer/room/components/header/RoomHeader.vue
  • src/features/game/multiplayer/room/components/player/PlayerDetailsModal.vue
  • src/features/game/multiplayer/room/composables/useRoom.js
  • src/features/game/multiplayer/room/composables/useRoomWebSocket.js
  • src/features/game/multiplayer/room/services/roomApi.service.js
  • src/features/game/multiplayer/room/services/roomWebSocket.service.js
  • src/features/game/multiplayer/room/views/RoomView.vue
  • src/features/game/multiplayer/room/views/RoomViewDesignF.vue
  • src/features/game/multiplayer/room/views/RoomViewHUD.vue
  • src/features/game/multiplayer/views/ComponentDesignTest.vue
  • src/features/game/multiplayer/views/DesignFTest.vue
  • src/features/game/multiplayer/views/HUDDesignTest.vue
  • src/features/game/multiplayer/views/components/LobbyViewDummy.vue
  • src/features/game/multiplayer/views/components/RoomViewDummy.vue
  • src/features/game/shared/components/Common/Adsense.vue
  • src/features/game/shared/components/Kakao/KakaoMap.vue
  • src/features/game/shared/components/Kakao/KakaoMapGame/KakaoMapGame.vue
  • src/features/game/shared/components/Kakao/KakaoMapGame/README.md
  • src/features/game/shared/components/Kakao/KakaoMapGame/composables/useKakaoMapControls.js
  • src/features/game/shared/components/Kakao/KakaoMapGame/composables/useKakaoMapGame.js
  • src/features/game/shared/components/Kakao/KakaoMapGame/composables/useKakaoMapHintCircles.js
  • src/features/game/shared/components/Kakao/KakaoMapGame/composables/useKakaoMapState.js
  • src/features/game/shared/components/Kakao/KakaoMapGame/composables/useKakaoMapTeamVote.js
  • src/features/game/shared/components/Kakao/VoteOverlay.vue
  • src/features/game/shared/components/Phone/PhoneFrame.vue
  • src/features/game/shared/components/Player/Card.vue
  • src/features/game/shared/components/Player/List.vue
  • src/features/game/shared/components/photo/PhotoGameController.vue
  • src/features/game/single/main/components/PracticeTutorialModal.vue
  • src/features/game/single/main/views/RoadViewMainView.vue
  • src/features/game/single/roadview/components/Result/ResultMapSection.vue
  • src/features/game/single/roadview/views/PracticeView.vue
  • src/features/game/single/roadview/views/RankView.vue
  • src/features/intro/components/HeroSection.vue
  • src/features/intro/components/IntroTutorialModal.vue
  • src/features/main/components/UserLoginCard.vue
  • src/features/main/services/main.service.js
  • src/features/main/views/MainView.vue
  • src/features/notice/services/notice.service.js
  • src/features/notice/views/NoticeDetailView.vue
  • src/features/notice/views/NoticeListView.vue
  • src/features/notice/views/NoticeWriteView.vue
  • src/features/user/view/ProfileView.vue
  • src/router/devRoutes.js
  • src/router/index.js
  • src/router/photoRoutes.js
  • src/router/userRoutes.js
  • src/shared/assets/styles/game/roadView/roadview-main.css
  • src/shared/assets/styles/index.css
  • src/shared/styles/theme/colors.js
  • src/store/gameStore.js
  • src/store/modules/game.js
  • tree-maker/20250610052452054-tree.md

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant