index.jsx 3.6 KB

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