|
| 1 | +import Component from '@glimmer/component'; |
| 2 | +import { inject as service } from '@ember/service'; |
| 3 | +import FileModel from 'ember-osf-web/models/file'; |
| 4 | +import PreprintProviderModel from 'ember-osf-web/models/preprint-provider'; |
| 5 | +import PreprintModel from 'ember-osf-web/models/preprint'; |
| 6 | +import Theme from 'ember-osf-web/services/theme'; |
| 7 | +import { tracked } from '@glimmer/tracking'; |
| 8 | +import { task } from 'ember-concurrency'; |
| 9 | +import { waitFor } from '@ember/test-waiters'; |
| 10 | +import { taskFor } from 'ember-concurrency-ts'; |
| 11 | +import FileVersionModel from 'ember-osf-web/models/file-version'; |
| 12 | +import Media from 'ember-responsive'; |
| 13 | + |
| 14 | + |
| 15 | +interface InputArgs { |
| 16 | + preprint: PreprintModel; |
| 17 | + provider: PreprintProviderModel; |
| 18 | + primaryFile: FileModel; |
| 19 | +} |
| 20 | + |
| 21 | +export interface VersionModel extends FileVersionModel { |
| 22 | + downloadUrl?: string; |
| 23 | +} |
| 24 | + |
| 25 | +export default class PreprintFileRender extends Component<InputArgs> { |
| 26 | + @service theme!: Theme; |
| 27 | + @service media!: Media; |
| 28 | + |
| 29 | + @tracked allowCommenting = false; |
| 30 | + @tracked primaryFileHasVersions = false; |
| 31 | + @tracked fileVersions: VersionModel[] = []; |
| 32 | + |
| 33 | + primaryFile = this.args.primaryFile; |
| 34 | + provider = this.args.provider; |
| 35 | + preprint = this.args.preprint; |
| 36 | + |
| 37 | + constructor(owner: unknown, args: InputArgs) { |
| 38 | + super(owner, args); |
| 39 | + |
| 40 | + taskFor(this.loadPrimaryFileVersions).perform(); |
| 41 | + |
| 42 | + this.allowCommenting = this.provider.allowCommenting && this.preprint.isPublished && this.preprint.public; |
| 43 | + } |
| 44 | + |
| 45 | + @task |
| 46 | + @waitFor |
| 47 | + private async loadPrimaryFileVersions() { |
| 48 | + const primaryFileVersions = (await this.primaryFile.queryHasMany('versions', { |
| 49 | + sort: '-id', 'page[size]': 50, |
| 50 | + })).toArray(); |
| 51 | + this.serializeVersions(primaryFileVersions); |
| 52 | + this.primaryFileHasVersions = primaryFileVersions.length > 0; |
| 53 | + } |
| 54 | + |
| 55 | + private serializeVersions(versions: FileVersionModel[]) { |
| 56 | + const downloadUrl = this.primaryFile.links.download as string || ''; |
| 57 | + |
| 58 | + versions.map((version: VersionModel) => { |
| 59 | + const dateFormatted = encodeURIComponent(version.dateCreated.toISOString()); |
| 60 | + const displayName = version.name.replace(/(\.\w+)?$/, ext => `-${dateFormatted}${ext}`); |
| 61 | + |
| 62 | + this.fileVersions.push( |
| 63 | + { |
| 64 | + name: version.name, |
| 65 | + id: version.id, |
| 66 | + dateCreated: version.dateCreated, |
| 67 | + downloadUrl: `${downloadUrl}?version=${version.id}&displayName=${displayName}`, |
| 68 | + } as VersionModel, |
| 69 | + ); |
| 70 | + return version; |
| 71 | + }); |
| 72 | + } |
| 73 | + |
| 74 | + get isMobile() { |
| 75 | + return this.media.isMobile; |
| 76 | + } |
| 77 | +} |
0 commit comments