YorKnEz

Chatroom.js

Apr 6th, 2021
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.94 KB | None | 0 0
  1. import React, { useEffect, useState } from 'react'
  2. import { Button, ButtonGroup, Dropdown, Form } from 'react-bootstrap'
  3. import { useParams } from 'react-router'
  4.  
  5. import axios from 'axios'
  6. import jwt_decode from 'jwt-decode'
  7. import Pusher from 'pusher-js'
  8.  
  9. import './Chatroom.css'
  10. import ChatroomHeader from '../../components/ChatroomHeader'
  11. import Message from '../../components/Message'
  12. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
  13. import * as Icons from '@fortawesome/free-solid-svg-icons'
  14.  
  15. const ip = process.env.REACT_APP_IP
  16.  
  17. let arr = []
  18.  
  19. export default function Chatroom() {
  20. const { category } = useParams()
  21. const [messages, setMessages] = useState([])
  22. const [message, setMessage] = useState('')
  23.  
  24. const chatroom = JSON.parse(localStorage.getItem('category'))
  25.  
  26. const apidata = { category: category }
  27. useEffect(() => {
  28. axios
  29. .post(ip + '/getMessages', apidata)
  30. .then(response => {
  31. if (response.status === 200) {
  32. setMessages(response.data.reverse())
  33. arr = response.data
  34. }
  35. })
  36. .catch(e => console.log(e))
  37.  
  38. const pusher = new Pusher(process.env.REACT_APP_KEY, {
  39. cluster: process.env.REACT_APP_CLUSTER,
  40. })
  41.  
  42. var channel = pusher.subscribe(category)
  43. channel.bind('message', function (data) {
  44. // alert(JSON.stringify(data))
  45. arr = [data.message, ...arr]
  46. setMessages(arr)
  47. })
  48. }, [])
  49.  
  50. const jwt = jwt_decode(localStorage.getItem('jwt'))
  51. const userID = jwt.userID
  52.  
  53. const sendMessage = event => {
  54. if (message) {
  55. const apidata2 = {
  56. messageData: {
  57. message: message,
  58. type: 'msg',
  59. category: category,
  60. },
  61. userID: userID,
  62. jwt: localStorage.getItem('jwt'),
  63. }
  64.  
  65. axios.post(ip + '/sendMessage', apidata2)
  66.  
  67. setMessage('')
  68. }
  69. event.preventDefault()
  70. }
  71.  
  72. const sendImage = event => {
  73. const formData = new FormData()
  74.  
  75. formData.append('image', event.target.files[0])
  76. formData.append('type', 'img')
  77. formData.append('category', category)
  78. formData.append('userID', userID)
  79. formData.append('jwt', localStorage.getItem('jwt'))
  80.  
  81. axios.post(process.env.REACT_APP_IP + '/sendPicture', formData)
  82. }
  83.  
  84. const sendFile = event => {
  85. const formData = new FormData()
  86.  
  87. formData.append('file', event.target.files[0])
  88. formData.append('type', 'file')
  89. formData.append('category', category)
  90. formData.append('userID', userID)
  91. formData.append('jwt', localStorage.getItem('jwt'))
  92.  
  93. axios.post(process.env.REACT_APP_IP + '/sendFile', formData)
  94. }
  95.  
  96. const messageList = messages.map((message, index) => (
  97. <Message message={message} key={index} />
  98. ))
  99.  
  100. return (
  101. <div className='chat-container'>
  102. <div className='chatroom-container'>
  103. <ChatroomHeader chatroom={chatroom} />
  104. <div className='message-list'>{messageList}</div>
  105. <Form className='send-box'>
  106. <Dropdown as={ButtonGroup}>
  107. <Dropdown.Toggle className='button dropdown-toggle'>
  108. <FontAwesomeIcon
  109. style={{ paddingRight: '2px' }}
  110. color='#fff'
  111. icon={Icons.faPaperclip}
  112. />
  113. </Dropdown.Toggle>
  114. <Dropdown.Menu className='dropdown-menu'>
  115. <div className='dropdown-item'>
  116. <label
  117. style={{ marginBottom: '0px' }}
  118. htmlFor='image-upload-button'>
  119. <div
  120. className='button'
  121. style={{
  122. cursor: 'pointer',
  123. display: 'flex',
  124. justifyContent: 'center',
  125. alignItems: 'center',
  126. }}
  127. variant='light'>
  128. <FontAwesomeIcon
  129. style={{ paddingRight: '2px' }}
  130. color='#fff'
  131. icon={Icons.faImage}
  132. />
  133. </div>
  134. </label>
  135. <input
  136. type='file'
  137. accept='image/*'
  138. id='image-upload-button'
  139. style={{ display: 'none' }}
  140. onChange={sendImage}
  141. />
  142. </div>
  143. <div className='dropdown-item'>
  144. <label
  145. style={{ marginBottom: '0px' }}
  146. htmlFor='file-upload-button'>
  147. <div
  148. className='button'
  149. style={{
  150. cursor: 'pointer',
  151. display: 'flex',
  152. justifyContent: 'center',
  153. alignItems: 'center',
  154. }}
  155. variant='light'>
  156. <FontAwesomeIcon
  157. style={{ paddingRight: '2px' }}
  158. color='#fff'
  159. icon={Icons.faFile}
  160. />
  161. </div>
  162. </label>
  163. <input
  164. type='file'
  165. id='file-upload-button'
  166. style={{ display: 'none' }}
  167. onChange={sendFile}
  168. />
  169. </div>
  170. </Dropdown.Menu>
  171. </Dropdown>
  172. <Form.Control
  173. className='message-input'
  174. placeholder='Send a message'
  175. aria-label='message'
  176. value={message}
  177. onChange={data => setMessage(data.target.value)}
  178. />
  179. <Button
  180. className='button'
  181. type='submit'
  182. variant='light'
  183. onClick={sendMessage}>
  184. <FontAwesomeIcon
  185. style={{ paddingRight: '2px' }}
  186. color='#fff'
  187. icon={Icons.faPaperPlane}
  188. />
  189. </Button>
  190. </Form>
  191. </div>
  192. </div>
  193. )
  194. }
  195.  
Advertisement
Add Comment
Please, Sign In to add comment