import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; import { action } from "@ember/object"; import didInsert from "@ember/render-modifiers/modifiers/did-insert"; import willDestroy from "@ember/render-modifiers/modifiers/will-destroy"; import { service } from "@ember/service"; import { htmlSafe } from "@ember/template"; import CookText from "discourse/components/cook-text"; import DButton from "discourse/components/d-button"; import DModal from "discourse/components/d-modal"; import concatClass from "discourse/helpers/concat-class"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { bind } from "discourse/lib/decorators"; import { i18n } from "discourse-i18n"; import SmoothStreamer from "../../lib/smooth-streamer"; import AiIndicatorWave from "../ai-indicator-wave"; export default class ModalDiffModal extends Component { @service currentUser; @service messageBus; @tracked loading = false; @tracked diff; @tracked suggestion = ""; @tracked smoothStreamer = new SmoothStreamer( () => this.suggestion, (newValue) => (this.suggestion = newValue) ); constructor() { super(...arguments); this.suggestChanges(); } @bind subscribe() { const channel = "/discourse-ai/ai-helper/stream_composer_suggestion"; this.messageBus.subscribe(channel, this.updateResult); } @bind unsubscribe() { const channel = "/discourse-ai/ai-helper/stream_composer_suggestion"; this.messageBus.subscribe(channel, this.updateResult); } @action async updateResult(result) { if (result) { this.loading = false; } await this.smoothStreamer.updateResult(result, "result"); if (result.done) { this.diff = result.diff; } const mdTablePromptId = this.currentUser?.ai_helper_prompts.find( (prompt) => prompt.name === "markdown_table" ).id; // Markdown table prompt looks better with // before/after results than diff // despite having `type: diff` if (this.args.model.mode === mdTablePromptId) { this.diff = null; } } @action async suggestChanges() { this.smoothStreamer.resetStreaming(); this.diff = null; this.suggestion = ""; this.loading = true; try { return await ajax("/discourse-ai/ai-helper/stream_suggestion", { method: "POST", data: { location: "composer", mode: this.args.model.mode, text: this.args.model.selectedText, custom_prompt: this.args.model.customPromptValue, force_default_locale: true, }, }); } catch (e) { popupAjaxError(e); } finally { this.loading = false; } } @action triggerConfirmChanges() { this.args.closeModal(); if (this.suggestion) { this.args.model.toolbarEvent.replaceText( this.args.model.selectedText, this.suggestion ); } } }