Skip to content

[JDDESIGN-2] Design: 로그인 및 회원가입 페이지 HIFI 구현#70

Merged
minnngo merged 3 commits into
developfrom
feature/JDDESIGN-2-login-ui-design
May 27, 2026
Merged

[JDDESIGN-2] Design: 로그인 및 회원가입 페이지 HIFI 구현#70
minnngo merged 3 commits into
developfrom
feature/JDDESIGN-2-login-ui-design

Conversation

@minnngo
Copy link
Copy Markdown
Collaborator

@minnngo minnngo commented May 26, 2026

🔗 관련 이슈

  • JDDESIGN-2
  • JDDEV-51

📝 개요

  • 로그인/회원가입/이메일 인증 화면에 하이파이 UI를 적용했습니다.
  • 공통 로고 컴포넌트를 추가하고 로그인 플로우 내 브랜드 영역과 회원가입 완료 화면에 적용했습니다.
  • 선택 문항 조회 API의 custom 값을 기준으로 직접 입력 문항 칩 상태가 유지되도록 수정했습니다.

⌨️ 작업 상세 내용

  • 로그인 페이지 하이파이 UI 적용
  • 회원가입, 이메일 인증, 회원가입 완료 화면 하이파이 UI 적용
  • logo/horizontal/m, logo/vertical/m 공통 로고 컴포넌트 추가
  • 회원가입 입력 폼에서 이름 입력 제거 및 이메일 기반 fallback name 처리
  • InputMain에 label/gap 커스텀 클래스 props 추가
  • 선택 문항 병합 시 선택 문항 조회 API의 custom 값을 우선 반영
  • 직접 입력 문항 칩 라벨을 직접 입력으로 표시

💡 코드 설명 및 참고사항

선택 문항 조회 API 응답의 custom 값을 최종 기준으로 사용하도록 수정해, 자소서 입력 페이지에 갔다가 다시 문항 선택 단계로 돌아와도 직접 입력 칩이 유지되게 했습니다.

📸 스크린샷 (UI 변경 시)

2026-05-27.004123.mp4
2026-05-27.004437.mp4
2026-05-27.004437.mp4

Summary by CodeRabbit

  • New Features

    • Added horizontal and vertical logo components
  • Improvements

    • Enhanced email authentication UI with redesigned success screen
    • Name field is now optional during signup and auto-generated from email when not provided
    • Improved input customization options for layout and styling
    • Updated label text for custom field entry

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 26, 2026

📝 Walkthrough

Walkthrough

This PR refactors the email authentication flow to remove the signup name requirement and modernizes related UI components. It introduces new logo components, refines existing button/input styling, normalizes question selection logic with stricter custom-flag handling, and restructures the email login screen with updated layout and navigation patterns.

Changes

Email Authentication & Component Updates

Layer / File(s) Summary
Common UI Component Refinements
jobdri/src/components/common/buttons/IconOnlyButton.tsx, jobdri/src/components/common/input/InputMain.tsx, jobdri/src/components/common/list/ListQ.tsx
IconOnlyButton now resolves icon type at render time based on size prop, InputMain gains optional gapClassName and labelClassName props for layout customization and applies updated icon styling, and ListQ updates custom-chip default label from "직접 추가" to "직접 입력".
New Logo Components
jobdri/src/components/common/logo/horizontal/m.tsx, jobdri/src/components/common/logo/vertical/m.tsx
Adds LogoHorizontalMedium (horizontal layout with LogoMinimum SVG) and LogoVerticalMedium (vertical layout with symbol and type SVGs), both with accessible labeling and class composition.
Question Selection Normalization Logic
jobdri/src/components/apply/SelectQuestion.tsx
Introduces createSelectedQuestionId helper for consistent selected-question ID generation, applies strict === true checks to custom flag handling, and derives selected state from matching selected-question references during initialization.
Email Authentication Flow & UI Refactor
jobdri/src/lib/auth.ts, jobdri/src/components/login/EmailLoginScreen.tsx
Makes signup name optional with email-prefix fallback derivation; EmailLoginScreen restructures layout with early success-screen return, adds shared "메인으로" header, integrates new logo components, and updates signup validation to depend only on email, password, and passwordConfirm (removes name requirement).

Sequence Diagram

sequenceDiagram
  participant User
  participant EmailLoginScreen
  participant signupWithEmail
  participant ApiAuth
  User->>EmailLoginScreen: Enter email, password, passwordConfirm (no name)
  EmailLoginScreen->>signupWithEmail: Call with email, password (name = null)
  signupWithEmail->>signupWithEmail: Derive fallbackName from email prefix
  signupWithEmail->>ApiAuth: POST /api/auth/signup with name ?? fallbackName
  ApiAuth-->>signupWithEmail: Success response
  signupWithEmail-->>EmailLoginScreen: Auth complete
  EmailLoginScreen->>User: Show success screen with LogoHorizontalMedium
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • yiyoonseo

🐰 A signup flow so clean, no names asked, just dreams,
Icons resize by their size, logos glow in themes,
Questions know who they are, inputs style with care,
Auth flows softly onward—fallback names in the air! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly addresses the main objective: applying high-fidelity (HIFI) design to the login and signup pages, which aligns with the majority of changes across EmailLoginScreen, logo components, and supporting UI modifications.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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 feature/JDDESIGN-2-login-ui-design

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

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 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 `@jobdri/src/components/login/EmailLoginScreen.tsx`:
- Around line 616-619: The signup button currently uses isSignupFilled to
control enabled/disabled but the form submit guard uses isSignupReady, causing
clickable buttons that do nothing; update the button in EmailLoginScreen (the
element with props active, className="self-stretch", disabled, type="submit") to
use isSignupReady (or the same condition used by the submit handler) for its
disabled/active state so UI and submit logic match, ensuring
disabled={!isSignupReady || isSignupSubmitting} (and active={isSignupReady})
instead of isSignupFilled.

In `@jobdri/src/lib/auth.ts`:
- Around line 153-162: The signup flow currently uses name ?? fallbackName which
doesn't handle empty or whitespace-only names; update the logic in the signup
function (where fallbackName and the postAuth call are defined) to trim and
validate name (e.g., const safeName = name && name.trim().length ? name.trim() :
fallbackName) and pass safeName into postAuth instead of name ?? fallbackName so
blank strings or whitespace are replaced by the fallbackName.
🪄 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: cae51fa3-6f49-4e20-b275-9e5348bf7afd

📥 Commits

Reviewing files that changed from the base of the PR and between e892a2d and 49129ee.

⛔ Files ignored due to path filters (2)
  • jobdri/src/assets/ic_LOGO_symbol.svg is excluded by !**/*.svg
  • jobdri/src/assets/ic_LOGO_type.svg is excluded by !**/*.svg
📒 Files selected for processing (8)
  • jobdri/src/components/apply/SelectQuestion.tsx
  • jobdri/src/components/common/buttons/IconOnlyButton.tsx
  • jobdri/src/components/common/input/InputMain.tsx
  • jobdri/src/components/common/list/ListQ.tsx
  • jobdri/src/components/common/logo/horizontal/m.tsx
  • jobdri/src/components/common/logo/vertical/m.tsx
  • jobdri/src/components/login/EmailLoginScreen.tsx
  • jobdri/src/lib/auth.ts

Comment on lines +616 to 619
active={isSignupFilled}
className="self-stretch"
disabled={!isSignupReady || isSignupSubmitting}
disabled={!isSignupFilled || isSignupSubmitting}
type="submit"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Align signup button enablement with actual submit guard.

Button state is based on isSignupFilled, but submit guard uses isSignupReady. This enables a clickable button that silently no-ops on invalid input.

Suggested fix
                         <Button
                           label={
                             isSignupSubmitting ? "인증번호 발송 중" : "회원가입"
                           }
                           styleType="primary"
                           size="large"
-                          active={isSignupFilled}
+                          active={isSignupReady}
                           className="self-stretch"
-                          disabled={!isSignupFilled || isSignupSubmitting}
+                          disabled={!isSignupReady || isSignupSubmitting}
                           type="submit"
                         />
📝 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
active={isSignupFilled}
className="self-stretch"
disabled={!isSignupReady || isSignupSubmitting}
disabled={!isSignupFilled || isSignupSubmitting}
type="submit"
active={isSignupReady}
className="self-stretch"
disabled={!isSignupReady || isSignupSubmitting}
type="submit"
🤖 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 `@jobdri/src/components/login/EmailLoginScreen.tsx` around lines 616 - 619, The
signup button currently uses isSignupFilled to control enabled/disabled but the
form submit guard uses isSignupReady, causing clickable buttons that do nothing;
update the button in EmailLoginScreen (the element with props active,
className="self-stretch", disabled, type="submit") to use isSignupReady (or the
same condition used by the submit handler) for its disabled/active state so UI
and submit logic match, ensuring disabled={!isSignupReady || isSignupSubmitting}
(and active={isSignupReady}) instead of isSignupFilled.

Comment thread jobdri/src/lib/auth.ts
Comment on lines +153 to 162
name = null,
email,
password,
}: SignupRequest) {
const fallbackName = email.split("@")[0] || "회원";

await postAuth<null>(
"/api/auth/signup",
{ name, email, password },
{ name: name ?? fallbackName, email, password },
"회원가입",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Harden fallback-name logic for blank name values.

name ?? fallbackName won’t fallback for ""/whitespace. This can send an empty display name if any caller still passes blank input.

Suggested fix
 export async function signupWithEmail({
   name = null,
   email,
   password,
 }: SignupRequest) {
   const fallbackName = email.split("@")[0] || "회원";
+  const normalizedName =
+    typeof name === "string" && name.trim().length > 0 ? name.trim() : fallbackName;

   await postAuth<null>(
     "/api/auth/signup",
-    { name: name ?? fallbackName, email, password },
+    { name: normalizedName, email, password },
     "회원가입",
   );
 }
📝 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
name = null,
email,
password,
}: SignupRequest) {
const fallbackName = email.split("@")[0] || "회원";
await postAuth<null>(
"/api/auth/signup",
{ name, email, password },
{ name: name ?? fallbackName, email, password },
"회원가입",
name = null,
email,
password,
}: SignupRequest) {
const fallbackName = email.split("@")[0] || "회원";
const normalizedName =
typeof name === "string" && name.trim().length > 0 ? name.trim() : fallbackName;
await postAuth<null>(
"/api/auth/signup",
{ name: normalizedName, email, password },
"회원가입",
🤖 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 `@jobdri/src/lib/auth.ts` around lines 153 - 162, The signup flow currently
uses name ?? fallbackName which doesn't handle empty or whitespace-only names;
update the logic in the signup function (where fallbackName and the postAuth
call are defined) to trim and validate name (e.g., const safeName = name &&
name.trim().length ? name.trim() : fallbackName) and pass safeName into postAuth
instead of name ?? fallbackName so blank strings or whitespace are replaced by
the fallbackName.

Copy link
Copy Markdown
Contributor

@yiyoonseo yiyoonseo left a comment

Choose a reason for hiding this comment

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

수고해써 !!!😘😘

@minnngo minnngo merged commit 2161319 into develop May 27, 2026
1 check passed
@minnngo minnngo deleted the feature/JDDESIGN-2-login-ui-design branch May 27, 2026 01:35
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.

2 participants