Skip to content

Commit 9cdd99d

Browse files
authored
Refactor/#129-K: ConfMediaBar 컴포넌트 관련 리팩토링 (#133)
1 parent b2523d2 commit 9cdd99d

File tree

5 files changed

+73
-68
lines changed

5 files changed

+73
-68
lines changed

client/src/components/ConfMediaBar/index.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1+
import { io } from 'socket.io-client';
2+
import env from 'src/config';
3+
import { useConfMediaStreams } from 'src/hooks/useConfMediaStreams';
4+
15
import ConfMedia from './ConfMedia';
26
import style from './style.module.scss';
37

48
interface ConfMediaBarProps {
5-
streams: Map<string, MediaStream>;
9+
workspaceId?: string;
610
}
711

8-
function ConfMediaBar({ streams }: ConfMediaBarProps) {
12+
function ConfMediaBar({ workspaceId }: ConfMediaBarProps) {
13+
const socketUrl = `${env.SERVER_PATH}/signaling/${workspaceId}`;
14+
const socket = io(socketUrl);
15+
16+
const streams = useConfMediaStreams(socket);
17+
918
return (
1019
<div className={style['conf-bar']}>
1120
<ul>

client/src/components/Confbar/index.tsx

Lines changed: 0 additions & 5 deletions
This file was deleted.

client/src/components/Workspace/index.tsx

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
1-
import Confbar from 'components/Confbar';
21
import Mom from 'components/Mom';
32
import Sidebar from 'components/Sidebar';
4-
import { TMom } from 'src/types/mom';
5-
import { TUser } from 'src/types/user';
6-
3+
import { useEffect, useState } from 'react';
4+
import { getWorkspaceInfo } from 'src/apis/workspace';
5+
import { WorkspaceInfo } from 'src/types/workspace';
76
interface WorkspaceProps {
8-
name: string;
9-
members: TUser[];
10-
moms: TMom[];
7+
workspaceId?: string;
118
}
129

13-
function Workspace({ name, members, moms }: WorkspaceProps) {
10+
function Workspace({ workspaceId }: WorkspaceProps) {
11+
const [workspace, setWorkspace] = useState<WorkspaceInfo | null>(null);
12+
13+
useEffect(() => {
14+
loadWorkspaceInfo();
15+
}, []);
16+
17+
const loadWorkspaceInfo = async () => {
18+
if (workspaceId) {
19+
const workspaceInfo = await getWorkspaceInfo({ id: workspaceId });
20+
setWorkspace(workspaceInfo);
21+
}
22+
};
23+
1424
return (
15-
<>
16-
<Sidebar />
17-
<Mom />
18-
<Confbar />
19-
</>
25+
workspace && (
26+
<>
27+
<Sidebar />
28+
<Mom />
29+
</>
30+
)
2031
);
2132
}
2233

client/src/hooks/useConfMediaStreams.tsx

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,49 @@ import { STUN_SERVER } from 'src/constants/rtc';
44
import RTC from 'src/utils/rtc';
55

66
export function useConfMediaStreams(socket: Socket) {
7-
const [mediaStreams, setMediaStreams] = useState<Map<string, MediaStream>>(new Map());
7+
const [mediaStreams, setMediaStreams] = useState<Map<string, MediaStream>>(
8+
new Map(),
9+
);
10+
11+
const initRTC = async () => {
12+
const userMedia = await navigator.mediaDevices.getUserMedia({
13+
video: true,
14+
audio: true,
15+
});
16+
setMediaStreams((prev) =>
17+
copyMapWithOperation(prev, (map) => map.set('me', userMedia)),
18+
);
19+
20+
const rtc = new RTC(socket, STUN_SERVER, userMedia);
21+
22+
rtc.onMediaConnected((socketId, remoteStream) => {
23+
setMediaStreams((prev) =>
24+
copyMapWithOperation(prev, (map) => map.set(socketId, remoteStream)),
25+
);
26+
});
27+
28+
rtc.onMediaDisconnected((socketId) => {
29+
setMediaStreams((prev) =>
30+
copyMapWithOperation(prev, (map) => map.delete(socketId)),
31+
);
32+
});
33+
34+
rtc.connect();
35+
};
836

937
useEffect(() => {
10-
(async () => {
11-
const userMedia = await navigator.mediaDevices.getUserMedia({video: true, audio: true});
12-
setMediaStreams(prev => copyMapWithOperation(prev, map => map.set('me', userMedia)));
13-
14-
const rtc = new RTC(socket, STUN_SERVER, userMedia);
15-
rtc.onMediaConnected((socketId, remoteStream) => {
16-
setMediaStreams(prev => copyMapWithOperation(prev, map => map.set(socketId, remoteStream)));
17-
});
18-
rtc.onMediaDisconnected((socketId) => {
19-
setMediaStreams(prev => copyMapWithOperation(prev, map => map.delete(socketId)));
20-
});
21-
rtc.connect();
22-
})();
23-
}, [])
38+
initRTC();
39+
}, []);
2440

2541
return mediaStreams;
2642
}
2743

2844
// TODO: 코드 반복때문에 만든 함수. 더 좋은 방법 있으면 고치기
29-
function copyMapWithOperation<K, V>(prev: Map<K, V>, operation: (cur: Map<K, V>) => void) {
45+
function copyMapWithOperation<K, V>(
46+
prev: Map<K, V>,
47+
operation: (cur: Map<K, V>) => void,
48+
) {
3049
const cur = new Map(prev);
3150
operation(cur);
3251
return cur;
33-
}
52+
}

client/src/pages/Workspace/index.tsx

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,18 @@
11
import Workspace from 'components/Workspace';
22
import WorkspaceList from 'components/WorkspaceList';
3-
import { useEffect, useState } from 'react';
43
import { useParams } from 'react-router-dom';
5-
import { io } from 'socket.io-client';
6-
import { getWorkspaceInfo } from 'src/apis/workspace';
74
import ConfMediaBar from 'src/components/ConfMediaBar';
8-
import config from 'src/config';
9-
import { useConfMediaStreams } from 'src/hooks/useConfMediaStreams';
10-
import { WorkspaceInfo } from 'src/types/workspace';
115

126
import style from './style.module.scss';
137

148
function WorkspacePage() {
15-
const [workspace, setWorkspace] = useState<WorkspaceInfo | null>(null);
16-
179
const { id } = useParams();
18-
const socketUrl = `${config.SERVER_PATH}/signaling/${id}`;
19-
const socket = io(socketUrl);
20-
21-
const confMediaStreams = useConfMediaStreams(socket);
22-
23-
const loadWorkspaceInfo = async () => {
24-
if (id) {
25-
const workspaceInfo = await getWorkspaceInfo({ id });
26-
setWorkspace(workspaceInfo);
27-
}
28-
};
29-
30-
useEffect(() => {
31-
loadWorkspaceInfo();
32-
}, []);
3310

3411
return (
3512
<div className={style.container}>
3613
<WorkspaceList />
37-
{workspace && ( // TODO: 임시로 만들었어요
38-
<Workspace
39-
name={workspace.name}
40-
members={workspace.members}
41-
moms={workspace.moms}
42-
/>
43-
)}
44-
<ConfMediaBar streams={confMediaStreams} />
14+
<Workspace workspaceId={id} />
15+
<ConfMediaBar workspaceId={id} />
4516
</div>
4617
);
4718
}

0 commit comments

Comments
 (0)