NewChatPage.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. import React, { useState, useEffect, useRef } from "react";
  2. import { connect } from "react-redux";
  3. import { useDropzone } from "react-dropzone";
  4. import { Link } from "react-router-dom";
  5. import Button from "react-bootstrap/esm/Button";
  6. import { CSearchAvatar } from "../components/Avatar";
  7. import { actionSetChatInfo } from "../actions";
  8. import { actionFindUsers } from "../actions";
  9. import { history } from "../App";
  10. import { CChatAvatar } from "../components/Avatar";
  11. const ChatPage = ({
  12. onChat,
  13. chat,
  14. myProfile,
  15. create,
  16. onGetUser,
  17. foundUsers,
  18. }) => {
  19. const useDebounce = (cb, depArray, delay, onAdd) => {
  20. let timeoutRef = useRef();
  21. useEffect(() => {
  22. clearInterval(timeoutRef.current);
  23. timeoutRef.current === undefined
  24. ? (timeoutRef.current = -1)
  25. : (timeoutRef.current = setTimeout(cb, delay));
  26. }, depArray);
  27. };
  28. const [login, setLogin] = useState();
  29. useDebounce(() => onGetUser(login), [login], 2000);
  30. const [open, setOpen] = useState(false);
  31. const [img, setImg] = useState(null);
  32. const [title, setTitle] = useState(chat?.title || "");
  33. const [members, setMembers] = useState(chat?.members || [myProfile]);
  34. function checkMembers(members, user) {
  35. for (var i = 0; i < members.length; i++) {
  36. if (members[i]?._id === user?._id) {
  37. return false;
  38. }
  39. }
  40. return onAddMember(user);
  41. }
  42. const onAddMember = (newMember) => {
  43. setMembers([...members, newMember]);
  44. };
  45. const onDelMember = (i) => {
  46. setMembers(
  47. members.filter((el, index) => members[index]._id !== members[i]._id)
  48. );
  49. };
  50. useEffect(() => {
  51. setTitle(chat?.title || "");
  52. setImg(null);
  53. setMembers(chat?.members || [myProfile]);
  54. }, [open]);
  55. const { getRootProps, getInputProps, isDragActive } = useDropzone({
  56. accept: "image/*",
  57. maxFiles: 1,
  58. onDrop: (acceptedFiles) => {
  59. setImg(acceptedFiles[0]);
  60. },
  61. });
  62. function prepareMembers(members) {
  63. const newMembers = [];
  64. for (const member of members) {
  65. if (checkMembers(newMembers, member)) {
  66. if (member._id !== myProfile?._id) {
  67. newMembers.push({ _id: member._id });
  68. }
  69. } else {
  70. newMembers.push({ _id: member._id });
  71. }
  72. }
  73. newMembers.shift();
  74. return newMembers;
  75. }
  76. return (
  77. <div className="newChatContainer">
  78. <div className="dfb">
  79. <div className="newChatContainer">
  80. <div {...getRootProps({ className: "dropZoneStyle" })}>
  81. <input {...getInputProps()} />
  82. {isDragActive ? (
  83. <p className="dropZoneStyleBr">
  84. Drop the files here ...
  85. </p>
  86. ) : (
  87. <CChatAvatar
  88. text="upload chat avatar"
  89. className="profileStyle"
  90. />
  91. )}
  92. </div>
  93. <div className="profileContainer">
  94. <div className="loginNickSetting">
  95. <div className="inputContainer">
  96. <label for="loginInput">
  97. Enter the name of the chat:{" "}
  98. </label>
  99. <input
  100. className="form-control-editing form-control"
  101. id="loginInput"
  102. type="text"
  103. value={title}
  104. onChange={(e) => {
  105. setTitle(e.target.value);
  106. }}
  107. />
  108. </div>
  109. <div className="inputContainer">
  110. <form>
  111. <label for="loginInput">
  112. Add users to a group:{" "}
  113. </label>
  114. <div className="search-box">
  115. <input
  116. className="form-control-editing form-control"
  117. placeholder=""
  118. value={login}
  119. onChange={(e) =>
  120. setLogin(e.target.value)
  121. }
  122. />
  123. </div>
  124. {foundUsers
  125. ? foundUsers.map((user, i) => {
  126. return (
  127. <div className="searchBlock">
  128. {user?.avatar !== null ? (
  129. <CSearchAvatar
  130. avatarUrl={user}
  131. />
  132. ) : (
  133. <div className="avatarStubChat2"></div>
  134. )}
  135. <div>
  136. {user?.login
  137. ? user.login
  138. : "anon"}
  139. </div>
  140. <div>
  141. <Button
  142. id={user._id + i}
  143. user={user?.login}
  144. onClick={() => {
  145. checkMembers(
  146. members,
  147. user
  148. );
  149. document.getElementById(
  150. user._id +
  151. i
  152. ).innerHTML =
  153. "✓";
  154. }}
  155. >
  156. +
  157. </Button>
  158. </div>
  159. </div>
  160. );
  161. })
  162. : null}
  163. </form>
  164. </div>
  165. <div className="df">
  166. <Button
  167. variant="primary"
  168. className="buttonSetting"
  169. onClick={() => {
  170. onChat(
  171. "media",
  172. img,
  173. title,
  174. prepareMembers(members),
  175. chat?.id
  176. );
  177. history.push("/main");
  178. }}
  179. >
  180. <Link
  181. // to="/changesdonechats"
  182. style={{
  183. color: "white",
  184. textDecoration: "none",
  185. }}
  186. >
  187. Apply Changes
  188. </Link>
  189. </Button>
  190. <Link to="/main" className="changepasLink">
  191. Back to all chats
  192. </Link>
  193. </div>
  194. </div>
  195. </div>
  196. </div>
  197. <div>
  198. <div>
  199. {members.map((login, i) => {
  200. return (
  201. <>
  202. <div className="membersBlock">
  203. {login?.avatar !== null ? (
  204. <CSearchAvatar avatarUrl={login} />
  205. ) : (
  206. <div className="avatarStubChat2"></div>
  207. )}
  208. <div>
  209. {login?.login
  210. ? login.login
  211. : "anon"}
  212. </div>
  213. <div>
  214. <Button
  215. id={login._id}
  216. user={login?.login}
  217. onClick={() => {
  218. onDelMember(i);
  219. document.getElementById(
  220. login._id
  221. ).innerHTML = "✓";
  222. }}
  223. key={i}
  224. >
  225. x
  226. </Button>
  227. </div>
  228. </div>
  229. </>
  230. );
  231. })}
  232. </div>
  233. </div>
  234. </div>
  235. </div>
  236. );
  237. };
  238. export const CNewChatPage = connect(
  239. (state) => ({
  240. myProfile: state.promise.myProfile?.payload || {},
  241. foundUsers: state?.promise?.findUsers?.payload,
  242. }),
  243. { onChat: actionSetChatInfo, onGetUser: actionFindUsers }
  244. )(ChatPage);