root.js 3.2 KB

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