refactor(dom) files: promisify

This commit is contained in:
coderaiser 2019-05-18 18:49:44 +03:00
parent 9ff5dee979
commit a979d532d5
9 changed files with 223 additions and 233 deletions

View file

@ -8,6 +8,7 @@ const rendy = require('rendy/legacy');
const exec = require('execon');
const load = require('load.js');
const {promisify} = require('es6-promisify');
const tryToCatch = require('try-to-catch/legacy');
const pascalCase = require('just-pascal-case');
const isDev = process.env.NODE_ENV === 'development';
@ -28,6 +29,8 @@ const {
buildFromJSON,
} = require('../common/cloudfunc');
const callbackify = require('../common/callbackify');
const loadModule = require('./load-module');
inherits(CloudCmdProto, Emitify);
@ -222,7 +225,7 @@ function CloudCmdProto(DOM) {
});
};
function initModules(callback) {
const initModules = callbackify(async () => {
exec.if(CloudCmd.Key, () => {
Key = new CloudCmd.Key();
CloudCmd.Key = Key;
@ -237,32 +240,29 @@ function CloudCmdProto(DOM) {
});
});
Files.get('modules', (error, modules) => {
const showLoad = Images.show.load;
const doBefore = {
'edit': showLoad,
'menu': showLoad,
};
const load = (name, path, dobefore) => {
loadModule({
name,
path,
dobefore,
});
};
if (!modules)
modules = [];
modules.local.forEach((module) => {
load(null, module, doBefore[module]);
const [, modules] = await tryToCatch(Files.get, 'modules');
const showLoad = Images.show.load;
const doBefore = {
'edit': showLoad,
'menu': showLoad,
};
const load = (name, path, dobefore) => {
loadModule({
name,
path,
dobefore,
});
callback();
};
if (!modules)
return;
modules.local.forEach((module) => {
load(null, module, doBefore[module]);
});
}
});
function baseInit(callback) {
const files = DOM.getFiles();
@ -378,12 +378,12 @@ function CloudCmdProto(DOM) {
options.sort = sort;
options.order = order;
createFileTable(newObj, panel, options, () => {
if (isRefresh && !noCurrent)
DOM.setCurrentByName(name);
exec(callback);
});
await createFileTable(newObj, panel, options);
if (isRefresh && !noCurrent)
DOM.setCurrentByName(name);
exec(callback);
if (!CloudCmd.config('dirStorage'))
return;
@ -409,7 +409,7 @@ function CloudCmdProto(DOM) {
* @param history
* @param callback
*/
function createFileTable(json, panelParam, options, callback) {
async function createFileTable(json, panelParam, options) {
const {
history,
noCurrent,
@ -417,59 +417,59 @@ function CloudCmdProto(DOM) {
const names = ['file', 'path', 'link', 'pathLink'];
Files.get(names, (error, templFile, templPath, templLink, templPathLink) => {
const {Dialog} = DOM;
const panel = panelParam || DOM.getPanel();
const {prefix} = CloudCmd;
const [
error,
[templFile, templPath, templLink, templPathLink],
] = await tryToCatch(Files.get, names);
if (error)
return DOM.Dialog.alert(error.responseText);
const panel = panelParam || DOM.getPanel();
const {prefix} = CloudCmd;
const {
dir,
name,
} = Info;
const {childNodes} = panel;
let i = childNodes.length;
while (i--)
panel.removeChild(panel.lastChild);
panel.innerHTML = buildFromJSON({
sort : options.sort,
order : options.order,
data : json,
id : panel.id,
prefix,
template : {
file : templFile,
path : templPath,
pathLink : templPathLink,
link : templLink,
},
});
Listeners.setOnPanel(panel);
if (!noCurrent) {
let current;
const {
dir,
name,
} = Info;
if (name === '..' && dir !== '/')
current = DOM.getCurrentByName(dir);
if (error)
return Dialog.alert(error.responseText);
if (!current)
[current] = DOM.getFiles(panel);
const {childNodes} = panel;
let i = childNodes.length;
while (i--)
panel.removeChild(panel.lastChild);
panel.innerHTML = buildFromJSON({
sort : options.sort,
order : options.order,
data : json,
id : panel.id,
prefix,
template : {
file : templFile,
path : templPath,
pathLink : templPathLink,
link : templLink,
},
DOM.setCurrentFile(current, {
history,
});
Listeners.setOnPanel(panel);
if (!noCurrent) {
let current;
if (name === '..' && dir !== '/')
current = DOM.getCurrentByName(dir);
if (!current)
[current] = DOM.getFiles(panel);
DOM.setCurrentFile(current, {
history,
});
CloudCmd.emit('active-dir', Info.dirPath);
}
exec(callback);
});
CloudCmd.emit('active-dir', Info.dirPath);
}
}
/**

View file

@ -4,7 +4,7 @@
const itype = require('itype/legacy');
const currify = require('currify/legacy');
const exec = require('execon');
const {promisify} = require('es6-promisify');
const load = require('./load');
const RESTful = require('./rest');
@ -23,33 +23,23 @@ const unaryMap = (array, fn) => array.map((a) => fn(a));
module.exports.get = get;
function getFile(name, callback) {
async function getFile(name) {
const type = itype(name);
let array;
check(name);
check(name, callback);
if (type === 'string')
return getModule(name);
switch(type) {
case 'string':
return getModule(name, callback);
case 'array':
array = unaryMap(name, get);
return exec.parallel(array, callback);
}
if (type === 'array')
return Promise.all(unaryMap(name, get));
}
function check(name, callback) {
function check(name) {
if (!name)
throw Error('name could not be empty!');
if (typeof callback !== 'function')
throw Error('callback should be a function');
}
function getModule(name, callback) {
let path;
async function getModule(name) {
const regExpHTML = new RegExp(FILES_HTML + '|' + FILES_HTML_ROOT);
const regExpJSON = new RegExp(FILES_JSON);
@ -60,11 +50,10 @@ function getModule(name, callback) {
return showError(name);
if (name === 'config')
return getConfig(callback);
return getConfig();
path = getPath(name, isHTML, isJSON);
getSystemFile(path, callback);
const path = getPath(name, isHTML, isJSON);
return getSystemFile(path);
}
function getPath(name, isHTML, isJSON) {
@ -93,7 +82,7 @@ function showError(name) {
throw error;
}
function getSystemFile(file, callback) {
const getSystemFile = promisify((file, callback) => {
const {prefix} = CloudCmd;
if (!Promises[file])
@ -113,9 +102,9 @@ function getSystemFile(file, callback) {
Promises[file] = null;
callback(error);
});
}
});
function getConfig(callback) {
const getConfig = promisify((callback) => {
let is;
if (!Promises.config)
@ -137,7 +126,7 @@ function getConfig(callback) {
if (!is)
Promises.config = null;
});
}
});
function getTimeoutOnce(time) {
let is;

View file

@ -20,7 +20,7 @@ module.exports = (name, options, callback = options) => {
if (o.name && window[o.name])
return callback();
Files.get('modules', (error, modules) => {
Files.get('modules').then((modules) => {
const online = config('online') && navigator.onLine;
const module = findObjByNameInArr(modules.remote, name);

View file

@ -5,6 +5,7 @@
const exec = require('execon');
const itype = require('itype/legacy');
const currify = require('currify/legacy');
const tryToCatch = require('try-to-catch/legacy');
const clipboard = require('@cloudcmd/clipboard');
const getRange = require('./get-range');
@ -99,11 +100,11 @@ function getPath(el, path = []) {
return getPath(el.parentElement, path.concat(el));
}
function config() {
DOM.Files.get('config', (e, config) => {
const type = config && config.packer;
EXT = DOM.getPackerExt(type);
});
async function config() {
const [, config] = await tryToCatch(DOM.Files.get, 'config');
const type = config && config.packer;
EXT = DOM.getPackerExt(type);
}
module.exports.initKeysPanel = () => {

View file

@ -5,7 +5,7 @@
const exec = require('execon');
const currify = require('currify/legacy');
const {promisify} = require('es6-promisify');
const loadJS = require('load.js').js;
const loadJS = promisify(require('load.js').js);
const {log} = CloudCmd;
@ -19,7 +19,11 @@ const Name = 'Cloud';
CloudCmd[Name] = module.exports;
module.exports.init = async () => {
await loadFiles();
const [modules] = await loadFiles();
const {key} = modules.data.FilePicker;
filepicker.setKey(key);
Images.hide();
};
module.exports.uploadFile = (filename, data) => {
@ -53,18 +57,12 @@ function _upload(callback, file) {
});
}
const loadFiles = promisify((callback) => {
async function loadFiles() {
const js = '//api.filepicker.io/v2/filepicker.js';
loadJS(js, () => {
Files.get('modules', (error, modules) => {
const {key} = modules.data.FilePicker;
filepicker.setKey(key);
Images.hide();
exec(callback);
});
});
});
return Promise.all([
Files.get('modules'),
loadJS(js),
]);
}

View file

@ -9,6 +9,7 @@ const currify = require('currify/legacy');
const wraptile = require('wraptile/legacy');
const squad = require('squad/legacy');
const {promisify} = require('es6-promisify');
const tryToCatch = require('try-to-catch/legacy');
const load = require('load.js');
const createElement = require('@cloudcmd/create-element');
@ -43,7 +44,6 @@ const Config = {};
let Template;
const getFile = promisify(Files.get);
const loadCSS = promisify(load.css);
module.exports.init = async () => {
@ -55,7 +55,7 @@ module.exports.init = async () => {
const {prefix} = CloudCmd;
[Template] = await Promise.all([
getFile('config-tmpl'),
Files.get('config-tmpl'),
loadSocket(),
loadCSS(prefix + '/dist/config.css'),
CloudCmd.View(),
@ -127,60 +127,60 @@ Config.save = saveHttp;
module.exports.show = show;
function show() {
async function show() {
if (!CloudCmd.config('configDialog'))
return;
fillTemplate();
await fillTemplate();
}
function fillTemplate() {
Files.get('config', (error, config) => {
if (error)
return Dialog.alert('Could not load config!');
const {
editor,
packer,
columns,
configAuth,
...obj
} = input.convert(config);
obj[editor + '-selected'] = 'selected';
obj[packer + '-selected'] = 'selected';
obj[columns + '-selected'] = 'selected';
obj.configAuth = configAuth ? '' : 'hidden';
const innerHTML = rendy(Template, obj);
Element = createElement('form', {
className : 'config',
innerHTML,
});
const inputs = document.querySelectorAll('input, select', Element);
const [inputFirst] = inputs;
let afterShow;
if (inputFirst) {
onAuthChange(inputFirst.checked);
afterShow = inputFirst.focus.bind(inputFirst);
}
const getTarget = ({target}) => target;
const handleChange = squad(onChange, getTarget);
[...inputs]
.map(addKey(onKey))
.map(addChange(handleChange));
const autoSize = true;
CloudCmd.View.show(Element, {
autoSize,
afterShow,
});
async function fillTemplate() {
const [error, config] = await tryToCatch(Files.get, 'config');
if (error)
return Dialog.alert('Could not load config!');
const {
editor,
packer,
columns,
configAuth,
...obj
} = input.convert(config);
obj[editor + '-selected'] = 'selected';
obj[packer + '-selected'] = 'selected';
obj[columns + '-selected'] = 'selected';
obj.configAuth = configAuth ? '' : 'hidden';
const innerHTML = rendy(Template, obj);
Element = createElement('form', {
className : 'config',
innerHTML,
});
const inputs = document.querySelectorAll('input, select', Element);
const [inputFirst] = inputs;
let afterShow;
if (inputFirst) {
onAuthChange(inputFirst.checked);
afterShow = inputFirst.focus.bind(inputFirst);
}
const getTarget = ({target}) => target;
const handleChange = squad(onChange, getTarget);
[...inputs]
.map(addKey(onKey))
.map(addChange(handleChange));
const autoSize = true;
CloudCmd.View.show(Element, {
autoSize,
afterShow,
});
}

View file

@ -232,9 +232,8 @@ function _uploadTo(nameModule) {
return;
const {name} = Info;
const execFrom = CloudCmd.execFromModule;
execFrom(nameModule, 'uploadFile', name, data);
CloudCmd.execFromModule(nameModule, 'uploadFile', name, data);
});
CloudCmd.log('Uploading to ' + name + '...');

View file

@ -17,20 +17,19 @@ module.exports.init = async () => {
module.exports.show = show;
module.exports.hide = hide;
function show() {
async function show() {
Images.show.load('top');
Files.get('upload', (error, innerHTML) => {
const autoSize = true;
const el = createElement('div', {
innerHTML,
});
CloudCmd.View.show(el, {
autoSize,
afterShow,
});
const innerHTML = await Files.get('upload');
const autoSize = true;
const el = createElement('div', {
innerHTML,
});
CloudCmd.View.show(el, {
autoSize,
afterShow,
});
const fontFamily = [

View file

@ -9,6 +9,7 @@ const rendy = require('rendy/legacy');
const exec = require('execon');
const currify = require('currify/legacy');
const {promisify} = require('es6-promisify');
const tryToCatch = require('try-to-catch/legacy');
const modal = require('@cloudcmd/modal');
const createElement = require('@cloudcmd/create-element');
@ -81,7 +82,7 @@ module.exports.init = async () => {
events.forEach(addEvent(Overlay, onOverlayClick));
};
function show(data, options) {
async function show(data, options) {
const prefixURL = CloudCmd.prefixURL + FS;
if (Loading)
@ -120,22 +121,25 @@ function show(data, options) {
}
}
function viewMedia(path) {
getMediaElement(path, (element) => {
const allConfig = {
...Config,
...{
autoSize: true,
afterShow: () => {
element
.querySelector('audio, video')
.focus();
},
async function viewMedia(path) {
const [e, element] = await getMediaElement(path);
if (e)
return alert(e);
const allConfig = {
...Config,
...{
autoSize: true,
afterShow: () => {
element
.querySelector('audio, video')
.focus();
},
};
modal.open(element, allConfig);
});
},
};
modal.open(element, allConfig);
}
function viewFile() {
@ -257,33 +261,33 @@ function getType(name) {
return 'media';
}
function getMediaElement(src, callback) {
check(src, callback);
async function getMediaElement(src) {
check(src);
Files.get('view/media-tmpl', (error, template) => {
const {name} = Info;
if (error)
return alert(error);
if (!TemplateAudio)
TemplateAudio = template;
const is = isAudio(name);
const type = is ? 'audio' : 'video';
const innerHTML = rendy(TemplateAudio, {
src,
type,
name,
});
const element = createElement('div', {
innerHTML,
});
callback(element);
const [error, template] = await tryToCatch(Files.get, 'view/media-tmpl');
if (error)
return [error];
const {name} = Info;
if (!TemplateAudio)
TemplateAudio = template;
const is = isAudio(name);
const type = is ? 'audio' : 'video';
const innerHTML = rendy(TemplateAudio, {
src,
type,
name,
});
const element = createElement('div', {
innerHTML,
});
return [null, element];
}
function check(src, callback) {