Skip to content

Feature#146 Apply 페이지에 STEP Navigation 컴포넌트 구현#147

Merged
eunwoo-levi merged 10 commits into
mainfrom
feat#146
Jul 15, 2025
Merged

Feature#146 Apply 페이지에 STEP Navigation 컴포넌트 구현#147
eunwoo-levi merged 10 commits into
mainfrom
feat#146

Conversation

@eunwoo-levi
Copy link
Copy Markdown
Contributor

@eunwoo-levi eunwoo-levi commented Jul 14, 2025

✅ Linked Issue

🔍 What I did

    1. ApplyStepNavigator컴포넌트 구현
    • 3단계 진행 상황 표시 (응시 정보 → 개인 정보 → 결제)
    • 현재 단계와 완료된 단계를 시각적으로 구분
    • Chevron 아이콘으로 단계 간 연결 표시

-2. Apply 페이지 레이아웃 통합

  • 각 Step 컴포넌트에서 중복된 헤더 제거

  • 메인 페이지에서 헤더와 네비게이터 통합 관리

  • 결제 완료/실패 페이지에서는 네비게이터 숨김 처리

    1. 시각적 일관성 개선
    • 활성/비활성 상태에 따른 색상 변경 (파란색/회색)
    • 일관된 타이포그래피 및 간격 적용

💡 Why I did it

  • 사용자 경험 개선: 현재 어느 단계에 있는지, 앞으로 몇 단계가 남았는지 명확하게 알 수 있어 사용자의 불안감을 줄이고 완주율을 높일 수 있습니다.

  • 진행률 시각화: 다단계 폼에서 가장 중요한 것은 사용자가 전체 과정을 파악하고 현재 위치를 인지하는 것입니다. 이를 통해 중도 이탈률을 줄일 수 있습니다.

스크린샷

image

추가 내용

이전 PR에서 반영되지 않은 피드백 반영하였습니다.
commit: 747f299

@vercel
Copy link
Copy Markdown

vercel Bot commented Jul 14, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
mosu-client ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 14, 2025 5:07pm

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Summary of Changes

Hello @eunwoo-levi, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the user experience on the application pages by introducing a visual step navigation component. This component guides users through the multi-step application process, improving clarity and reducing potential abandonment by making the current progress and remaining steps transparent.

Highlights

  • New Step Navigation Component: I've implemented the ApplyStepNavigator component, which visually guides users through the 3-step application process (Application Info, Personal Info, Payment). It clearly distinguishes between current and completed stages using distinct styling and chevron separators, enhancing user understanding of their progress.
  • Centralized Layout Management: The main ApplyPage now centrally manages the application's primary header and the new step navigator. This refactoring involved removing redundant header elements from individual step components (ApplyPayment, ApplyStep1, ApplyStep2), leading to a more consistent and maintainable layout.
  • Conditional Navigator Display: The step navigator is now conditionally rendered. It appears only during the initial application steps (apply-step1, apply-step2) and is hidden on the payment, success, or failure pages, aligning with the specified user experience requirements.
  • Improved Navigation Logic: On the Kakao authentication callback page, I've updated the navigation logic to use Next.js's useRouter for programmatic redirection. This replaces direct window.location.href assignments, offering better integration with the Next.js routing system and more control over navigation.
  • Development Tooling Cleanup: I've removed the ReactQueryDevtools import from the mosu-admin application's main entry point (App.tsx). This is a minor cleanup to streamline the development environment for the admin panel.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jul 14, 2025

Messages
📖 ✅ PR 제목에 이슈 번호가 포함되어 있습니다.
📖 ✅ PR에 Reviewers가 지정되어 있습니다.
📖 ✅ PR에 라벨이 지정되어 있습니다.
📖 ✅ PR에 Assignees가 지정되어 있습니다.
📖 ✅ package.json에 변경사항이 없습니다.
📖 ✅ 브랜치 이름 'feat#146'이 컨벤션을 따릅니다.
📖 ✅ TypeScript 컴파일이 성공적으로 완료되었습니다.
📖 ✅ ESLint 검사 결과 문제가 없습니다.

📝 추가 및 변경된 파일

총 7개 파일 변경

├── 📂 mosu-admin/
│   └── 📂 src/
│       └── ⚛️ App.tsx
└── 📂 mosu-app/
    └── 📂 src/
        ├── 📂 pages/
        │   ├── 📂 apply/
        │   │   └── ⚛️ index.tsx
        │   └── 📂 auth/
        │       └── 📂 kakao/
        │           └── ⚛️ callback.tsx
        ├── 📂 widgets/
        │   └── 📂 apply/
        │       ├── ⚛️ ApplyPayment.tsx
        │       ├── ⚛️ ApplyStep1.tsx
        │       └── ⚛️ ApplyStep2.tsx
        └── 📂 features/
            └── 📂 apply/
                └── 📂 ui/
                    └── ⚛️ ApplyStepNavigator.tsx

Generated by 🚫 dangerJS against b99ec56

@github-actions
Copy link
Copy Markdown

✅ Mosu Admin 빌드가 성공적으로 완료되었습니다!

📋 빌드 결과

  • ✅ DangerJS 검사 통과
  • ✅ React 앱 빌드 성공

🚀 다음 단계

코드 리뷰 후 머지하면 프로덕션에 배포됩니다.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

The pull request introduces a step navigator for the application process. The code is well-structured, centralizing the header logic and cleaning up individual step components. Consider eliminating duplicated constants, making the navigator component more data-driven, replacing hardcoded colors with theme variables, and strengthening the logic for conditionally displaying the navigator.


import { cn } from "@/shared/lib/utils";

const applySteps = ["apply-step1", "apply-step2", "apply-payment"] as const;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

The applySteps constant is defined locally here, but a more complete version already exists in src/features/apply/constants/steps.ts. This duplication can lead to maintenance problems. To ensure a single source of truth, import the steps from the central constants file.

Comment on lines +12 to +32
<ul className="flex h-[48px] w-full items-center justify-between text-sm font-semibold">
<ApplyStepNavigatorItem
index={1}
label="응시 정보"
active={stepIndex >= 1}
/>

<ApplyStepNavigatorDecorator active={stepIndex >= 2} />
<ApplyStepNavigatorItem
index={2}
label="개인 정보"
active={stepIndex >= 2}
/>

<ApplyStepNavigatorDecorator active={stepIndex >= 3} />
<ApplyStepNavigatorItem
index={3}
label="결제"
active={stepIndex >= 3}
/>
</ul>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The JSX for rendering the steps is repetitive. Consider a data-driven approach to improve maintainability. Define an array of step configurations and map over it to render the ApplyStepNavigatorItem and ApplyStepNavigatorDecorator components.

const stepConfigs = [
  { index: 1, label: "응시 정보" },
  { index: 2, label: "개인 정보" },
  { index: 3, label: "결제" },
];

return (
    <nav>
        <ul className="flex h-[48px] w-full items-center justify-between text-sm font-semibold">
            {stepConfigs.map((config, i) => (
                <React.Fragment key={config.index}>
                    <ApplyStepNavigatorItem
                        index={config.index}
                        label={config.label}
                        active={stepIndex >= config.index}
                    />
                    {i < stepConfigs.length - 1 && (
                        <ApplyStepNavigatorDecorator active={stepIndex >= config.index + 1} />
                    )}
                </React.Fragment>
            ))}
        </ul>
    </nav>
);

Comment on lines +51 to +54
active
? "bg-[#0080FF] text-white"
: "bg-[#F5F5F5] text-[#909090]",
)}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Hardcoded hex color values are used in this component. Define these colors in your Tailwind CSS theme configuration and reference them by their semantic names for better maintainability and visual consistency.

const { Funnel, Step, useStep } = useFunnel(applySteps);
const { step, setStep } = useStep();

const shouldShowNavigator = applySteps.slice(0, -2).includes(step as (typeof applySteps)[number]);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Using slice(0, -2) to determine which steps should show the navigator is brittle. Explicitly define the steps where the navigator should be hidden for a more robust approach.

const shouldShowNavigator = !["apply-payment-success", "apply-payment-fail"].includes(step as (typeof applySteps)[number]);

@github-actions
Copy link
Copy Markdown

📚 Storybook이 Chromatic에 배포되었습니다!

Copy link
Copy Markdown
Contributor

@kimgho kimgho left a comment

Choose a reason for hiding this comment

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

고생하셨습니다~

@eunwoo-levi eunwoo-levi merged commit f687238 into main Jul 15, 2025
18 checks passed
@github-project-automation github-project-automation Bot moved this to 완료 in mosu-client Jul 15, 2025
@toothlessdev toothlessdev deleted the feat#146 branch August 3, 2025 21:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: 완료

Development

Successfully merging this pull request may close these issues.

[✨ 기능 요청] Apply 페이지에 Step Navigation 컴포넌트 구현

2 participants