MyProfile.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. import { Spoiler } from "../Other/Spoiler";
  2. import {
  3. backURL,
  4. validateEmail,
  5. validatePassword,
  6. validateNickname,
  7. } from "../../helpers/index";
  8. import { CMyDropzone } from "../Other/Dropzone";
  9. import { Form, Alert, Row, Col, Button } from "react-bootstrap";
  10. import { useState } from "react";
  11. import { connect } from "react-redux";
  12. import { CUserInfo } from "./UserInfo";
  13. import { CPreloader } from "../Other/Preloader";
  14. import {
  15. actionSetNickname,
  16. actionSetEmail,
  17. actionSetNewPassword,
  18. } from "./../../actions/types";
  19. const MyProfile = ({
  20. id,
  21. auth,
  22. promise,
  23. emailUpdate,
  24. nickUpdate,
  25. changePassword,
  26. }) => {
  27. const [login, setLogin] = useState("");
  28. const [nick, setNickname] = useState("");
  29. const [password, setPassword] = useState("");
  30. const [newPassword, setNewPassword] = useState("");
  31. const [passwordShown, setPasswordShown] = useState(false);
  32. return (
  33. <div className="ProfilePage">
  34. <CPreloader
  35. promiseName={`${
  36. id === auth?.payload?.sub?.id ? "myUser" : "anotherUser"
  37. }`}
  38. promiseState={promise}
  39. children={<CUserInfo id={id} />}
  40. />
  41. {id === auth?.payload?.sub?.id ? (
  42. <div className="d-block mx-auto mt-2 container w-50">
  43. <h1>
  44. Редактирование профиля:{" "}
  45. {promise?.myUser?.payload?.nick
  46. ? promise?.myUser?.payload?.nick
  47. : "user"}
  48. </h1>
  49. <Spoiler
  50. children={
  51. <>
  52. <br />
  53. <form
  54. action="/upload"
  55. method="post"
  56. encType="multipart/form-data"
  57. id="form"
  58. className="text-center"
  59. >
  60. <img
  61. className="avatarProfile"
  62. src={
  63. promise?.myUser?.payload?.avatar
  64. ? `${backURL}/${promise.myUser.payload.avatar.url}`
  65. : "https://i.ibb.co/bBxzmTm/default-avatar.jpg"
  66. }
  67. alt="Avatar"
  68. />
  69. <CMyDropzone />
  70. </form>
  71. </>
  72. }
  73. header={<h3>Изменить аватар</h3>}
  74. />
  75. <Spoiler
  76. children={
  77. <>
  78. <br />
  79. <Form>
  80. {promise?.myUser?.payload?.nick === nick ? (
  81. <Alert>Никнейм не должен повторяться с предыдущим.</Alert>
  82. ) : null}
  83. {validateNickname(nick) ? null : (
  84. <Alert>
  85. Никнейм может состоять только из строчных букв и цифр,
  86. символы - и _, а так же иметь длину от 3 до 8 символов.
  87. </Alert>
  88. )}
  89. <Form.Group
  90. as={Row}
  91. className="m-2"
  92. controlId="formHorizontalEmail"
  93. >
  94. <Form.Label column sm={5}>
  95. Ваш никнейм:
  96. </Form.Label>
  97. <Col sm={10}>
  98. <Form.Control
  99. type="text"
  100. placeholder="Ваш текущий никнейм"
  101. value={
  102. promise?.myUser?.payload?.nick
  103. ? promise?.myUser?.payload?.nick
  104. : "Никнейм не установлен"
  105. }
  106. disabled
  107. />
  108. </Col>
  109. </Form.Group>
  110. <Form.Group
  111. as={Row}
  112. className="m-2"
  113. controlId="formHorizontalEmail"
  114. >
  115. <Form.Label column sm={5}>
  116. Новый никнейм:
  117. </Form.Label>
  118. <Col sm={10}>
  119. <Form.Control
  120. type="text"
  121. placeholder="Введите ваш новый никнейм"
  122. value={nick}
  123. max="8"
  124. onChange={(e) => setNickname(e.target.value)}
  125. />
  126. </Col>
  127. </Form.Group>
  128. <Form.Group as={Row} className="mb-3">
  129. <Col sm={{ span: 10, offset: 2 }} className="my-3">
  130. <Button
  131. variant="success"
  132. disabled={
  133. promise?.myUser?.payload?.nick !== nick &&
  134. validateNickname(nick)
  135. ? false
  136. : true
  137. }
  138. onClick={() =>
  139. nickUpdate({
  140. _id: promise?.myUser?.payload?._id,
  141. nick,
  142. })
  143. }
  144. >
  145. Сохранить
  146. </Button>
  147. </Col>
  148. </Form.Group>
  149. </Form>
  150. </>
  151. }
  152. header={<h3>Изменить никнейм</h3>}
  153. />
  154. <Spoiler
  155. children={
  156. <>
  157. <br />
  158. <Form>
  159. {promise?.myUser?.payload?.login === login ? (
  160. <Alert>Email не должен повторяться с предыдущим.</Alert>
  161. ) : null}
  162. {validateEmail(login) ? null : (
  163. <Alert>Email должен быть в формате: email@gmail.com.</Alert>
  164. )}
  165. <Form.Group
  166. as={Row}
  167. className="m-2"
  168. controlId="formHorizontalEmail"
  169. >
  170. <Form.Label column sm={5}>
  171. Ваша почта:
  172. </Form.Label>
  173. <Col sm={10}>
  174. <Form.Control
  175. type="text"
  176. placeholder="Ваша текущая почта"
  177. value={promise?.myUser?.payload?.login}
  178. disabled
  179. />
  180. </Col>
  181. </Form.Group>
  182. <Form.Group
  183. as={Row}
  184. className="m-2"
  185. controlId="formHorizontalEmail"
  186. >
  187. <Form.Label column sm={5}>
  188. Новая почта:
  189. </Form.Label>
  190. <Col sm={10}>
  191. <Form.Control
  192. type="text"
  193. placeholder="Введите вашу новую почту"
  194. value={login}
  195. onChange={(e) => setLogin(e.target.value)}
  196. />
  197. </Col>
  198. </Form.Group>
  199. <Form.Group as={Row} className="mb-3">
  200. <Col sm={{ span: 10, offset: 2 }} className="my-3">
  201. <Button
  202. variant="success"
  203. disabled={
  204. validateEmail(login) &&
  205. promise?.myUser?.payload?.login !== login
  206. ? false
  207. : true
  208. }
  209. onClick={() =>
  210. emailUpdate({
  211. _id: promise?.myUser?.payload?._id,
  212. login,
  213. })
  214. }
  215. >
  216. Сохранить
  217. </Button>
  218. </Col>
  219. </Form.Group>
  220. </Form>
  221. </>
  222. }
  223. header={<h3>Изменить почту</h3>}
  224. />
  225. <Spoiler
  226. children={
  227. <>
  228. <br />
  229. <Form>
  230. {password.length !== 0 ? null : (
  231. <Alert>
  232. Пожалуйста, введите свой текущий пароль в первое поле для
  233. изменения пароля.
  234. </Alert>
  235. )}
  236. {validatePassword(newPassword) ? null : (
  237. <Alert>
  238. Новый пароль должен быть от 6 символов, иметь хотя бы одну
  239. цифру и заглавную букву.
  240. </Alert>
  241. )}
  242. <Form.Group
  243. as={Row}
  244. className="m-2"
  245. controlId="formHorizontalPassword"
  246. >
  247. <Form.Label column sm={5}>
  248. Пароль:
  249. </Form.Label>
  250. <Col sm={10}>
  251. <Form.Control
  252. type={passwordShown ? "text" : "password"}
  253. placeholder="Введите ваш текущий пароль"
  254. onChange={(e) => setPassword(e.target.value)}
  255. />
  256. <Button
  257. className="mt-2"
  258. variant="secondary"
  259. onClick={() => setPasswordShown(!passwordShown)}
  260. >
  261. {`${passwordShown ? "Скрыть" : "Показать"} пароль`}
  262. </Button>
  263. </Col>
  264. </Form.Group>
  265. <Form.Group
  266. as={Row}
  267. className="m-2"
  268. controlId="formHorizontalPassword"
  269. >
  270. <Form.Label column sm={5}>
  271. Новый пароль:
  272. </Form.Label>
  273. <Col sm={10}>
  274. <Form.Control
  275. type={passwordShown ? "text" : "password"}
  276. placeholder="Введите ваш новый пароль"
  277. onChange={(e) => setNewPassword(e.target.value)}
  278. />
  279. </Col>
  280. </Form.Group>
  281. <Form.Group as={Row} className="mb-3">
  282. <Col sm={{ span: 10, offset: 2 }} className="my-3">
  283. <Button
  284. variant="success"
  285. disabled={validatePassword(newPassword) ? false : true}
  286. onClick={() =>
  287. changePassword(
  288. promise?.myUser?.payload?.login,
  289. password,
  290. newPassword
  291. )
  292. }
  293. >
  294. Сохранить
  295. </Button>
  296. </Col>
  297. </Form.Group>
  298. </Form>
  299. </>
  300. }
  301. header={<h3>Изменить пароль</h3>}
  302. />
  303. </div>
  304. ) : null}
  305. <div className="container" style={{ height: "300px" }}></div>
  306. </div>
  307. );
  308. };
  309. export const CMyProfile = connect(
  310. (state) => ({ auth: state.auth, promise: state.promise }),
  311. {
  312. emailUpdate: actionSetEmail,
  313. nickUpdate: actionSetNickname,
  314. changePassword: actionSetNewPassword,
  315. }
  316. )(MyProfile);