diff --git a/src/features/notification/ui/notification-sse-provider.tsx b/src/features/notification/ui/notification-sse-provider.tsx
index a0f8166b..85b5a6ac 100644
--- a/src/features/notification/ui/notification-sse-provider.tsx
+++ b/src/features/notification/ui/notification-sse-provider.tsx
@@ -19,6 +19,8 @@ const SSE_EVENT_TYPES = [
"auctionFailedSubscriber",
"auctionSuccessSeller",
"auctionSuccessSubscriber",
+ "reviewRegistered",
+ "chatMessage",
] as const;
const MAX_RECONNECT_DELAY_MS = 30_000;
const RECONNECT_BASE_DELAY_MS = 1_000;
diff --git a/src/screens/guide/model/guide-data.ts b/src/screens/guide/model/guide-data.ts
index 2d21aafa..ea092b03 100644
--- a/src/screens/guide/model/guide-data.ts
+++ b/src/screens/guide/model/guide-data.ts
@@ -30,9 +30,7 @@ export interface PricePoint {
export const priceData: PricePoint[] = [
{ time: "00:00", price: 100000, label: "시작" },
{ time: "00:05", price: 95000 },
- { time: "00:10", price: 90000 },
- { time: "00:15", price: 85000 },
- { time: "00:20", price: 80000, label: "구매 완료" },
+ { time: "00:10", price: 90000, label: "구매 완료" },
];
export interface ChatMessage {
diff --git a/src/screens/guide/ui/guide.tsx b/src/screens/guide/ui/guide.tsx
index 85fe6e10..77e3d916 100644
--- a/src/screens/guide/ui/guide.tsx
+++ b/src/screens/guide/ui/guide.tsx
@@ -7,6 +7,8 @@ import { useRouter } from "next/navigation";
import { ChevronLeft, ChevronRight } from "lucide-react";
import { AnimatePresence, motion } from "motion/react";
+import { Container } from "@/shared/ui";
+
import {
GuidebookPage1,
GuidebookPage2,
@@ -58,64 +60,64 @@ export function Guidebook() {
}, []);
return (
-
-
-
-
{
- if (typeof window !== "undefined") {
- window.localStorage.setItem(GUIDE_STORAGE_KEY, "true");
- }
- router.replace("/");
- }}
- >
- Skip
-
-
-
- Chapter {currentPage + 1} / {totalPages}
-
- {pages[currentPage].title}
-
-
-
-
-
-
- {pages[currentPage].node}
-
-
-
+
+
+
+
+
+
+
+
+ {pages[currentPage].node}
+
+
-
+
-
+
이전
-
+
{pages.map((page, index) => (
goTo(index)}
className="rounded-full transition-all"
style={{
- width: index === currentPage ? "32px" : "8px",
- height: "8px",
+ width: index === currentPage ? "28px" : "6px",
+ height: "6px",
backgroundColor:
index === currentPage ? "oklch(0.4758 0.2241 288.5)" : "#D1D5DB",
}}
@@ -149,7 +151,7 @@ export function Guidebook() {
다음
-
+
-
+
);
}
diff --git a/src/screens/guide/ui/pages/guidebook-page1.tsx b/src/screens/guide/ui/pages/guidebook-page1.tsx
index 948a16cd..3e2e72cd 100644
--- a/src/screens/guide/ui/pages/guidebook-page1.tsx
+++ b/src/screens/guide/ui/pages/guidebook-page1.tsx
@@ -11,16 +11,16 @@ export function GuidebookPage1() {
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.1, duration: 0.6 }}
- className="mb-8"
+ className="mb-6 max-[1024px]:mb-4"
>
네덜란드 경매
-
+
{KEYWORDS.map((keyword, index) => (
-
+
{keyword.label}
@@ -68,13 +71,13 @@ export function GuidebookPage1() {
transition={{ delay: 0.8 + index * 0.15, duration: 0.6 }}
/>
- {keyword.description}
+ {keyword.description}
))}
+
- 5분마다 일정 금액씩 가격이 하락합니다
+
+ 판매자가 정한 Stop Loss까지
+
+ 5분
+ 마다 가격이 하락합니다
+
-
+
{priceData.map((point, index) => (
-
+
{point.time}
{point.label && (
-
-
-
+
₩{point.price.toLocaleString()}
{index > 0 && (
-{Math.round((1 - point.price / priceData[0].price) * 100)}%
@@ -152,16 +144,16 @@ export function GuidebookPage2() {
-
+
💡 원하는 가격이 되면 즉시 구매할 수 있습니다
-
+
);
}
diff --git a/src/screens/guide/ui/pages/guidebook-page3.tsx b/src/screens/guide/ui/pages/guidebook-page3.tsx
index 0910908a..1bd10431 100644
--- a/src/screens/guide/ui/pages/guidebook-page3.tsx
+++ b/src/screens/guide/ui/pages/guidebook-page3.tsx
@@ -19,106 +19,112 @@ export function GuidebookPage3() {
}, []);
return (
-
-
- 실시간 가격 변동
-
- {priceSteps.map((step, index) => (
-
-
- {step.time}
-
- ₩{step.price.toLocaleString()}
-
-
+
+
+ StopLoss에 언제 도달할지, 누가 먼저 구매할지 예측할 수 없습니다
+
+
+
+ 실시간 가격 변동
+
+ {priceSteps.map((step, index) => (
+
+
+ {step.time}
+
+ ₩{step.price.toLocaleString()}
+
+
- {index === 2 && (
-
- 구매 가능한 가격!
-
- )}
-
- ))}
-
-
+ {index === 2 && (
+
+ 원하는 가격!
+
+ )}
+
+ ))}
+
+
-
- 구매자의 고민
-
- {messages.map((message, idx) => {
- const isVisible = idx < visibleMessages;
- let backgroundColor = "#F3F4F6";
- let textColor = "#1F2937";
+
+
+ 구매자의 고민
+
+
+ {messages.map((message, idx) => {
+ const isVisible = idx < visibleMessages;
+ let backgroundColor = "#F3F4F6";
+ let textColor = "#1F2937";
- if (message.type === "success") {
- backgroundColor = "oklch(0.4758 0.2241 288.5)";
- textColor = "white";
- } else if (message.type === "waiting") {
- backgroundColor = "#FEF3C7";
- }
+ if (message.type === "success") {
+ backgroundColor = "oklch(0.4758 0.2241 288.5)";
+ textColor = "white";
+ } else if (message.type === "waiting") {
+ backgroundColor = "#FEF3C7";
+ }
- return (
-
+ return (
- {message.text}
+
+ {message.text}
+
-
- );
- })}
-
+ );
+ })}
+
+
+
- {visibleMessages === messages.length && (
-
-
- 💡 타이밍을 잘 잡으면 원하는 가격에 구매할 수 있습니다
-
-
- )}
+
+
+ 💡 타이밍을 잘 잡으면 원하는 가격에 구매할 수 있습니다
+
-
+
);
}
diff --git a/src/screens/guide/ui/pages/guidebook-page4.tsx b/src/screens/guide/ui/pages/guidebook-page4.tsx
index 7ad0b842..fe3f790e 100644
--- a/src/screens/guide/ui/pages/guidebook-page4.tsx
+++ b/src/screens/guide/ui/pages/guidebook-page4.tsx
@@ -11,24 +11,24 @@ export function GuidebookPage4() {
return (
-
+
경매 상태를 확인하고 적절한 타이밍에 참여하세요
-
+
-
+
-
-
프리미엄 무선 이어폰
+
+
+ 프리미엄 무선 이어폰
+
현재 가격
-
+
₩85,000
₩120,000
@@ -103,7 +108,7 @@ export function GuidebookPage4() {
transition={{ duration: 0.6, delay: 0.4 }}
className="bg-secondary/60 border-border/60 overflow-hidden rounded-2xl border shadow-lg"
>
-
+
-
-
스마트 워치 프로
+
+
스마트 워치 프로
-
+
시작 가격
-
₩450,000
+
₩450,000
diff --git a/src/screens/guide/ui/pages/guidebook-page5.tsx b/src/screens/guide/ui/pages/guidebook-page5.tsx
index 1e63f6ff..9102528e 100644
--- a/src/screens/guide/ui/pages/guidebook-page5.tsx
+++ b/src/screens/guide/ui/pages/guidebook-page5.tsx
@@ -17,17 +17,19 @@ export function GuidebookPage5() {
};
return (
-
+
- 5단계로 간편하게 경매를 등록하세요
+
+ 5단계로 간편하게 경매를 등록하세요
+
-
+
{steps.map((step, index) => {
const isCompleted = completedSteps.includes(index);
const isCurrent = index === currentStep;
@@ -54,7 +56,7 @@ export function GuidebookPage5() {
whileHover={{ scale: 1.05 }}
>
{isCompleted ? (
-
+
) : (
React.createElement(step.icon, {
- className: "w-7 h-7",
+ className: "h-5 w-5 max-[1024px]:h-4 max-[1024px]:w-4",
style: {
color: iconColor,
},
})
)}
-
+
Step {index + 1}
{index < steps.length - 1 && (
-
+
{React.createElement(steps[currentStep].icon, {
- className: "w-6 h-6",
+ className: "h-5 w-5 max-[1024px]:h-4 max-[1024px]:w-4",
style: { color: "oklch(0.4758 0.2241 288.5)" },
})}
-
{steps[currentStep].label}
-
{steps[currentStep].description}
+
+ {steps[currentStep].label}
+
+
+ {steps[currentStep].description}
+
{currentStep < steps.length - 1 ? "다음 단계" : "경매 등록하기"}
-
+
{completedSteps.length === steps.length && (
-
+
모든 단계 완료!
)}
-
+
);
}