HomePage.js 9.63 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';
우지원's avatar
ul    
우지원 committed
3
4
import ClosedList from '../Components/ClosedList';
import OpenList from '../Components/OpenList';
Choi Ga Young's avatar
Choi Ga Young committed
5
import Menu from '../Components/Menu';
6
import { io } from "socket.io-client";   //모듈 가져오기
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
7
import Chat from "../Components/Chat";
Soo Hyun Kim's avatar
Soo Hyun Kim committed
8
9
import RoomMake from "../Components/RoomMake"
import EnterRoom from "../Components/EnterRoom"
우지원's avatar
우지원 committed
10
import axios from 'axios';
우지원's avatar
ul    
우지원 committed
11

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

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

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

36
37
38
  const [checknew, setChecknew] = useState('')
  const [unreadnumber, setUnreadnumber] = useState(INIT_UNREAD)

JeongYeonwoo's avatar
JeongYeonwoo committed
39
  const [showModal, setShowModal] = useState(false);
Choi Ga Young's avatar
dmdk    
Choi Ga Young committed
40
  const [showEnter, setShowEnter] = useState(false);
JeongYeonwoo's avatar
JeongYeonwoo committed
41
  const [chat, setChat] = useState(false);
42
43
  const [open, setOpen] = useState(false);
  const [room, setRoom] = useState(INIT_ROOM)
44
  const [show, setShow] = useState(false)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
45

JeongYeonwoo's avatar
JeongYeonwoo committed
46
47
48
49
  //소켓
  const [singleChat, setSingleChat] = useState('')
  const [recievedMsg, setRecievedMsg] = useState('')
  const [roomCode, setRoomCode] = useState('')
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
50
  const [sysmsg, setSysmsg] = useState('')
Soo Hyun Kim's avatar
Soo Hyun Kim committed
51
  const [roomName, setRoomName] = useState('')
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
52

JeongYeonwoo's avatar
JeongYeonwoo committed
53
54
  const [singleUser, setSingleUser] = useState('')
  const [recievedUser, setRecievedUser] = useState('')
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
55

JeongYeonwoo's avatar
JeongYeonwoo committed
56
57
58
  const [singleImg, setSingleImg] = useState('')
  const [recievedImg, setRecievedImg] = useState('')

59
60
61
  const [singleTime, setSingleTime] = useState('')
  const [recievedTime, setRecievedTime] = useState('')

JeongYeonwoo's avatar
JeongYeonwoo committed
62
63
  const handleCloseModal = () => setShowModal(false);
  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
75
    socket.emit('joinRoom', rCode)
    socket.emit('newUser', { rmIf: rCode, userInfo: userName })
    console.log(`joinRoom : ${rCode} 입장`)
76
    //여기서 채팅 불러와서 넘겨주던가 해야할거 같은데
77
    console.log('HomePage/enterChatRoom 끝났습니다')
78
  }
Soo Hyun Kim's avatar
Soo Hyun Kim committed
79

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

85

Soo Hyun Kim's avatar
Soo Hyun Kim committed
86
87
88
89
90
  async function exitRoom(roomId) {
    await axios.put('/room/deleteMem', { userId: userId, roomId: roomId })
    console.log(`${roomId}${userId} 탈퇴`)
    setRoomCode("")
  }
JeongYeonwoo's avatar
JeongYeonwoo committed
91

92
93
94
  async function getClosedList() {
    const userid = sessionStorage.getItem('userId')
    let res = await axios.get('/room/closedlist', { params: { '_id': userid } })
95
    // console.log('getClosedList',res.data)
96
97
98
99
100
    setClosedList(res.data)
  }

  async function getOpenList() {
    let res = await axios.get('/room/openlist')
101
    // console.log('getOpenlist', res.data)
102
103
104
    setOpenlist(res.data)
  }

105
106
107
108
109
  //오픈채팅방에서 참가하기
  async function openListroom(roomId) {
    console.log(roomId)
    const roomInf = await axios.get('/room/changeMem', { params: { 'roomId': roomId } })
    setRoom(roomInf.data[0])
110
    setOpen(true)
111
112
113
114
115
116
    setShow(false)
  }

  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
117
118
    const response = await axios.get('/users/check', { params: { '_id': userId } })
    const userNick = response.data.nickname;
119
120
    if (tf.data) {
      alert('참가되었습니다.')
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
121
      setSysmsg(`${userNick}님이 들어왔습니다.`)
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
167
      socket.emit("chat", {
        roomInfo: roomCode,
        sendInfo: {
          msg: sysmsg,
          sender: "system",
          // time: singleTime
        }
      })
      setSysmsg('')
    }
  }, [sysmsg])

168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207


  // const INIT_LEFT = {
  //   userId: '',
  //   roomCode: '',
  //   now: '',
  // }
  // const [leftInfo, setLeftInfo] = useState(INIT_LEFT)
  let leaveInfo = []
  async function unreadMessage() {
    const userId = sessionStorage.getItem('userId')
    try {
      for (let i = 0; i < closedlist.length; i++) {
        leaveInfo.push({ userId: userId, roomCode: closedlist[i].roomId, now: 0 })
      }
      // setLeftInfo(leaveInfo)
      for (let i = 0; i < closedlist.length; i++) {
        if (leaveInfo[i].roomCode === roomCode) {
          // setLeftInfo(leftInfo[i].now='보는중')
          leaveInfo[i].now = '보는중'   // 방 나가면 안 보는중으로 하기 위해 0으로 바꾸기!!!!!@@@@@@@@@@
          //usestate로 해보기@@@@@@
          console.log(i, '아아아아아아아아')
        } else {
          leaveInfo[i].now = 0
        }
      }
      // leaveInfo[0].now='시발'

      console.log('클ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ', leaveInfo)

      setUnreadnumber([''])
      const respond = await axios.get('/room/unreadMessage', { params: leaveInfo })
      console.log('~~~~~~~~~~~~~~~~~~~~~~~~~', respond.data)

      setUnreadnumber(respond.data)
    } catch (error) {
      console.log(error)
    }
  }

JeongYeonwoo's avatar
JeongYeonwoo committed
208
  useEffect(() => {
Choi Ga Young's avatar
Choi Ga Young committed
209
    socket.on("sendedMSG", (sendInfo) => {
210
      setRecievedTime(sendInfo.time)
JeongYeonwoo's avatar
JeongYeonwoo committed
211
212
213
      setRecievedImg(sendInfo.img)
      setRecievedUser(sendInfo.sender)
      setRecievedMsg(sendInfo.msg)
214
215
216
217
    })
    socket.on('checking', (check) => {
      console.log('클라이언트', check)
      setChecknew(check)
Choi Ga Young's avatar
Choi Ga Young committed
218
    })
JeongYeonwoo's avatar
JeongYeonwoo committed
219
220
221
222
223
224
225
  }, [])

  return (
    <>
      <Menu />
      <Row className="mr-0">
        <Col className="list" md={5}>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
226
          <Tabs defaultActiveKey="closed" id="uncontrolled-tab-example" >
JeongYeonwoo's avatar
JeongYeonwoo committed
227
            <Tab eventKey="closed" title="내 채팅" onClick={handleChato} >
228
              <ClosedList checknew={checknew} unreadMessage={unreadMessage} unreadnumber={unreadnumber} setUnreadnumber={setUnreadnumber} setChecknew={setChecknew} closedlist={closedlist} userId={userId} singleChat={singleChat} recievedMsg={recievedMsg} enterChatRoom={enterChatRoom} setRoomCode={setRoomCode} setRoomName={setRoomName} roomCode={roomCode} closeChatRoom={closeChatRoom} />
JeongYeonwoo's avatar
JeongYeonwoo committed
229
            </Tab>
Choi Ga Young's avatar
dmdk    
Choi Ga Young committed
230
            <Tab eventKey="open" title="공개방" onClick={handleChatc}>
231
              <OpenList openlist={openlist} enterChatRoom={enterChatRoom} openListroom={openListroom} setRoomCode={setRoomCode} setRoomName={setRoomName} roomCode={roomCode} closeChatRoom={closeChatRoom} />
JeongYeonwoo's avatar
JeongYeonwoo committed
232
233
234
235
            </Tab>
          </Tabs>
        </Col>
        <Col style={{ padding: "0" }}>
236
237
238
          <>
            {(show || chat) ?
              null
239
240
241
              : <div style={{ position: "fixed", bottom: "20px", right: "30px" }}>
                <Button variant="primary" onClick={handleShowModal} size="lg" block>생성</Button>
                <Button variant="secondary" onClick={handleShowEnter} size="lg" block>참가</Button>
242
243
244
              </div>
            }
            {chat ?
245
              <Chat leaveInfo={leaveInfo} handleChatc={handleChatc} 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} closedlist={closedlist}/>
246
              : null}
247
            {open ?
248
249
250
251
252
253
254
255
256
257
258
              <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-warning" size="sm" className="mr-4" onClick={enterButton}>뒤로가기</Button>
                      <Button variant="outline-warning" size="sm" className="ml-4" type='submit' onClick={attendListRoom}>참가</Button>
                    </Row>
259
                  </div>
260
261
262
263
                </div>
              </div>
              : null}
          </>
JeongYeonwoo's avatar
JeongYeonwoo committed
264
265
266
        </Col>
      </Row>
      <RoomMake showModal={showModal} handleCloseModal={handleCloseModal} />
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
267
      <EnterRoom showEnter={showEnter} enterChatRoom={enterChatRoom} handleCloseEnter={handleCloseEnter} handleChato={handleChato} setRoomCode={setRoomCode} setRoomName={setRoomName} sysmsg={sysmsg} setSysmsg={setSysmsg} />
JeongYeonwoo's avatar
JeongYeonwoo committed
268
269
    </>
  );
우지원's avatar
ul    
우지원 committed
270
271
272
}

export default Home;
273