1
+ import IconInfoMark from "@assets/icons/ic_question-mark.svg?react" ;
2
+ import { PATH } from "@constants/path" ;
3
+ import useToastConfig from "@hooks/common/useToastConfig" ;
4
+ import { ReactElement , useEffect , useState } from "react" ;
5
+ import { useNavigate } from "react-router-dom" ;
6
+
7
+ import * as S from "./RoomNavBar.style" ;
8
+
9
+ import type { TButtonVariant } from "./RoomNavBar.style" ;
10
+ import type { RoomNavBarData } from "@type/room" ;
11
+
1
12
import { ResponseError } from "@/components/error/Error" ;
2
13
import { STATUS_CODE } from "@/constants/api" ;
3
14
import { useStockQuery } from "@/hooks/api/useStockQuery" ;
4
15
import useAuthStore from "@/store/authStore" ;
5
- import { PATH } from "@constants/path" ;
6
- import useToastConfig from "@hooks/common/useToastConfig" ;
7
16
8
- import type { RoomNavBarData } from "@type/room" ;
9
- import { useEffect , useState } from "react" ;
10
- import { useNavigate } from "react-router-dom" ;
17
+ interface ButtonProps {
18
+ text : ReactElement ;
19
+ action : ( ) => void ;
20
+ status : boolean ;
21
+ variant ?: TButtonVariant ;
22
+ }
11
23
12
- import * as S from "./RoomNavBar.style" ;
24
+ const Button = ( { text, action, status, variant } : ButtonProps ) => {
25
+ return (
26
+ < S . Button
27
+ type = "button"
28
+ variant = { variant }
29
+ disabled = { ! status }
30
+ onClick = { action }
31
+ >
32
+ { text }
33
+ </ S . Button >
34
+ ) ;
35
+ } ;
13
36
14
37
interface RoomNavBarProps {
15
38
room : RoomNavBarData ;
16
39
roomId : string ;
17
- discount : string ;
18
40
}
19
41
20
- const RoomNavBar = ( { room, roomId, discount } : RoomNavBarProps ) => {
42
+ const RoomNavBar = ( { room, roomId } : RoomNavBarProps ) => {
21
43
const navigate = useNavigate ( ) ;
22
44
const [ error , setError ] = useState < unknown > ( null ) ;
23
45
const isLoggedIn = useAuthStore ( ( state ) => state . isLoggedIn ) ;
@@ -61,6 +83,36 @@ const RoomNavBar = ({ room, roomId, discount }: RoomNavBarProps) => {
61
83
}
62
84
} ;
63
85
86
+ const buttonConfig = {
87
+ propose : {
88
+ buyer : {
89
+ text : (
90
+ < >
91
+ 가격 제안
92
+ < IconInfoMark />
93
+ </ >
94
+ ) ,
95
+ action : ( ) => console . log ( "가격 제안 페이지로 이동" ) ,
96
+ } ,
97
+ seller : {
98
+ text : "받은 가격 제안" ,
99
+ action : ( ) => console . log ( "받은 가격 제안으로 이동" ) ,
100
+ } ,
101
+ } ,
102
+ purchase : {
103
+ buyer : {
104
+ text : "즉시 구매" ,
105
+ action : handlePurchaseClick ,
106
+ } ,
107
+ seller : {
108
+ text : "판매 취소" ,
109
+ action : ( ) => console . log ( "판매 취소 로직" ) ,
110
+ } ,
111
+ } ,
112
+ } ;
113
+
114
+ const userType = room . isSeller ? "seller" : "buyer" ;
115
+
64
116
useEffect ( ( ) => {
65
117
if ( error ) {
66
118
throw error ;
@@ -69,27 +121,19 @@ const RoomNavBar = ({ room, roomId, discount }: RoomNavBarProps) => {
69
121
70
122
return (
71
123
< S . Wrapper >
72
- < S . ColWrapper >
73
- < S . Text variant = "body3" color = "greyScale3" >
74
- < s > { room . originalPrice . toLocaleString ( ) } 원</ s >
75
- </ S . Text >
76
- < S . Row2 >
77
- < S . Text variant = "title2" color = "percentBlue" >
78
- { discount } %
79
- </ S . Text >
80
- < S . Text variant = "title2" >
81
- { room . sellingPrice . toLocaleString ( ) } 원
82
- </ S . Text >
83
- </ S . Row2 >
84
- </ S . ColWrapper >
85
- < S . Button
86
- type = "button"
87
- $status = { room . saleStatus }
88
- aria-label = "구매하기"
89
- onClick = { handlePurchaseClick }
90
- >
91
- 구매하기
92
- </ S . Button >
124
+ < S . Heart />
125
+ < S . ButtonWrapper >
126
+ < Button
127
+ { ...buttonConfig . propose [ userType ] }
128
+ status = { room . saleStatus }
129
+ variant = "outline"
130
+ />
131
+ < Button
132
+ { ...buttonConfig . purchase [ userType ] }
133
+ status = { room . saleStatus }
134
+ variant = "fill"
135
+ />
136
+ </ S . ButtonWrapper >
93
137
</ S . Wrapper >
94
138
) ;
95
139
} ;
0 commit comments