discourse-ai/assets/javascripts/discourse/lib/copy-conversation.js

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;
}