Chat.js 6.89 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
7

function Chat(props) {
JeongYeonwoo's avatar
JeongYeonwoo committed
8
9
  const [sender, setSender] = useState([])

Soo Hyun Kim's avatar
Soo Hyun Kim committed
10
  const [roomName, setRoomName] = useState('')
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
11
  const [inner, setInner] = useState([''])
Soo Hyun Kim's avatar
Soo Hyun Kim committed
12
  const [chat, setChat] = useState([])   //object로 key는 보낸사람 value는 메세지
JeongYeonwoo's avatar
JeongYeonwoo committed
13
14

  const [img, setImg] = useState([])
15
16
17
18
19
20
21
  const [time, setTime] = useState([''])
  const simpleTime = new Date().toLocaleTimeString()
  const usualTime = simpleTime.substring(0, simpleTime.length - 3)
  const realTime = new Date().toISOString()

const  r = Date.parse(realTime)

JeongYeonwoo's avatar
JeongYeonwoo committed
22

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
23
  const [disabled, setDisabled] = useState(true)
Choi Ga Young's avatar
Choi Ga Young committed
24
25
  const [user, setUser] = useState('')
  const [error, setError] = useState('');
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
26

Choi Ga Young's avatar
Choi Ga Young committed
27

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
28
29
30
31
32
33
34
35
36
37
  const userId = isAuthenticated()
  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
Soo Hyun Kim committed
38
39
40
  async function getRoomName(roomCode) {
    try {
      let res = await axios.get('/room/getRoomName', { params: { 'roomCode': roomCode } })
Soo Hyun Kim's avatar
Soo Hyun Kim committed
41
      console.log(res.data)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
42
43
44
45
46
47
      setRoomName(res.data)
    } catch (error) {
      catchErrors(error, setError)
    }
  }

48
49
  function handleChange(e) {
    e.preventDefault()
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
50
    setInner(e.target.value)
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
51
    setDisabled(false)
52
53
54
  }

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

57
    props.setSingleTime(usualTime)
JeongYeonwoo's avatar
JeongYeonwoo committed
58
59
    props.setSingleImg(user.profileimg)
    props.setSingleUser(user.nickname)
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
60
    props.setSingleChat(inner)
JeongYeonwoo's avatar
JeongYeonwoo committed
61

62
    props.sendMsg(e)
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
63
    setInner('')
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
64
    setDisabled(true)
65
    // console.log('보내기', chat)
66
  }
Choi Ga Young's avatar
Choi Ga Young committed
67

Choi Ga Young's avatar
Choi Ga Young committed
68
  function handleClick() {
69
70
71
72
73
    props.setRecievedMsg('')
    console.log('chat1', chat)
    setChat(['초기화  '])

    console.log('chat2', chat)
Choi Ga Young's avatar
Choi Ga Young committed
74
    props.handleChatc()
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
    props.setLeaveInfo([...props.leaveInfo, { roomName: props.roomCode, leaveTime: realTime }])
    console.log('나간시간',realTime, usualTime)
  }

  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 } })
    const info = respond.data
    let chatlist = []
    let userlist = []
    let timelist = []
    let imglist = []
    for (let i = 0; i <= info.length - 1; i++) {  //사용하려는 형식에 맞게 수정 
      chatlist = [...chatlist, info[i].message]
      userlist = [...userlist, info[i].username]
      timelist = [...timelist, info[i].createdAt]
      let hour = timelist[i].split('T')[1].split(':')
      timelist[i] = settingtime(hour[0]) + ':' + hour[1]
    }

    //그 nick에 맞는 프사 불러오기
    const respond2 = await axios.get('/room/getProfileImage', { params: { 'userlist': userlist } })
    const imginfo = respond2.data
    for (let j = 0; j <= imginfo.length - 1; j++) {
      imglist = [...imglist, imginfo[j][0].profileimg]
    }
    setChat(chatlist)
    setSender(userlist)
    setImg(imglist)
    setTime(timelist)
Choi Ga Young's avatar
Choi Ga Young committed
122
123
  }

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
124
125
126
  useEffect(() => {
    getProfile(userId)
  }, [userId])
127

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
128
  useEffect(() => {
129
    setTime([...time, props.singleTime])
JeongYeonwoo's avatar
JeongYeonwoo committed
130
    setImg([...img, props.singleImg])
JeongYeonwoo's avatar
JeongYeonwoo committed
131
    setSender([...sender, props.singleUser])
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
132
    setChat([...chat, props.singleChat])
JeongYeonwoo's avatar
JeongYeonwoo committed
133
  }, [props.singleChat])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
134

JeongYeonwoo's avatar
JeongYeonwoo committed
135
  useEffect(() => {
136
    setTime([...time, props.recievedTime])
JeongYeonwoo's avatar
JeongYeonwoo committed
137
    setImg([...img, props.recievedImg])
JeongYeonwoo's avatar
JeongYeonwoo committed
138
    setSender([...sender, props.recievedUser])
JeongYeonwoo's avatar
JeongYeonwoo committed
139
    setChat([...chat, props.recievedMsg])
JeongYeonwoo's avatar
JeongYeonwoo committed
140
  }, [props.recievedMsg])
Choi Ga Young's avatar
aa    
Choi Ga Young committed
141

142
143
144
145
  useEffect(() => {
    getPreviousChat()
  }, [props.roomCode])

Soo Hyun Kim's avatar
Soo Hyun Kim committed
146
147
  useEffect(() => {
    getRoomName(props.roomCode)
148
    console.log('겟 룸네임', chat)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
149
150
  }, [props.roomCode])

151

우지원's avatar
ul    
우지원 committed
152
  return (
JeongYeonwoo's avatar
JeongYeonwoo committed
153
154
    <>
      <Container id="chat" style={{ overflow: 'auto', padding: '20px', border: "2px solid", height: "500px", margin: "1%", borderColor: "#BDBDBD", background: '' }}>
JeongYeonwoo's avatar
dd    
JeongYeonwoo committed
155
        <Row className="d-flex justify-content-center" style={{ border: "2px solid", borderWidth: "medium", borderColor: "#FFD75F", height: "80px", margin: "1%" }}>
156
          <Col md="auto">
Choi Ga Young's avatar
dmdk    
Choi Ga Young committed
157
            <Button variant="light" onClick={handleClick} >{`<`}</Button>
158
159
160
          </Col>
          <Col>
            <Row style={{ fontWeight: "bold", fontSize: "x-large" }}> {roomName} </Row>
161
            <Row > {props.roomCode}</Row>
162
163
          </Col>
        </Row>
164
        <p>{props.newUser}님이 입장하셨습니다.</p>
JeongYeonwoo's avatar
JeongYeonwoo committed
165
166
167
168
169
170
171
172
173
174
175
176
        {chat.map((value, index) => {
          if (!(value == '')) {
            if (!(sender[index] === user.nickname)) {
              return (
                <Row key={index} className='m-1' >
                  <Col xs={2}>
                    <Image src={img && `/images/${img[index]}`} style={{ width: "50px", height: "50px" }} roundedCircle />
                  </Col>
                  <Col xs={8}>
                    <Row><strong>{sender[index]}</strong></Row>
                    <Row className='d-flex flex-wrap-nowrap'>
                      <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}</Row>
177
                      <Col className='ml-1'>{time[index]}</Col>
JeongYeonwoo's avatar
JeongYeonwoo committed
178
179
180
181
182
183
184
185
                    </Row>
                  </Col>
                </Row>
              )
            } else {
              return (
                <Row key={index} className='m-1 justify-content-end'>
                  <Row className='d-flex flex-wrap-nowrap' >
186
                    <Col className='mr-1'>{time[index]}</Col>
JeongYeonwoo's avatar
JeongYeonwoo committed
187
                    <Row className='mr-2' style={{ width: 'max-content', maxWidth: '300px', height: 'auto', paddingLeft: '15px', paddingRight: '15px', background: 'yellow', borderRadius: '3px', fontSize: 'x-large' }}>{value}</Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
188
                  </Row>
189
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
190
191
192
193
              )
            }
          } else {
            return null
JeongYeonwoo's avatar
JeongYeonwoo committed
194
          }
JeongYeonwoo's avatar
JeongYeonwoo committed
195
        })
Soo Hyun Kim's avatar
Soo Hyun Kim committed
196
        }
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
197

JeongYeonwoo's avatar
JeongYeonwoo committed
198
      </Container >
199
200
      <Form onSubmit={sendMsgCH} fluid>
        <Form.Group className='d-flex flex-wrap-nowrap justify-content-center m-3'>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
201
202
203
          <Form.Control className='border border-warning' name='chat' type="text" value={inner} onChange={handleChange} style={{ width: '85%' }} />
          <Button variant="warning" type="submit" disabled={disabled} style={{ width: '10%' }}>
            전송
JeongYeonwoo's avatar
JeongYeonwoo committed
204
          </Button>
우지원's avatar
ul    
우지원 committed
205
        </Form.Group>
206
      </Form>
JeongYeonwoo's avatar
JeongYeonwoo committed
207
    </>
우지원's avatar
ul    
우지원 committed
208
209
210
211
212


  );
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
213

우지원's avatar
ul    
우지원 committed
214
export default Chat;
JeongYeonwoo's avatar
JeongYeonwoo committed
215