import { tracked } from "@glimmer/tracking"; import Component, { Input } from "@ember/component"; import { fn } from "@ember/helper"; import { on } from "@ember/modifier"; import { action } from "@ember/object"; import { getOwner } from "@ember/owner"; import didInsert from "@ember/render-modifiers/modifiers/did-insert"; import { inject as service } from "@ember/service"; import DButton from "discourse/components/d-button"; import { ajax } from "discourse/lib/ajax"; import UppyUpload from "discourse/lib/uppy/uppy-upload"; import icon from "discourse-common/helpers/d-icon"; import discourseDebounce from "discourse-common/lib/debounce"; import I18n from "discourse-i18n"; import RagUploadProgress from "./rag-upload-progress"; export default class RagUploader extends Component { @service appEvents; @tracked term = null; @tracked filteredUploads = null; @tracked ragIndexingStatuses = null; @tracked ragUploads = null; uppyUpload = new UppyUpload(getOwner(this), { id: "discourse-ai-rag-uploader", maxFiles: 20, uploadUrl: "/admin/plugins/discourse-ai/rag-document-fragments/files/upload", preventDirectS3Uploads: true, uploadDone: (uploadedFile) => { const newUpload = uploadedFile.upload; newUpload.status = "uploaded"; newUpload.statusText = I18n.t("discourse_ai.rag.uploads.uploaded"); this.ragUploads.pushObject(newUpload); this.debouncedSearch(); }, }); didReceiveAttrs() { super.didReceiveAttrs(...arguments); if (this.uppyUpload.inProgressUploads?.length > 0) { this.uppyUpload.cancelAllUploads(); } this.ragUploads = this.target?.rag_uploads || []; this.filteredUploads = this.ragUploads; const targetName = this.target?.constructor?.name; if (this.ragUploads?.length && this.target?.id) { ajax( `/admin/plugins/discourse-ai/rag-document-fragments/files/status.json?target_type=${targetName}&target_id=${this.target.id}` ).then((statuses) => { this.set("ragIndexingStatuses", statuses); }); } this.appEvents.on( `upload-mixin:${this.uppyUpload.config.id}:all-uploads-complete`, this, "_updateTargetWithUploads" ); } willDestroy() { super.willDestroy(...arguments); this.appEvents.off( `upload-mixin:${this.uppyUpload.config}:all-uploads-complete`, this, "_updateTargetWithUploads" ); } _updateTargetWithUploads() { this.updateUploads(this.ragUploads); } @action submitFiles() { this.uppyUpload.openPicker(); } @action cancelUploading(upload) { this.uppyUpload.cancelSingleUpload({ fileId: upload.id, }); } @action search() { if (this.term) { this.filteredUploads = this.ragUploads.filter((u) => { return ( u.original_filename.toUpperCase().indexOf(this.term.toUpperCase()) > -1 ); }); } else { this.filteredUploads = this.ragUploads; } } @action debouncedSearch() { discourseDebounce(this, this.search, 100); } @action removeUpload(upload) { this.ragUploads.removeObject(upload); this.onRemove(upload); this.debouncedSearch(); } }