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