mirror of
https://github.com/discourse/discourse.git
synced 2024-12-13 02:33:43 +08:00
ef31c7df63
This method override was misnamed from the beginning and nobody noticed that this special bookmark handling was missing so…
100 lines
2.8 KiB
JavaScript
100 lines
2.8 KiB
JavaScript
import { debounce } from "discourse-common/utils/decorators";
|
|
import { headerOffset } from "discourse/lib/offset-calculator";
|
|
import isElementInViewport from "discourse/lib/is-element-in-viewport";
|
|
import { withPluginApi } from "discourse/lib/plugin-api";
|
|
|
|
const PLUGIN_ID = "new-user-narrative";
|
|
|
|
function initialize(api) {
|
|
const messageBus = api.container.lookup("service:message-bus");
|
|
const currentUser = api.getCurrentUser();
|
|
const appEvents = api.container.lookup("service:app-events");
|
|
|
|
api.modifyClass("component:site-header", {
|
|
pluginId: PLUGIN_ID,
|
|
didInsertElement() {
|
|
this._super(...arguments);
|
|
this.dispatch("header:search-context-trigger", "header");
|
|
},
|
|
});
|
|
|
|
api.modifyClass("controller:topic", {
|
|
pluginId: PLUGIN_ID,
|
|
|
|
subscribe() {
|
|
this._super(...arguments);
|
|
|
|
this.messageBus.subscribe(`/topic/${this.model.id}`, (data) => {
|
|
const topic = this.model;
|
|
|
|
// scroll only for discobot (-2 is discobot id)
|
|
if (
|
|
topic.isPrivateMessage &&
|
|
this.currentUser &&
|
|
this.currentUser.id !== data.user_id &&
|
|
data.user_id === -2 &&
|
|
data.type === "created"
|
|
) {
|
|
const postNumber = data.post_number;
|
|
const notInPostStream =
|
|
topic.get("highest_post_number") <= postNumber;
|
|
const postNumberDifference = postNumber - topic.currentPost;
|
|
|
|
if (
|
|
notInPostStream &&
|
|
postNumberDifference > 0 &&
|
|
postNumberDifference < 7
|
|
) {
|
|
this._scrollToDiscobotPost(data.post_number);
|
|
}
|
|
}
|
|
});
|
|
// No need to unsubscribe, core unsubscribes /topic/* routes
|
|
},
|
|
|
|
@debounce(500)
|
|
_scrollToDiscobotPost(postNumber) {
|
|
const post = document.querySelector(
|
|
`.topic-post article#post_${postNumber}`
|
|
);
|
|
|
|
if (!post || isElementInViewport(post)) {
|
|
return;
|
|
}
|
|
|
|
const viewportOffset = post.getBoundingClientRect();
|
|
|
|
window.scrollTo({
|
|
top: window.scrollY + viewportOffset.top - headerOffset(),
|
|
behavior: "smooth",
|
|
});
|
|
},
|
|
});
|
|
|
|
api.attachWidgetAction("header", "headerSearchContextTrigger", function () {
|
|
if (this.site.mobileView) {
|
|
this.state.skipSearchContext = false;
|
|
} else {
|
|
this.state.contextEnabled = true;
|
|
this.state.searchContextType = "topic";
|
|
}
|
|
});
|
|
|
|
if (messageBus && currentUser) {
|
|
messageBus.subscribe(`/new_user_narrative/tutorial_search`, () => {
|
|
appEvents.trigger("header:search-context-trigger");
|
|
});
|
|
}
|
|
}
|
|
|
|
export default {
|
|
name: "new-user-narrative",
|
|
|
|
initialize(container) {
|
|
const siteSettings = container.lookup("service:site-settings");
|
|
if (siteSettings.discourse_narrative_bot_enabled) {
|
|
withPluginApi("0.8.7", initialize);
|
|
}
|
|
},
|
|
};
|