@@ -4,24 +4,66 @@ import { TwoOptions } from '../../../../../design-system/stories/ChoiceChip.stor
44import ChoiceChip from '../../../../../design-system/ui/ChoiceChip' ;
55import DefaultTextField from '../../../../../design-system/ui/textFields/DefaultTextField' ;
66import Button from '../../../../../design-system/ui/Button' ;
7- import EventDatePicker from '../../../../features/event-manage/event-create/ui/DatePicker' ;
7+ import TicketDatePicker from '../../../../features/ticket/model/TicketDatePicker' ;
8+ import { createTicket } from '../../../../features/ticket/api/ticket' ;
9+ import { CreateTicketRequest } from '../../../../features/ticket/model/ticketCreation' ;
810
911const TicketCreatePage = ( ) => {
10- const [ price , setPrice ] = useState < number > ( 0 ) ;
11- const [ quantity , setQuantity ] = useState < number > ( 0 ) ;
12+ const [ ticketData , setTicketData ] = useState < CreateTicketRequest > ( {
13+ eventId : 1 ,
14+ ticketType : 'FIRST_COME' ,
15+ ticketName : '' ,
16+ ticketDescription : '' ,
17+ ticketPrice : 0 ,
18+ availableQuantity : 0 ,
19+ startDate : '' ,
20+ endDate : '' ,
21+ startTime : '' ,
22+ endTime : '' ,
23+ } ) ;
24+ const [ eventState , setEventState ] = useState ( {
25+ startDate : '' ,
26+ endDate : '' ,
27+ startTime : '' ,
28+ endTime : '' ,
29+ } ) ;
1230
13- const handlePriceChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
14- const value = Number ( e . target . value ) ;
15- setPrice ( Number . isNaN ( value ) ? 0 : value ) ;
31+ const handleTicketTypeChange = ( type : string ) => {
32+ let mappedType : string ;
33+ if ( type === '선착순' ) {
34+ mappedType = 'FIRST_COME' ;
35+ } else {
36+ mappedType = 'SELECTION' ;
37+ }
38+ setTicketData ( ( prev ) => ( {
39+ ...prev ,
40+ ticketType : mappedType ,
41+ } ) ) ;
1642 } ;
1743
18- const handleQuantityChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
19- const value = Number ( e . target . value ) ;
20- setQuantity ( Number . isNaN ( value ) ? 0 : value ) ;
44+ // 필드값 업데이트
45+ const handleInputChange = ( field : keyof CreateTicketRequest ) => ( e : React . ChangeEvent < HTMLInputElement > ) => {
46+ const value = e . target . value ;
47+ setTicketData ( ( prev ) => ( {
48+ ...prev ,
49+ [ field ] : field === 'ticketPrice' || field === 'availableQuantity' ? Number ( value ) : value ,
50+ } ) ) ;
2151 } ;
2252
23- const sum = price * quantity ;
53+ // 시간 업데이트
54+ const handleDateChange = ( dates : { startDate : string ; endDate : string ; startTime : string ; endTime : string } ) => {
55+ setEventState ( dates ) ;
56+ setTicketData ( ( prevState ) => ( {
57+ ...prevState ,
58+ startDate : dates . startDate ,
59+ endDate : dates . endDate ,
60+ startTime : dates . startTime ,
61+ endTime : dates . endTime ,
62+ } ) ) ;
63+ } ;
2464
65+ // 예상 수익
66+ const sum = ticketData . ticketPrice * ticketData . availableQuantity ;
2567 const formatNumber = ( num : number ) : string => {
2668 if ( num >= 1000000 ) {
2769 return num / 1000000 + 'M' ;
@@ -32,6 +74,16 @@ const TicketCreatePage = () => {
3274 return num . toString ( ) ;
3375 } ;
3476
77+ // API 호출
78+ const handleSaveClick = async ( ) => {
79+ try {
80+ const response = await createTicket ( ticketData ) ;
81+ console . log ( '티켓 저장 성공:' , response ) ;
82+ } catch ( err ) {
83+ console . error ( '티켓 저장에 실패했습니다.' , err ) ;
84+ }
85+ } ;
86+
3587 return (
3688 < DashboardLayout centerContent = "WOOACON 2024" >
3789 < div className = " flex flex-col gap-3 md:gap-5 px-7 py-5" >
@@ -45,7 +97,7 @@ const TicketCreatePage = () => {
4597 < div >
4698 < div className = "w-32 md:w-40 my-1" >
4799 < p className = "font-semibold px-1 mb-1 text-gray-700" > 티켓 종류</ p >
48- < ChoiceChip { ...TwoOptions . args } />
100+ < ChoiceChip { ...TwoOptions . args } onSelect = { handleTicketTypeChange } />
49101 </ div >
50102 < p className = "block px-1 mb-1 text-placeholderText text-11 md:text-13" >
51103 참가자가 선착순으로 발행된 티켓을 구매합니다.
@@ -58,6 +110,7 @@ const TicketCreatePage = () => {
58110 label = "티켓(입장권) 이름"
59111 detail = "티켓을 잘 나타낼 수 있는 이름을 써보세요.(무료 입장권, VIP 입장권,얼리버드)"
60112 className = "h-12"
113+ onChange = { handleInputChange ( 'ticketName' ) }
61114 />
62115 </ div >
63116 { /*티켓 설명 입력란*/ }
@@ -67,14 +120,15 @@ const TicketCreatePage = () => {
67120 label = "티켓 설명"
68121 detail = "티켓에 대한 상세한 설명을 해주세요."
69122 className = "h-12"
123+ onChange = { handleInputChange ( 'ticketDescription' ) }
70124 />
71125 </ div >
72126
73127 { /*가격 계산 란*/ }
74128 < div className = "flex items-center gap-5" >
75- < DefaultTextField label = "1개당 가격" className = "h-8 md:h-9" onChange = { handlePriceChange } placeholder = "0" />
129+ < DefaultTextField label = "1개당 가격" className = "h-8 md:h-9" onChange = { handleInputChange ( 'ticketPrice' ) } placeholder = "0" />
76130 < p className = "text-gray-700 text-2xl" > X</ p >
77- < DefaultTextField label = "수량" className = "h-8 md:h-9" onChange = { handleQuantityChange } placeholder = "1" />
131+ < DefaultTextField label = "수량" className = "h-8 md:h-9" onChange = { handleInputChange ( 'availableQuantity' ) } placeholder = "1" />
78132 < p className = "text-gray-700 text-2xl" > =</ p >
79133 < div >
80134 < p className = "whitespace-nowrap text-gray-700 font-semibold text-15 md:text-base" > 예상 수익</ p >
@@ -85,16 +139,21 @@ const TicketCreatePage = () => {
85139 { /*캘린더가 들어갈 자리*/ }
86140 < div className = "flex flex-col gap-2" >
87141 < p className = "px-1 text-gray-700 font-semibold" > 판매 기간</ p >
88- < EventDatePicker isLabel = { true } />
142+ < TicketDatePicker isLabel = { true } ticketState = { eventState }
143+ setTicketState = { setEventState } onDateChange = { handleDateChange } />
89144 </ div >
90145 < div className = "flex-grow" > </ div >
146+ < div className = "ticket-data-output" >
147+ < pre > { JSON . stringify ( ticketData , null , 2 ) } </ pre >
148+ </ div >
91149
92150 < div className = "w-full " >
93- < Button label = "저장하기" onClick = { ( ) => console . log ( 'post 요청' ) } className = "w-full h-12 rounded-full" />
151+ < Button label = "저장하기" onClick = { handleSaveClick } className = "w-full h-12 rounded-full" />
94152 </ div >
95153 </ div >
96154 </ DashboardLayout >
97155 ) ;
98156} ;
99157
100158export default TicketCreatePage ;
159+
0 commit comments