58 lines
1.8 KiB
JavaScript
58 lines
1.8 KiB
JavaScript
import { ajax } from "discourse/lib/ajax";
|
|
import { popupAjaxError } from "discourse/lib/ajax-error";
|
|
import { apiInitializer } from "discourse/lib/api";
|
|
import I18n from "discourse-i18n";
|
|
|
|
export default apiInitializer("1.25.0", (api) => {
|
|
const buttonAttrs = {
|
|
label: I18n.t("discourse_ai.ai_helper.image_caption.button_label"),
|
|
icon: "discourse-sparkles",
|
|
class: "generate-caption",
|
|
};
|
|
const imageCaptionPopup = api.container.lookup("service:imageCaptionPopup");
|
|
const settings = api.container.lookup("service:site-settings");
|
|
|
|
if (!settings.ai_helper_enabled_features.includes("image_caption")) {
|
|
return;
|
|
}
|
|
api.addComposerImageWrapperButton(
|
|
buttonAttrs.label,
|
|
buttonAttrs.class,
|
|
buttonAttrs.icon,
|
|
(event) => {
|
|
if (event.target.classList.contains("generate-caption")) {
|
|
const buttonWrapper = event.target.closest(".button-wrapper");
|
|
const imageIndex = parseInt(
|
|
buttonWrapper.getAttribute("data-image-index"),
|
|
10
|
|
);
|
|
const imageSrc = event.target
|
|
.closest(".image-wrapper")
|
|
.querySelector("img")
|
|
.getAttribute("src");
|
|
|
|
imageCaptionPopup.loading = true;
|
|
imageCaptionPopup.showPopup = !imageCaptionPopup.showPopup;
|
|
|
|
ajax(`/discourse-ai/ai-helper/caption_image`, {
|
|
method: "POST",
|
|
data: {
|
|
image_url: imageSrc,
|
|
},
|
|
})
|
|
.then(({ caption }) => {
|
|
event.target.classList.add("disabled");
|
|
imageCaptionPopup.imageSrc = imageSrc;
|
|
imageCaptionPopup.imageIndex = imageIndex;
|
|
imageCaptionPopup.newCaption = caption;
|
|
})
|
|
.catch(popupAjaxError)
|
|
.finally(() => {
|
|
imageCaptionPopup.loading = false;
|
|
event.target.classList.remove("disabled");
|
|
});
|
|
}
|
|
}
|
|
);
|
|
});
|