Files
discourse-ai/assets/javascripts/discourse/lib/copy-conversation.js
T
Sam c9b109f9d4 FIX: use async versions of clipboardCopy (#389)
Chrome and Firefox work with standard clipboardCopy, but since
we are making an ajax call Safari fails cause there is too much
delay detected.

To avoid this issue we trade in promises which are acceptable and
work in iOS.
2023-12-29 22:50:10 +11:00

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