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} - - -
+
+ +
+
+ { + 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.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 (
-

+

경매 상태를 확인하고 적절한 타이밍에 참여하세요

-
+
-
+
Live Auction
-
-

프리미엄 무선 이어폰

+
+

+ 프리미엄 무선 이어폰 +

현재 가격
-
+
₩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" > -
+
Upcoming Auction
-
-

스마트 워치 프로

+
+

스마트 워치 프로

-
+
시작 가격
-
₩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 && (
- + 모든 단계 완료!
)} -
+
); }