NewChatPage.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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 { CChatAvatar } from "../components/Avatar";
  10. const ChatPage = ({
  11. onChat,
  12. chat,
  13. myProfile,
  14. create,
  15. onGetUser,
  16. foundUsers,
  17. }) => {
  18. const useDebounce = (cb, depArray, delay, onAdd) => {
  19. let timeoutRef = useRef();
  20. useEffect(() => {
  21. clearInterval(timeoutRef.current);
  22. timeoutRef.current === undefined
  23. ? (timeoutRef.current = -1)
  24. : (timeoutRef.current = setTimeout(cb, delay));
  25. }, depArray);
  26. };
  27. const [login, setLogin] = useState();
  28. useDebounce(() => onGetUser(login), [login], 2000);
  29. const [open, setOpen] = useState(false);
  30. const [img, setImg] = useState(null);
  31. const [title, setTitle] = useState(chat?.title || "");
  32. const [members, setMembers] = useState(chat?.members || [myProfile]);
  33. const onAddMember = (newMember) => {
  34. setMembers(prepareMembers([...members, newMember]));
  35. };
  36. useEffect(() => {
  37. setTitle(chat?.title || "");
  38. setImg(null);
  39. setMembers(chat?.members || [myProfile]);
  40. }, [open]);
  41. const { getRootProps, getInputProps, isDragActive } = useDropzone({
  42. accept: "image/*",
  43. maxFiles: 1,
  44. onDrop: (acceptedFiles) => {
  45. setImg(acceptedFiles[0]);
  46. },
  47. });
  48. function prepareMembers(members) {
  49. const newMembers = [];
  50. for (const member of members) {
  51. if (create) {
  52. if (member._id !== myProfile?._id) {
  53. newMembers.push({ _id: member._id });
  54. }
  55. } else {
  56. newMembers.push({ _id: member._id });
  57. }
  58. }
  59. return newMembers;
  60. }
  61. return (
  62. <div className="newChatContainer">
  63. <div {...getRootProps({ className: "dropZoneStyle" })}>
  64. <input {...getInputProps()} />
  65. {isDragActive ? (
  66. <p className="dropZoneStyleBr">Drop the files here ...</p>
  67. ) : (
  68. <CChatAvatar
  69. text="upload chat avatar"
  70. className="profileStyle"
  71. />
  72. )}
  73. </div>
  74. <div className="profileContainer">
  75. <div className="loginNickSetting">
  76. <div className="inputContainer">
  77. <label for="loginInput">
  78. Enter the name of the chat:{" "}
  79. </label>
  80. <input
  81. className="form-control-editing form-control"
  82. id="loginInput"
  83. type="text"
  84. value={title}
  85. onChange={(e) => {
  86. setTitle(e.target.value);
  87. }}
  88. />
  89. </div>
  90. <div className="inputContainer">
  91. <form>
  92. <label for="loginInput">
  93. Add users to a group:{" "}
  94. </label>
  95. <div className="search-box">
  96. <input
  97. className="form-control-editing form-control"
  98. placeholder=""
  99. value={login}
  100. onChange={(e) => setLogin(e.target.value)}
  101. />
  102. </div>
  103. {foundUsers
  104. ? foundUsers.map((user, i) => {
  105. return (
  106. <div className="searchBlock">
  107. {user?.avatar !== null ? (
  108. <CSearchAvatar
  109. avatarUrl={user}
  110. />
  111. ) : (
  112. <div className="avatarStubChat2"></div>
  113. )}
  114. <div>
  115. {user?.login
  116. ? user.login
  117. : "anon"}
  118. </div>
  119. <div>
  120. <Button
  121. id={user._id + i}
  122. user={user?.login}
  123. onClick={() => {
  124. onAddMember(user);
  125. document.getElementById(
  126. user._id + i
  127. ).innerHTML = "✓";
  128. }}
  129. >
  130. +
  131. </Button>
  132. </div>
  133. </div>
  134. );
  135. })
  136. : null}
  137. </form>
  138. </div>
  139. <div className="df">
  140. <Button
  141. variant="primary"
  142. className="buttonSetting"
  143. onClick={() => {
  144. (console.log(prepareMembers(members, "members")))
  145. onChat(
  146. "media",
  147. img,
  148. title,
  149. prepareMembers(members),
  150. chat?.id,
  151. )
  152. }}
  153. >
  154. {console.log(members, "members")}
  155. <Link
  156. to="/changesdonechats"
  157. style={{
  158. color: "white",
  159. textDecoration: "none",
  160. }}
  161. >
  162. Apply Changes
  163. </Link>
  164. </Button>
  165. <Link to="/main" className="changepasLink">
  166. Back to all chats
  167. </Link>
  168. </div>
  169. </div>
  170. </div>
  171. </div>
  172. );
  173. };
  174. export const CNewChatPage = connect(
  175. (state) => ({
  176. myProfile: state.promise.myProfile?.payload || {},
  177. foundUsers: state?.promise?.findUsers?.payload,
  178. }),
  179. { onChat: actionSetChatInfo, onGetUser: actionFindUsers }
  180. )(ChatPage);