Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.56 KB | None | 0 0
  1. import React, { Component, Fragment } from "react";
  2. import Button from "components/Button.jsx";
  3. import classNames from "classname";
  4. import avatar from "../assest/avatar.png";
  5. import openSocket from "socket.io-client";
  6. import { Link, withRouter } from "react-router-dom";
  7. import decode from "jwt-decode";
  8. import { domain } from "components/helper/const";
  9. import auth from "components/helper/auth";
  10. import ChatInfo from 'components/ChatModal'
  11. import axios from 'axios'
  12. import "./style.scss";
  13.  
  14. const Auth = new auth();
  15. let historyHandled = false;
  16. const socket = openSocket(domain);
  17.  
  18. export default class App extends Component {
  19. constructor(props) {
  20. super(props);
  21.  
  22. this.state = {
  23. height: window.innerHeight,
  24. message: [],
  25. roomList: [],
  26. msgBoX: "",
  27. usersTyping: [],
  28. userName: decode(localStorage.getItem("current")).name,
  29. userId: decode(localStorage.getItem("current")).id,
  30. userEmail: decode(localStorage.getItem("current")).email,
  31. usersTyping: [],
  32. showProfileModal: false,
  33. roomName: "",
  34. lastMsg: [],
  35. users: []
  36. };
  37. }
  38.  
  39. scrollToBottom = () => {
  40. this.messagesEnd.scrollIntoView({ behavior: "smooth", block: "end", inline: "end" });
  41. };
  42.  
  43. showModal = () => {
  44. this.setState({ show: true });
  45. };
  46.  
  47. hideModal = () => {
  48. this.setState({ show: false });
  49. };
  50.  
  51. handleSubmit = async event => {
  52. event.preventDefault();
  53. console.log("sent message");
  54. const { message } = this.state;
  55.  
  56. const seed = {
  57. userName: this.state.userName,
  58. roomID: window.location.pathname.replace("/chat/", ""),
  59. message: this.state.msgBoX,
  60. userID: decode(localStorage.getItem("current")).id,
  61. avatar: { avatar }
  62. };
  63.  
  64. socket.emit("send-chat-message", seed);
  65. this.setState({ msgBoX: "" });
  66. };
  67.  
  68. getNonMembers = async (members) => {
  69. console.log(members)
  70. const userList = await axios.get('http://' + domain + '/users/')
  71. console.log(userList)
  72. let seed = []
  73.  
  74. for (let i in (userList.data)) {
  75. seed[i] = {
  76. id: (userList.data[i])._id,
  77. name: (userList.data[i]).usr_fname + ' ' + (userList.data[i]).usr_lname
  78. }
  79.  
  80. }
  81.  
  82. console.log(seed)
  83.  
  84. for (let i = 0; i <= seed.length - 1; i++) {
  85. for (let j = 0; j < (members).length; j++) {
  86. if (seed[i] != null && seed[i].name === (members[j]).name) {
  87. seed.splice(i, 1);
  88. }
  89. }
  90. }
  91.  
  92. this.setState({
  93. users: seed
  94. })
  95.  
  96.  
  97. console.log(seed)
  98. }
  99.  
  100.  
  101. handleHistory(socket, data) {
  102. historyHandled = true;
  103.  
  104. const { message } = this.state;
  105. if (data) {
  106. this.setState({ message: [] });
  107.  
  108. for (let i = 0; i < Object.assign(data).length; i++) {
  109. let isItMe;
  110. if (data[i].userID == decode(localStorage.getItem("current")).id) isItMe = true;
  111.  
  112. const newMsg = {
  113. author: data[i].username,
  114. body: data[i].message,
  115. userID: data[i].userID,
  116. avatar: data[i].avatar,
  117. me: isItMe
  118. };
  119.  
  120. message.push(newMsg);
  121. }
  122. this.setState({ message: message });
  123. socket.removeListener("chats", this.handleHistory());
  124. }
  125. }
  126.  
  127. componentDidMount = async () => {
  128. this.scrollToBottom();
  129.  
  130. await socket.emit('clear-message')
  131.  
  132. const roomInfo = await axios.get('http://' + domain + '/chat/getInfo/' + (window.location.pathname).replace('/chat/', ''))
  133. this.setState({
  134. roomName: roomInfo.data[0].name,
  135. message: [],
  136. })
  137. this.getNonMembers(roomInfo.data[0].members)
  138. await socket.emit("currentuserid", decode(localStorage.getItem("current")).id);
  139. await socket.emit(
  140. "new-user",
  141. window.location.pathname.replace("/chat/", ""),
  142. this.state.name,
  143. decode(localStorage.getItem("current")).id
  144. );
  145. await socket.on("roomGrant", data => {
  146. // if(data=='false') this.props.history.replace("/admin");
  147. });
  148. socket.emit("currentUser", {
  149. user: this.state.name,
  150. status: "online",
  151. room: window.location.pathname.replace("/chat/", "")
  152. });
  153. socket.on("roomList", data => {
  154. this.setState({
  155. roomList: data
  156. });
  157. });
  158.  
  159. if (!historyHandled) {
  160. socket.on("chats", data => {
  161. if (data) {
  162. this.handleHistory(socket, data);
  163. }
  164. });
  165. }
  166.  
  167. Auth.get("utils/get/rooms/" + window.location.pathname.replace("/chat/", "")).then(
  168. result => {
  169. console.log("aijo babub aijo", result);
  170. this.setState({
  171. roomName: result.data.result[0].name
  172. });
  173. }
  174. );
  175.  
  176. socket.on("hello world", () => {
  177. console.log("hello world");
  178. });
  179.  
  180. socket.on("naya-message", data => {
  181. let message = this.state.message;
  182. console.log(message);
  183. let isItMe = false;
  184. if (data.userID == decode(localStorage.getItem("current")).id) isItMe = true;
  185.  
  186. const newMsg = {
  187. author: data.username,
  188. body: data.message,
  189. userID: data.userID,
  190. avatar: data.avatar,
  191. me: isItMe
  192. };
  193.  
  194. message.push(newMsg);
  195. this.setState({ message: message });
  196. });
  197.  
  198. socket.on("user-connected", name => {
  199. // appendMessage(${name} connected haha)
  200. });
  201.  
  202. socket.on("user-disconnected", name => {
  203. // appendMessage(${name} disconnected)
  204. });
  205.  
  206. socket.on("onlineUser", data => {
  207. let online = [];
  208. for (let i in data) {
  209. if (data[i].room === window.location.pathname) {
  210. online.push(data[i].user);
  211. }
  212. }
  213. // onlineUserSection.innerHTML = 'Online Users : ' + online
  214. });
  215.  
  216. socket.on("roomJoined", data => {
  217. // document.getElementById("currentRoom").innerHTML = 'Current Room : ' + data
  218. });
  219.  
  220. socket.on("listOfRooms", data => {
  221. // document.getElementById('listRoom').innerHTML = data
  222. });
  223.  
  224. socket.on("displayTyping", data => {
  225. this.setState({
  226. usersTyping: data
  227. });
  228.  
  229. let user =data.split(" ");
  230.  
  231. console.log(data)
  232.  
  233. document.getElementById("users_typing").innerHTML = user[0]+" is Typing";
  234. });
  235.  
  236. socket.on("clearTyping", data => {
  237. this.setState({
  238. usersTyping: []
  239. });
  240. document.getElementById("users_typing").innerHTML = "";
  241. });
  242. window.addEventListener("resize", this._onResize);
  243. };
  244.  
  245. componentDidUpdate() {
  246. this.scrollToBottom();
  247. }
  248. handleReload() {
  249. setTimeout(() => {
  250. document.location.reload();
  251. }, 5);
  252. }
  253.  
  254. handleMemberChange(event) {
  255.  
  256. let index = event.nativeEvent.target.selectedIndex;
  257. this.setState({
  258. memberToAdd: {
  259. id: event.nativeEvent.target[index].value,
  260. name: event.nativeEvent.target[index].text
  261. }
  262. })
  263. }
  264.  
  265. addMembersToGroup = async (event) => {
  266. await axios({
  267. method: 'put',
  268. url: 'http://' + domain + '/chat/addToRoom/' + (window.location.pathname).replace('/chat/', '') + '/u/',
  269. data: this.state.memberToAdd
  270. });
  271. };
  272.  
  273. render() {
  274. const { height, message, roomList, users, roomName } = this.state;
  275.  
  276. const style = {
  277. height: height
  278. };
  279. let temp = [];
  280.  
  281. console.log(message)
  282.  
  283. return (
  284. <div style={style} className="sockat-app">
  285. <div className="header">
  286. <div className="left">
  287. <h3 className="action">Messages</h3>
  288. </div>
  289. <div className="content">
  290. <h2 className="group-name">{roomName}</h2>
  291. </div>
  292. <div className="input-wrap mr-3">
  293. <Link to="/admin/chatrooms/">
  294. <Button buttonName="< Chat Room" />
  295. </Link>
  296. </div>
  297. </div>
  298.  
  299. <div className="main">
  300. <Fragment>
  301. <div className="sidebar-left">
  302. <div className="chanels">
  303. {roomList.map((room, index) => {
  304. return (
  305. <div key={index} className="room-list">
  306. <div className="room-header">
  307. {((window.location.pathname).replace('/chat/', '') == room._id) ? <ChatInfo
  308. roomID={roomList[index]._id}
  309. roomName={roomList[index].name}
  310. roomAccess={roomList[index].access}
  311. no_of_user={roomList[index].no_of_user}
  312. inMembers={roomList[index].members}
  313. userList={users}
  314. created_at={roomList[index].created_at}
  315. created_by={roomList[index].created_by}
  316. handleMembers={this.addMembersToGroup}
  317. handlePassChange={
  318. event => this.handleMemberChange(event)
  319. }
  320. /> : false}
  321. <Link to={`/chat/${room._id}`}>
  322. <p
  323. className="room-name"
  324. onClick={this.handleReload}
  325. >
  326. {room.name}
  327. </p>
  328. </Link>
  329. <p className="room-access">
  330. {room.access.toUpperCase()}
  331. </p>
  332. </div>
  333. <div className="room-footer">
  334. {this.state.message.map(data => {
  335. temp = [...temp, data.body];
  336. })}
  337. <p className="room-message">
  338. {temp[temp.length - 1]}
  339. </p>
  340. </div>
  341. </div>
  342. );
  343. })}
  344. </div>
  345. </div>
  346. <div className="content">
  347. <div className="messages">
  348.  
  349. {message.map((message, index) => {
  350. return (
  351. <div
  352. key={index}
  353. className={classNames("message", {
  354. me: message.me
  355. })}
  356. >
  357. <div className="message-body">
  358. <Link to={`/admin/view-profile/${message.userID}`}>
  359. <div className="message-author">
  360. {message.me ? "" : message.author}
  361. </div>
  362. </Link>
  363. <div className="message-text">
  364. <p>{message.body} </p>
  365. </div>
  366. </div>
  367. </div>
  368. );
  369. })}
  370. <div
  371. style={{ float: "left", clear: "both" }}
  372. ref={el => {
  373. this.messagesEnd = el;
  374. }}
  375. />
  376. </div>
  377.  
  378. <div id="users_typing" className="users_typing" />
  379.  
  380. <div className="message-input-input">
  381. <form className="message-form" onSubmit={this.handleSubmit}>
  382. <input
  383. type="text"
  384. className="message__input"
  385. value={this.state.msgBoX}
  386. onChange={event => {
  387. socket.emit("userIsTyping", {
  388. user: this.state.userName,
  389. room: window.location.pathname.replace("/chat/", "")
  390. });
  391.  
  392. this.setState({ msgBoX: event.target.value });
  393. }}
  394. onKeyUp={event => {
  395. socket.emit("userIsNotTyping", {
  396. user: this.state.userName,
  397. room: window.location.pathname.replace("/chat/", "")
  398. });
  399. }}
  400. onKeyDown={event => {
  401. socket.emit("userIsTyping", {
  402. user: this.state.userName,
  403. room: window.location.pathname.replace("/chat/", "")
  404. });
  405. }}
  406. placeholder="Enter message here..."
  407. required
  408. />
  409. <button className="message__button--send">
  410. <i className="icon-go" />
  411. </button>
  412. </form>
  413. </div>
  414. </div>
  415. </Fragment>
  416. </div>
  417. </div>
  418. );
  419. }
  420. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement