diff --git a/packages/bot-skeleton/src/scratch/utils/index.js b/packages/bot-skeleton/src/scratch/utils/index.js index cc387be70ecf..47683e6dc24d 100644 --- a/packages/bot-skeleton/src/scratch/utils/index.js +++ b/packages/bot-skeleton/src/scratch/utils/index.js @@ -11,6 +11,29 @@ import { error_message_map } from '../../utils/error-config'; import { botNotification } from '../../../../bot-web-ui/src/components/bot-notification/bot-notification'; import { notification_message } from '../../../../bot-web-ui/src/components/bot-notification/bot-notification-utils'; +export const inject_workspace_options = { + media: `${__webpack_public_path__}media/`, + zoom: { + wheel: true, + startScale: config.workspaces.previewWorkspaceStartScale, + }, + readOnly: true, + scrollbars: true, + renderer: 'zelos', +}; + +export const updateXmlValues = blockly_options => { + if (!window.Blockly) return; + const { strategy_id, convertedDom, file_name, from } = blockly_options; + window.Blockly.xmlValues = { + ...window.Blockly.xmlValues, + strategy_id, + convertedDom, + file_name, + from, + }; +}; + export const getSelectedTradeType = (workspace = Blockly.derivWorkspace) => { const trade_type_block = workspace.getAllBlocks(true).find(block => block.type === 'trade_definition_tradetype'); const selected_trade_type = trade_type_block?.getFieldValue('TRADETYPE_LIST'); @@ -122,9 +145,9 @@ export const load = async ({ showIncompatibleStrategyDialog, }) => { if (!DBotStore?.instance || !workspace) return; - const { setLoading } = DBotStore.instance; - const { load_modal } = DBotStore.instance; - const { setLoadedLocalFile } = load_modal; + const { setLoading, load_modal } = DBotStore.instance; + const { setOpenButtonDisabled, setLoadedLocalFile } = load_modal; + setLoading(true); // Delay execution to allow fully previewing previous strategy if users quickly switch between strategies. await delayExecution(100); @@ -185,7 +208,7 @@ export const load = async ({ workspace, Array.from(blockly_xml).map(xml_block => xml_block.getAttribute('type')) ); - + updateXmlValues({ strategy_id, convertedDom: xml, file_name, from }); if (is_collection) { loadBlocks(xml, drop_event, event_group, workspace); } else { @@ -218,6 +241,7 @@ export const load = async ({ return showInvalidStrategyError(); } finally { setLoading(false); + setOpenButtonDisabled(false); } }; diff --git a/packages/bot-web-ui/src/components/load-modal/__tests__/local-footer.spec.tsx b/packages/bot-web-ui/src/components/load-modal/__tests__/local-footer.spec.tsx index 7bfc727aa085..d1c9203d7e11 100644 --- a/packages/bot-web-ui/src/components/load-modal/__tests__/local-footer.spec.tsx +++ b/packages/bot-web-ui/src/components/load-modal/__tests__/local-footer.spec.tsx @@ -33,9 +33,10 @@ describe('LocalFooter', () => { } as DashboardStore, load_modal: { ...mock_DBot_store.load_modal, - loadFileFromLocal: jest.fn(), toggleLoadModal: jest.fn(), setLoadedLocalFile: jest.fn(), + loadStrategyOnBotBuilder: jest.fn(), + saveStrategyToLocalStorage: jest.fn(), preview_workspace: jest.fn() as unknown, selected_strategy: jest.fn() as unknown, tab_name: 'google_tab', @@ -78,7 +79,8 @@ describe('LocalFooter', () => { userEvent.click(open_button); - expect(mock_DBot_store?.load_modal.loadFileFromLocal).toHaveBeenCalled(); + expect(mock_DBot_store?.load_modal.loadStrategyOnBotBuilder).toHaveBeenCalled(); + expect(mock_DBot_store?.load_modal.saveStrategyToLocalStorage).toHaveBeenCalled(); expect(mock_DBot_store?.load_modal.toggleLoadModal).toHaveBeenCalled(); expect(mock_DBot_store?.dashboard.setPreviewOnPopup).toHaveBeenCalledWith(false); expect(mock_DBot_store?.dashboard.setOpenSettings).toHaveBeenCalledWith(NOTIFICATION_TYPE.BOT_IMPORT); diff --git a/packages/bot-web-ui/src/components/load-modal/__tests__/recent-footer.spec.tsx b/packages/bot-web-ui/src/components/load-modal/__tests__/recent-footer.spec.tsx index 25e4303eebfd..6b748797387e 100644 --- a/packages/bot-web-ui/src/components/load-modal/__tests__/recent-footer.spec.tsx +++ b/packages/bot-web-ui/src/components/load-modal/__tests__/recent-footer.spec.tsx @@ -16,11 +16,17 @@ jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); window.Blockly = { - derivWorkspace: { asyncClear: () => ({}) }, + derivWorkspace: { asyncClear: () => ({}), cleanUp: () => ({}), clearUndo: () => ({}) }, utils: { xml: { textToDom: jest.fn() }, }, - Xml: { domToWorkspace: () => ({}), textToDom: () => ({}) }, + Xml: { domToWorkspace: () => ({}), textToDom: () => ({}), clearWorkspaceAndLoadFromXml: () => ({}) }, + xmlValues: { + strategy_id: 'strategy_id', + file_name: 'strategy_name', + from: 'xml', + convertedDom: 'convertedDom', + }, }; describe('RecentFooter', () => { diff --git a/packages/bot-web-ui/src/components/load-modal/__tests__/recent-workspace.spec.tsx b/packages/bot-web-ui/src/components/load-modal/__tests__/recent-workspace.spec.tsx index cc567b13685c..cbbd663556bf 100644 --- a/packages/bot-web-ui/src/components/load-modal/__tests__/recent-workspace.spec.tsx +++ b/packages/bot-web-ui/src/components/load-modal/__tests__/recent-workspace.spec.tsx @@ -6,6 +6,7 @@ import { mock_ws } from 'Utils/mock'; import RootStore from 'Stores/root-store'; import { DBotStoreProvider, mockDBotStore } from 'Stores/useDBotStore'; import RecentWorkspace from '../recent-workspace'; +import { TStrategy } from 'Types'; jest.mock('@deriv/bot-skeleton/src/scratch/blockly', () => jest.fn()); jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ @@ -22,6 +23,21 @@ const mock_workspace = { xml: 'Sample', }; +type TMockStrategy = Array; + +const strategy = { + name: '', + xml: '', + save_type: '', + timestamp: 1, +}; + +const mock_strategy: TMockStrategy = [ + { ...strategy, name: 'martingale', id: 'test-id-1' }, + { ...strategy, name: 'd_alembert', id: 'test-id-1' }, + { ...strategy, name: 'oscar_grind', id: 'test-id-1' }, +]; + describe('RecentWorkspace', () => { let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element, mock_DBot_store: RootStore | undefined; @@ -49,9 +65,10 @@ describe('RecentWorkspace', () => { }); it('should update selected strategy ID on clicking the strategy', () => { + mock_DBot_store?.load_modal?.setRecentStrategies(mock_strategy); render(, { wrapper }); const recent_workspace_item = screen.getByTestId('dt_recent_workspace_item'); userEvent.click(recent_workspace_item); - expect(mock_DBot_store?.load_modal?.selected_strategy_id).toBe(mock_workspace.id); + expect(mock_DBot_store?.load_modal?.selected_strategy_id).toBe(mock_strategy[0].id); }); }); diff --git a/packages/bot-web-ui/src/components/load-modal/local-footer.tsx b/packages/bot-web-ui/src/components/load-modal/local-footer.tsx index f022fd2ddf6e..eba03ffae0e5 100644 --- a/packages/bot-web-ui/src/components/load-modal/local-footer.tsx +++ b/packages/bot-web-ui/src/components/load-modal/local-footer.tsx @@ -8,7 +8,14 @@ import { useDBotStore } from 'Stores/useDBotStore'; const LocalFooter = observer(() => { const { ui } = useStore(); const { load_modal, dashboard } = useDBotStore(); - const { is_open_button_loading, loadFileFromLocal, setLoadedLocalFile, toggleLoadModal } = load_modal; + const { + is_open_button_loading, + is_open_button_disabled, + loadStrategyOnBotBuilder, + setLoadedLocalFile, + saveStrategyToLocalStorage, + toggleLoadModal, + } = load_modal; const { setOpenSettings, setPreviewOnPopup } = dashboard; const { is_desktop } = ui; @@ -22,7 +29,9 @@ const LocalFooter = observer(() => {