Overnap

RoomData 핸들링을 RoomInfo에서 Room으로 옮김

...@@ -4,74 +4,11 @@ import SocketContext from '../../contexts/SocketContext'; ...@@ -4,74 +4,11 @@ import SocketContext from '../../contexts/SocketContext';
4 import { MessageResponse, MessageType, RawMessage } from '../common/types'; 4 import { MessageResponse, MessageType, RawMessage } from '../common/types';
5 import { RoomData, UpdateRoomUser } from './types'; 5 import { RoomData, UpdateRoomUser } from './types';
6 6
7 -interface RoomInfoLocation { 7 +interface RoomInfoProps {
8 - state: { roomData: RoomData } 8 + roomData: RoomData;
9 } 9 }
10 10
11 -export const RoomInfo: React.FC = () => { 11 +export const RoomInfo: React.FC<RoomInfoProps> = ({ roomData }) => {
12 - const history = useHistory();
13 - const socket = useContext(SocketContext);
14 - const location: RoomInfoLocation = useLocation();
15 -
16 - const [ roomData, setRoomData ] = useState<RoomData>({
17 - // 기본값
18 - uuid: '0',
19 - name: 'loading...',
20 - maxUsers: 9,
21 - users: []
22 - });
23 -
24 - const handleUpdateRoomUser = useCallback((rawMessage: RawMessage) => {
25 - if (rawMessage.type == MessageType.ROOM_USER_UPDATE) {
26 - const data = rawMessage.message as UpdateRoomUser;
27 - console.log(data);
28 - if (data.state == 'removed') {
29 - const newUsers = roomData.users;
30 - const index = newUsers.indexOf(data.user);
31 - if (index < 0) {
32 - console.log('존재하지 않는 유저를 제거 시도');
33 - } else {
34 - newUsers.splice(index, 1);
35 - }
36 - setRoomData({
37 - ...roomData,
38 - users: newUsers
39 - });
40 - } else if (data.state == 'added') {
41 - setRoomData({
42 - ...roomData,
43 - users: [data.user, ...roomData.users]
44 - });
45 - }
46 - }
47 - }, [roomData]);
48 -
49 - useEffect(() => {
50 - socket.on('msg', handleUpdateRoomUser);
51 -
52 - return () => {
53 - socket.off('msg', handleUpdateRoomUser);
54 - }
55 - }, [roomData]);
56 -
57 - useEffect(() => {
58 - // 비정상적인 루트로 방을 들어오면 로그인 화면으로 푸시
59 - if (location.state === undefined) {
60 - history.push('/');
61 - return;
62 - }
63 -
64 - setRoomData(location.state.roomData);
65 -
66 - return () => {
67 - const rawMessage: RawMessage = {
68 - type: MessageType.ROOM_LEAVE,
69 - message: ''
70 - }
71 - socket.emit('msg', rawMessage, (response : MessageResponse<undefined>) => {});
72 - }
73 - }, [])
74 -
75 return ( 12 return (
76 <div className='m-3 w-5/6 flex items-center place-content-between'> 13 <div className='m-3 w-5/6 flex items-center place-content-between'>
77 <div>{roomData.name}</div> 14 <div>{roomData.name}</div>
......
1 -import React, { useContext } from 'react'; 1 +import React, { useCallback, useContext, useEffect, useState } from 'react';
2 -import { useLocation } from 'react-router'; 2 +import { useHistory, useLocation } from 'react-router';
3 import { Main } from '../components/common/Main'; 3 import { Main } from '../components/common/Main';
4 +import { MessageResponse, MessageType, RawMessage } from '../components/common/types';
4 import { Canvas } from '../components/room/Canvas'; 5 import { Canvas } from '../components/room/Canvas';
5 import { Chat } from '../components/room/Chat'; 6 import { Chat } from '../components/room/Chat';
6 import { RoomInfo } from '../components/room/RoomInfo'; 7 import { RoomInfo } from '../components/room/RoomInfo';
8 +import { RoomData, UpdateRoomUser } from '../components/room/types';
7 import SocketContext from '../contexts/SocketContext'; 9 import SocketContext from '../contexts/SocketContext';
8 10
11 +interface RoomLocation {
12 + state: { roomData: RoomData }
13 +}
14 +
9 export const Room: React.FC = () => { 15 export const Room: React.FC = () => {
16 + const history = useHistory();
17 + const socket = useContext(SocketContext);
18 + const location: RoomLocation = useLocation();
19 +
20 + const [ roomData, setRoomData ] = useState<RoomData>({
21 + // 기본값
22 + uuid: '0',
23 + name: 'loading...',
24 + maxUsers: 9,
25 + users: []
26 + });
27 +
28 + const handleUpdateRoomUser = useCallback((rawMessage: RawMessage) => {
29 + if (rawMessage.type == MessageType.ROOM_USER_UPDATE) {
30 + const data = rawMessage.message as UpdateRoomUser;
31 + console.log(data);
32 + if (data.state == 'removed') {
33 + const newUsers = roomData.users;
34 + const index = newUsers.indexOf(data.user);
35 + if (index < 0) {
36 + console.log('존재하지 않는 유저를 제거 시도');
37 + } else {
38 + newUsers.splice(index, 1);
39 + }
40 + setRoomData({
41 + ...roomData,
42 + users: newUsers
43 + });
44 + } else if (data.state == 'added') {
45 + setRoomData({
46 + ...roomData,
47 + users: [data.user, ...roomData.users]
48 + });
49 + }
50 + }
51 + }, [roomData]);
52 +
53 + useEffect(() => {
54 + socket.on('msg', handleUpdateRoomUser);
55 +
56 + return () => {
57 + socket.off('msg', handleUpdateRoomUser);
58 + }
59 + }, [roomData]);
60 +
61 + useEffect(() => {
62 + // 비정상적인 루트로 방을 들어오면 로그인 화면으로 푸시
63 + if (location.state === undefined) {
64 + history.push('/');
65 + return;
66 + }
67 +
68 + setRoomData(location.state.roomData);
69 +
70 + return () => {
71 + const rawMessage: RawMessage = {
72 + type: MessageType.ROOM_LEAVE,
73 + message: ''
74 + }
75 + socket.emit('msg', rawMessage, (response : MessageResponse<undefined>) => {});
76 + }
77 + }, [])
78 +
10 return ( 79 return (
11 <Main> 80 <Main>
12 - <RoomInfo /> 81 + <RoomInfo roomData={roomData}/>
13 <div className='w-full flex'> 82 <div className='w-full flex'>
14 <Canvas /> 83 <Canvas />
15 <Chat /> 84 <Chat />
......