UNPKG

@paperbits/core

Version:
101 lines (85 loc) 3.96 kB
import * as ko from "knockout"; import * as MediaUtils from "@paperbits/common/media/mediaUtils"; import { MediaContract } from "@paperbits/common/media/mediaContract"; import { IWidgetFactoryResult } from "@paperbits/common/editing"; import { HyperlinkModel } from "@paperbits/common/permalinks"; export const defaultFileName: string = "media.svg"; export const defaultURL: string = "https://cdn.paperbits.io/images/logo.svg"; export class MediaItem { public key: string; public blobKey: string; public downloadUrl: ko.Observable<string>; public thumbnailUrl: ko.Observable<string>; public permalink: ko.Observable<string>; public fileName: ko.Observable<string>; public description: ko.Observable<string>; public keywords: ko.Observable<string>; public mimeType: ko.Observable<string>; public widgetFactoryResult: IWidgetFactoryResult<any, any>; public nonPreviewable: ko.Computed<boolean>; public isReferenced: ko.Computed<boolean>; constructor(mediaContract: MediaContract) { this.key = mediaContract.key; this.blobKey = mediaContract.blobKey; this.fileName = ko.observable<string>(mediaContract.fileName); this.description = ko.observable<string>(mediaContract.description); this.keywords = ko.observable<string>(mediaContract.keywords); this.permalink = ko.observable<string>(mediaContract.permalink); this.mimeType = ko.observable<string>(mediaContract.mimeType); this.nonPreviewable = ko.computed(() => !mediaContract.mimeType?.startsWith("image/") && !mediaContract.mimeType?.startsWith("video/")); this.thumbnailUrl = ko.observable<string>(); this.downloadUrl = ko.observable<string>(mediaContract.downloadUrl); this.setThumbnail(mediaContract); this.isReferenced = ko.computed(() => { return !mediaContract.blobKey && (mediaContract.downloadUrl?.startsWith("http://") || mediaContract.downloadUrl?.startsWith("https//")); }); } private async setThumbnail(mediaContract: MediaContract): Promise<void> { if (mediaContract.mimeType?.startsWith("video")) { const thumbnailUrl = await MediaUtils.getVideoThumbnailAsDataUrlFromUrl(mediaContract.downloadUrl); this.thumbnailUrl(thumbnailUrl); return; } if (mediaContract.mimeType?.startsWith("image")) { let thumbnailUrl = mediaContract.downloadUrl; if (mediaContract.variants) { thumbnailUrl = MediaUtils.getThumbnailUrl(mediaContract); } this.thumbnailUrl(thumbnailUrl); return; } this.thumbnailUrl(null); // TODO: Placeholder? } public isDefaultFileName(): boolean { return this.fileName() === defaultFileName; } public isDefaultUrl(): boolean { return this.downloadUrl() === defaultURL; } public updateDefault(newName: string): void { this.fileName(newName); this.permalink(this.permalink().replace(defaultFileName, newName)); this.thumbnailUrl(this.downloadUrl()); } public toMedia(): MediaContract { return { key: this.key, blobKey: this.blobKey, fileName: this.fileName(), description: this.description(), keywords: this.keywords(), mimeType: this.mimeType(), downloadUrl: this.downloadUrl(), permalink: this.permalink() }; } public getHyperlink(): HyperlinkModel { const hyperlinkModel = new HyperlinkModel(); hyperlinkModel.title = this.fileName(); hyperlinkModel.target = "_download"; hyperlinkModel.targetKey = this.key; hyperlinkModel.href = this.permalink(); return hyperlinkModel; } }