mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
102 lines (86 loc) • 2.79 kB
text/typescript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Files, General} from '../constants';
import {Client4} from 'client';
import {FileInfo} from 'types/files';
import {Dictionary} from 'types/utilities';
const mimeDB = require('mime-db');
export function getFormattedFileSize(file: FileInfo): string {
const bytes = file.size;
const fileSizes = [
['TB', 1024 * 1024 * 1024 * 1024],
['GB', 1024 * 1024 * 1024],
['MB', 1024 * 1024],
['KB', 1024],
];
const size = fileSizes.find((unitAndMinBytes) => {
const minBytes = unitAndMinBytes[1];
return bytes > minBytes;
});
if (size) {
return `${Math.floor(bytes / (size[1] as any))} ${size[0]}`;
}
return `${bytes} B`;
}
export function getFileType(file: FileInfo): string {
if (!file || !file.extension) {
return 'other';
}
const fileExt = file.extension.toLowerCase();
const fileTypes = [
'image',
'code',
'pdf',
'video',
'audio',
'spreadsheet',
'text',
'word',
'presentation',
'patch',
];
return fileTypes.find((fileType) => {
const constForFileTypeExtList = `${fileType}_types`.toUpperCase();
const fileTypeExts = Files[constForFileTypeExtList];
return fileTypeExts.indexOf(fileExt) > -1;
}) || 'other';
}
let extToMime: Dictionary<string>;
function buildExtToMime() {
extToMime = {};
Object.keys(mimeDB).forEach((key) => {
const mime = mimeDB[key];
if (mime.extensions) {
mime.extensions.forEach((ext: string) => {
extToMime[ext] = key;
});
}
});
}
export function lookupMimeType(filename: string): string {
if (!extToMime) {
buildExtToMime();
}
const ext = filename.split('.').pop()!.toLowerCase();
return extToMime[ext] || 'application/octet-stream';
}
export function getFileUrl(fileId: string): string {
return Client4.getFileRoute(fileId);
}
export function getFileDownloadUrl(fileId: string): string {
return `${Client4.getFileRoute(fileId)}?download=1`;
}
export function getFileThumbnailUrl(fileId: string): string {
return `${Client4.getFileRoute(fileId)}/thumbnail`;
}
export function getFilePreviewUrl(fileId: string): string {
return `${Client4.getFileRoute(fileId)}/preview`;
}
export function sortFileInfos(fileInfos: FileInfo[] = [], locale: string = General.DEFAULT_LOCALE): FileInfo[] {
return fileInfos.sort((a, b) => {
if (a.create_at !== b.create_at) {
return a.create_at - b.create_at;
}
return a.name.localeCompare(b.name, locale, {numeric: true});
});
}