Skip to content
This repository has been archived by the owner on Feb 22, 2024. It is now read-only.

Commit

Permalink
Merge pull request #2140 from aaron-binary/show-message-scratch-strategy
Browse files Browse the repository at this point in the history
aaron/Detect DBot strategy and show popup
  • Loading branch information
Aaron committed Dec 2, 2019
2 parents 3fa9cd4 + fce824a commit 0f3df86
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 121 deletions.
5 changes: 3 additions & 2 deletions src/botPage/view/View.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import ReactDOM from 'react-dom';
import 'jquery-ui/ui/widgets/dialog';
import _Blockly from './blockly';
import _Blockly, { load } from './blockly';
import Chart from './Dialogs/Chart';
import Limits from './Dialogs/Limits';
import IntegrationsDialog from './Dialogs/IntegrationsDialog';
Expand Down Expand Up @@ -254,10 +254,11 @@ export default class View {
});
}

// eslint-disable-next-line class-methods-use-this
setFileBrowser() {
const readFile = (f, dropEvent = {}) => {
const reader = new FileReader();
reader.onload = e => this.blockly.load(e.target.result, dropEvent);
reader.onload = e => load(e.target.result, dropEvent);
reader.readAsText(f);
};

Expand Down
242 changes: 136 additions & 106 deletions src/botPage/view/blockly/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ const disableStrayBlocks = () => {
}
});
};

const disposeBlocksWithLoaders = () => {
Blockly.mainWorkspace.addChangeListener(ev => {
saveBeforeUnload();
Expand All @@ -50,6 +51,7 @@ const disposeBlocksWithLoaders = () => {
}
});
};

const marketsWereRemoved = xml => {
if (!Array.from(xml.children).every(block => !removeUnavailableMarkets(block))) {
if (window.trackJs) {
Expand All @@ -74,64 +76,12 @@ const marketsWereRemoved = xml => {
}
return false;
};
export const loadWorkspace = xml => {
updateRenamedFields(xml);
if (!strategyHasValidTradeTypeCategory(xml)) return;
if (marketsWereRemoved(xml)) return;

Blockly.Events.setGroup('load');
Blockly.mainWorkspace.clear();

Array.from(xml.children).forEach(block => {
backwardCompatibility(block);
});

fixArgumentAttribute(xml);
Blockly.Xml.domToWorkspace(xml, Blockly.mainWorkspace);
addLoadersFirst(xml).then(
() => {
fixCollapsedBlocks();
Blockly.Events.setGroup(false);
globalObserver.emit('ui.log.success', translate('Blocks are loaded successfully'));
},
e => {
Blockly.Events.setGroup(false);
throw e;
}
);
};

export const loadBlocks = (xml, dropEvent = {}) => {
updateRenamedFields(xml);
if (!strategyHasValidTradeTypeCategory(xml)) return;
if (marketsWereRemoved(xml)) return;

const variables = xml.getElementsByTagName('variables');
if (variables.length > 0) {
Blockly.Xml.domToVariables(variables[0], Blockly.mainWorkspace);
}
Blockly.Events.setGroup('load');
addLoadersFirst(xml).then(
loaders => {
const addedBlocks = [
...loaders,
...Array.from(xml.children)
.map(block => addDomAsBlock(block))
.filter(b => b),
];
cleanUpOnLoad(addedBlocks, dropEvent);
fixCollapsedBlocks();
globalObserver.emit('ui.log.success', translate('Blocks are loaded successfully'));
},
e => {
throw e;
}
);
};
const xmlToStr = xml => {
const serializer = new XMLSerializer();
return serializer.serializeToString(xml);
};

const addBlocklyTranslation = () => {
$.ajaxPrefilter(options => {
options.async = true; // eslint-disable-line no-param-reassign
Expand All @@ -148,6 +98,7 @@ const addBlocklyTranslation = () => {
$.getScript(`translations/${lang}.js`, resolve);
});
};

const onresize = () => {
let element = document.getElementById('blocklyArea');
const blocklyArea = element;
Expand All @@ -165,10 +116,12 @@ const onresize = () => {
blocklyDiv.style.width = `${blocklyArea.offsetWidth}px`;
blocklyDiv.style.height = `${blocklyArea.offsetHeight}px`;
};

const render = workspace => () => {
onresize();
Blockly.svgResize(workspace);
};

const overrideBlocklyDefaultShape = () => {
const addDownloadToMenu = block => {
if (block instanceof Object) {
Expand All @@ -195,6 +148,7 @@ const overrideBlocklyDefaultShape = () => {
}
});
};

const repaintDefaultColours = () => {
Blockly.Msg.LOGIC_HUE = '#DEDEDE';
Blockly.Msg.LOOPS_HUE = '#DEDEDE';
Expand All @@ -216,6 +170,135 @@ const repaintDefaultColours = () => {
Blockly.Blocks.procedures.HUE = '#DEDEDE';
};

export const load = (blockStr, dropEvent = {}) => {
const unrecognisedMsg = () => translate('Unrecognized file format');

try {
const xmlDoc = new DOMParser().parseFromString(blockStr, 'application/xml');

if (xmlDoc.getElementsByTagName('parsererror').length) {
throw new Error();
}
} catch (err) {
throw createErrorAndEmit('FileLoad', unrecognisedMsg());
}

let xml;
try {
xml = Blockly.Xml.textToDom(blockStr);
} catch (e) {
throw createErrorAndEmit('FileLoad', unrecognisedMsg());
}

const blocklyXml = xml.querySelectorAll('block');

if (!blocklyXml.length) {
throw createErrorAndEmit('FileLoad', 'XML file contains unsupported elements. Please check or modify file.');
}

if (xml.hasAttribute('is_dbot')) {
showDialog({
title : translate('Unsupported strategy'),
text : [translate('Sorry, this strategy can’t be used with Binary Bot. You may only use it with DBot.')],
buttons: [
{
text : translate('Cancel'),
class: 'button-secondary',
click() {
$(this).dialog('close');
$(this).remove();
},
},
{
text : translate('Take me to DBot'),
class: 'button-primary',
click() {
window.location.href = 'https://deriv.app/bot';
},
},
],
})
.then(() => {})
.catch(() => {});
return;
}

blocklyXml.forEach(block => {
const blockType = block.getAttribute('type');

if (!Object.keys(Blockly.Blocks).includes(blockType)) {
throw createErrorAndEmit('FileLoad', 'XML file contains unsupported elements. Please check or modify file');
}
});

removeParam('strategy');

try {
if (xml.hasAttribute('collection') && xml.getAttribute('collection') === 'true') {
loadBlocks(xml, dropEvent);
} else {
loadWorkspace(xml);
}
} catch (e) {
throw createErrorAndEmit('FileLoad', translate('Unable to load the block file'));
}
};

export const loadWorkspace = xml => {
updateRenamedFields(xml);
if (!strategyHasValidTradeTypeCategory(xml)) return;
if (marketsWereRemoved(xml)) return;

Blockly.Events.setGroup('load');
Blockly.mainWorkspace.clear();

Array.from(xml.children).forEach(block => {
backwardCompatibility(block);
});

fixArgumentAttribute(xml);
Blockly.Xml.domToWorkspace(xml, Blockly.mainWorkspace);
addLoadersFirst(xml).then(
() => {
fixCollapsedBlocks();
Blockly.Events.setGroup(false);
globalObserver.emit('ui.log.success', translate('Blocks are loaded successfully'));
},
e => {
Blockly.Events.setGroup(false);
throw e;
}
);
};

export const loadBlocks = (xml, dropEvent = {}) => {
updateRenamedFields(xml);
if (!strategyHasValidTradeTypeCategory(xml)) return;
if (marketsWereRemoved(xml)) return;

const variables = xml.getElementsByTagName('variables');
if (variables.length > 0) {
Blockly.Xml.domToVariables(variables[0], Blockly.mainWorkspace);
}
Blockly.Events.setGroup('load');
addLoadersFirst(xml).then(
loaders => {
const addedBlocks = [
...loaders,
...Array.from(xml.children)
.map(block => addDomAsBlock(block))
.filter(b => b),
];
cleanUpOnLoad(addedBlocks, dropEvent);
fixCollapsedBlocks();
globalObserver.emit('ui.log.success', translate('Blocks are loaded successfully'));
},
e => {
throw e;
}
);
};

export default class _Blockly {
constructor() {
this.generatedJs = '';
Expand Down Expand Up @@ -343,59 +426,6 @@ export default class _Blockly {
Blockly.mainWorkspace.resizeContents();
}
/* eslint-disable class-methods-use-this */
load(blockStr = '', dropEvent = {}) {
const unrecognisedMsg = () => translate('Unrecognized file format');

try {
const xmlDoc = new DOMParser().parseFromString(blockStr, 'application/xml');

if (xmlDoc.getElementsByTagName('parsererror').length) {
throw new Error();
}
} catch (err) {
throw createErrorAndEmit('FileLoad', unrecognisedMsg());
}

let xml;
try {
xml = Blockly.Xml.textToDom(blockStr);
} catch (e) {
throw createErrorAndEmit('FileLoad', unrecognisedMsg());
}

const blocklyXml = xml.querySelectorAll('block');

if (!blocklyXml.length) {
throw createErrorAndEmit(
'FileLoad',
'XML file contains unsupported elements. Please check or modify file.'
);
}

blocklyXml.forEach(block => {
const blockType = block.getAttribute('type');

if (!Object.keys(Blockly.Blocks).includes(blockType)) {
throw createErrorAndEmit(
'FileLoad',
'XML file contains unsupported elements. Please check or modify file'
);
}
});

removeParam('strategy');

try {
if (xml.hasAttribute('collection') && xml.getAttribute('collection') === 'true') {
loadBlocks(xml, dropEvent);
} else {
loadWorkspace(xml);
}
} catch (e) {
throw createErrorAndEmit('FileLoad', translate('Unable to load the block file'));
}
}
/* eslint-disable class-methods-use-this */
save(arg) {
const { filename, collection } = arg;

Expand Down
16 changes: 3 additions & 13 deletions src/common/integrations/GoogleDrive.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
import { getLanguage } from '../lang';
import { observer as globalObserver } from '../utils/observer';
import { translate, trackAndEmitError } from '../utils/tools';
import { loadWorkspace, loadBlocks } from '../../botPage/view/blockly';
import config from '../../botPage/common/const';
import { load } from '../../botPage/view/blockly';

class GoogleDrive {
constructor() {
Expand Down Expand Up @@ -134,18 +134,8 @@ class GoogleDrive {
})
.then(response => {
try {
const xmlDom = Blockly.Xml.textToDom(response.body);
const isCollection =
xmlDom.hasAttribute('collection') && xmlDom.getAttribute('collection') === 'true';
const loadFunction = isCollection ? loadBlocks : loadWorkspace;

try {
loadFunction(xmlDom);
resolve();
} catch (error) {
trackAndEmitError(translate('Could not load Google Drive blocks'), error);
reject(error);
}
load(response.body);
resolve();
} catch (error) {
trackAndEmitError(translate('Unrecognized file format'), error);
reject(error);
Expand Down

0 comments on commit 0f3df86

Please sign in to comment.