Chat.js 4.53 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
8


function Chat(props) {
Choi Ga Young's avatar
Choi Ga Young committed
9
  // let defaultname = sessionStorage.getItem('name');
JeongYeonwoo's avatar
JeongYeonwoo committed
10

JeongYeonwoo's avatar
JeongYeonwoo committed
11
12
  const [sender, setSender] = useState([])

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
13
  const [inner, setInner] = useState([''])
Soo Hyun Kim's avatar
Soo Hyun Kim committed
14
  const [chat, setChat] = useState([])   //object로 key는 보낸사람 value는 메세지
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
15
  const [disabled, setDisabled] = useState(true)
Choi Ga Young's avatar
Choi Ga Young committed
16
17
  const [user, setUser] = useState('')
  const [error, setError] = useState('');
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
18
19
20
21
22
23
24
25
26
27
28

  const userId = isAuthenticated()
  async function getProfile(userId) {
    try {
      const response = await axios.get(`/users/${userId}`)
      setUser(response.data)
    } catch (error) {
      catchErrors(error, setError)
    }
  }

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

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

    props.setSingleUser(sessionStorage.getItem('name'))
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
40
    props.setSingleChat(inner)
JeongYeonwoo's avatar
JeongYeonwoo committed
41

42
    props.sendMsg(e)
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
43
    setInner('')
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
44
45
    setDisabled(true)
    console.log(chat)
46
  }
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
47
48
49
  useEffect(() => {
    getProfile(userId)
  }, [userId])
50

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
51
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
52
53
    setSender([...sender, props.singleUser])
    console.log('UseEffect singleUser', sender)
JeongYeonwoo's avatar
JeongYeonwoo committed
54

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
55
    setChat([...chat, props.singleChat])
JeongYeonwoo's avatar
JeongYeonwoo committed
56
57
    // console.log('UseEffect singlechat', chat)

JeongYeonwoo's avatar
JeongYeonwoo committed
58
    console.log('Chat에 Sing있는 name = ', props.singleUser)
JeongYeonwoo's avatar
JeongYeonwoo committed
59

JeongYeonwoo's avatar
JeongYeonwoo committed
60
  }, [props.singleChat])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
61

JeongYeonwoo's avatar
JeongYeonwoo committed
62
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
63
64
    setSender([...sender, props.recievedUser])
    console.log('UseEffect RecievedUser', sender)
JeongYeonwoo's avatar
JeongYeonwoo committed
65
    console.log('Chat에 Reci있는 name = ')
JeongYeonwoo's avatar
JeongYeonwoo committed
66

JeongYeonwoo's avatar
JeongYeonwoo committed
67
    setChat([...chat, props.recievedMsg])
JeongYeonwoo's avatar
JeongYeonwoo committed
68
    // console.log('UseEffect recievechat', chat)
JeongYeonwoo's avatar
JeongYeonwoo committed
69
  }, [props.recievedMsg])
Choi Ga Young's avatar
aa    
Choi Ga Young committed
70

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
71
  const time = new Date().toLocaleTimeString()
우지원's avatar
ul    
우지원 committed
72
  return (
JeongYeonwoo's avatar
JeongYeonwoo committed
73
    <Container className="chat" id="chat" style={{ padding: '20px', border: "2px solid", height: "300%", margin: "1%", borderColor: "#BDBDBD", background: '' }}>
74
      <h2>해당 방에 대한 참여코드는 {props.roomCode} 입니다.</h2>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
75
      {/* 상대방이 보낸 메세지 띄우기 + 같은유저면 프로필 이미지는 생략(chat을 object로 보낸사람과 함께 보내서 구분하자) */}
76
77
      {chat.map((value, index) => {
        if (!(value == '')) {
JeongYeonwoo's avatar
JeongYeonwoo committed
78
79
          if (!(sender[index] === sessionStorage.getItem('name'))) {
            return (
JeongYeonwoo's avatar
JeongYeonwoo committed
80
              <Row key={index} className='m-1' >
JeongYeonwoo's avatar
JeongYeonwoo committed
81
82
83
84
                <Col xs={2}>
                  {user.profileimg ? <Image src={user.profileimg && `/images/${user.profileimg}`} style={{ width: "50px", height: "50px" }} roundedCircle /> : <Image src='https://www.flaticon.com/svg/vstatic/svg/149/149071.svg?token=exp=1610922596~hmac=f4b972b9db509d4e3cc2eb40543b0b0f' style={{ width: "50px", height: "50px" }} roundedCircle />}
                </Col>
                <Col xs={8}>
JeongYeonwoo's avatar
JeongYeonwoo committed
85
                  <Row><strong>{sender[index]}</strong></Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
86
87
88
89
90
91
92
                  <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>
              </Row>
            )
JeongYeonwoo's avatar
JeongYeonwoo committed
93
          } else {
JeongYeonwoo's avatar
JeongYeonwoo committed
94
95
96
            return (
              <Row key={index} className='m-1 justify-content-end'>
                <Row className='d-flex flex-wrap-nowrap' >
JeongYeonwoo's avatar
JeongYeonwoo committed
97
98
                  <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>
99
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
100
101
102
              </Row>
            )
          }
Soo Hyun Kim's avatar
Soo Hyun Kim committed
103
104
105
        } else {
          return null
        }
106
      })
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
107
      }
JeongYeonwoo's avatar
JeongYeonwoo committed
108

우지원's avatar
ul    
우지원 committed
109
      <Button variant="light" onClick={props.handleChatc} >{`<`}</Button>
110
      <Form onSubmit={sendMsgCH}>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
111
112
113
114
115
        <Form.Group className='d-flex flex-wrap-nowrap justify-content-center ml-2 mr-2'>
          <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>
우지원's avatar
ul    
우지원 committed
116
        </Form.Group>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
117

118
      </Form>
JeongYeonwoo's avatar
JeongYeonwoo committed
119
    </Container >
우지원's avatar
ul    
우지원 committed
120
121
122
123
124


  );
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
125

우지원's avatar
ul    
우지원 committed
126
export default Chat;