ChatEditing.js 11 KB

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