HomePage.js 8.98 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';
Choi Ga Young's avatar
탭 색    
Choi Ga Young committed
12
import "./Home.css"
우지원's avatar
ul    
우지원 committed
13

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

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

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

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

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

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

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

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

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

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

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

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

Soo Hyun Kim's avatar
Soo Hyun Kim committed
87
  async function exitRoom(roomId) {
Choi Ga Young's avatar
퇴장    
Choi Ga Young committed
88
89
    const response = await axios.get('/users/check', { params: { '_id': userId } })
    const userNick = response.data.nickname;
Soo Hyun Kim's avatar
Soo Hyun Kim committed
90
    await axios.put('/room/deleteMem', { userId: userId, roomId: roomId })
Choi Ga Young's avatar
퇴장    
Choi Ga Young committed
91
    setSysmsg(`${userNick}님이 나갔습니다.`)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
92
93
    setRoomCode("")
  }
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
          <Sdiv chat={chat}>
Choi Ga Young's avatar
탭 색    
Choi Ga Young committed
183
            <Tabs defaultActiveKey="closed" id="uncontrolled-tab-example"  >
Soo Hyun Kim's avatar
Soo Hyun Kim committed
184
185
186
187
188
189
190
191
              <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;