import React from 'react'; import { Files } from '../model/'; import { notify, alert, currentShare } from '../helpers/'; import Path from 'path'; import Worker from "../worker/search.worker.js"; import { Observable } from "rxjs/Observable"; export const sort = function(files, type){ if(type === 'name'){ return sortByName(files); }else if(type === 'date'){ return sortByDate(files); }else{ return sortByType(files); } function sortByType(files){ return files.sort((fileA, fileB) => { if(fileA.icon === 'loading' && fileB.icon !== 'loading'){return +1;} else if(fileA.icon !== 'loading' && fileB.icon === 'loading'){return -1;} else{ if(['directory', 'link'].indexOf(fileA.type) === -1 && ['directory', 'link'].indexOf(fileB.type) !== -1){ return +1; }else if(['directory', 'link'].indexOf(fileA.type) !== -1 && ['directory', 'link'].indexOf(fileB.type) === -1){ return -1; }else{ if(fileA.name[0] === "." && fileB.name[0] !== ".") return +1; else if(fileA.name[0] !== "." && fileB.name[0] === ".") return -1; else{ const aExt = Path.extname(fileA.name.toLowerCase()), bExt = Path.extname(fileB.name.toLowerCase()); if(fileA.name.toLowerCase() === fileB.name.toLowerCase()){ return fileA.name > fileB.name ? +1 : -1; }else{ if(aExt !== bExt) return aExt > bExt ? +1 : -1; else return fileA.name.toLowerCase() > fileB.name.toLowerCase() ? +1 : -1; } } } } }); } function sortByName(files){ return files.sort((fileA, fileB) => { if(fileA.icon === 'loading' && fileB.icon !== 'loading'){return +1;} else if(fileA.icon !== 'loading' && fileB.icon === 'loading'){return -1;} else{ if(fileA.name[0] === "." && fileB.name[0] !== ".") return +1; else if(fileA.name[0] !== "." && fileB.name[0] === ".") return -1; else{ if(fileA.name.toLowerCase() === fileB.name.toLowerCase()){ return fileA.name > fileB.name ? +1 : -1; } return fileA.name.toLowerCase() > fileB.name.toLowerCase() ? +1 : -1; } } }); } function sortByDate(files){ return files.sort((fileA, fileB) => { if(fileA.icon === 'loading' && fileB.icon !== 'loading'){return +1;} else if(fileA.icon !== 'loading' && fileB.icon === 'loading'){return -1;} else{ if(fileB.time === fileA.time){ return fileA.name > fileB.name ? +1 : -1; } return fileB.time - fileA.time; } }); } }; export const onCreate = function(path, type, file){ if(type === 'file'){ return Files.touch(path, file) .then(() => { notify.send('A file named "'+Path.basename(path)+'" was created', 'success'); return Promise.resolve(); }) .catch((err) => { notify.send(err, 'error'); return Promise.reject(err); }); }else if(type === 'directory'){ return Files.mkdir(path) .then(() => notify.send('A folder named "'+Path.basename(path)+'" was created', 'success')) .catch((err) => notify.send(err, 'error')); }else{ return Promise.reject({message: 'internal error: can\'t create a '+type.toString(), code: 'UNKNOWN_TYPE'}); } }; export const onRename = function(from, to, type){ return Files.mv(from, to, type) .then(() => notify.send('The file "'+Path.basename(from)+'" was renamed', 'success')) .catch((err) => notify.send(err, 'error')); }; export const onDelete = function(path, type){ return Files.rm(path, type) .then(() => notify.send('The file "'+Path.basename(path)+'" was deleted', 'success')) .catch((err) => notify.send(err, 'error')); }; export const onUpload = function(path, e){ const MAX_POOL_SIZE = 15; let PRIOR_STATUS = {}; if(e.dataTransfer.types && e.dataTransfer.types.length >= 0){ if(e.dataTransfer.types[0] === "text/uri-list"){ return } } extract_upload_directory_the_way_that_works_but_non_official(e.dataTransfer.items || [], []) .then((files) => { if(files.length === 0){ return extract_upload_crappy_hack_but_official_way(e.dataTransfer); } return Promise.resolve(files); }) .then((files) => { var failed = [], currents = []; const processes = files.map((file) => { let original_path = file.path; file.path = Path.join(path, file.path); if(file.type === 'file'){ if(files.length < 150) Files.touch(file.path, file.file, 'prepare_only'); return { path: original_path, parent: file._prior || null, fn: Files.touch.bind(Files, file.path, file.file, 'execute_only') }; }else{ Files.mkdir(file.path, 'prepare_only'); return { id: file._id || null, path: original_path, parent: file._prior || null, fn: Files.mkdir.bind(Files, file.path, 'execute_only') }; } }); class Stats extends React.Component { constructor(props){ super(props); this.state = {timeout: 1}; } componentDidMount(){ if(typeof this.state.timeout === "number"){ this.setState({ timeout: window.setTimeout(() => { this.componentDidMount(); }, Math.random()*1000+200) }); } } componentWillUnmount(){ window.clearTimeout(this.state.timeout); } emphasis(path){ notify.send(path.split("/").join(" / "), "info"); } render() { const percent = Math.floor(100 * (files.length - processes.length - currents.length) / files.length); return (