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

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는 메세지
Choi Ga Young's avatar
Choi Ga Young committed
14
15
16
17
18
19
20
21
22
23
24
25
26
  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
27

Soo Hyun Kim's avatar
Soo Hyun Kim committed
28
29
30
31
32
33
34
35
36
  async function getRoomName(roomCode) {
    try {
      let res = await axios.get('/room/getRoomName', { params: { 'roomCode': roomCode } })
      setRoomName(res.data)
    } catch (error) {
      catchErrors(error, setError)
    }
  }

37
38
  function handleChange(e) {
    e.preventDefault()
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
39
    setInner(e.target.value)
40
    console.log(e.target.value)
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
41
    setDisabled(false)
42
43
44
  }

  function sendMsgCH(e) {
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
45
46
    e.preventDefault()
    props.setSingleChat(inner)
47
    props.sendMsg(e)
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
48
    setInner('')
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
49
50
    setDisabled(true)
    console.log(chat)
51
  }
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
52
53
54
  useEffect(() => {
    getProfile(userId)
  }, [userId])
55

Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
56
57
  useEffect(() => {
    setChat([...chat, props.singleChat])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
58
59
    console.log('UseEffect singlechat', chat)
    // check()
Soo Hyun Kim's avatar
soo0115    
Soo Hyun Kim committed
60
  }, [props.singleChat])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
61

Soo Hyun Kim's avatar
Soo Hyun Kim committed
62
63
  useEffect(() => {
    setChat([...chat, props.recievedMsg])
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
64
    console.log('UseEffect recievechat', chat)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
65
66
  }, [props.recievedMsg])

Soo Hyun Kim's avatar
Soo Hyun Kim committed
67
68
69
70
  useEffect(() => {
    getRoomName(props.roomCode)
  }, [props.roomCode])

JeongYeonwoo's avatar
JeongYeonwoo committed
71

JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
72
73
74
75
76
77
78
79
80
81
  // function check() {
  //   // if (chat[chat.length-1].user ===chat[chat.length-2].user){  //마지막보낸거랑 그 전꺼랑 보낸사람이 같은지 비교
  //   if (chat.length === 2) {
  //     setHidden(false)
  //   } else {
  //     setHidden(true)
  //   }
  //   console.log(hidden)
  // }
  const time = new Date().toLocaleTimeString()
우지원's avatar
ul    
우지원 committed
82
  return (
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
83
    <div className="chat" id="chat" style={{ border: "2px solid", height: "300%", margin: "1%", borderColor: "#BDBDBD", background: '' }}>
84
      <Row class="d-flex justify-content-center" style={{ border:"2px solid", borderWidth: "medium", borderColor: "#FFD75F", height: "80px", margin: "1%" }}>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
85
86
87
88
        <Col md="auto">
          <Button variant="light" onClick={props.handleChatc} >{`<`}</Button>
        </Col>
        <Col>
89
          <Row style={{ fontWeight: "bold", fontSize: "x-large" }}> {roomName} </Row>
Soo Hyun Kim's avatar
Soo Hyun Kim committed
90
91
92
93
          <Row > {props.roomCode} </Row>
        </Col>
      </Row>
      {/* <h2> 참여코드 : {props.roomCode} </h2> */}
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
94
      {/* 상대방이 보낸 메세지 띄우기 + 같은유저면 프로필 이미지는 생략(chat을 object로 보낸사람과 함께 보내서 구분하자) */}
Soo Hyun Kim's avatar
Soo Hyun Kim committed
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
      {
        chat.map((value, index) => {
          if (!(value == '')) {
            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>{user.nickname} {index}</strong></Row>
                  <Row className='d-flex flex-wrap-nowrap'>
                    <Col className='border border-dark' style={{ width: 'max-content', maxWidth: '300px', height: 'auto', paddingLeft: '15px', paddingRight: '15px', background: 'white', borderRadius: '5px', fontSize: 'x-large' }}>{value}</Col>
                    <Col className='ml-4'>{new Date().toLocaleTimeString()}</Col>
                  </Row>
                </Col>
              </Row>
            )
          } else {
            return null
          }
        })
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
116
117
      }
      {/* 내가 보낸 메세지 띄우기 */}
Soo Hyun Kim's avatar
Soo Hyun Kim committed
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
      {
        chat.map((value, index) => {
          if (!(value == '')) {
            return (
              <Row key={index} className='m-1 mr-4 justify-content-end'>
                <div className='d-flex flex-wrap-nowrap' >
                  <Row className='mr-4'>{time}</Row>
                  <Row style={{ width: 'max-content', maxWidth: '300px', height: 'auto', paddingLeft: '15px', paddingRight: '15px', background: 'yellow', borderRadius: '3px', fontSize: 'x-large' }}>{value}</Row>
                </div>
              </Row>
            )
          } else {
            return null
          }
        })
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
133
134
135
136
      }



137
138


Soo Hyun Kim's avatar
Soo Hyun Kim committed
139

140
      <Form onSubmit={sendMsgCH}>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
141
142
143
144
145
        <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
146
        </Form.Group>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
147

148
      </Form>
JeongYeonwoo's avatar
yeonwoo    
JeongYeonwoo committed
149
    </div >
우지원's avatar
ul    
우지원 committed
150
151
152
153
154


  );
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
155

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