diff --git a/src/domain/session/room/timeline/tiles/FileTile.js b/src/domain/session/room/timeline/tiles/FileTile.js new file mode 100644 index 00000000..2891e8be --- /dev/null +++ b/src/domain/session/room/timeline/tiles/FileTile.js @@ -0,0 +1,68 @@ +/* +Copyright 2020 Bruno Windels +Copyright 2020 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import {MessageTile} from "./MessageTile.js"; +import {formatSize} from "../../../../../utils/formatSize.js"; + +export class FileTile extends MessageTile { + constructor(options) { + super(options); + this._error = null; + this._downloading = false; + } + + async download() { + if (this._downloading) { + return; + } + const content = this._getContent(); + const filename = content.body; + this._downloading = true; + this.emitChange("label"); + try { + const bufferHandle = await this._mediaRepository.downloadAttachment(content); + this.platform.offerSaveBufferHandle(bufferHandle, filename); + } catch (err) { + this._error = err; + } finally { + this._downloading = false; + } + this.emitChange("label"); + } + + get label() { + if (this._error) { + return `Could not decrypt file: ${this._error.message}`; + } + const content = this._getContent(); + const filename = content.body; + const size = formatSize(content.info?.size); + if (this._downloading) { + return this.i18n`Downloading ${filename} (${size})…`; + } else { + return this.i18n`Download ${filename} (${size})`; + } + } + + get error() { + return null; + } + + get shape() { + return "file"; + } +}