Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
1834cc1
feat: 최초 로그인 사용자 온보딩 투어 구현
Seojegyeong Jul 31, 2026
1524f80
fix: react-joyride v3 named export로 import 수정
Seojegyeong Jul 31, 2026
593e060
feat: 온보딩 투어 커스텀 툴팁 디자인 적용
Seojegyeong Jul 31, 2026
0e865d4
feat: 온보딩 투어 툴팁 소제목+설명 구조로 개선
Seojegyeong Jul 31, 2026
1b7142a
style: 온보딩 투어 UX 개선 — 툴팁 페이드인 애니메이션 적용 및 문구 가독성 정돈
Seojegyeong Jul 31, 2026
2f5a351
fix: TARGET_NOT_FOUND 시 투어 강제 종료 제거
Seojegyeong Aug 2, 2026
ef66b9f
fix: 플랫폼 데이터 로딩 완료 후 온보딩 투어 시작
Seojegyeong Aug 2, 2026
17fdbd9
fix: 온보딩 투어 워크스페이스 스텝 제목 오류 수정 (설정 → 관리)
Seojegyeong Aug 2, 2026
b883ad6
style: 온보딩 툴팁 그림자 강화 — 오버레이 위 입체감 개선
Seojegyeong Aug 2, 2026
00a8eb9
fix: 온보딩 투어 Naver 카드 툴팁 정렬 고정 — flip 비활성화
Seojegyeong Aug 2, 2026
94036db
fix: 온보딩 투어 사이드바 화살표 정렬 — data-tour 타겟을 버튼 요소로 이동
Seojegyeong Aug 2, 2026
ff4c079
style: 온보딩 투어 문구 줄바꿈 개선
Seojegyeong Aug 2, 2026
d802aa0
style: 온보딩 투어 플랫폼 연동 스텝 순서 변경 (Meta → Google → Naver)
Seojegyeong Aug 2, 2026
0211f15
style: 온보딩 투어 전환 UX 개선 — 스포트라이트 모핑·스텝 간 콘텐츠 페이드 적용
Seojegyeong Aug 2, 2026
a09e853
feat: 온보딩 투어 최초 로그인 조건 적용 — hasSeenOnboarding 플래그 기반으로 교체
Seojegyeong Aug 2, 2026
1ce7a70
Merge branch 'develop' into feature/#373
Seojegyeong Aug 2, 2026
17dada0
fix: develop returnUrl 로직과 최초 로그인 온보딩 리다이렉트 통합
Seojegyeong Aug 2, 2026
096eb1e
fix: 온보딩 투어 TARGET_NOT_FOUND 이벤트 시 완료 처리 복구
Seojegyeong Aug 2, 2026
abbd796
style: shadow-tooltip 하드코딩 색상을 디자인 시스템 토큰으로 교체
Seojegyeong Aug 2, 2026
2c21708
style: 온보딩 투어 통합 대시보드 스텝 제목 변경 — 통합·플랫폼 대시보드
Seojegyeong Aug 3, 2026
5073915
fix: 최초 로그인 리다이렉트를 /integrations → /workspace로 변경
Seojegyeong Aug 3, 2026
8778023
feat: 역할별 온보딩 투어 분기 - ADMIN/MEMBER 스텝 분리
Seojegyeong Aug 3, 2026
f419cd7
feat: ADMIN/MEMBER 온보딩 투어 개선- 역할별 흐름·문구·UX 정리
Seojegyeong Aug 3, 2026
1a359df
fix: MEMBER 온보딩 투어 시작 위치를 /dashboard로 이동
Seojegyeong Aug 3, 2026
8bfc978
fix: myRole null 신규 사용자에게도 온보딩 투어 표시
Seojegyeong Aug 3, 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
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"react-dom": "^19.2.0",
"react-error-boundary": "^6.1.2",
"react-hook-form": "^7.71.1",
"react-joyride": "^3.2.0",
"react-markdown": "^10.1.0",
"react-remove-scroll": "^2.7.2",
"react-router-dom": "^7.12.0",
Expand Down
131 changes: 129 additions & 2 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

68 changes: 68 additions & 0 deletions src/components/common/OnboardingTooltip.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import type { TooltipRenderProps } from "react-joyride";

import Button from "@/components/common/button/Button";

export default function OnboardingTooltip({
continuous,
index,
size,
step,
isLastStep,
backProps,
primaryProps,
skipProps,
tooltipProps,
}: TooltipRenderProps) {
return (
<div
{...tooltipProps}
className="bg-surface-100 rounded-3xl shadow-tooltip w-84 overflow-hidden"
>
<div
key={index}
className="animate-tooltip-enter flex flex-col gap-4 p-6"
>
<div className="flex items-start justify-between gap-4">
{step.title && (
<h3 className="font-heading4 text-text-title whitespace-pre-line">
{step.title}
</h3>
)}
<span className="font-caption text-text-muted shrink-0 pt-1">
{index + 1} / {size}
</span>
</div>

<p className="font-body2 text-text-body leading-relaxed break-keep whitespace-pre-line">
{step.content}
</p>

<div className="flex items-center justify-between pt-3 ">
{!isLastStep ? (
<button
{...skipProps}
className="font-body2 text-text-muted hover:text-text-body transition-colors duration-150"
>
건너뛰기
</button>
) : (
<span />
)}

<div className="flex items-center gap-2">
{index > 0 && (
<Button {...backProps} size="small" variant="outline">
이전
</Button>
)}
{continuous && (
<Button {...primaryProps} size="small" variant="primary">
{isLastStep ? "완료" : "다음"}
</Button>
)}
</div>
</div>
</div>
</div>
);
}
55 changes: 55 additions & 0 deletions src/components/common/OnboardingTour.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { useEffect, useRef } from "react";
import { Joyride } from "react-joyride";
import { useLocation, useNavigate } from "react-router-dom";

import { useOnboardingTour } from "@/hooks/common/useOnboardingTour";

import OnboardingTooltip from "@/components/common/OnboardingTooltip";

interface IOnboardingTourProps {
autoStart?: boolean;
}

export default function OnboardingTour({
autoStart = false,
}: IOnboardingTourProps) {
const { run, startTour, handleEvent, steps, myRole } = useOnboardingTour();
const navigate = useNavigate();
const { pathname } = useLocation();
const tourStarted = useRef(false);

useEffect(() => {
if (!autoStart || tourStarted.current) return;
if ((myRole === "ADMIN" || myRole === null) && pathname !== "/workspace") {
navigate("/workspace", { replace: true });
return;
}
if (myRole === "MEMBER" && pathname !== "/dashboard") {
navigate("/dashboard", { replace: true });
return;
}
tourStarted.current = true;
startTour();
}, [autoStart, myRole, pathname, navigate, startTour]);

return (
<Joyride
steps={steps}
run={run}
onEvent={handleEvent}
continuous
scrollToFirstStep
tooltipComponent={OnboardingTooltip}
styles={{
spotlight: {
style: { transition: "d 280ms cubic-bezier(0.4, 0, 0.2, 1)" },
},
overlay: { transition: "opacity 200ms ease-out" },
}}
options={{
overlayColor: "rgba(0, 0, 0, 0.5)",
zIndex: 1000,
}}
/>
);
}
Loading
Loading