root.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import React from 'react'; // jshint ignore:line
  2. import { connect } from 'react-redux';
  3. import BanDetails from './ban-details'; // jshint ignore:line
  4. import { Posts, Threads } from './feed'; // jshint ignore:line
  5. import Followers from './followers'; // jshint ignore:line
  6. import Follows from './follows'; // jshint ignore:line
  7. import UsernameHistory from './username-history'; // jshint ignore:line
  8. import Header from './header'; // jshint ignore:line
  9. import ModerationNav from './moderation/nav'; // jshint ignore:line
  10. import { SideNav, CompactNav } from './navs'; // jshint ignore:line
  11. import Avatar from 'misago/components/avatar'; // jshint ignore:line
  12. import WithDropdown from 'misago/components/with-dropdown';
  13. import misago from 'misago';
  14. import { hydrate } from 'misago/reducers/profile'; // jshint ignore:line
  15. import polls from 'misago/services/polls';
  16. import store from 'misago/services/store'; // jshint ignore:line
  17. export default class extends WithDropdown {
  18. constructor(props) {
  19. super(props);
  20. this.startPolling(props.profile.api_url.root);
  21. }
  22. startPolling(api) {
  23. polls.start({
  24. poll: 'user-profile',
  25. url: api,
  26. frequency: 90 * 1000,
  27. update: this.update
  28. });
  29. }
  30. /* jshint ignore:start */
  31. update = (data) => {
  32. store.dispatch(hydrate(data));
  33. };
  34. /* jshint ignore:end */
  35. getClassName() {
  36. const baseClass = 'page page-user-profile';
  37. if (false && this.props.profile.rank.css_class) {
  38. return baseClass + ' page-user-profile-' + this.props.profile.rank.css_class;
  39. }
  40. return baseClass;
  41. }
  42. render() {
  43. /* jshint ignore:start */
  44. const baseUrl = misago.get('PROFILE').absolute_url;
  45. const pages = misago.get('PROFILE_PAGES');
  46. return (
  47. <div className={this.getClassName()}>
  48. <Header
  49. baseUrl={baseUrl}
  50. pages={pages}
  51. profile={this.props.profile}
  52. toggleNav={this.toggleNav}
  53. toggleModeration={this.toggleModeration}
  54. user={this.props.user}
  55. />
  56. <div className="container">
  57. <div className="row">
  58. <div className="col-md-3 hidden-xs hidden-sm">
  59. <div className="profile-side-avatar">
  60. <Avatar user={this.props.profile} size="400" />
  61. </div>
  62. <SideNav
  63. baseUrl={baseUrl}
  64. pages={pages}
  65. profile={this.props.profile}
  66. />
  67. </div>
  68. <div className="col-md-9">
  69. {this.props.children}
  70. </div>
  71. </div>
  72. </div>
  73. </div>
  74. );
  75. /* jshint ignore:end */
  76. }
  77. }
  78. export function select(store) {
  79. return {
  80. 'tick': store.tick.tick,
  81. 'user': store.auth.user,
  82. 'users': store.users,
  83. 'posts': store.posts,
  84. 'profile': store.profile,
  85. 'username-history': store['username-history']
  86. };
  87. }
  88. const COMPONENTS = {
  89. 'posts': Posts,
  90. 'threads': Threads,
  91. 'followers': Followers,
  92. 'follows': Follows,
  93. 'username-history': UsernameHistory,
  94. 'ban-details': BanDetails
  95. };
  96. export function paths() {
  97. let paths = [];
  98. misago.get('PROFILE_PAGES').forEach(function(item) {
  99. paths.push(Object.assign({}, item, {
  100. path: misago.get('PROFILE').absolute_url + item.component + '/',
  101. component: connect(select)(COMPONENTS[item.component]),
  102. }));
  103. });
  104. return paths;
  105. }