Skip to content

feat(fe): 로그인, 헤더, 챗봇 UI 구현 (#44) - #80

Merged
crolvlee merged 3 commits into
developfrom
feat/44-login-fe
Jun 25, 2026
Merged

feat(fe): 로그인, 헤더, 챗봇 UI 구현 (#44)#80
crolvlee merged 3 commits into
developfrom
feat/44-login-fe

Conversation

@crolvlee

@crolvlee crolvlee commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

변경 내용

  • AuthView.vue: 로그인/회원가입 페이지 구현 (풀스크린 히어로 이미지, 카드 UI, 모드 전환)
  • App.vue: 전역 헤더 리디자인 — 세그먼트 컨트롤 네비(지도/챗봇), 로고, 로그인 CTA, Auth/Chatbot 라우트에서 헤더·푸터 숨김 처리
  • Chatbot.vue: 챗봇 UI 전면 리디자인 — 외부/내부 카드 레이아웃, 메시지 버블(사용자 우측·AI 좌측), 민트 그라데이션 배경, 입력 툴바
  • router/index.js: /loginAuth 라우트 추가
  • 로고·히어로 이미지 에셋 추가 (logo-black.png, logo-white.png, hero_house.jpg)

연결 이슈

closes #44

테스트

  • 로컬 동작 확인

리뷰 포인트

<style scoped>:root CSS 변수가 Vue의 data-v 변환으로 동작하지 않아 모든 색상값을 리터럴 헥스로 인라인 처리했습니다.

Summary by CodeRabbit

  • New Features

    • Added a full login/register screen with email/password sign-in, account creation, password show/hide, and improved inline validation/feedback.
    • Updated the app layout to use route-based header/footer visibility and streamlined navigation links to “지도” and “챗봇”, plus “로그인”.
  • Bug Fixes

    • Removed the pre-seeded chat start message so the chatbot begins only after the first send action.
  • Chatbot

    • Refreshed the chat UI with welcome prompts, grouped message bubbles, richer per-message actions, improved loading indicators, and a multi-line auto-resizing composer.

@vercel

vercel Bot commented Jun 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
salmanhae Ready Ready Preview, Comment Jun 25, 2026 12:50am

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e77bf7a7-e10f-4ae6-ab4b-44dfde22195f

📥 Commits

Reviewing files that changed from the base of the PR and between e4ba51a and d5c97d2.

📒 Files selected for processing (2)
  • frontend/src/store/mapStore.js
  • frontend/src/views/AuthView.vue
💤 Files with no reviewable changes (1)
  • frontend/src/views/AuthView.vue

📝 Walkthrough

Walkthrough

The app shell now switches header and footer visibility by route and adds a login route. A new auth view handles login and register states, and the chatbot page was rebuilt with welcome cards, grouped bubbles, message actions, loading dots, and a textarea composer.

Changes

Frontend shell and UI refresh

Layer / File(s) Summary
Route-driven app shell
frontend/src/App.vue, frontend/src/router/index.js
App.vue uses $route.name to control header and footer rendering, replaces the navigation with branded links and a login CTA, and the router adds /login as Auth.
Authentication screen
frontend/src/views/AuthView.vue
AuthView.vue adds login and register modes with email, password, and name fields, password visibility control, loading and error state, and submit handlers.
Chat page redesign
frontend/src/views/Chatbot.vue, frontend/src/store/mapStore.js
Chatbot.vue now renders a welcome state, grouped user and bot bubbles, bot action buttons, legal and analysis cards, loading dots, and a textarea composer, and the store starts with an empty chat history.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant AppVue as App.vue
  participant Router as vue-router
  participant AuthView as AuthView.vue

  User->>AppVue: click "로그인"
  AppVue->>Router: navigate to /login
  Router->>AuthView: render Auth route
  User->>AuthView: submit login form
  AuthView->>Router: router.push("/")
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • ssafy-salman/salmanhae#27: The chatbot message rendering, loading state, and input handling overlap with the updated bubble layout and composer in frontend/src/views/Chatbot.vue.
  • ssafy-salman/salmanhae#48: The chatbot analysis-card rendering and metric display overlap with the updated analysisCards and formatting logic in frontend/src/views/Chatbot.vue.

Poem

🐰 I hopped to the login path, then back again in a flash,
With bubbles, cards, and buttons bright, the UI did a dash.
A carrot-colored welcome sat where chats began to bloom,
The app now tip-taps through its routes and keeps a tidy room.
Thump! The rabbit approves the scene.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning [#44] The PR covers auth and UI redesign, but it does not implement JWT storage, Axios interceptors, logout, or route guards. Implement the missing auth flows from #44, especially token storage, Axios interceptor wiring, logout handling, and auth-based route guards.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly matches the main change set: auth UI, header redesign, and chatbot UI updates.
Description check ✅ Passed The description follows the template and includes changes, linked issue, testing, and review points.
Out of Scope Changes check ✅ Passed The code changes stay aligned with the auth and UI redesign goals and do not introduce clearly unrelated scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/44-login-fe

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/src/App.vue`:
- Line 3: The header visibility condition in App.vue is inconsistent with the
shell layout rules because it only excludes Auth. Update the header v-if logic
on the app header to also hide it when the current route name is Chatbot,
matching the existing main/footer route handling so route-level layout behavior
stays consistent.

In `@frontend/src/views/AuthView.vue`:
- Line 155: Remove the plaintext PII logging from AuthView by updating the
login/register debug statements that currently print email/name values in the
console. In the AuthView.vue handlers around the login flow and the registration
flow, keep any necessary debug logging but replace direct email/name output with
non-identifying messages or omit those values entirely. Use the existing
console.log calls near the login and signup logic as the places to adjust.
- Around line 150-157: handleLogin currently treats every submission as a
successful login by pushing to "/" without authenticating first. Update the
AuthView.vue handleLogin flow to call the real login action on useAuthStore
(with the entered email and password), only navigate with router.push('/') after
a successful response, and keep the catch path setting errorMsg/loading
correctly for failed authentication.

In `@frontend/src/views/Chatbot.vue`:
- Around line 10-11: The welcome branch in Chatbot.vue is currently gated by
store.chatMessages.length, but the store starts with a default bot message so
the welcome UI never appears. Update the condition in the Chatbot template to
use a true “no real conversation yet” flag or adjust the store initialization so
chatMessages starts empty, and make sure the logic around store.chatMessages
reflects whether only the seeded bot prompt exists versus actual user chat
history.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 39881725-6645-43e6-bbd6-59655252919c

📥 Commits

Reviewing files that changed from the base of the PR and between 39df73d and e4ba51a.

⛔ Files ignored due to path filters (3)
  • frontend/src/assets/hero_house.jpg is excluded by !**/*.jpg
  • frontend/src/assets/logo-black.png is excluded by !**/*.png
  • frontend/src/assets/logo-white.png is excluded by !**/*.png
📒 Files selected for processing (4)
  • frontend/src/App.vue
  • frontend/src/router/index.js
  • frontend/src/views/AuthView.vue
  • frontend/src/views/Chatbot.vue

Comment thread frontend/src/App.vue
</div>
</div>
<div class="min-h-screen bg-white text-slate-800 flex flex-col">
<header v-if="$route.name !== 'Auth'" class="app-header">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Hide header on Chatbot route as well.

Line 3 currently hides the header only for Auth, but the shell logic for main/footer already treats Auth and Chatbot together. This creates inconsistent route-level layout behavior.

Suggested fix
-    <header v-if="$route.name !== 'Auth'" class="app-header">
+    <header v-if="!['Auth', 'Chatbot'].includes($route.name)" class="app-header">
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<header v-if="$route.name !== 'Auth'" class="app-header">
<header v-if="!['Auth', 'Chatbot'].includes($route.name)" class="app-header">
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/App.vue` at line 3, The header visibility condition in App.vue
is inconsistent with the shell layout rules because it only excludes Auth.
Update the header v-if logic on the app header to also hide it when the current
route name is Chatbot, matching the existing main/footer route handling so
route-level layout behavior stays consistent.

Comment on lines +150 to +157
async function handleLogin() {
loading.value = true
errorMsg.value = ''
try {
// TODO: useAuthStore().login({ email, password }) 연결
console.log('login', email.value)
router.push('/')
} catch (e) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🔴 Critical | ⚡ Quick win

handleLogin currently allows unauthenticated success path.

Line 156 navigates to / without any real authentication check, so any input is treated as a successful login.

Suggested fix
 async function handleLogin() {
   loading.value = true
   errorMsg.value = ''
   try {
-    // TODO: useAuthStore().login({ email, password }) 연결
-    console.log('login', email.value)
+    // 실제 인증 성공 후에만 이동해야 합니다.
+    await useAuthStore().login({ email: email.value, password: password.value })
     router.push('/')
   } catch (e) {
     errorMsg.value = e?.response?.data?.message ?? '로그인에 실패했습니다.'
   } finally {
     loading.value = false
   }
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async function handleLogin() {
loading.value = true
errorMsg.value = ''
try {
// TODO: useAuthStore().login({ email, password }) 연결
console.log('login', email.value)
router.push('/')
} catch (e) {
async function handleLogin() {
loading.value = true
errorMsg.value = ''
try {
// 실제 인증 성공 후에만 이동해야 합니다.
await useAuthStore().login({ email: email.value, password: password.value })
router.push('/')
} catch (e) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/views/AuthView.vue` around lines 150 - 157, handleLogin
currently treats every submission as a successful login by pushing to "/"
without authenticating first. Update the AuthView.vue handleLogin flow to call
the real login action on useAuthStore (with the entered email and password),
only navigate with router.push('/') after a successful response, and keep the
catch path setting errorMsg/loading correctly for failed authentication.

Comment thread frontend/src/views/AuthView.vue Outdated
Comment on lines +10 to +11
<template v-if="!store.chatMessages.length">
<div class="chat-welcome">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Welcome state is unreachable with current store defaults.

Line 10 checks !store.chatMessages.length, but upstream state starts with one bot message, so this branch never renders on first load.
Use an explicit “has real conversation” condition (or initialize chat list empty) so the intended welcome cards can actually appear.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/views/Chatbot.vue` around lines 10 - 11, The welcome branch in
Chatbot.vue is currently gated by store.chatMessages.length, but the store
starts with a default bot message so the welcome UI never appears. Update the
condition in the Chatbot template to use a true “no real conversation yet” flag
or adjust the store initialization so chatMessages starts empty, and make sure
the logic around store.chatMessages reflects whether only the seeded bot prompt
exists versus actual user chat history.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.

[FEAT] 프론트엔드 회원가입·로그인 및 전체 UI 디자인 구현

1 participant