matrix-react-sdk
Version:
SDK for matrix.org using React
103 lines (96 loc) • 15.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.downloadLabelForFile = downloadLabelForFile;
exports.fileSize = fileSize;
exports.presentableTextForFile = presentableTextForFile;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _filesize = require("filesize");
var _languageHandler = require("../languageHandler");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /*
Copyright 2024 New Vector Ltd.
Copyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>
Copyright 2015-2021 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
function downloadLabelForFile(content, withSize = true) {
let text = (0, _languageHandler._t)("action|download");
if (content.info?.size && withSize) {
// If we know the size of the file then add it as human-readable string to the end of the link text
// so that the user knows how big a file they are downloading.
text += " (" + fileSize(content.info.size, {
base: 2,
standard: "jedec"
}) + ")";
}
return text;
}
/**
* Extracts a human-readable label for the file attachment to use as
* link text.
*
* @param {MediaEventContent} content The "content" key of the matrix event.
* @param {string} fallbackText The fallback text
* @param {boolean} withSize Whether to include size information. Default true.
* @param {boolean} shortened Ensure the extension of the file name is visible. Default false.
* @return {string} the human-readable link text for the attachment.
*/
function presentableTextForFile(content, fallbackText = (0, _languageHandler._t)("common|attachment"), withSize = true, shortened = false) {
let text = fallbackText;
if (content.filename?.length) {
text = content.filename;
} else if (content.body?.length) {
// The content body should be the name of the file including a
// file extension.
text = content.body;
}
// We shorten to 15 characters somewhat arbitrarily, and assume most files
// will have a 3 character (plus full stop) extension. The goal is to knock
// the label down to 15-25 characters, not perfect accuracy.
if (shortened && text.length > 19) {
const parts = text.split(".");
let fileName = parts.slice(0, parts.length - 1).join(".").substring(0, 15);
const extension = parts[parts.length - 1];
// Trim off any full stops from the file name to avoid a case where we
// add an ellipsis that looks really funky.
fileName = fileName.replace(/\.*$/g, "");
text = `${fileName}...${extension}`;
}
if (content.info?.size && withSize) {
// If we know the size of the file then add it as human readable
// string to the end of the link text so that the user knows how
// big a file they are downloading.
// The content.info also contains a MIME-type but we don't display
// it since it is "ugly", users generally aren't aware what it
// means and the type of the attachment can usually be inferred
// from the file extension.
text += " (" + fileSize(content.info.size, {
base: 2,
standard: "jedec"
}) + ")";
}
return text;
}
/**
* wrapper function to set default values for filesize function
*
* @param byteCount size of file
* @param options options to customize the response type or size type conversion e.g. 12kB, 12KB
* @returns {string | number | any[] | {
* value: any;
* symbol: any;
* exponent: number;
* unit: string;}} formatted file size with unit e.g. 12kB, 12KB
*/
function fileSize(byteCount, options) {
const defaultOption = _objectSpread({
base: 2,
standard: "jedec"
}, options);
return (0, _filesize.filesize)(byteCount, defaultOption);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZmlsZXNpemUiLCJyZXF1aXJlIiwiX2xhbmd1YWdlSGFuZGxlciIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImRvd25sb2FkTGFiZWxGb3JGaWxlIiwiY29udGVudCIsIndpdGhTaXplIiwidGV4dCIsIl90IiwiaW5mbyIsInNpemUiLCJmaWxlU2l6ZSIsImJhc2UiLCJzdGFuZGFyZCIsInByZXNlbnRhYmxlVGV4dEZvckZpbGUiLCJmYWxsYmFja1RleHQiLCJzaG9ydGVuZWQiLCJmaWxlbmFtZSIsImJvZHkiLCJwYXJ0cyIsInNwbGl0IiwiZmlsZU5hbWUiLCJzbGljZSIsImpvaW4iLCJzdWJzdHJpbmciLCJleHRlbnNpb24iLCJyZXBsYWNlIiwiYnl0ZUNvdW50Iiwib3B0aW9ucyIsImRlZmF1bHRPcHRpb24iLCJmaWxlc2l6ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9GaWxlVXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEgxaBpbW9uIEJyYW5kbmVyIDxzaW1vbi5icmEuYWdAZ21haWwuY29tPlxuQ29weXJpZ2h0IDIwMTUtMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQge1xuICAgIGZpbGVzaXplLFxuICAgIEZpbGVTaXplT3B0aW9uc0FycmF5LFxuICAgIEZpbGVTaXplT3B0aW9uc0Jhc2UsXG4gICAgRmlsZVNpemVPcHRpb25zRXhwb25lbnQsXG4gICAgRmlsZVNpemVPcHRpb25zT2JqZWN0LFxuICAgIEZpbGVTaXplT3B0aW9uc1N0cmluZyxcbiAgICBGaWxlU2l6ZVJldHVybkFycmF5LFxuICAgIEZpbGVTaXplUmV0dXJuT2JqZWN0LFxufSBmcm9tIFwiZmlsZXNpemVcIjtcbmltcG9ydCB7IE1lZGlhRXZlbnRDb250ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3R5cGVzXCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uL2xhbmd1YWdlSGFuZGxlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRMYWJlbEZvckZpbGUoY29udGVudDogTWVkaWFFdmVudENvbnRlbnQsIHdpdGhTaXplID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgbGV0IHRleHQgPSBfdChcImFjdGlvbnxkb3dubG9hZFwiKTtcblxuICAgIGlmIChjb250ZW50LmluZm8/LnNpemUgJiYgd2l0aFNpemUpIHtcbiAgICAgICAgLy8gSWYgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSB0aGVuIGFkZCBpdCBhcyBodW1hbi1yZWFkYWJsZSBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbGluayB0ZXh0XG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIHVzZXIga25vd3MgaG93IGJpZyBhIGZpbGUgdGhleSBhcmUgZG93bmxvYWRpbmcuXG4gICAgICAgIHRleHQgKz0gXCIgKFwiICsgPHN0cmluZz5maWxlU2l6ZShjb250ZW50LmluZm8uc2l6ZSwgeyBiYXNlOiAyLCBzdGFuZGFyZDogXCJqZWRlY1wiIH0pICsgXCIpXCI7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBmaWxlIGF0dGFjaG1lbnQgdG8gdXNlIGFzXG4gKiBsaW5rIHRleHQuXG4gKlxuICogQHBhcmFtIHtNZWRpYUV2ZW50Q29udGVudH0gY29udGVudCBUaGUgXCJjb250ZW50XCIga2V5IG9mIHRoZSBtYXRyaXggZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFsbGJhY2tUZXh0IFRoZSBmYWxsYmFjayB0ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhTaXplIFdoZXRoZXIgdG8gaW5jbHVkZSBzaXplIGluZm9ybWF0aW9uLiBEZWZhdWx0IHRydWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3J0ZW5lZCBFbnN1cmUgdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZSBuYW1lIGlzIHZpc2libGUuIERlZmF1bHQgZmFsc2UuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBodW1hbi1yZWFkYWJsZSBsaW5rIHRleHQgZm9yIHRoZSBhdHRhY2htZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlc2VudGFibGVUZXh0Rm9yRmlsZShcbiAgICBjb250ZW50OiBNZWRpYUV2ZW50Q29udGVudCxcbiAgICBmYWxsYmFja1RleHQgPSBfdChcImNvbW1vbnxhdHRhY2htZW50XCIpLFxuICAgIHdpdGhTaXplID0gdHJ1ZSxcbiAgICBzaG9ydGVuZWQgPSBmYWxzZSxcbik6IHN0cmluZyB7XG4gICAgbGV0IHRleHQgPSBmYWxsYmFja1RleHQ7XG4gICAgaWYgKGNvbnRlbnQuZmlsZW5hbWU/Lmxlbmd0aCkge1xuICAgICAgICB0ZXh0ID0gY29udGVudC5maWxlbmFtZTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnQuYm9keT8ubGVuZ3RoKSB7XG4gICAgICAgIC8vIFRoZSBjb250ZW50IGJvZHkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGluY2x1ZGluZyBhXG4gICAgICAgIC8vIGZpbGUgZXh0ZW5zaW9uLlxuICAgICAgICB0ZXh0ID0gY29udGVudC5ib2R5O1xuICAgIH1cblxuICAgIC8vIFdlIHNob3J0ZW4gdG8gMTUgY2hhcmFjdGVycyBzb21ld2hhdCBhcmJpdHJhcmlseSwgYW5kIGFzc3VtZSBtb3N0IGZpbGVzXG4gICAgLy8gd2lsbCBoYXZlIGEgMyBjaGFyYWN0ZXIgKHBsdXMgZnVsbCBzdG9wKSBleHRlbnNpb24uIFRoZSBnb2FsIGlzIHRvIGtub2NrXG4gICAgLy8gdGhlIGxhYmVsIGRvd24gdG8gMTUtMjUgY2hhcmFjdGVycywgbm90IHBlcmZlY3QgYWNjdXJhY3kuXG4gICAgaWYgKHNob3J0ZW5lZCAmJiB0ZXh0Lmxlbmd0aCA+IDE5KSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdGV4dC5zcGxpdChcIi5cIik7XG4gICAgICAgIGxldCBmaWxlTmFtZSA9IHBhcnRzXG4gICAgICAgICAgICAuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIC5qb2luKFwiLlwiKVxuICAgICAgICAgICAgLnN1YnN0cmluZygwLCAxNSk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIC8vIFRyaW0gb2ZmIGFueSBmdWxsIHN0b3BzIGZyb20gdGhlIGZpbGUgbmFtZSB0byBhdm9pZCBhIGNhc2Ugd2hlcmUgd2VcbiAgICAgICAgLy8gYWRkIGFuIGVsbGlwc2lzIHRoYXQgbG9va3MgcmVhbGx5IGZ1bmt5LlxuICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoL1xcLiokL2csIFwiXCIpO1xuXG4gICAgICAgIHRleHQgPSBgJHtmaWxlTmFtZX0uLi4ke2V4dGVuc2lvbn1gO1xuICAgIH1cblxuICAgIGlmIChjb250ZW50LmluZm8/LnNpemUgJiYgd2l0aFNpemUpIHtcbiAgICAgICAgLy8gSWYgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSB0aGVuIGFkZCBpdCBhcyBodW1hbiByZWFkYWJsZVxuICAgICAgICAvLyBzdHJpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbGluayB0ZXh0IHNvIHRoYXQgdGhlIHVzZXIga25vd3MgaG93XG4gICAgICAgIC8vIGJpZyBhIGZpbGUgdGhleSBhcmUgZG93bmxvYWRpbmcuXG4gICAgICAgIC8vIFRoZSBjb250ZW50LmluZm8gYWxzbyBjb250YWlucyBhIE1JTUUtdHlwZSBidXQgd2UgZG9uJ3QgZGlzcGxheVxuICAgICAgICAvLyBpdCBzaW5jZSBpdCBpcyBcInVnbHlcIiwgdXNlcnMgZ2VuZXJhbGx5IGFyZW4ndCBhd2FyZSB3aGF0IGl0XG4gICAgICAgIC8vIG1lYW5zIGFuZCB0aGUgdHlwZSBvZiB0aGUgYXR0YWNobWVudCBjYW4gdXN1YWxseSBiZSBpbmZlcnJlZFxuICAgICAgICAvLyBmcm9tIHRoZSBmaWxlIGV4dGVuc2lvbi5cbiAgICAgICAgdGV4dCArPSBcIiAoXCIgKyA8c3RyaW5nPmZpbGVTaXplKGNvbnRlbnQuaW5mby5zaXplLCB7IGJhc2U6IDIsIHN0YW5kYXJkOiBcImplZGVjXCIgfSkgKyBcIilcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG59XG5cbnR5cGUgRmlsZVNpemVPcHRpb25zID1cbiAgICB8IEZpbGVTaXplT3B0aW9uc1N0cmluZ1xuICAgIHwgRmlsZVNpemVPcHRpb25zQmFzZVxuICAgIHwgRmlsZVNpemVPcHRpb25zQXJyYXlcbiAgICB8IEZpbGVTaXplT3B0aW9uc0V4cG9uZW50XG4gICAgfCBGaWxlU2l6ZU9wdGlvbnNPYmplY3Q7XG5cbi8qKlxuICogd3JhcHBlciBmdW5jdGlvbiB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGZpbGVzaXplIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIGJ5dGVDb3VudCBzaXplIG9mIGZpbGVcbiAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMgdG8gY3VzdG9taXplIHRoZSByZXNwb25zZSB0eXBlIG9yIHNpemUgdHlwZSBjb252ZXJzaW9uIGUuZy4gMTJrQiwgMTJLQlxuICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IGFueVtdIHwge1xuICogIHZhbHVlOiBhbnk7XG4gKiAgc3ltYm9sOiBhbnk7XG4gKiAgZXhwb25lbnQ6IG51bWJlcjtcbiAqICB1bml0OiBzdHJpbmc7fX0gZm9ybWF0dGVkIGZpbGUgc2l6ZSB3aXRoIHVuaXQgZS5nLiAxMmtCLCAxMktCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlU2l6ZShieXRlQ291bnQ6IG51bWJlciwgb3B0aW9uczogRmlsZVNpemVPcHRpb25zU3RyaW5nIHwgRmlsZVNpemVPcHRpb25zQmFzZSk6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBmaWxlU2l6ZShieXRlQ291bnQ6IG51bWJlciwgb3B0aW9uczogRmlsZVNpemVPcHRpb25zQXJyYXkpOiBGaWxlU2l6ZVJldHVybkFycmF5O1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVTaXplKGJ5dGVDb3VudDogbnVtYmVyLCBvcHRpb25zOiBGaWxlU2l6ZU9wdGlvbnNFeHBvbmVudCk6IG51bWJlcjtcbmV4cG9ydCBmdW5jdGlvbiBmaWxlU2l6ZShieXRlQ291bnQ6IG51bWJlciwgb3B0aW9uczogRmlsZVNpemVPcHRpb25zT2JqZWN0KTogRmlsZVNpemVSZXR1cm5PYmplY3Q7XG5leHBvcnQgZnVuY3Rpb24gZmlsZVNpemUoYnl0ZUNvdW50OiBudW1iZXIpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gZmlsZVNpemUoXG4gICAgYnl0ZUNvdW50OiBudW1iZXIsXG4gICAgb3B0aW9ucz86IEZpbGVTaXplT3B0aW9ucyxcbik6IHN0cmluZyB8IG51bWJlciB8IEZpbGVTaXplUmV0dXJuQXJyYXkgfCBGaWxlU2l6ZVJldHVybk9iamVjdCB7XG4gICAgY29uc3QgZGVmYXVsdE9wdGlvbjogRmlsZVNpemVPcHRpb25zID0geyBiYXNlOiAyLCBzdGFuZGFyZDogXCJqZWRlY1wiLCAuLi5vcHRpb25zIH07XG4gICAgcmV0dXJuIGZpbGVzaXplKGJ5dGVDb3VudCwgZGVmYXVsdE9wdGlv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