Chat.js 4.21 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) {
Choi Ga Young's avatar
Choi Ga Young committed
8
  // let defaultname = sessionStorage.getItem('name');
JeongYeonwoo's avatar
JeongYeonwoo committed
9

JeongYeonwoo's avatar
JeongYeonwoo committed
10
11
  const [sender, setSender] = 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
  const [disabled, setDisabled] = useState(true)
  const [user, setUser] = useState('')
  const [error, setError] = useState('');
Choi Ga Young's avatar
Choi Ga Young committed
20
  
Choi Ga Young's avatar
Choi Ga Young committed
21
22
23
24
25
26
27
28
29
30

  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
31

32
33
  function handleChange(e) {
    e.preventDefault()
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
34
    setInner(e.target.value)
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
35
    setDisabled(false)
36
37
38
  }

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

JeongYeonwoo's avatar
JeongYeonwoo committed
41
42
43
    props.setSingleImg(user.profileimg)
    props.setSingleUser(user.nickname)
    // props.setSingleUser(sessionStorage.getItem('name'))
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
44
    props.setSingleChat(inner)
JeongYeonwoo's avatar
JeongYeonwoo committed
45

46
    props.sendMsg(e)
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
47
    setInner('')
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
48
    setDisabled(true)
49
  }
Choi Ga Young's avatar
Choi Ga Young committed
50
51
52
53
54
55

  function handleClick(e) {
    setChat([])
    props.handleChatc()
  }

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
56
57
58
  useEffect(() => {
    getProfile(userId)
  }, [userId])
59

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
60
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
61
    setImg([...img, props.singleImg])
JeongYeonwoo's avatar
JeongYeonwoo committed
62
    setSender([...sender, props.singleUser])
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
63
64
    setChat([...chat, props.singleChat])
  }, [props.singleChat])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
65

Soo Hyun Kim's avatar
Soo Hyun Kim committed
66
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
67
    setImg([...img, props.recievedImg])
JeongYeonwoo's avatar
JeongYeonwoo committed
68
    setSender([...sender, props.recievedUser])
Soo Hyun Kim's avatar
Soo Hyun Kim committed
69
70
71
    setChat([...chat, props.recievedMsg])
  }, [props.recievedMsg])

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
72
  const time = new Date().toLocaleTimeString()
우지원's avatar
ul    
우지원 committed
73
  return (
JeongYeonwoo's avatar
JeongYeonwoo committed
74
75
76
    <>
      <Container id="chat" style={{ overflow: 'auto', padding: '20px', border: "2px solid", height: "500px", margin: "1%", borderColor: "#BDBDBD", background: '' }}>
        <h2>해당 방에 대한 참여코드는 {props.roomCode} 입니다.</h2>
77
        <p>{props.newUser}님이 입장하셨습니다.</p>
JeongYeonwoo's avatar
JeongYeonwoo committed
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
        {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>
93
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
94
95
96
97
98
99
100
              )
            } 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
101
                  </Row>
102
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
103
104
105
106
              )
            }
          } else {
            return null
JeongYeonwoo's avatar
JeongYeonwoo committed
107
          }
JeongYeonwoo's avatar
JeongYeonwoo committed
108
        })
109
        }
Choi Ga Young's avatar
Choi Ga Young committed
110

JeongYeonwoo's avatar
JeongYeonwoo committed
111
        <Button variant="light" onClick={props.handleChatc} >{`<`}</Button>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
112

JeongYeonwoo's avatar
JeongYeonwoo committed
113
114
115
116
117
118
119
120
121
122
123

      </Container >
        <Form onSubmit={sendMsgCH} fluid>
          <Form.Group className='d-flex flex-wrap-nowrap justify-content-center m-3'>
            <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%' }}>
              전송
          </Button>
          </Form.Group>
        </Form>
    </>
우지원's avatar
ul    
우지원 committed
124
125
126
127
128


  );
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
129

우지원's avatar
ul    
우지원 committed
130
export default Chat;
JeongYeonwoo's avatar
JeongYeonwoo committed
131