65 lines
1.6 KiB
JavaScript
65 lines
1.6 KiB
JavaScript
import { ajax } from "discourse/lib/ajax";
|
|
import { clipboardCopyAsync } from "discourse/lib/utilities";
|
|
import I18n from "discourse-i18n";
|
|
|
|
export default async function (topic, fromPostNumber, toPostNumber) {
|
|
await clipboardCopyAsync(async () => {
|
|
const text = await generateClipboard(topic, fromPostNumber, toPostNumber);
|
|
return new Blob([text], {
|
|
type: "text/plain",
|
|
});
|
|
});
|
|
}
|
|
|
|
async function generateClipboard(topic, fromPostNumber, toPostNumber) {
|
|
const stream = topic.get("postStream");
|
|
|
|
let postNumbers = [];
|
|
// simpler to understand than Array.from
|
|
for (let i = fromPostNumber; i <= toPostNumber; i++) {
|
|
postNumbers.push(i);
|
|
}
|
|
|
|
const postIds = postNumbers.map((postNumber) => {
|
|
return stream.findPostIdForPostNumber(postNumber);
|
|
});
|
|
|
|
// we need raw to construct so post stream will not help
|
|
|
|
const url = `/t/${topic.id}/posts.json`;
|
|
const data = {
|
|
post_ids: postIds,
|
|
include_raw: true,
|
|
};
|
|
|
|
const response = await ajax(url, { data });
|
|
|
|
let buffer = [];
|
|
buffer.push("<details class='ai-quote'>");
|
|
buffer.push("<summary>");
|
|
buffer.push(`<span>${topic.title}</span>`);
|
|
buffer.push(
|
|
`<span title='${I18n.t("discourse_ai.ai_bot.ai_title")}'>${I18n.t(
|
|
"discourse_ai.ai_bot.ai_label"
|
|
)}</span>`
|
|
);
|
|
buffer.push("</summary>");
|
|
|
|
response.post_stream.posts.forEach((post) => {
|
|
buffer.push("");
|
|
buffer.push(`**${post.username}:**`);
|
|
buffer.push("");
|
|
buffer.push(post.raw);
|
|
});
|
|
|
|
buffer.push("</details>");
|
|
|
|
const text = buffer.join("\n");
|
|
|
|
if (window.discourseAiTestClipboard) {
|
|
window.discourseAiClipboard = text;
|
|
}
|
|
|
|
return text;
|
|
}
|