This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/components/topic-timer-info.js.es6
2019-06-13 17:01:43 +05:30

99 lines
2.7 KiB
JavaScript

import { iconHTML } from "discourse-common/lib/icon-library";
import { bufferedRender } from "discourse-common/lib/buffered-render";
import Category from "discourse/models/category";
export default Ember.Component.extend(
bufferedRender({
classNames: ["topic-status-info"],
_delayedRerender: null,
rerenderTriggers: [
"topicClosed",
"statusType",
"executeAt",
"basedOnLastPost",
"duration",
"categoryId"
],
buildBuffer(buffer) {
if (!this.executeAt) return;
const topicStatus = this.topicClosed ? "close" : "open";
const topicStatusKnown = this.topicClosed !== undefined;
if (topicStatusKnown && topicStatus === this.statusType) return;
const statusUpdateAt = moment(this.executeAt);
const duration = moment.duration(statusUpdateAt - moment());
const minutesLeft = duration.asMinutes();
if (minutesLeft > 0) {
let rerenderDelay = 1000;
if (minutesLeft > 2160) {
rerenderDelay = 12 * 60 * 60000;
} else if (minutesLeft > 1410) {
rerenderDelay = 60 * 60000;
} else if (minutesLeft > 90) {
rerenderDelay = 30 * 60000;
} else if (minutesLeft > 2) {
rerenderDelay = 60000;
}
let autoCloseHours = this.duration || 0;
buffer.push(`<h3>${iconHTML("far-clock")} `);
let options = {
timeLeft: duration.humanize(true),
duration: moment.duration(autoCloseHours, "hours").humanize()
};
const categoryId = this.categoryId;
if (categoryId) {
const category = Category.findById(categoryId);
options = Object.assign(
{
categoryName: category.get("slug"),
categoryUrl: category.get("url")
},
options
);
}
buffer.push(
`<span title="${moment(this.executeAt).format("LLLL")}">${I18n.t(
this._noticeKey(),
options
)}</span>`
);
buffer.push("</h3>");
// TODO Sam: concerned this can cause a heavy rerender loop
if (!Ember.testing) {
this._delayedRerender = Ember.run.later(
this,
this.rerender,
rerenderDelay
);
}
}
},
willDestroyElement() {
if (this._delayedRerender) {
Ember.run.cancel(this._delayedRerender);
}
},
_noticeKey() {
const statusType = this.statusType;
if (this.basedOnLastPost) {
return `topic.status_update_notice.auto_${statusType}_based_on_last_post`;
} else {
return `topic.status_update_notice.auto_${statusType}`;
}
}
})
);