Skip to content

Commit da41e22

Browse files
authored
Merge pull request #75 from SWM-FIRE/FIRE-332-fe-캐릭터-위에-채팅-구현
FIRE-332-fe-캐릭터-위에-채팅-구현
2 parents ecbf2a3 + bd5a5d1 commit da41e22

File tree

5 files changed

+63
-28
lines changed

5 files changed

+63
-28
lines changed

src/adapters/video/videoSocket.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { io } from 'socket.io-client';
2+
3+
const videoSocket = io(process.env.REACT_APP_SOCKET_VIDEO_URL as string);
4+
5+
function videoSocketInit(payload) {
6+
videoSocket.on('connect', () => {
7+
console.log('socket server connected.');
8+
videoSocket.emit('joinRoom', payload);
9+
});
10+
}
11+
12+
export { videoSocketInit, videoSocket };

src/components/room/LocalScreen.tsx

+20-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import React, { useEffect, useRef } from 'react';
1+
import React, { useEffect, useRef, useState } from 'react';
22
import styled from 'styled-components';
33
import MyAvatar from '../../assets/avatar/MyAvatar';
44
import controlModal from '../../stores/controlModal';
55
import { useCreateMediaStream } from '../rtc/hooks/useCreateLocalStream';
66

7-
export default function LocalScreen({ nickname, avatar, uid }) {
7+
export default function LocalScreen({ nickname, avatar, uid, messages }) {
88
const { userMediaStream, createMediaStream } = useCreateMediaStream();
9+
const [currentTime, setCurrentTime] = useState<Date>(new Date());
910
useEffect(() => {
1011
createMediaStream();
1112
}, []);
@@ -24,14 +25,29 @@ export default function LocalScreen({ nickname, avatar, uid }) {
2425
}
2526
}, [videoRef, userMediaStream]);
2627

28+
useEffect(() => {
29+
const timer = setInterval(() => {
30+
setCurrentTime(new Date());
31+
}, 250);
32+
return () => clearInterval(timer);
33+
}, []);
34+
35+
const newMessages = messages.filter(
36+
(message) =>
37+
message.uid === uid &&
38+
new Date(message.createdAt).getTime() > currentTime.getTime() - 5000,
39+
);
2740
return (
2841
<Container onClick={OpenModal}>
2942
<Video ref={videoRef} autoPlay playsInline muted />
3043
<ControlBar>
3144
<ChatContainer>
3245
<ChatInner>
33-
<Chats>Lorem ipsum dolor sit amet,</Chats>
34-
<Chats>Vestibulum sit amet tellus suscipit</Chats>
46+
{newMessages.map((message) => (
47+
<Chats key={message.createdAt}>{message.message}</Chats>
48+
))}
49+
{/* <Chats>Lorem ipsum dolor sit amet,</Chats> */}
50+
{/* <Chats>Vestibulum sit amet tellus suscipit</Chats> */}
3551
</ChatInner>
3652
</ChatContainer>
3753
<AvatarPosition>

src/components/room/ScreenShare.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import SingleScreen from './SingleScreen';
55
import LocalScreen from './LocalScreen';
66
import connectedUsersStore from '../../stores/connectedUsersStore';
77

8-
export default function ScreenShare() {
8+
export default function ScreenShare({ messages }) {
99
const navigate = useNavigate();
1010
const { connectedUsers } = connectedUsersStore();
1111
useEffect(() => {
@@ -22,13 +22,15 @@ export default function ScreenShare() {
2222
nickname={localStorage.getItem('nickname')}
2323
avatar={localStorage.getItem('avatar')}
2424
uid={localStorage.getItem('uid')}
25+
messages={messages}
2526
/>
2627
{connectedUsers.map((user) => (
2728
<SingleScreen
2829
key={user.nickname}
2930
nickname={user.nickname}
3031
avatar={user.avatar}
3132
uid={user.uid}
33+
messages={messages}
3234
/>
3335
))}
3436
</ScreenWrapper>

src/components/room/SingleScreen.tsx

+20-15
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
1+
import { useState, useEffect } from 'react';
12
import styled from 'styled-components';
23
import MyAvatar from '../../assets/avatar/MyAvatar';
34
import controlModal from '../../stores/controlModal';
45

5-
export default function SingleScreen({
6-
nickname,
7-
avatar,
8-
uid,
9-
}: {
10-
nickname: string;
11-
avatar: string;
12-
uid: string;
13-
}) {
6+
export default function SingleScreen({ nickname, avatar, uid, messages }) {
147
const { toggleModal, setNickname, setAvatar, setUid } = controlModal();
8+
const [currentTime, setCurrentTime] = useState<Date>(new Date());
9+
1510
const OpenModal = () => {
1611
setNickname(nickname);
1712
setAvatar(avatar);
1813
setUid(uid);
1914
toggleModal();
2015
};
16+
17+
useEffect(() => {
18+
const timer = setInterval(() => {
19+
setCurrentTime(new Date());
20+
}, 250);
21+
return () => clearInterval(timer);
22+
}, []);
23+
const newMessages = messages.filter(
24+
(message) =>
25+
message.uid === uid &&
26+
new Date(message.createdAt).getTime() > currentTime.getTime() - 5000,
27+
);
28+
2129
return (
2230
<Container onClick={OpenModal}>
2331
<ChatContainer>
2432
<ChatInner>
25-
<Chats>Lorem ipsum dolor sit amet,</Chats>
26-
<Chats>Vestibulum sit amet tellus suscipit</Chats>
27-
<Chats>
28-
Fusce eget lacus eu magna finibus interdum vel vel felis.
29-
</Chats>
30-
<Chats>Last Chat</Chats>
33+
{newMessages.map((message) => (
34+
<Chats key={message.createdAt}>{message.message}</Chats>
35+
))}
3136
</ChatInner>
3237
</ChatContainer>
3338
<AvatarPosition>

src/pages/Room.tsx

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import styled from 'styled-components';
2-
import io from 'socket.io-client';
32
import axios from 'axios';
43
import { useEffect, useState, useCallback } from 'react';
4+
import { io } from 'socket.io-client';
55
import { useParams } from 'react-router-dom';
66
import Header from '../components/room/Header';
77
import ScreenShare from '../components/room/ScreenShare';
@@ -20,21 +20,21 @@ import {
2020
} from '../adapters/chat/socketio';
2121

2222
export default function Room() {
23-
const uid = localStorage.getItem('uid');
24-
const videoSocket = io(process.env.REACT_APP_SOCKET_VIDEO_URL as string);
2523
const [userList, setUserList] = useState({});
2624
const [messages, setMessages] = useState([]);
2725
const [prev, setPrev] = useState('');
2826
const { isOpen } = controlModal();
2927
const { roomId } = useParams();
3028
const { enablePrevent, disablePrevent } = usePreventLeave();
3129
const { connectedUsers, appendUser, removeUser } = connectedUsersStore();
30+
const myuid = localStorage.getItem('uid');
3231

3332
useEffect(() => {
33+
const videoSocket = io(process.env.REACT_APP_SOCKET_VIDEO_URL as string);
34+
3435
videoSocket.on('connect', () => {
35-
console.log('video socket connected');
36-
const payload = { room: roomId, uid: localStorage.getItem('uid') };
37-
console.log('payload', payload);
36+
console.log('socket server connected.');
37+
const payload = { room: roomId, uid: myuid };
3838
videoSocket.emit('joinRoom', payload);
3939
});
4040

@@ -78,7 +78,7 @@ export default function Room() {
7878
removeUser(user.socketId);
7979
});
8080
socketInit();
81-
emitJoinChatRoom(roomId, uid);
81+
emitJoinChatRoom(roomId, myuid);
8282
onJoinedRoom(receiveJoin);
8383
onChatMessage(receiveMessage);
8484
onLeftRoom();
@@ -146,7 +146,7 @@ export default function Room() {
146146
<Component>
147147
<Header />
148148
<Contents>
149-
<ScreenShare />
149+
<ScreenShare messages={messages} />
150150
<Sidebar messages={messages} />
151151
</Contents>
152152
</Component>

0 commit comments

Comments
 (0)