HomePage.js 9.26 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
92
    setRoomCode("")
  }
JeongYeonwoo's avatar
JeongYeonwoo committed
93

94
95
96
97
98
99
100
101
102
103
104
  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)
  }

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

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

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

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

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

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

  return (
Soo Hyun Kim's avatar
Soo Hyun Kim committed
177
178
179
    <div style={{ weight: "100vw", height: "100vh", backgroundColor: "" }}>
      <Menu style={{ weight: "100%", height: "10%" }} />
      <Row className="mr-0" style={{ weight: "100%", height: "80%" }}>
JeongYeonwoo's avatar
JeongYeonwoo committed
180
        <Col className="list" md={5}>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
181
182
183
184
185
186
187
188
189
190
          <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
191
        </Col>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
192
        <Col style={{ padding: "5px", marginLeft: "15px" }}>
우지원's avatar
오픈    
우지원 committed
193
194
          {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} />
195
              : <div style={{ position: "fixed", bottom: "20px", right: "30px" }}>
196
197
                <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
198
              </div>} </>
우지원's avatar
우지원 committed
199
200
            : <> {open ? 
            <div className="vh-90 flex-column align-items-center justify-content-center mt-2" variant="dark">
우지원's avatar
오픈    
우지원 committed
201
              <div className="d-flex justify-content-center">
우지원's avatar
우지원 committed
202
                <div className="mt-5 p-5 mr-2" style={{ display: "flex", flexDirection: "column", borderStyle: "solid", borderRadius: "5px", borderColor: "#4A5D7E", backgroundColor: "#FFFFFF", padding: '15px', position: "relative" }}>
우지원's avatar
오픈    
우지원 committed
203
204
205
206
207
208
209
210
                  <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} />
Soo Hyun Kim's avatar
Soo Hyun Kim committed
221
    </div>
JeongYeonwoo's avatar
JeongYeonwoo committed
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;