79 lines
2.3 KiB
Plaintext
79 lines
2.3 KiB
Plaintext
import { cached, tracked } from "@glimmer/tracking";
|
|
import BasicTopicList from "discourse/components/basic-topic-list";
|
|
import { withPluginApi } from "discourse/lib/plugin-api";
|
|
import icon from "discourse-common/helpers/d-icon";
|
|
import i18n from "discourse-common/helpers/i18n";
|
|
|
|
const RelatedTopics = <template>
|
|
<div
|
|
role="complementary"
|
|
aria-labelledby="related-topics-title"
|
|
id="related-topics"
|
|
class="more-topics__list"
|
|
>
|
|
<h3 id="related-topics-title" class="more-topics__list-title">
|
|
{{icon "discourse-sparkles"}}{{i18n "discourse_ai.related_topics.title"}}
|
|
</h3>
|
|
<div class="topics">
|
|
<BasicTopicList @topics={{@topic.relatedTopics}} />
|
|
</div>
|
|
</div>
|
|
</template>;
|
|
|
|
export default {
|
|
name: "discourse-ai-related-topics",
|
|
|
|
initialize(container) {
|
|
const settings = container.lookup("service:site-settings");
|
|
|
|
if (
|
|
!settings.ai_embeddings_enabled ||
|
|
!settings.ai_embeddings_semantic_related_topics_enabled
|
|
) {
|
|
return;
|
|
}
|
|
|
|
withPluginApi("1.37.2", (api) => {
|
|
api.registerMoreTopicsTab({
|
|
id: "related-topics",
|
|
name: i18n("discourse_ai.related_topics.pill"),
|
|
icon: "discourse-sparkles",
|
|
component: RelatedTopics,
|
|
condition: ({ topic }) => topic.relatedTopics?.length,
|
|
});
|
|
|
|
api.modifyClass(
|
|
"model:topic",
|
|
(Superclass) =>
|
|
class extends Superclass {
|
|
@tracked related_topics;
|
|
relatedTopicsCache = [];
|
|
|
|
@cached
|
|
get relatedTopics() {
|
|
// Used to keep related topics when a user scrolls up from the
|
|
// bottom of the topic and then scrolls back down
|
|
if (this.related_topics) {
|
|
this.relatedTopicsCache = this.related_topics;
|
|
}
|
|
return this.relatedTopicsCache?.map((topic) =>
|
|
this.store.createRecord("topic", topic)
|
|
);
|
|
}
|
|
}
|
|
);
|
|
|
|
api.modifyClass(
|
|
"model:post-stream",
|
|
(Superclass) =>
|
|
class extends Superclass {
|
|
_setSuggestedTopics(result) {
|
|
super._setSuggestedTopics(...arguments);
|
|
this.topic.related_topics = result.related_topics;
|
|
}
|
|
}
|
|
);
|
|
});
|
|
},
|
|
};
|