index.jsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import React, {Component} from "react";
  2. import PropTypes from "prop-types";
  3. import {connect} from "react-redux";
  4. import { Redirect } from "react-router-dom";
  5. import {translate} from "react-i18next";
  6. import CustomMessages from "components/CustomMessages.jsx";
  7. import io from "io";
  8. @connect(state => ({
  9. user: {
  10. userId: state.user.get("userId"),
  11. role: state.user.get("role"),
  12. },
  13. }))
  14. @translate(["profile"], {wait: true})
  15. export default class Profile extends Component {
  16. static propTypes = {
  17. user: PropTypes.object,
  18. t: PropTypes.func,
  19. };
  20. static defaultProps = {
  21. user: {
  22. userId: "",
  23. role: "default",
  24. },
  25. t: () => {
  26. },
  27. };
  28. constructor(props) {
  29. super(props);
  30. const prettyRole = {
  31. default: "Default",
  32. admin: "Admin",
  33. };
  34. this.state = {
  35. user: {},
  36. loaded: false,
  37. notFound: true,
  38. };
  39. io.getSocket(socket => {
  40. socket.emit("users.findByUsername", this.props.props.computedMatch.params.username, res => {
  41. if (res.status === "success") {
  42. const user = this.state.user;
  43. user.username = res.data.username;
  44. user.image = "/assets/images/notes.png";
  45. user.joinDatePretty = moment(res.data.createdAt).format("LL");
  46. user.likes = res.data.liked.length;
  47. user.dislikes = res.data.disliked.length;
  48. user.songsRequested = res.data.statistics.songsRequested;
  49. user.rolePretty = prettyRole[res.data.role];
  50. user.role = res.data.role;
  51. user.userId = res.data._id;
  52. document.title = user.username + " - Musare"; // TODO Improve title system
  53. this.setState({ user, loaded: true, notFound: false });
  54. } else {
  55. this.setState({ loaded: true, notFound: true });
  56. }
  57. });
  58. });
  59. }
  60. promoteDemoteButton = () => {
  61. if (this.state.loaded === false) return null;
  62. if (this.props.user.role !== "admin") return null;
  63. const demoteButton = <button onClick={ this.demoteToDefault }>{ this.props.t("profile:demoteToDefault") }</button>;
  64. const promoteButton = <button onClick={ this.promoteToAdmin }>{ this.props.t("profile:promoteToAdmin") }</button>;
  65. return (this.state.user.role === "admin") ? demoteButton : promoteButton;
  66. };
  67. promoteDemote = (role) => {
  68. this.messages.clearErrorSuccess();
  69. io.getSocket(socket => {
  70. socket.emit("users.updateRole", this.state.user.userId, role, res => {
  71. if (res.status === "success") {
  72. this.messages.clearAddSuccess(this.props.t("profile:failedToChangeRank"));// TODO Fix
  73. } else {
  74. this.messages.addError(res.message);
  75. }
  76. });
  77. });
  78. };
  79. promoteToAdmin = () => {
  80. this.promoteDemote("admin");
  81. };
  82. demoteToDefault = () => {
  83. this.promoteDemote("default");
  84. };
  85. render() {
  86. const { t } = this.props;
  87. const {user, loaded, notFound} = this.state;
  88. return (loaded)
  89. ? (
  90. (notFound)
  91. ? <Redirect to={"/404"}/>
  92. : (
  93. <main id="profile">
  94. <h1>{user.username}</h1>
  95. <CustomMessages onRef={ref => (this.messages = ref)}/>
  96. <img src={ user.image }/>
  97. <p>{ t("profile:aMemberSince") } {user.joinDatePretty}</p>
  98. <div className="profile-details-list">
  99. <span>
  100. <b>{ t("profile:likedSongs") }:</b>
  101. <span>{ user.likes }</span>
  102. </span>
  103. <span>
  104. <b>{ t("profile:dislikedSongs") }</b>
  105. <span>{ user.dislikes }</span>
  106. </span>
  107. <span>
  108. <b>{ t("profile:songsRequested") }</b>
  109. <span>{ user.songsRequested }</span>
  110. </span>
  111. <span>
  112. <b>{ t("profile:rank") }</b>
  113. <span>{ user.rolePretty }</span>
  114. </span>
  115. </div>
  116. { this.promoteDemoteButton() }
  117. </main>
  118. )
  119. )
  120. : <h1>Loading...</h1>;
  121. }
  122. }