Chat.js 6.03 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) {
Soo Hyun Kim's avatar
Soo Hyun Kim committed
15
  const [roomName, setRoomName] = useState('')
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
16
  const [inner, setInner] = useState([''])
JeongYeonwoo's avatar
JeongYeonwoo committed
17
  const [chat, setChat] = useState([INIT_CHAT])   //object로 key는 보낸사람 value는 메세지
JeongYeonwoo's avatar
JeongYeonwoo committed
18

19
20
21
22
  const simpleTime = new Date().toLocaleTimeString()
  const usualTime = simpleTime.substring(0, simpleTime.length - 3)
  const realTime = new Date().toISOString()

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)
JeongYeonwoo's avatar
JeongYeonwoo committed
52
    console.log(chat)
53
54
55
  }

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

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

63
    props.sendMsg(e)
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
64
    setInner('')
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
65
    setDisabled(true)
66
  }
Choi Ga Young's avatar
Choi Ga Young committed
67

Choi Ga Young's avatar
Choi Ga Young committed
68
  function handleClick() {
69
    props.setRecievedMsg('')
JeongYeonwoo's avatar
JeongYeonwoo committed
70
71
    setChat([''])

72
73
74
75
76
77
    props.handleChatc()


    
    props.setLeaveInfo([...props.leaveInfo, { roomName: props.roomCode, leaveTime: realTime }])
  
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  }

  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
JeongYeonwoo's avatar
JeongYeonwoo committed
100
101
102
103
104

    let intochat = []
    for (let prop in info) {
      let hour = info[prop].createdAt.split('T')[1].split(':')
      hour = settingtime(hour[0]) + ':' + hour[1]
105
      intochat.push({ msg: info[prop].message, sender: info[prop].username, img: info[prop].profileimg, time: hour })
106
    }
JeongYeonwoo's avatar
JeongYeonwoo committed
107
    setChat(intochat)
Choi Ga Young's avatar
Choi Ga Young committed
108
109
  }

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
110
111
112
  useEffect(() => {
    getProfile(userId)
  }, [userId])
113

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

JeongYeonwoo's avatar
JeongYeonwoo committed
118
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
119
    setChat([...chat, { msg: props.recievedMsg, sender: props.recievedUser, img: props.recievedImg, time: props.recievedTime }])
JeongYeonwoo's avatar
JeongYeonwoo committed
120
  }, [props.recievedMsg])
Choi Ga Young's avatar
aa    
Choi Ga Young committed
121

Soo Hyun Kim's avatar
Soo Hyun Kim committed
122
123
  useEffect(() => {
    getRoomName(props.roomCode)
JeongYeonwoo's avatar
JeongYeonwoo committed
124
125
    getPreviousChat()
    // console.log('겟 룸네임', chat)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
126
127
  }, [props.roomCode])

128

우지원's avatar
ul    
우지원 committed
129
  return (
JeongYeonwoo's avatar
JeongYeonwoo committed
130
131
    <>
      <Container id="chat" style={{ overflow: 'auto', padding: '20px', border: "2px solid", height: "500px", margin: "1%", borderColor: "#BDBDBD", background: '' }}>
JeongYeonwoo's avatar
dd    
JeongYeonwoo committed
132
        <Row className="d-flex justify-content-center" style={{ border: "2px solid", borderWidth: "medium", borderColor: "#FFD75F", height: "80px", margin: "1%" }}>
133
          <Col md="auto">
Choi Ga Young's avatar
dmdk    
Choi Ga Young committed
134
            <Button variant="light" onClick={handleClick} >{`<`}</Button>
135
136
137
          </Col>
          <Col>
            <Row style={{ fontWeight: "bold", fontSize: "x-large" }}> {roomName} </Row>
138
            <Row > {props.roomCode}</Row>
139
140
          </Col>
        </Row>
141
        <p>{props.newUser}님이 입장하셨습니다.</p>
JeongYeonwoo's avatar
JeongYeonwoo committed
142
        {chat.map((value, index) => {
JeongYeonwoo's avatar
JeongYeonwoo committed
143
144
          if (!(value.msg == '')) {
            if (!(value.sender === user.nickname)) {
JeongYeonwoo's avatar
JeongYeonwoo committed
145
146
147
              return (
                <Row key={index} className='m-1' >
                  <Col xs={2}>
JeongYeonwoo's avatar
JeongYeonwoo committed
148
                    <Image src={value.img && `/images/${value.img}`} style={{ width: "50px", height: "50px" }} roundedCircle />
JeongYeonwoo's avatar
JeongYeonwoo committed
149
150
                  </Col>
                  <Col xs={8}>
JeongYeonwoo's avatar
JeongYeonwoo committed
151
                    <Row><strong>{value.sender}</strong></Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
152
                    <Row className='d-flex flex-wrap-nowrap'>
JeongYeonwoo's avatar
JeongYeonwoo committed
153
154
                      <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
155
156
157
158
159
160
161
162
                    </Row>
                  </Col>
                </Row>
              )
            } else {
              return (
                <Row key={index} className='m-1 justify-content-end'>
                  <Row className='d-flex flex-wrap-nowrap' >
JeongYeonwoo's avatar
JeongYeonwoo committed
163
164
                    <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
165
                  </Row>
166
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
167
168
169
170
              )
            }
          } else {
            return null
JeongYeonwoo's avatar
JeongYeonwoo committed
171
          }
JeongYeonwoo's avatar
JeongYeonwoo committed
172
        })
Soo Hyun Kim's avatar
Soo Hyun Kim committed
173
        }
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
174

JeongYeonwoo's avatar
JeongYeonwoo committed
175
      </Container >
176
177
      <Form onSubmit={sendMsgCH} fluid>
        <Form.Group className='d-flex flex-wrap-nowrap justify-content-center m-3'>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
178
179
180
          <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
181
          </Button>
우지원's avatar
ul    
우지원 committed
182
        </Form.Group>
183
      </Form>
JeongYeonwoo's avatar
JeongYeonwoo committed
184
    </>
우지원's avatar
ul    
우지원 committed
185
186
187
188
189


  );
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
190

우지원's avatar
ul    
우지원 committed
191
export default Chat;
JeongYeonwoo's avatar
JeongYeonwoo committed
192