import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; import { action } from "@ember/object"; import { notEmpty } from "@ember/object/computed"; import { service } from "@ember/service"; import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner"; import DButton from "discourse/components/d-button"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { bind } from "discourse/lib/decorators"; import { exportEntity } from "discourse/lib/export-csv"; import { i18n } from "discourse-i18n"; import UserExport from "admin/models/user-export"; const EXPORT_PROGRESS_CHANNEL = "/user-export-progress"; export default class extends Component { @service dialog; @service messageBus; @service toasts; @tracked userExport = null; @tracked userExportReloading = false; @notEmpty("userExport") userExportAvailable; constructor() { super(...arguments); this.messageBus.subscribe(EXPORT_PROGRESS_CHANNEL, this.onExportProgress); this.model = this.args.model; this.userExport = UserExport.create(this.model.latest_export?.user_export); } willDestroy() { super.willDestroy(...arguments); this.messageBus.unsubscribe(EXPORT_PROGRESS_CHANNEL, this.onExportProgress); } @bind onExportProgress(data) { if (data.user_export_id === this.model.id) { this.userExportReloading = false; if (data.failed) { this.dialog.alert(i18n("admin.user.exports.download.export_failed")); } else { this.userExport = UserExport.create(data.export_data.user_export); this.toasts.success({ autoClose: false, data: { message: i18n("admin.user.exports.download.success") }, }); } } } @action triggerUserExport() { this.dialog.yesNoConfirm({ message: i18n("admin.user.exports.download.confirm"), didConfirm: () => { this.userExportReloading = true; try { exportEntity("user_archive", { export_user_id: this.model.id, }); this.toasts.success({ duration: 3000, data: { message: i18n("admin.user.exports.download.started") }, }); } catch (err) { popupAjaxError(err); } }, }); } get userExportExpiry() { return i18n("admin.user.exports.download.expires_in", { count: this.userExport.retain_hours, }); } }