1- import { useEffect , useRef , useState } from 'react' ;
21import { useParams } from 'react-router-dom' ;
32
43import { BASE_URL } from '@/api/axios.ts' ;
54import type { PostSeatData } from '@/api/booking.ts' ;
65import { postSeat } from '@/api/booking.ts' ;
76
7+ import useSSE from '@/hooks/useSSE.tsx' ;
8+
89import { toast } from '@/components/Toast/index.ts' ;
910import Icon from '@/components/common/Icon.tsx' ;
1011
@@ -30,10 +31,6 @@ export default function SeatMap({
3031 selectedSeats,
3132} : SeatMapProps ) {
3233 const { eventId } = useParams ( ) ;
33- //TODO 이름 헷갈림
34- const [ seatStatusList , setSeatStatusList ] = useState < boolean [ ] [ ] > ( [ ] ) ;
35- const seatStatus = seatStatusList [ selectedSectionIndex ] ;
36- const eventSourceRef = useRef < null | EventSource > ( null ) ;
3734 const { mutate : pickSeat } = useMutation ( {
3835 mutationFn : postSeat ,
3936 mutationKey : PICK_SEAT_MUTATION_KEY_LIST ,
@@ -58,34 +55,21 @@ export default function SeatMap({
5855 } ,
5956 select : ( mutation ) => mutation . state . variables as PostSeatData ,
6057 } ) ;
61- useEffect ( ( ) => {
62- if ( eventSourceRef . current === null ) {
63- eventSourceRef . current = new EventSource ( `${ BASE_URL } ${ API . BOOKING . GET_SEATS_SSE ( Number ( eventId ) ) } ` , {
64- withCredentials : true ,
65- } ) ;
66- eventSourceRef . current . onmessage = ( event ) => {
67- const { seatStatus } = JSON . parse ( event . data ) ;
68- if ( seatStatus ) {
69- setSeatStatusList ( seatStatus ) ;
70- }
71- } ;
72- }
73- return ( ) => {
74- if ( eventSourceRef . current ) {
75- eventSourceRef . current . close ( ) ;
76- eventSourceRef . current = null ;
77- }
78- } ;
79- } , [ eventId ] ) ;
80- const canRender = seatStatusList . length !== 0 ;
58+ const { data, isLoading } = useSSE < { seatStatus : boolean [ ] [ ] } > ( {
59+ sseURL : `${ BASE_URL } ${ API . BOOKING . GET_SEATS_SSE ( Number ( eventId ) ) } ` ,
60+ } ) ;
61+
62+ const seatStatusList = data ? data . seatStatus : null ;
63+ const selectedSeatStatus = seatStatusList ? seatStatusList [ selectedSectionIndex ] : null ;
64+ const canRender = isLoading === false && seatStatusList && seatStatusList . length !== 0 ;
65+
8166 return (
8267 < >
83- { /* <Loading /> */ }
8468 { canRender ? (
8569 renderSeatMap (
8670 selectedSection ,
8771 selectedSectionIndex ,
88- seatStatus ,
72+ selectedSeatStatus ! ,
8973 setSelectedSeats ,
9074 maxSelectCount ,
9175 selectedSeats ,
@@ -99,6 +83,7 @@ export default function SeatMap({
9983 </ >
10084 ) ;
10185}
86+
10287const Loading = ( ) => {
10388 return (
10489 < div className = "absolute flex w-full items-center justify-center" >
0 commit comments