ChatEditing.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. import React, { useState, useRef, useEffect } from "react";
  2. import { connect } from "react-redux";
  3. import { useDropzone } from "react-dropzone";
  4. import { Link, useParams } from "react-router-dom";
  5. import Button from "react-bootstrap/esm/Button";
  6. import { actionFindUsers } from "../actions";
  7. import { CSearchAvatar } from "../components/Avatar";
  8. import { actionSetChatInfo } from "../actions";
  9. import { CChatAvatar } from "../components/Avatar";
  10. import { history } from "../App";
  11. const ChatEditing = ({
  12. chatId,
  13. onChat,
  14. myProfile,
  15. create,
  16. onGetUser,
  17. foundUsers,
  18. }) => {
  19. const useDebounce = (cb, depArray, delay) => {
  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. let { _id } = useParams();
  31. const [chat] = useState();
  32. const [img, setImg] = useState(null);
  33. const [newTitle, setNewTitle] = useState(chatId[_id]?.title || "");
  34. const { getRootProps, getInputProps, isDragActive } = useDropzone({
  35. accept: "image/*",
  36. maxFiles: 1,
  37. onDrop: (acceptedFiles) => {
  38. setImg(acceptedFiles[0]);
  39. },
  40. });
  41. const [members, setMembers] = useState(chatId[_id]?.members || [myProfile]);
  42. useEffect(() => {
  43. onChat("media", img, newTitle, prepareMembers(members), _id);
  44. }, [members]);
  45. function prepareMembers(members) {
  46. const newMembers = [];
  47. for (const member of members) {
  48. if (create) {
  49. if (member._id !== myProfile?._id) {
  50. newMembers.push({ _id: member._id });
  51. }
  52. } else {
  53. newMembers.push({ _id: member?._id });
  54. }
  55. }
  56. return newMembers;
  57. }
  58. function checkMembers(members, user) {
  59. for (var i = 0; i < members.length; i++) {
  60. if (members[i]?._id === user?._id) {
  61. return null;
  62. }
  63. }
  64. return onAddMember(user);
  65. }
  66. const onAddMember = (newMember) => {
  67. setMembers([...members, newMember]);
  68. };
  69. const onDelMember = (i) => {
  70. setMembers(
  71. members.filter((el, index) => members[index]._id !== members[i]._id)
  72. );
  73. };
  74. return (
  75. <div className="newChatContainer">
  76. <div className="dfb">
  77. <div>
  78. <div {...getRootProps({ className: "dropZoneStyle" })}>
  79. <input {...getInputProps()} />
  80. {isDragActive ? (
  81. <p className="dropZoneStyleBr">
  82. Drop the files here ...
  83. </p>
  84. ) : (
  85. <CChatAvatar
  86. _id={_id}
  87. text="upload chat avatar"
  88. className="profileStyle"
  89. />
  90. )}
  91. </div>
  92. <div className="profileContainer">
  93. <div className="loginNickSetting">
  94. <div className="inputContainer">
  95. <label for="loginInput">
  96. Enter the new name of the chat:{" "}
  97. </label>
  98. <input
  99. className="form-control-editing form-control"
  100. id="loginInput"
  101. type="text"
  102. value={newTitle}
  103. onChange={(e) => {
  104. setNewTitle(e.target.value);
  105. }}
  106. />
  107. </div>
  108. <div className="inputContainer">
  109. {/* <CSearchByLogin onChange={newUserId}/> */}
  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. <div className="df"></div>
  167. <Button
  168. variant="primary"
  169. className="buttonSetting"
  170. onClick={() => {
  171. onChat(
  172. "media",
  173. img,
  174. newTitle,
  175. prepareMembers(members),
  176. _id
  177. );
  178. history.push("/main");
  179. }}
  180. >
  181. <Link
  182. style={{
  183. color: "white",
  184. textDecoration: "none",
  185. }}
  186. >
  187. Apply Changes
  188. </Link>
  189. </Button>
  190. <Link
  191. to={"/main/" + _id}
  192. className="changepasLink"
  193. >
  194. Back to chat
  195. </Link>
  196. </div>
  197. </div>
  198. </div>
  199. </div>
  200. <div>
  201. <div>
  202. {members.map((login, i) => {
  203. return (
  204. <>
  205. <div className="membersBlock">
  206. {login?.avatar !== null ? (
  207. <CSearchAvatar avatarUrl={login} />
  208. ) : (
  209. <div className="avatarStubChat2"></div>
  210. )}
  211. <div>
  212. {login?.login
  213. ? login.login
  214. : "anon"}
  215. </div>
  216. <div>
  217. <Button
  218. id={login?._id}
  219. user={login?.login}
  220. onClick={() => {
  221. onDelMember(i);
  222. document.getElementById(
  223. login._id
  224. ).innerHTML = "✓";
  225. }}
  226. key={i}
  227. >
  228. x
  229. </Button>
  230. </div>
  231. </div>
  232. </>
  233. );
  234. })}
  235. </div>
  236. </div>
  237. </div>
  238. </div>
  239. );
  240. };
  241. export const CChatEditing = connect(
  242. (state) => ({
  243. myProfile: state.promise.myProfile?.payload || {},
  244. chatId: state.chats,
  245. foundUsers: state?.promise?.findUsers?.payload,
  246. }),
  247. {
  248. onChat: actionSetChatInfo,
  249. onGetUser: actionFindUsers,
  250. }
  251. )(ChatEditing);