root.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import React from 'react';
  2. import { connect } from 'react-redux';
  3. import Avatar from 'misago/components/avatar'; // jshint ignore:line
  4. import BanDetails from 'misago/components/profile/ban-details'; // jshint ignore:line
  5. import Followers from 'misago/components/profile/followers'; // jshint ignore:line
  6. import Follows from 'misago/components/profile/follows'; // jshint ignore:line
  7. import UsernameHistory from 'misago/components/profile/username-history'; // jshint ignore:line
  8. import Header from 'misago/components/profile/header'; // jshint ignore:line
  9. import ModerationNav from 'misago/components/profile/moderation/nav'; // jshint ignore:line
  10. import { SideNav, CompactNav } from 'misago/components/profile/navs'; // jshint ignore:line
  11. import WithDropdown from 'misago/components/with-dropdown';
  12. import misago from 'misago/index';
  13. import { hydrate } from 'misago/reducers/profile'; // jshint ignore:line
  14. import polls from 'misago/services/polls';
  15. import store from 'misago/services/store'; // jshint ignore:line
  16. export default class extends WithDropdown {
  17. constructor(props) {
  18. super(props);
  19. this.startPolling(props.profile.api_url.root);
  20. }
  21. startPolling(api) {
  22. polls.start({
  23. poll: 'user-profile',
  24. url: api,
  25. frequency: 90 * 1000,
  26. update: this.update
  27. });
  28. }
  29. /* jshint ignore:start */
  30. update = (data) => {
  31. store.dispatch(hydrate(data));
  32. };
  33. toggleNav = () => {
  34. if (this.state.dropdown === 'pages') {
  35. this.setState({
  36. dropdown: false
  37. });
  38. } else {
  39. this.setState({
  40. dropdown: 'pages'
  41. });
  42. }
  43. };
  44. toggleModeration = () => {
  45. if (this.state.dropdown === 'moderation') {
  46. this.setState({
  47. dropdown: false
  48. });
  49. } else {
  50. this.setState({
  51. dropdown: 'moderation'
  52. });
  53. }
  54. };
  55. /* jshint ignore:end */
  56. getNavDropdown() {
  57. if (this.state.dropdown === 'pages') {
  58. /* jshint ignore:start */
  59. return <CompactNav pages={misago.get('PROFILE_PAGES')}
  60. baseUrl={misago.get('PROFILE').absolute_url}
  61. profile={this.props.profile}
  62. toggleModeration={this.toggleModeration}
  63. hideNav={this.hideNav} />;
  64. /* jshint ignore:end */
  65. } else if (this.state.dropdown === 'moderation') {
  66. /* jshint ignore:start */
  67. return <ModerationNav profile={this.props.profile}
  68. toggleNav={this.toggleNav}
  69. hideNav={this.hideNav} />;
  70. /* jshint ignore:end */
  71. } else {
  72. return null;
  73. }
  74. }
  75. getClassName() {
  76. const baseClass = 'page page-user-profile';
  77. if (false && this.props.profile.rank.css_class) {
  78. return baseClass + ' page-user-profile-' + this.props.profile.rank.css_class;
  79. } else {
  80. return baseClass;
  81. }
  82. }
  83. render() {
  84. /* jshint ignore:start */
  85. return <div className={this.getClassName()}>
  86. <Header user={this.props.user}
  87. profile={this.props.profile}
  88. toggleNav={this.toggleNav}
  89. toggleModeration={this.toggleModeration} />
  90. <div className={this.getCompactNavClassName()}>
  91. {this.getNavDropdown()}
  92. </div>
  93. <div className="container">
  94. <div className="row">
  95. <div className="col-md-3 hidden-xs hidden-sm">
  96. <div className="profile-side-avatar">
  97. <Avatar user={this.props.profile} size="400" />
  98. </div>
  99. <SideNav pages={misago.get('PROFILE_PAGES')}
  100. baseUrl={misago.get('PROFILE').absolute_url}
  101. profile={this.props.profile} />
  102. </div>
  103. <div className="col-md-9">
  104. {this.props.children}
  105. </div>
  106. </div>
  107. </div>
  108. </div>;
  109. /* jshint ignore:end */
  110. }
  111. }
  112. export function select(store) {
  113. return {
  114. 'tick': store.tick.tick,
  115. 'user': store.auth.user,
  116. 'users': store.users,
  117. 'profile': store.profile,
  118. 'username-history': store['username-history']
  119. };
  120. }
  121. class Placeholder extends React.Component {
  122. render() {
  123. // jshint ignore:start
  124. return <div className="container">
  125. <p>{"Hello, I'm placeholder for " + this.props.route.name}</p>
  126. </div>;
  127. // jshint ignore:end
  128. }
  129. }
  130. const COMPONENTS = {
  131. 'posts': Placeholder,
  132. 'threads': Placeholder,
  133. 'followers': Followers,
  134. 'follows': Follows,
  135. 'username-history': UsernameHistory,
  136. 'ban-details': BanDetails
  137. };
  138. export function paths() {
  139. let paths = [];
  140. misago.get('PROFILE_PAGES').forEach(function(item) {
  141. paths.push(Object.assign({}, item, {
  142. path: misago.get('PROFILE').absolute_url + item.component + '/',
  143. component: connect(select)(COMPONENTS[item.component]),
  144. }));
  145. });
  146. return paths;
  147. }