104 lines
3.0 KiB
JavaScript
104 lines
3.0 KiB
JavaScript
import { isEmpty } from "@ember/utils";
|
|
import { scheduleOnce } from "@ember/runloop";
|
|
import DiscourseRoute from "discourse/routes/discourse";
|
|
import DiscourseURL from "discourse/lib/url";
|
|
import Draft from "discourse/models/draft";
|
|
import ENV from "discourse-common/config/environment";
|
|
|
|
// This route is used for retrieving a topic based on params
|
|
export default DiscourseRoute.extend({
|
|
// Avoid default model hook
|
|
model(params) {
|
|
return params;
|
|
},
|
|
|
|
deactivate() {
|
|
this._super(...arguments);
|
|
this.controllerFor("topic").unsubscribe();
|
|
},
|
|
|
|
setupController(controller, params) {
|
|
params = params || {};
|
|
params.track_visit = true;
|
|
|
|
const topic = this.modelFor("topic"),
|
|
postStream = topic.postStream,
|
|
topicController = this.controllerFor("topic"),
|
|
composerController = this.controllerFor("composer");
|
|
|
|
// I sincerely hope no topic gets this many posts
|
|
if (params.nearPost === "last") {
|
|
params.nearPost = 999999999;
|
|
}
|
|
|
|
params.forceLoad = true;
|
|
|
|
postStream
|
|
.refresh(params)
|
|
.then(() => {
|
|
// TODO we are seeing errors where closest post is null and this is exploding
|
|
// we need better handling and logging for this condition.
|
|
|
|
// there are no closestPost for hidden topics
|
|
if (topic.view_hidden) {
|
|
return;
|
|
}
|
|
|
|
// The post we requested might not exist. Let's find the closest post
|
|
const closestPost = postStream.closestPostForPostNumber(
|
|
params.nearPost || 1
|
|
);
|
|
const closest = closestPost.post_number;
|
|
|
|
topicController.setProperties({
|
|
"model.currentPost": closest,
|
|
enteredIndex: topic.postStream.progressIndexOfPost(closestPost),
|
|
enteredAt: new Date().getTime().toString()
|
|
});
|
|
|
|
this.appEvents.trigger("page:topic-loaded", topic);
|
|
topicController.subscribe();
|
|
|
|
// Highlight our post after the next render
|
|
scheduleOnce("afterRender", () =>
|
|
this.appEvents.trigger("post:highlight", closest)
|
|
);
|
|
|
|
const opts = {};
|
|
if (document.location.hash && document.location.hash.length) {
|
|
opts.anchor = document.location.hash;
|
|
}
|
|
DiscourseURL.jumpToPost(closest, opts);
|
|
|
|
if (!isEmpty(topic.draft)) {
|
|
composerController.open({
|
|
draft: Draft.getLocal(topic.draft_key, topic.draft),
|
|
draftKey: topic.draft_key,
|
|
draftSequence: topic.draft_sequence,
|
|
ignoreIfChanged: true,
|
|
topic
|
|
});
|
|
}
|
|
})
|
|
.catch(e => {
|
|
if (ENV.environment !== "test") {
|
|
// eslint-disable-next-line no-console
|
|
console.log("Could not view topic", e);
|
|
}
|
|
});
|
|
},
|
|
|
|
actions: {
|
|
willTransition() {
|
|
this.controllerFor("topic").set(
|
|
"previousURL",
|
|
document.location.pathname
|
|
);
|
|
|
|
// NOTE: omitting this return can break the back button when transitioning quickly between
|
|
// topics and the latest page.
|
|
return true;
|
|
}
|
|
}
|
|
});
|