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

Choi Ga Young's avatar
Choi Ga Young committed
7

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

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

  const [img, setImg] = useState([])

Choi Ga Young's avatar
Choi Ga Young committed
17
18
19
20
21
22
23
24
25
26
27
28
29
  const [disabled, setDisabled] = useState(true)
  const [user, setUser] = useState('')
  const [error, setError] = useState('');

  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
soo0115    
Soo Hyun Kim committed
30

Soo Hyun Kim's avatar
Soo Hyun Kim committed
31
32
33
  async function getRoomName(roomCode) {
    try {
      let res = await axios.get('/room/getRoomName', { params: { 'roomCode': roomCode } })
Soo Hyun Kim's avatar
Soo Hyun Kim committed
34
      console.log(res.data)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
35
36
37
38
39
      setRoomName(res.data)
    } catch (error) {
      catchErrors(error, setError)
    }
  }
Choi Ga Young's avatar
x    
Choi Ga Young committed
40
41
42
43
44
45
46
47
48
  // async function sysMsg(roomCode) {
  //   try {
  //     let res = await axios.get('/room/sysMsg', { params: { 'roomCode': roomCode } })
  //     console.log('sysmsg', res.data)
      
  //   } catch (error) {
  //     catchErrors(error, setError)
  //   }
  // }
Soo Hyun Kim's avatar
Soo Hyun Kim committed
49

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

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

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() {
Choi Ga Young's avatar
Choi Ga Young committed
69
    props.setRecievedMsg('')
Choi Ga Young's avatar
Choi Ga Young committed
70
71
72
73
    setChat([])
    props.handleChatc()
  }

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
74
75
76
  useEffect(() => {
    getProfile(userId)
  }, [userId])
77

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
78
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
79
    setImg([...img, props.singleImg])
JeongYeonwoo's avatar
JeongYeonwoo committed
80
    setSender([...sender, props.singleUser])
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
81
82
    setChat([...chat, props.singleChat])
  }, [props.singleChat])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
83

Soo Hyun Kim's avatar
Soo Hyun Kim committed
84
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
85
    setImg([...img, props.recievedImg])
JeongYeonwoo's avatar
JeongYeonwoo committed
86
    setSender([...sender, props.recievedUser])
Soo Hyun Kim's avatar
Soo Hyun Kim committed
87
88
89
    setChat([...chat, props.recievedMsg])
  }, [props.recievedMsg])

Soo Hyun Kim's avatar
Soo Hyun Kim committed
90
91
  useEffect(() => {
    getRoomName(props.roomCode)
Choi Ga Young's avatar
x    
Choi Ga Young committed
92
    sysMsg(props.roomCode)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
93
94
  }, [props.roomCode])

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
95
  const time = new Date().toLocaleTimeString()
우지원's avatar
ul    
우지원 committed
96
  return (
JeongYeonwoo's avatar
JeongYeonwoo committed
97
98
    <>
      <Container id="chat" style={{ overflow: 'auto', padding: '20px', border: "2px solid", height: "500px", margin: "1%", borderColor: "#BDBDBD", background: '' }}>
99
        <Row className="d-flex justify-content-center" style={{ border: "2px solid", borderWidth: "medium", borderColor: "#FFD75F", height: "80px", margin: "1%" }}>
100
          <Col md="auto">
Choi Ga Young's avatar
dmdk    
Choi Ga Young committed
101
            <Button variant="light" onClick={handleClick} >{`<`}</Button>
102
103
104
105
106
107
          </Col>
          <Col>
            <Row style={{ fontWeight: "bold", fontSize: "x-large" }}> {roomName} </Row>
            <Row > {props.roomCode} </Row>
          </Col>
        </Row>
Choi Ga Young's avatar
x    
Choi Ga Young committed
108

JeongYeonwoo's avatar
JeongYeonwoo committed
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
        {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>
                      <Col className='ml-1'>{time}</Col>
                    </Row>
                  </Col>
124
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
125
126
127
128
129
130
131
              )
            } else {
              return (
                <Row key={index} className='m-1 justify-content-end'>
                  <Row className='d-flex flex-wrap-nowrap' >
                    <Col className='mr-1'>{time}</Col>
                    <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
132
                  </Row>
133
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
134
135
136
137
              )
            }
          } else {
            return null
JeongYeonwoo's avatar
JeongYeonwoo committed
138
          }
JeongYeonwoo's avatar
JeongYeonwoo committed
139
        })
140
        }
Choi Ga Young's avatar
Choi Ga Young committed
141

JeongYeonwoo's avatar
JeongYeonwoo committed
142
      </Container >
143
144
      <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
145
          <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
146
147
          <Button variant="warning" type="submit" disabled={disabled} style={{ width: '10%' }}>
            전송
JeongYeonwoo's avatar
JeongYeonwoo committed
148
          </Button>
우지원's avatar
ul    
우지원 committed
149
        </Form.Group>
150
      </Form>
JeongYeonwoo's avatar
JeongYeonwoo committed
151
    </>
우지원's avatar
ul    
우지원 committed
152
153
154
155
156


  );
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
157

우지원's avatar
ul    
우지원 committed
158
export default Chat;
JeongYeonwoo's avatar
JeongYeonwoo committed
159