YorKnEz

Chatroom.js

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