@@ -12,6 +12,7 @@ import axios from "axios";
1212import { useApiMutation } from "../../hooks/useApiMutation" ;
1313import { useNavigate } from "react-router-dom" ;
1414import useRoomSseClient from "../../hooks/useRoomSseClient" ;
15+ import Spinner from "../../shared/Spinner" ;
1516
1617const roomsRequest = async ( ) => {
1718 const response = await axios . get ( `/rooms` ) ;
@@ -32,7 +33,6 @@ const RoomList = () => {
3233 const [ searchTerm , setSearchTerm ] = useState ( "" ) ;
3334 const [ currentPage , setCurrentPage ] = useState ( 1 ) ;
3435 const [ rooms , setRooms ] = useState ( [ ] ) ;
35- const [ filteredRooms , setFilteredRooms ] = useState ( [ ] ) ;
3636 const [ isModalOpen , setIsModalOpen ] = useState ( false ) ;
3737 const [ isFullModalOpen , setIsFullModalOpen ] = useState ( false ) ;
3838 const [ isPasswordModalOpen , setIsPasswordModalOpen ] = useState ( false ) ;
@@ -41,44 +41,43 @@ const RoomList = () => {
4141 const navigate = useNavigate ( ) ;
4242 const ROOMS_PER_PAGE = 8 // 한 페이지당 8개
4343
44- const { data, refetch } = useApiQuery (
44+ const { data, isLoading } = useApiQuery (
4545 [ "rooms" ] ,
4646 ( ) => roomsRequest ( ) ,
4747 ) ;
4848
4949 useRoomSseClient ( ( event ) => {
5050 const { type, payload } = event ;
51- console . log ( type , payload )
5251 setRooms ( ( prev ) => {
5352 switch ( type ) {
5453 case 'CREATE' :
5554 // 이미 있는 방이면 추가하지 않음 (중복 방지)
56- if ( prev . some ( ( room ) => room . roomId === payload . roomId ) ) {
55+ if ( prev . some ( ( room ) => room . roomId === payload . payload . roomId ) ) {
5756 return prev ;
5857 }
59- return [ ...prev , payload ] ;
58+ return [ ...prev , payload . payload ] ;
6059
6160 case 'UPDATE' :
6261 return prev . map ( ( room ) =>
63- room . roomId === payload . roomId ? { ...room , ...payload } : room
62+ room . roomId === payload . payload . roomId ? { ...room , ... payload . payload } : room
6463 ) ;
6564
6665 case 'DELETE' :
67- return prev . filter ( ( room ) => room . roomId !== payload . roomId ) ;
66+ return prev . filter ( ( room ) => room . roomId !== payload . payload . roomId ) ;
6867
6968 default :
7069 return prev ;
7170 }
7271 } ) ;
7372 } ) ;
7473
75- const { mutate : createRoomMutate } = useApiMutation ( createRoomRequest , {
74+ const { mutate : createRoomMutate , isLoading : isCreateRoomLoading } = useApiMutation ( createRoomRequest , {
7675 onSuccess : ( data ) => {
7776 navigate ( `/room/${ data . roomId } ` ) ;
7877 } ,
7978 } ) ;
8079
81- const { mutate : enterRoomMutate } = useApiMutation ( enterRoomRequest , {
80+ const { mutate : enterRoomMutate , isLoading : isEnterRoomLoading } = useApiMutation ( enterRoomRequest , {
8281 onSuccess : ( data , variables ) => {
8382 // 임시로 그냥 모달 닫고 입장했다고 가정
8483 setIsPasswordModalOpen ( false ) ;
@@ -90,7 +89,6 @@ const RoomList = () => {
9089 useEffect ( ( ) => {
9190 if ( data ) {
9291 setRooms ( data . rooms ) ;
93- setFilteredRooms ( data . rooms ) ;
9492 }
9593 } , [ data ] )
9694
@@ -104,15 +102,14 @@ const RoomList = () => {
104102 } , [ ] ) ;
105103
106104 const handleSearch = ( ) => {
107- const filtered = rooms . filter ( ( room ) => room . roomName . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ) ;
108- setFilteredRooms ( filtered ) ;
105+ setRooms ( ( prev ) => prev . filter ( ( room ) => room . roomName . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ) ) ;
109106 setCurrentPage ( 1 ) ; // 검색 시 첫 페이지로 이동
110107 setSearchOn ( true ) ;
111108 }
112109
113110 const handleReset = ( ) => {
114111 setSearchTerm ( '' ) ;
115- setFilteredRooms ( rooms ) ;
112+ setRooms ( data . rooms ) ;
116113 setCurrentPage ( 1 ) ; // 검색 시 첫 페이지로 이동
117114 setSearchOn ( false ) ;
118115 } ;
@@ -142,16 +139,17 @@ const RoomList = () => {
142139 }
143140
144141 // 현재 페이지에 표시할 방들 계산
145- const totalPages = Math . ceil ( filteredRooms . length / ROOMS_PER_PAGE )
142+ const totalPages = Math . ceil ( rooms . length / ROOMS_PER_PAGE )
146143 const startIndex = ( currentPage - 1 ) * ROOMS_PER_PAGE
147144 const endIndex = startIndex + ROOMS_PER_PAGE
148- const currentRooms = filteredRooms . slice ( startIndex , endIndex )
145+ const currentRooms = rooms . slice ( startIndex , endIndex )
149146
150147 // 빈 카드로 채우기 (레이아웃 안정화를 위해)
151148 const emptyCards = Array ( Math . max ( 0 , ROOMS_PER_PAGE - currentRooms . length ) ) . fill ( null )
152149
153150 return (
154151 < div className = { styles . mainContainer } >
152+ < Spinner show = { isLoading || isEnterRoomLoading || isCreateRoomLoading } />
155153 { /* Main Content */ }
156154 < main className = { styles . mainContent } >
157155 { /* Search Section */ }
@@ -188,7 +186,7 @@ const RoomList = () => {
188186 { searchTerm && searchOn && (
189187 < div className = { styles . searchInfo } >
190188 < p >
191- "{ searchTerm } " 검색 결과: { filteredRooms . length } 개의 방
189+ "{ searchTerm } " 검색 결과: { rooms . length } 개의 방
192190 </ p >
193191 </ div >
194192 ) }
@@ -205,13 +203,13 @@ const RoomList = () => {
205203 </ section >
206204
207205 { /* 검색 결과가 없을 때 */ }
208- { filteredRooms . length === 0 && searchTerm && (
206+ { rooms . length === 0 && searchTerm && (
209207 < div className = { styles . noResults } >
210208 < p > 검색 결과가 없습니다.</ p >
211209 < button
212210 onClick = { ( ) => {
213211 setSearchTerm ( "" )
214- setFilteredRooms ( dummyRooms )
212+ setRooms ( data . rooms )
215213 setCurrentPage ( 1 )
216214 } }
217215 >
0 commit comments