Chat.js 4.74 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
13
14
  const [name, setName] = useState([''])
  const [sender, setSender] = useState([])
  const [senderimg, setSenderimg] = useState('')

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
15
  const [inner, setInner] = useState([''])
Soo Hyun Kim's avatar
Soo Hyun Kim committed
16
  const [chat, setChat] = useState([])   //object로 key는 보낸사람 value는 메세지
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
17
  const [disabled, setDisabled] = useState(true)
Choi Ga Young's avatar
Choi Ga Young committed
18
19
  const [user, setUser] = useState('')
  const [error, setError] = useState('');
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
20
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)
    }
  }

31
32
  function handleChange(e) {
    e.preventDefault()
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
33
    setInner(e.target.value)
34
    console.log(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
41
42
43

    setName(sessionStorage.getItem('name'))
    
    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
49
    setDisabled(true)
    console.log(chat)
JeongYeonwoo's avatar
JeongYeonwoo committed
50
51
52



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

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
58
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
59
60
61
    setSender([...sender, props.singleUser])
    console.log('UseEffect singleUser', sender)
    
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
62
    setChat([...chat, props.singleChat])
JeongYeonwoo's avatar
JeongYeonwoo committed
63
64
65
66
67
68
69
70
    // console.log('UseEffect singlechat', chat)
    

    console.log('Chat에 Sing있는 name = ', name, props.singleUser)



  }, [props.singleChat, props.singleUser])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
71

JeongYeonwoo's avatar
JeongYeonwoo committed
72
  useEffect(() => {
JeongYeonwoo's avatar
JeongYeonwoo committed
73
74
75
76
    setSender([...sender, props.recievedUser])
    console.log('UseEffect RecievedUser', sender)
    console.log('Chat에 Reci있는 name = ', name)

JeongYeonwoo's avatar
JeongYeonwoo committed
77
    setChat([...chat, props.recievedMsg])
JeongYeonwoo's avatar
JeongYeonwoo committed
78
79
80
81
82
    // console.log('UseEffect recievechat', chat)

    // setName('')

  }, [props.recievedMsg, props.recievedUser])
Choi Ga Young's avatar
aa    
Choi Ga Young committed
83

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
84
  const time = new Date().toLocaleTimeString()
우지원's avatar
ul    
우지원 committed
85
  return (
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
86
    <div className="chat" id="chat" style={{ border: "2px solid", height: "300%", margin: "1%", borderColor: "#BDBDBD", background: '' }}>
87
      <h2>해당 방에 대한 참여코드는 {props.roomCode} 입니다.</h2>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
88
      {/* 상대방이 보낸 메세지 띄우기 + 같은유저면 프로필 이미지는 생략(chat을 object로 보낸사람과 함께 보내서 구분하자) */}
89
90
      {chat.map((value, index) => {
        if (!(value == '')) {
JeongYeonwoo's avatar
JeongYeonwoo committed
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

          if (!(sender[index] === sessionStorage.getItem('name'))) {
            return (
              <Row key={index} className='m-1 ml-3' >
                <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}>
                  <Row><strong>{sender[index]} {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>
              </Row>
            )
          }else{
            return (
              <Row key={index} className='m-1 justify-content-end'>
                <Row className='d-flex flex-wrap-nowrap' >
                  <Col className='mr-1'>{user.nickname} {time}</Col>
                  <Row style={{ width: 'max-content', maxWidth: '300px', height: 'auto', paddingLeft: '15px', paddingRight: '15px', background: 'yellow', borderRadius: '3px', fontSize: 'x-large' }}>{value}</Row>
113
                </Row>
JeongYeonwoo's avatar
JeongYeonwoo committed
114
115
116
117
              </Row>
            )
          }

Soo Hyun Kim's avatar
Soo Hyun Kim committed
118
119
120
        } else {
          return null
        }
121
      })
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
122
      }
JeongYeonwoo's avatar
JeongYeonwoo committed
123
     
우지원's avatar
ul    
우지원 committed
124
      <Button variant="light" onClick={props.handleChatc} >{`<`}</Button>
125
      <Form onSubmit={sendMsgCH}>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
126
127
128
129
130
        <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
131
        </Form.Group>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
132

133
      </Form>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
134
    </div >
우지원's avatar
ul    
우지원 committed
135
136
137
138
139


  );
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
140

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