root.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React from "react"
  2. import ListEmpty from "misago/components/users/active-posters/list-empty"
  3. import ListPreview from "misago/components/users/active-posters/list-preview"
  4. import ListReady from "misago/components/users/active-posters/list-ready"
  5. import misago from "misago/index"
  6. import { hydrate } from "misago/reducers/users"
  7. import polls from "misago/services/polls"
  8. import store from "misago/services/store"
  9. import title from "misago/services/page-title"
  10. export default class extends React.Component {
  11. constructor(props) {
  12. super(props)
  13. if (misago.has("USERS")) {
  14. this.initWithPreloadedData(misago.pop("USERS"))
  15. } else {
  16. this.initWithoutPreloadedData()
  17. }
  18. this.startPolling()
  19. }
  20. initWithPreloadedData(data) {
  21. this.state = {
  22. isLoaded: true,
  23. trackedPeriod: data.tracked_period,
  24. count: data.count,
  25. }
  26. store.dispatch(hydrate(data.results))
  27. }
  28. initWithoutPreloadedData() {
  29. this.state = {
  30. isLoaded: false,
  31. }
  32. }
  33. startPolling() {
  34. polls.start({
  35. poll: "active-posters",
  36. url: misago.get("USERS_API"),
  37. data: {
  38. list: "active",
  39. },
  40. frequency: 90 * 1000,
  41. update: this.update,
  42. })
  43. }
  44. update = (data) => {
  45. store.dispatch(hydrate(data.results))
  46. this.setState({
  47. isLoaded: true,
  48. trackedPeriod: data.tracked_period,
  49. count: data.count,
  50. })
  51. }
  52. componentDidMount() {
  53. title.set({
  54. title: this.props.route.extra.name,
  55. parent: gettext("Users"),
  56. })
  57. }
  58. componentWillUnmount() {
  59. polls.stop("active-posters")
  60. }
  61. render() {
  62. const page = { name: this.props.route.extra.name }
  63. if (this.state.isLoaded) {
  64. if (this.state.count > 0) {
  65. return (
  66. <ListReady
  67. page={page}
  68. users={this.props.users}
  69. trackedPeriod={this.state.trackedPeriod}
  70. count={this.state.count}
  71. />
  72. )
  73. } else {
  74. return (
  75. <ListEmpty page={page} trackedPeriod={this.state.trackedPeriod} />
  76. )
  77. }
  78. } else {
  79. return <ListPreview page={page} />
  80. }
  81. }
  82. }