import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; import { inject as service } from '@ember/service'; import { task } from 'ember-concurrency'; import Icon from '#components/icon'; import { on } from '@ember/modifier'; import { fn } from '@ember/helper'; export default class PlacePhotoItem extends Component { @service blossom; @tracked thumbnailUrl = ''; @tracked error = ''; @tracked isUploaded = false; constructor() { super(...arguments); if (this.args.file) { this.thumbnailUrl = URL.createObjectURL(this.args.file); this.uploadTask.perform(this.args.file); } } willDestroy() { super.willDestroy(...arguments); if (this.thumbnailUrl) { URL.revokeObjectURL(this.thumbnailUrl); } } uploadTask = task(async (file) => { this.error = ''; try { const dim = await new Promise((resolve) => { const img = new Image(); img.onload = () => resolve(`${img.width}x${img.height}`); img.onerror = () => resolve(''); img.src = this.thumbnailUrl; }); const result = await this.blossom.upload(file); this.isUploaded = true; if (this.args.onSuccess) { this.args.onSuccess({ file, url: result.url, fallbackUrls: result.fallbackUrls, type: result.type, dim, hash: result.hash, }); } } catch (e) { this.error = e.message; } }); }