HomePage.js 9.04 KB
Newer Older
Soo Hyun Kim's avatar
Soo Hyun Kim committed
1
import React, { useState, useEffect } from 'react';
Choi Ga Young's avatar
x    
Choi Ga Young committed
2
import { Row, Col, Button, Tabs, Tab } from 'react-bootstrap';
Soo Hyun Kim's avatar
Soo Hyun Kim committed
3
import styled from 'styled-components';
우지원's avatar
ul    
우지원 committed
4
5
import ClosedList from '../Components/ClosedList';
import OpenList from '../Components/OpenList';
Choi Ga Young's avatar
Choi Ga Young committed
6
import Menu from '../Components/Menu';
7
import { io } from "socket.io-client";   //모듈 가져오기
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
8
import Chat from "../Components/Chat";
Soo Hyun Kim's avatar
Soo Hyun Kim committed
9
10
import RoomMake from "../Components/RoomMake"
import EnterRoom from "../Components/EnterRoom"
우지원's avatar
우지원 committed
11
import axios from 'axios';
우지원's avatar
ul    
우지원 committed
12

13
const socket = io();
우지원's avatar
ul    
우지원 committed
14

우지원's avatar
우지원 committed
15
const INIT_ROOM = {
16
17
18
19
  roomName: '',
  interest: '',
  roomId: '',
  member: '',
우지원's avatar
우지원 committed
20
}
21
22
23
24
25
26
27
const INIT_LIST = [{
  interest: '',
  isOpen: '',
  memeber: [],
  roomId: '',
  roomName: '',
}]
우지원's avatar
우지원 committed
28

우지원's avatar
ul    
우지원 committed
29
function Home() {
30
  const userName = sessionStorage.getItem('name')
Choi Ga Young's avatar
x    
Choi Ga Young committed
31
  const userId = sessionStorage.getItem('userId')
32

JeongYeonwoo's avatar
JeongYeonwoo committed
33
  const [showModal, setShowModal] = useState(false);
Choi Ga Young's avatar
dmdk    
Choi Ga Young committed
34
  const [showEnter, setShowEnter] = useState(false);
JeongYeonwoo's avatar
JeongYeonwoo committed
35
  const [chat, setChat] = useState(false);
36
37
  const [open, setOpen] = useState(false);
  const [room, setRoom] = useState(INIT_ROOM)
38
  const [show, setShow] = useState(false)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
39

JeongYeonwoo's avatar
JeongYeonwoo committed
40
41
42
43
  //소켓
  const [singleChat, setSingleChat] = useState('')
  const [recievedMsg, setRecievedMsg] = useState('')
  const [roomCode, setRoomCode] = useState('')
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
44
  const [sysmsg, setSysmsg] = useState('')
Soo Hyun Kim's avatar
Soo Hyun Kim committed
45
  const [roomName, setRoomName] = useState('')
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
46

JeongYeonwoo's avatar
JeongYeonwoo committed
47
48
  const [singleUser, setSingleUser] = useState('')
  const [recievedUser, setRecievedUser] = useState('')
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
49

JeongYeonwoo's avatar
JeongYeonwoo committed
50
51
52
  const [singleImg, setSingleImg] = useState('')
  const [recievedImg, setRecievedImg] = useState('')

53
54
  const [singleTime, setSingleTime] = useState('')
  const [recievedTime, setRecievedTime] = useState('')
55
  const [leaveInfo, setLeaveInfo] = useState([{ roomName: "", leaveTime: "" }])
56

Choi Ga Young's avatar
Choi Ga Young committed
57
58
59
60
61
62
  const handleCloseModal = () => {
    setShowModal(false);
    getClosedList()
    getOpenList()

  }
JeongYeonwoo's avatar
JeongYeonwoo committed
63
  const handleShowModal = () => setShowModal(true);
64
65
  const handleCloseEnter = () => setShowEnter(false);
  const handleShowEnter = () => setShowEnter(true);
JeongYeonwoo's avatar
JeongYeonwoo committed
66
67
  const handleChato = () => setChat(true);
  const handleChatc = () => setChat(false);
68
69
  const [closedlist, setClosedList] = useState(INIT_LIST);
  const [openlist, setOpenlist] = useState([])
70

71
  //SOCKET 관련 시작
Choi Ga Young's avatar
x    
Choi Ga Young committed
72
  async function enterChatRoom(rCode) {    //방 입장하기
73
74
    socket.emit('joinRoom', rCode)
    socket.emit('newUser', { rmIf: rCode, userInfo: userName })
우지원's avatar
오픈    
우지원 committed
75
    setShow(true)
76
    console.log(`joinRoom : ${rCode} 입장`)
우지원's avatar
오픈    
우지원 committed
77
    console.log('show:', show)
78
    //여기서 채팅 불러와서 넘겨주던가 해야할거 같은데
79
  }
Soo Hyun Kim's avatar
Soo Hyun Kim committed
80

Soo Hyun Kim's avatar
Soo Hyun Kim committed
81
82
83
84
  function closeChatRoom(rCode) {
    socket.emit('closeRoom', rCode)
    console.log(`${rCode}방 보기 중단`)
  }
Choi Ga Young's avatar
Choi Ga Young committed
85

Soo Hyun Kim's avatar
Soo Hyun Kim committed
86
  async function exitRoom(roomId) {
Choi Ga Young's avatar
퇴장    
Choi Ga Young committed
87
88
    const response = await axios.get('/users/check', { params: { '_id': userId } })
    const userNick = response.data.nickname;
Soo Hyun Kim's avatar
Soo Hyun Kim committed
89
    await axios.put('/room/deleteMem', { userId: userId, roomId: roomId })
Choi Ga Young's avatar
퇴장    
Choi Ga Young committed
90
    setSysmsg(`${userNick}님이 나갔습니다.`)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
91
    setRoomCode("")
우지원's avatar
오픈    
우지원 committed
92
    const response = await axios.get('/users/check', { params: { '_id': userId } })
Soo Hyun Kim's avatar
Soo Hyun Kim committed
93
  }
JeongYeonwoo's avatar
JeongYeonwoo committed
94

95
96
97
98
99
100
101
102
103
104
105
  async function getClosedList() {
    const userid = sessionStorage.getItem('userId')
    let res = await axios.get('/room/closedlist', { params: { '_id': userid } })
    setClosedList(res.data)
  }

  async function getOpenList() {
    let res = await axios.get('/room/openlist')
    setOpenlist(res.data)
  }

106
107
108
109
  async function openListroom(roomId) {
    const roomInf = await axios.get('/room/changeMem', { params: { 'roomId': roomId } })
    setRoom(roomInf.data[0])
    setShow(false)
우지원's avatar
오픈    
우지원 committed
110
    setOpen(true)
111
  }
Choi Ga Young's avatar
Choi Ga Young committed
112
  //오픈채팅방에서 참가하기
113
114
115
  async function attendListRoom() {
    const roomId = room.roomId
    const tf = await axios.put('/room/changeMem', { userId: userId, roomId: roomId })
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
116
117
    const response = await axios.get('/users/check', { params: { '_id': userId } })
    const userNick = response.data.nickname;
118
119
    if (tf.data) {
      alert('참가되었습니다.')
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
120
      setSysmsg(`${userNick}님이 들어왔습니다.`)
Choi Ga Young's avatar
Choi Ga Young committed
121
      getClosedList()
122
123
    } else {
      alert('이미 참가된 방입니다.')
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
124
    }
125
126
127
128
129
  }

  function enterButton() {
    setOpen(false)
  }
Choi Ga Young's avatar
Choi Ga Young committed
130
131
132
133
  const sendMsg = (e) => {
    e.preventDefault()
  }

134
135
136
137
  useEffect(() => {
    getClosedList();
    getOpenList();
  }, [roomCode]);
Choi Ga Young's avatar
Choi Ga Young committed
138

JeongYeonwoo's avatar
JeongYeonwoo committed
139
  useEffect(() => {
Choi Ga Young's avatar
Choi Ga Young committed
140
    if (!(singleChat === "")) {
JeongYeonwoo's avatar
JeongYeonwoo committed
141
142
      socket.emit("chat", {
        roomInfo: roomCode,
143
144
145
        sendInfo: {
          msg: singleChat,
          sender: singleUser,
146
147
          img: singleImg,
          time: singleTime
148
        }
JeongYeonwoo's avatar
JeongYeonwoo committed
149
      })
Soo Hyun Kim's avatar
Soo Hyun Kim committed
150
      setSingleChat("")
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
151
    }
JeongYeonwoo's avatar
JeongYeonwoo committed
152
  }, [singleChat])
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
153

Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
154
  useEffect(() => {
Choi Ga Young's avatar
Choi Ga Young committed
155
    if (!(sysmsg === '')) {
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
156
157
158
159
160
161
162
163
164
165
166
      socket.emit("chat", {
        roomInfo: roomCode,
        sendInfo: {
          msg: sysmsg,
          sender: "system",
        }
      })
      setSysmsg('')
    }
  }, [sysmsg])

JeongYeonwoo's avatar
JeongYeonwoo committed
167
  useEffect(() => {
Choi Ga Young's avatar
Choi Ga Young committed
168
    socket.on("sendedMSG", (sendInfo) => {
169
      setRecievedTime(sendInfo.time)
JeongYeonwoo's avatar
JeongYeonwoo committed
170
171
172
      setRecievedImg(sendInfo.img)
      setRecievedUser(sendInfo.sender)
      setRecievedMsg(sendInfo.msg)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
173
      console.log(sendInfo.msg)
Choi Ga Young's avatar
Choi Ga Young committed
174
    })
JeongYeonwoo's avatar
JeongYeonwoo committed
175
176
177
178
179
180
  }, [])

  return (
    <>
      <Menu />
      <Row className="mr-0">
Choi Ga Young's avatar
Choi Ga Young committed
181
        <Col className="list" md={5} style={{ overflow: 'auto', height: "80%" }}>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
182
183
184
185
186
187
188
189
190
191
          <Sdiv chat={chat}>
            <Tabs defaultActiveKey="closed" id="uncontrolled-tab-example" >
              <Tab eventKey="closed" title="내 채팅" onClick={handleChato} >
                <ClosedList closedlist={closedlist} singleChat={singleChat} recievedMsg={recievedMsg} leaveInfo={leaveInfo} setLeaveInfo={setLeaveInfo} enterChatRoom={enterChatRoom} setRoomCode={setRoomCode} setRoomName={setRoomName} roomCode={roomCode} closeChatRoom={closeChatRoom} />
              </Tab>
              <Tab eventKey="open" title="공개방" onClick={handleChatc}>
                <OpenList openlist={openlist} enterChatRoom={enterChatRoom} openListroom={openListroom} setRoomCode={setRoomCode} setRoomName={setRoomName} roomCode={roomCode} closeChatRoom={closeChatRoom} />
              </Tab>
            </Tabs>
          </Sdiv>
JeongYeonwoo's avatar
JeongYeonwoo committed
192
        </Col>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
193
        <Col style={{ padding: "5px", marginLeft: "15px" }}>
우지원's avatar
오픈    
우지원 committed
194
195
          {show ? <>
            {chat ? <Chat handleChatc={handleChatc} leaveInfo={leaveInfo} setLeaveInfo={setLeaveInfo} sendMsg={sendMsg} singleChat={singleChat} singleUser={singleUser} singleImg={singleImg} singleTime={singleTime} recievedMsg={recievedMsg} recievedUser={recievedUser} recievedImg={recievedImg} recievedTime={recievedTime} setSingleChat={setSingleChat} setSingleUser={setSingleUser} setSingleImg={setSingleImg} setSingleTime={setSingleTime} setRecievedMsg={setRecievedMsg} roomCode={roomCode} roomName={roomName} closeChatRoom={closeChatRoom} exitRoom={exitRoom} />
196
              : <div style={{ position: "fixed", bottom: "20px", right: "30px" }}>
197
198
                <Button style={{ borderColor: "#9174ad", backgroundColor: "#9174ad", color: 'white' }} onClick={handleShowModal} size="lg" block>생성</Button>
                <Button style={{ borderColor: "#9174ad", backgroundColor: "#9174ad", color: 'white' }} onClick={handleShowEnter} size="lg" block>참가</Button>
우지원's avatar
오픈    
우지원 committed
199
200
201
202
203
204
205
206
207
208
209
210
              </div>} </>
            : <> {open ? <div className="vh-90 flex-column align-items-center justify-content-center mt-2" variant="dark">
              <div className="d-flex justify-content-center">
                <div className="mt-5 p-5 shadow w-75">
                  <h2 className="d-flex justify-content-center mb-3">현재 {room.roomName} 입니다.</h2>
                  <h5> 관심분야 : {room.interest}</h5>
                  <h5> 참여인원 : {room.member.length}</h5>
                  <h5 className="mb-3"> 방코드(방코드를 통해서도 참여할  있습니다.) : {room.roomId}</h5>
                  <Row className='justify-content-center'>
                    <Button variant="outline" style={{ border: "3px solid", borderColor: "#b49dc9" }} size="sm" className="mr-4" onClick={enterButton}>뒤로가기</Button>
                    <Button variant="outline" style={{ border: "3px solid", borderColor: "#b49dc9" }} size="sm" className="ml-4" type='submit' onClick={attendListRoom}>참가</Button>
                  </Row>
211
212
                </div>
              </div>
우지원's avatar
오픈    
우지원 committed
213
214
215
216
            </div> : <div style={{ position: "fixed", bottom: "20px", right: "30px" }}>
                <Button style={{ borderColor: "#9174ad", backgroundColor: "#9174ad", color: 'white' }} onClick={handleShowModal} size="lg" block>생성</Button>
                <Button style={{ borderColor: "#9174ad", backgroundColor: "#9174ad", color: 'white' }} onClick={handleShowEnter} size="lg" block>참가</Button>
              </div>} </>}
JeongYeonwoo's avatar
JeongYeonwoo committed
217
218
219
        </Col>
      </Row>
      <RoomMake showModal={showModal} handleCloseModal={handleCloseModal} />
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
220
      <EnterRoom showEnter={showEnter} enterChatRoom={enterChatRoom} handleCloseEnter={handleCloseEnter} handleChato={handleChato} setRoomCode={setRoomCode} setRoomName={setRoomName} sysmsg={sysmsg} setSysmsg={setSysmsg} />
JeongYeonwoo's avatar
JeongYeonwoo committed
221
222
    </>
  );
우지원's avatar
ul    
우지원 committed
223
224
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
225
226
227
const Sdiv = styled.div`
    @media screen and (max-width: 768px) {
     display: ${({ chat }) => {
Choi Ga Young's avatar
Choi Ga Young committed
228
229
    return chat === false ? 'block' : 'none'
  }}
Soo Hyun Kim's avatar
Soo Hyun Kim committed
230
231
232
   }
`

우지원's avatar
e    
우지원 committed
233
export default Home;