@bigfishtv/cockpit
Version:
152 lines (134 loc) • 6.48 kB
JavaScript
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/**
* File Utilities
* @module Utilities/fileUtils
*/
import pluploadSettings from '../config/pluploadSettings';
import filesizeParser from 'filesize-parser';
import filesize from 'file-size';
import { notifyFailure } from '../actions/notifications';
var store = null;
var maxSize = filesizeParser(pluploadSettings.max_file_size);
/**
* Makes a reference to redux store for notification dispatches
* @param {Object} store
*/
export function init(_store) {
store = _store;
}
/**
* Filters an of files based on validation props provided
* @param {Array} files - Array of files
* @param {Object} props - Uploader props: multiple, maxFiles, files, subject
* @return {Array} - Returns filtered array of files depending on max files and filesize limits, or empty array. Will dispatch notifications via store
*/
export function validateFiles(files) {
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var maxFiles = props.multiple ? props.maxFiles ? props.maxFiles : 9999 : 1;
var currentFiles = props.files || [];
var fileTypeStore = store && store.getState().fileTypes;
var subject = props.subject;
var extensions = subject && fileTypeStore && subject in fileTypeStore ? fileTypeStore[subject] : null;
if (maxFiles && currentFiles.length + files.length > maxFiles) {
var remaining = maxFiles - currentFiles.length;
if (store) store.dispatch(notifyFailure('Too many files! (' + maxFiles + ' allowed, ' + remaining + ' remaining)'));
return [];
}
var maxBytes = store && store.getState().maximumUploadSize || maxSize;
return files.filter(function (file) {
if (extensions && !isValidExtension(file, extensions)) {
var extension = getExtension(file.name);
if (store) store.dispatch(notifyFailure('".' + extension + '" is an invalid ' + (subject || 'file') + ' type!'));
} else if (file.size > maxBytes) {
var sizeReadable = filesize(file.size).human('si');
var maxSizeReadable = filesize(maxBytes).human('si');
if (store) store.dispatch(notifyFailure('"' + file.name + '" is too big (' + sizeReadable + '), limit is ' + maxSizeReadable));
} else {
return true;
}
return false;
});
}
/**
* Takes filename and returns file extension
* @param {String} filename - File name (can include path)
* @return {String} - Returns extension
*/
export function getExtension(filename) {
if (typeof filename !== 'string' || filename.indexOf('.') < 0) return false;
return filename.substring(filename.lastIndexOf('.') + 1, filename.length).toLowerCase();
}
/**
* Is basically a glorified inArray function...
* @param {Object} file - File object containing 'name' key
* @param {Array} extensions - Array of valid file extensions
* @return {Boolean} - Returns true or false if file's extension is valid
*/
export function isValidExtension(file, extensions) {
if ((typeof file === 'undefined' ? 'undefined' : _typeof(file)) !== 'object' || !file.name || !(extensions instanceof Array)) return false;
var extension = getExtension(file.name);
return extension && extensions.indexOf(extension) >= 0;
}
/**
* Cherry picks bits of data from native file object and returns new object
* @param {Object} file - Native file object, e.g. from drop zone
* @return {Object} - Returns object with data extracted from native file
*/
export function createFileObjectFromNative(file) {
return {
name: file.name,
type: file.type,
extension: getExtension(file.name),
lastModified: file.lastModified,
lastModifiedDate: file.lastModifiedDate,
size: file.size
};
}
/**
* Takes a native file object and a callback. It loads the file via FileReader and once read sends data url back via callback
* @param {Object} file - Native file object
* @param {Function} callback - Callback function, called with 1 argument - the image's data url
*/
export function extractDataUrlFromNative(file) {
var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
return false;
};
var img = new FileReader();
img.onload = function (e) {
callback(this.result);
};
img.readAsDataURL(file);
}
/**
* Tank specific function for getting a generated image url based on size preset and extension
* @param {Object} file - Image object, containing keys: filename,
* @param {String} size - Image size preset - defined in tank, defaults to 'cockpit-small'
* @param {String} extension - Not required, used to specify extension, defaults to original file extension
* @param {Boolean} getOriginal - Whether or not to fetch pre-edited image
* @return {String} - Returns url string
*/
export function getImageUrl(file) {
var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'cockpit-small';
var extension = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
var getOriginal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
if ((typeof file === 'undefined' ? 'undefined' : _typeof(file)) != 'object' || file instanceof Array || !file.filename || typeof size != 'string') return false;
var dot = file.filename.lastIndexOf('.');
if (!file.slug) file.slug = file.filename.substr(0, dot);
if (!file.extension) file.extension = file.filename.substr(dot + 1, file.filename.length);
if (file.extension === 'svg') return getAssetUrl(file);
if (file.extension === 'pdf' && !extension) extension = 'png';
var originalStr = getOriginal ? 'original/' : '';
var url = '/generated/' + originalStr + size + '/' + file.slug + '.' + (extension ? extension : file.extension ? file.extension : 'jpg');
return url;
}
/**
* Takes file object and returns original upload url
* @param {Object} file - File object, containing keys: filename
* @return {String} - Returns url to original upload
*/
export function getAssetUrl(file) {
if (file instanceof Array || (typeof file === 'undefined' ? 'undefined' : _typeof(file)) != 'object' && typeof file != 'string' || (typeof file === 'undefined' ? 'undefined' : _typeof(file)) == 'object' && !file.filename) return false;
var filename = typeof file == 'string' ? file : file.filename;
var url = '/uploads/' + filename;
return url;
}