Chat.js 7.84 KB
Newer Older
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
1
import axios from 'axios';
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
2
import React, { useState, useEffect } from 'react';
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
3
4
5
import { Form, Button, Row, Image, Col, Container } from 'react-bootstrap';
import { isAuthenticated } from '../utils/auth';
import catchErrors from '../utils/catchErrors';
우지원's avatar
ul    
우지원 committed
6

JeongYeonwoo's avatar
JeongYeonwoo committed
7
8
9
10
11
12
13

const INIT_CHAT = {
  msg: '',
  sender: '',
  img: '',
  time: ''
}
우지원's avatar
ul    
우지원 committed
14
function Chat(props) {
JeongYeonwoo's avatar
JeongYeonwoo committed
15
16
  const [sender, setSender] = useState([])

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
17
  const [inner, setInner] = useState([''])
JeongYeonwoo's avatar
JeongYeonwoo committed
18
  const [chat, setChat] = useState([INIT_CHAT])   //object로 key는 보낸사람 value는 메세지
JeongYeonwoo's avatar
JeongYeonwoo committed
19
20

  const [img, setImg] = useState([])
21
22
23
24
25
  const [time, setTime] = useState([''])
  const simpleTime = new Date().toLocaleTimeString()
  const usualTime = simpleTime.substring(0, simpleTime.length - 3)
  const realTime = new Date().toISOString()

Choi Ga Young's avatar
Choi Ga Young committed
26
27
28
29
  const [disabled, setDisabled] = useState(true)
  const [user, setUser] = useState('')
  const [error, setError] = useState('');

Soo Hyun Kim's avatar
Soo Hyun Kim committed
30
  const [exit, setExit] = useState(false);
Choi Ga Young's avatar
Choi Ga Young committed
31
32

  const userId = isAuthenticated()
Soo Hyun Kim's avatar
Soo Hyun Kim committed
33

Choi Ga Young's avatar
Choi Ga Young committed
34
35
36
37
38
39
40
41
  async function getProfile(userId) {
    try {
      const response = await axios.get(`/users/${userId}`)
      setUser(response.data)
    } catch (error) {
      catchErrors(error, setError)
    }
  }
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
42

43
44
  function handleChange(e) {
    e.preventDefault()
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
45
    setInner(e.target.value)
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
46
    setDisabled(false)
JeongYeonwoo's avatar
JeongYeonwoo committed
47
    console.log(chat)
48
49
50
  }

  function sendMsgCH(e) {
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
51
    e.preventDefault()
JeongYeonwoo's avatar
JeongYeonwoo committed
52

53
    props.setSingleTime(usualTime)
JeongYeonwoo's avatar
JeongYeonwoo committed
54
55
    props.setSingleImg(user.profileimg)
    props.setSingleUser(user.nickname)
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
56
    props.setSingleChat(inner)
57
    props.sendMsg(e)
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
58
    setInner('')
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
59
    setDisabled(true)
60
  }
Choi Ga Young's avatar
Choi Ga Young committed
61

Choi Ga Young's avatar
Choi Ga Young committed
62
  function handleClick() {
Soo Hyun Kim's avatar
Soo Hyun Kim committed
63
    props.closeChatRoom(props.roomCode)
Choi Ga Young's avatar
Choi Ga Young committed
64
    props.setRecievedMsg('')
Choi Ga Young's avatar
Choi Ga Young committed
65
    props.handleChatc()
66
    props.setLeaveInfo([...props.leaveInfo, { roomName: props.roomCode, leaveTime: realTime }])
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
67
    console.log('나간시간', realTime, usualTime)
JeongYeonwoo's avatar
JeongYeonwoo committed
68
    setChat([''])
69
    props.handleChatc()
JeongYeonwoo's avatar
JeongYeonwoo committed
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
    // console.log("22222222222222222", props.leaveInfo)

    // let find1 = props.leaveInfo.findIndex((ele) => ele.roomName === props.roomCode)
    // console.log("33333333333333333", find1)

    // let find=0
    // for(let i=0;i<=props.leaveInfo.length-1;i++){
    //   if(props.leaveInfo[i].roomName===props.roomCode){
    //     find = i
    //     break;
    //   }
    //   console.log('찾자',find)
    // }

    // if (props.leaveInfo[find1]) {
    //   props.setLeaveInfo(props.leaveInfo[find1] = { roomName: props.roomCode, leaveTime: realTime })
    //   console.log('트루')
    // } else {
    //   props.setLeaveInfo([...props.leaveInfo, { roomName: props.roomCode, leaveTime: realTime }])
    //   console.log('폴스')
    // }
    // console.log('나간다', props.leaveInfo)
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  }

  function settingtime(hour) {
    let newhour = parseInt(hour) + 9
    if (newhour >= 24) {
      newhour -= 24
    }
    if (newhour >= 13) {
      newhour -= 12
      newhour = '오후 ' + newhour
    } else {
      newhour = '오전 ' + newhour
    }
    return newhour
  }

  //이전 채팅 내용에 대한 것 불러오기
  //프사 닉네임 메세지가 각각의 배열로 들어가서 띄워지는 방식
  async function getPreviousChat() {
    //메세지, 닉네임, 시간 불러오기
    const respond = await axios.get('/room/getChatInfo', { params: { 'roomCode': props.roomCode } })
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
113
    console.log(respond)
114
    const info = respond.data
JeongYeonwoo's avatar
JeongYeonwoo committed
115
116
117

    let intochat = []
    let msglist = []
118
    let userlist = []
JeongYeonwoo's avatar
JeongYeonwoo committed
119
    let hourlist = []
120
    let imglist = []
JeongYeonwoo's avatar
JeongYeonwoo committed
121
122
123
124
125
126
    for (let prop in info) {
      let hour = info[prop].createdAt.split('T')[1].split(':')
      hour = settingtime(hour[0]) + ':' + hour[1]
      msglist.push(info[prop].message)
      userlist.push(info[prop].username)
      hourlist.push(hour)
127
128
    }
    const respond2 = await axios.get('/room/getProfileImage', { params: { 'userlist': userlist } })
JeongYeonwoo's avatar
JeongYeonwoo committed
129
130
131
132
    imglist = respond2.data
    console.log('확인해보자', imglist)
    for (let i = 0; i < msglist.length; i++) {
      intochat.push({ msg: msglist[i], sender: userlist[i], img: imglist[i].profileimg, time: hourlist[i] })
133
    }
JeongYeonwoo's avatar
JeongYeonwoo committed
134
    setChat(intochat)
Choi Ga Young's avatar
Choi Ga Young committed
135
136
  }

Soo Hyun Kim's avatar
Soo Hyun Kim committed
137
138
139
140
141
142
143
  async function exitAndCloseRoom(){
    props.exitRoom(props.roomCode)
    setExit(false)
    props.handleChatc()
  }
  

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
144
145
146
  useEffect(() => {
    getProfile(userId)
  }, [userId])
147

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
148
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
149
    setChat([...chat, { msg: props.singleChat, sender: props.singleUser, img: props.singleImg, time: props.singleTime }])
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
150
  }, [props.singleChat])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
151

Soo Hyun Kim's avatar
Soo Hyun Kim committed
152
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
153
    setChat([...chat, { msg: props.recievedMsg, sender: props.recievedUser, img: props.recievedImg, time: props.recievedTime }])
Soo Hyun Kim's avatar
Soo Hyun Kim committed
154
155
  }, [props.recievedMsg])

156
  useEffect(() => {
Soo Hyun Kim's avatar
Soo Hyun Kim committed
157
    getRoomName(props.roomCode)
158
    getPreviousChat()
JeongYeonwoo's avatar
JeongYeonwoo committed
159
    // console.log('겟 룸네임', chat)
160
161
162
  }, [props.roomCode])


우지원's avatar
ul    
우지원 committed
163
  return (
JeongYeonwoo's avatar
JeongYeonwoo committed
164
165
    <>
      <Container id="chat" style={{ overflow: 'auto', padding: '20px', border: "2px solid", height: "500px", margin: "1%", borderColor: "#BDBDBD", background: '' }}>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
166
        <Row className="justify-content-center" style={{ border: "2px solid", borderWidth: "medium", borderColor: "#FFD75F", height: "80px" }}>
167
          <Col md="auto">
Choi Ga Young's avatar
dmdk    
Choi Ga Young committed
168
            <Button variant="light" onClick={handleClick} >{`<`}</Button>
169
170
          </Col>
          <Col>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
171
            <Row style={{ fontWeight: "bold", fontSize: "x-large" }}> {props.roomName} </Row>
172
173
            <Row > {props.roomCode} </Row>
          </Col>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
174
175
          <Col md="auto">
            <Button variant="light" onClick={() => setExit(true)}>{'='}</Button>
176
177
          </Col>
        </Row>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
178
179
180
181
182
183
        {exit ?
          <Row>
            <Col>퇴장하시겠습니까?</Col>
            <Col md="auto"><Button variant="light" onClick={exitAndCloseRoom}>{"나가기"}</Button></Col>
          </Row>
          : null}
184
        <p>{props.newUser}님이 입장하셨습니다.</p>
JeongYeonwoo's avatar
JeongYeonwoo committed
185
        {chat.map((value, index) => {
186
          if (!(value.msg === '')) {
JeongYeonwoo's avatar
JeongYeonwoo committed
187
            if (!(value.sender === user.nickname)) {
JeongYeonwoo's avatar
JeongYeonwoo committed
188
189
190
              return (
                <Row key={index} className='m-1' >
                  <Col xs={2}>
JeongYeonwoo's avatar
JeongYeonwoo committed
191
                    <Image src={value.img && `/images/${value.img}`} style={{ width: "50px", height: "50px" }} roundedCircle />
JeongYeonwoo's avatar
JeongYeonwoo committed
192
193
                  </Col>
                  <Col xs={8}>
JeongYeonwoo's avatar
JeongYeonwoo committed
194
                    <Row><strong>{value.sender}</strong></Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
195
                    <Row className='d-flex flex-wrap-nowrap'>
JeongYeonwoo's avatar
JeongYeonwoo committed
196
197
                      <Row className='border border-dark' style={{ width: 'max-content', maxWidth: '300px', height: 'auto', paddingLeft: '15px', paddingRight: '15px', background: 'white', borderRadius: '5px', fontSize: 'x-large' }}>{value.msg}</Row>
                      <Col className='ml-1'>{value.time}</Col>
JeongYeonwoo's avatar
JeongYeonwoo committed
198
199
                    </Row>
                  </Col>
200
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
201
              )
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
202
            } else if (sender[index] === "") {
JeongYeonwoo's avatar
JeongYeonwoo committed
203
              return (
Choi Ga Young's avatar
xxxxx    
Choi Ga Young committed
204
205
206
207
                { value }
              )
            } else {
              return ( //내가 보낸 메시지
JeongYeonwoo's avatar
JeongYeonwoo committed
208
209
                <Row key={index} className='m-1 justify-content-end'>
                  <Row className='d-flex flex-wrap-nowrap' >
JeongYeonwoo's avatar
JeongYeonwoo committed
210
211
                    <Col className='mr-1'>{value.time}</Col>
                    <Row className='mr-2' name='msg' style={{ width: 'max-content', maxWidth: '300px', height: 'auto', paddingLeft: '15px', paddingRight: '15px', background: 'yellow', borderRadius: '3px', fontSize: 'x-large' }}>{value.msg}</Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
212
                  </Row>
213
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
214
215
216
217
              )
            }
          } else {
            return null
JeongYeonwoo's avatar
JeongYeonwoo committed
218
          }
JeongYeonwoo's avatar
JeongYeonwoo committed
219
        })
220
        }
Choi Ga Young's avatar
Choi Ga Young committed
221

JeongYeonwoo's avatar
JeongYeonwoo committed
222
      </Container >
223
224
      <Form onSubmit={sendMsgCH} fluid>
        <Form.Group className='d-flex flex-wrap-nowrap justify-content-center m-3'>
Choi Ga Young's avatar
x    
Choi Ga Young committed
225
          <Form.Control className='border border-warning' name='chat' type="text" value={inner} onChange={handleChange} style={{ width: '85%', position: 'fixed' }} />
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
226
227
          <Button variant="warning" type="submit" disabled={disabled} style={{ width: '10%' }}>
            전송
JeongYeonwoo's avatar
JeongYeonwoo committed
228
          </Button>
우지원's avatar
ul    
우지원 committed
229
        </Form.Group>
230
      </Form>
JeongYeonwoo's avatar
JeongYeonwoo committed
231
    </>
우지원's avatar
ul    
우지원 committed
232
233
234
235
236


  );
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
237

우지원's avatar
ul    
우지원 committed
238
export default Chat;
JeongYeonwoo's avatar
JeongYeonwoo committed
239