-
-
-
-
-
-
-
-
-
-
- {children}
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+
+
- )
+
);
});
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/mobile-form-wrapper.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/mobile-form-wrapper.tsx
index 816b838d4ac1..adc39f7af3d5 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/mobile-form-wrapper.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/mobile-form-wrapper.tsx
@@ -5,7 +5,7 @@ import { observer } from '@deriv/stores';
import { Localize } from '@deriv/translations';
import { useDBotStore } from 'Stores/useDBotStore';
import { TFormValues } from '../types';
-import useQsSubmitHandler from './useQsSubmitHandler';
+import useSubmitHandler from './useSubmitHandler';
import '../add-bot.scss';
type TMobileFormWrapper = {
@@ -14,9 +14,9 @@ type TMobileFormWrapper = {
const MobileFormWrapper: React.FC
= observer(({ children }) => {
const { isValid, validateForm } = useFormikContext();
- const { quick_strategy } = useDBotStore();
- const { selected_strategy } = quick_strategy;
- const { handleSubmit } = useQsSubmitHandler();
+ const { server_bot } = useDBotStore();
+ const { selected_strategy } = server_bot;
+ const { handleSubmit } = useSubmitHandler();
React.useEffect(() => {
validateForm();
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/useQsSubmitHandler.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/useQsSubmitHandler.tsx
deleted file mode 100644
index f5fe0ecabfe0..000000000000
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/useQsSubmitHandler.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import { useFormikContext } from 'formik';
-import { useStore } from '@deriv/stores';
-import { useDBotStore } from 'Stores/useDBotStore';
-import { rudderStackSendQsRunStrategyEvent } from '../../../../analytics/rudderstack-quick-strategy';
-import { SERVER_BOT_LOSS_THRESHOLD_WARNING } from '../constants';
-import { TFormValues } from '../types';
-
-const useQsSubmitHandler = () => {
- const { client } = useStore();
- const { currency, balance, is_logged_in } = client;
- const { submitForm, setFieldValue, values, isValid, validateForm } = useFormikContext();
- const { quick_strategy, run_panel } = useDBotStore();
- const {
- toggleStopBotDialog,
- setLossThresholdWarningData,
- selected_strategy,
- loss_threshold_warning_data,
- onSubmit,
- } = quick_strategy;
-
- const handleSubmit = async () => {
- const loss_amount = Number(values?.loss ?? 0);
- const profit_threshold = Number(values?.profit ?? 0);
- const stored_dont_show_warning_value = localStorage?.getItem(SERVER_BOT_LOSS_THRESHOLD_WARNING);
- const dont_show_warning = JSON.parse(stored_dont_show_warning_value ?? 'false');
- if (
- !loss_threshold_warning_data.already_shown &&
- (loss_amount > 0.5 * Number(balance ?? 0) || loss_amount > 2 * profit_threshold) &&
- is_logged_in &&
- !dont_show_warning
- ) {
- setLossThresholdWarningData({
- show: true,
- loss_amount,
- currency,
- already_shown: true,
- });
- } else {
- proceedFormSubmission();
- }
- };
-
- const proceedFormSubmission = async () => {
- if (run_panel.is_running) {
- await setFieldValue('action', 'EDIT');
- validateForm();
- submitForm();
- toggleStopBotDialog();
- rudderStackSendQsRunStrategyEvent({
- form_values: values,
- selected_strategy,
- });
- } else {
- await setFieldValue('action', 'RUN');
- validateForm();
- submitForm().then((form_data: TFormValues | void) => {
- if (isValid && form_data) {
- rudderStackSendQsRunStrategyEvent({
- form_values: values,
- selected_strategy,
- });
- onSubmit(form_data);
- }
- });
- }
- };
-
- return { handleSubmit, proceedFormSubmission };
-};
-
-export default useQsSubmitHandler;
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/useSubmitHandler.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/useSubmitHandler.tsx
new file mode 100644
index 000000000000..3dae2bdcb096
--- /dev/null
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form-wrappers/useSubmitHandler.tsx
@@ -0,0 +1,44 @@
+import { useFormikContext } from 'formik';
+import { useStore } from '@deriv/stores';
+import { useDBotStore } from 'Stores/useDBotStore';
+import { SERVER_BOT_LOSS_THRESHOLD_WARNING } from '../constants';
+import { TFormValues } from '../types';
+
+const useSubmitHandler = () => {
+ const { client } = useStore();
+ const { currency, balance, is_logged_in } = client;
+ const { submitForm, values, validateForm } = useFormikContext();
+ const { server_bot } = useDBotStore();
+ const { setLossThresholdWarningData, loss_threshold_warning_data } = server_bot;
+
+ const handleSubmit = async () => {
+ const loss_amount = Number(values?.loss ?? 0);
+ const profit_threshold = Number(values?.profit ?? 0);
+ const stored_dont_show_warning_value = localStorage?.getItem(SERVER_BOT_LOSS_THRESHOLD_WARNING);
+ const dont_show_warning = JSON.parse(stored_dont_show_warning_value ?? 'false');
+ if (
+ !loss_threshold_warning_data.already_shown &&
+ (loss_amount > 0.5 * Number(balance ?? 0) || loss_amount > 2 * profit_threshold) &&
+ is_logged_in &&
+ !dont_show_warning
+ ) {
+ setLossThresholdWarningData({
+ show: true,
+ loss_amount,
+ currency,
+ already_shown: true,
+ });
+ } else {
+ proceedFormSubmission();
+ }
+ };
+
+ const proceedFormSubmission = () => {
+ validateForm();
+ submitForm();
+ };
+
+ return { handleSubmit, proceedFormSubmission };
+};
+
+export default useSubmitHandler;
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form.tsx
index ae1ea042965e..ffc2d00f747c 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/form.tsx
@@ -17,12 +17,11 @@ import './add-bot.scss';
const QuickStrategyForm = observer(() => {
const { ui } = useStore();
- const { quick_strategy } = useDBotStore();
- const { selected_strategy, setValue, form_data } = quick_strategy;
+ const { server_bot } = useDBotStore();
+ const { selected_strategy, setValue, form_data, current_duration_min_max } = server_bot;
const config: TConfigItem[][] = STRATEGIES[selected_strategy]?.fields;
const { is_desktop } = ui;
const { values, setFieldTouched, setFieldValue } = useFormikContext();
- const { current_duration_min_max } = quick_strategy;
const [isEnabledToggleSwitch, setIsEnabledToggleSwitch] = React.useState(false);
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/inputs/add-input.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/inputs/add-input.tsx
index 8f1b6f36fe48..d8da73cd56ba 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/inputs/add-input.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/inputs/add-input.tsx
@@ -32,8 +32,8 @@ const QSInput: React.FC = observer(
ui: { is_desktop },
client: { currency },
} = useStore();
- const { quick_strategy } = useDBotStore();
- const { loss_threshold_warning_data } = quick_strategy;
+ const { server_bot } = useDBotStore();
+ const { loss_threshold_warning_data } = server_bot;
const [has_focus, setFocus] = React.useState(false);
const { setFieldValue, setFieldTouched } = useFormikContext();
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/parts/__tests__/loss-threshold-warning.spec.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/parts/__tests__/loss-threshold-warning.spec.tsx
index 6bfda2c77058..fbac68ee3332 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/parts/__tests__/loss-threshold-warning.spec.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/parts/__tests__/loss-threshold-warning.spec.tsx
@@ -55,7 +55,7 @@ describe('LossThresholdWarningDialog', () => {
});
it('should handle edit the amount button click', () => {
- mock_dbot_store?.quick_strategy.setLossThresholdWarningData({
+ mock_dbot_store?.server_bot.setLossThresholdWarningData({
show: true,
});
render(, {
@@ -63,11 +63,11 @@ describe('LossThresholdWarningDialog', () => {
});
const edit_amount_btn = screen.getByRole('button', { name: /Edit the amount/i });
userEvent.click(edit_amount_btn);
- expect(mock_dbot_store?.quick_strategy.loss_threshold_warning_data.show).toBeFalsy();
+ expect(mock_dbot_store?.server_bot.loss_threshold_warning_data.show).toBeFalsy();
});
it('should handle continue button click', async () => {
- mock_dbot_store?.quick_strategy.setLossThresholdWarningData({
+ mock_dbot_store?.server_bot.setLossThresholdWarningData({
show: true,
});
render(, {
@@ -76,12 +76,12 @@ describe('LossThresholdWarningDialog', () => {
const continue_btn = screen.getByRole('button', { name: /Yes, continue/i });
userEvent.click(continue_btn);
await waitFor(() => {
- expect(mock_dbot_store?.quick_strategy.loss_threshold_warning_data.show).toBeFalsy();
+ expect(mock_dbot_store?.server_bot.loss_threshold_warning_data.show).toBeFalsy();
});
});
it('should handle dont show again checkbox click', () => {
- mock_dbot_store?.quick_strategy.setLossThresholdWarningData({
+ mock_dbot_store?.server_bot.setLossThresholdWarningData({
show: true,
});
render(, {
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/parts/loss-threshold-warning-dialog.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/parts/loss-threshold-warning-dialog.tsx
index f9bf5e8140cd..4f906de6f1ce 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/parts/loss-threshold-warning-dialog.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/parts/loss-threshold-warning-dialog.tsx
@@ -4,16 +4,15 @@ import { observer } from '@deriv/stores';
import { Localize, localize } from '@deriv/translations';
import { useDBotStore } from 'Stores/useDBotStore';
import { SERVER_BOT_LOSS_THRESHOLD_WARNING } from '../constants';
-import useQsSubmitHandler from '../form-wrappers/useQsSubmitHandler';
+import useSubmitHandler from '../form-wrappers/useSubmitHandler';
import './loss-threshold-warning-dialog.scss';
const base_classname = 'loss-threshold-warning-dialog';
const LossThresholdWarningDialog = observer(() => {
- const { quick_strategy } = useDBotStore();
- const { loss_threshold_warning_data, setLossThresholdWarningData, initializeLossThresholdWarningData } =
- quick_strategy;
- const { proceedFormSubmission } = useQsSubmitHandler();
+ const { server_bot } = useDBotStore();
+ const { loss_threshold_warning_data, setLossThresholdWarningData, initializeLossThresholdWarningData } = server_bot;
+ const { proceedFormSubmission } = useSubmitHandler();
const handleAmountEdit = () => {
setLossThresholdWarningData({
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/contract-type.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/contract-type.tsx
index 31a872f9e7f0..551024bbbe0c 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/contract-type.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/contract-type.tsx
@@ -17,8 +17,8 @@ const ContractTypes: React.FC = observer(({ name }) => {
const { ui } = useStore();
const { is_desktop } = ui;
const [list, setList] = React.useState([]);
- const { quick_strategy } = useDBotStore();
- const { setValue } = quick_strategy;
+ const { server_bot } = useDBotStore();
+ const { setValue } = server_bot;
const { setFieldValue, values } = useFormikContext();
const { symbol, tradetype } = values;
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/duration-type.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/duration-type.tsx
index b2c1f94dbd3f..f6ca30756386 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/duration-type.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/duration-type.tsx
@@ -15,8 +15,8 @@ const DurationUnit: React.FC = ({ attached }: TDurationUnit) => {
const [list, setList] = React.useState([]);
const [prevSymbol, setPrevSymbol] = React.useState('');
const [prevTradeType, setPrevTradeType] = React.useState('');
- const { quick_strategy } = useDBotStore();
- const { setValue, setCurrentDurationMinMax } = quick_strategy;
+ const { server_bot } = useDBotStore();
+ const { setValue, setCurrentDurationMinMax } = server_bot;
const { setFieldValue, validateForm, values } = useFormikContext();
const { symbol, tradetype } = values;
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/symbol.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/symbol.tsx
index b897f8683e81..7997beeb59b2 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/symbol.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/symbol.tsx
@@ -28,11 +28,11 @@ const MarketOption: React.FC = ({ symbol }) => (
);
const SymbolSelect: React.FC = () => {
- const { quick_strategy } = useDBotStore();
+ const { server_bot } = useDBotStore();
const {
ui: { is_desktop },
} = useStore();
- const { setValue } = quick_strategy;
+ const { setValue } = server_bot;
const [active_symbols, setActiveSymbols] = React.useState([]);
const [is_input_started, setIsInputStarted] = useState(false);
const [input_value, setInputValue] = useState({ text: '', value: '' });
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/trade-type.tsx b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/trade-type.tsx
index 9ad9c02096c3..09e836969f10 100644
--- a/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/trade-type.tsx
+++ b/packages/bot-web-ui/src/pages/server-side-bot/add-bot/selects/trade-type.tsx
@@ -28,8 +28,8 @@ const TradeTypeOption: React.FC = ({ trade_type: { value, icon
const TradeTypeSelect: React.FC = () => {
const [trade_types, setTradeTypes] = React.useState([]);
const { setFieldValue, values, validateForm } = useFormikContext();
- const { quick_strategy } = useDBotStore();
- const { setValue } = quick_strategy;
+ const { server_bot } = useDBotStore();
+ const { setValue } = server_bot;
React.useEffect(() => {
if (values?.symbol) {
diff --git a/packages/bot-web-ui/src/pages/server-side-bot/config.ts b/packages/bot-web-ui/src/pages/server-side-bot/config.ts
new file mode 100644
index 000000000000..81a0a34ce668
--- /dev/null
+++ b/packages/bot-web-ui/src/pages/server-side-bot/config.ts
@@ -0,0 +1,16 @@
+export const SERVER_BOT_CONFIG = {
+ DISABLED: {
+ SYMBOLS: ['1HZ150V', '1HZ250V'],
+ SUBMARKETS: ['crash_index', 'non_stable_coin', 'step_index'],
+ BARRIER_TRADE_TYPES: ['higherlower', 'touchnotouch', 'endsinout', 'staysinout', 'callputspread', 'accumulator'],
+ PREDICTION_TRADE_TYPES: ['highlowticks'],
+ },
+ DEFAULT: {
+ symbol: '1HZ100V',
+ tradetype: 'callput',
+ durationtype: 't',
+ size: 1,
+ unit: 1,
+ prediction: 0,
+ },
+};
diff --git a/packages/bot-web-ui/src/stores/server-side-bot-store.ts b/packages/bot-web-ui/src/stores/server-side-bot-store.ts
index f7ab3cb0c6ce..006f7f7ee9e6 100644
--- a/packages/bot-web-ui/src/stores/server-side-bot-store.ts
+++ b/packages/bot-web-ui/src/stores/server-side-bot-store.ts
@@ -6,6 +6,7 @@ import { isEnded } from '@deriv/shared';
import { localize } from '@deriv/translations';
import { botNotification } from 'Components/bot-notification/bot-notification';
import { downloadFile } from 'Utils/download';
+import { SERVER_BOT_CONFIG } from '../pages/server-side-bot/config';
import RootStore from './root-store';
export type TFormData = {
@@ -85,6 +86,14 @@ export type TJournalItem = {
time?: string;
};
+export type TLossThresholdWarningData = {
+ show: boolean;
+ loss_amount?: string | number;
+ currency?: string;
+ highlight_field?: Array;
+ already_shown?: boolean;
+};
+
export const getDate = (epoch: number) => {
const DATE_TIME_FORMAT_WITH_OFFSET = 'YYYY-MM-DD HH:mm:ss Z';
return moment.unix(epoch).utc().local().format(DATE_TIME_FORMAT_WITH_OFFSET);
@@ -107,6 +116,20 @@ export default class ServerBotStore {
pocs: { [key: string]: ProposalOpenContract } = {};
should_subscribe = true;
+ loss_threshold_warning_data: TLossThresholdWarningData = {
+ show: false,
+ };
+ current_duration_min_max = {
+ min: 0,
+ max: 10,
+ };
+ selected_strategy = 'MARTINGALE';
+ form_data: TFormData = {
+ symbol: SERVER_BOT_CONFIG.DEFAULT.symbol,
+ tradetype: SERVER_BOT_CONFIG.DEFAULT.tradetype,
+ durationtype: SERVER_BOT_CONFIG.DEFAULT.durationtype,
+ action: 'RUN',
+ };
constructor(root_store: RootStore) {
this.root_store = root_store;
@@ -119,6 +142,10 @@ export default class ServerBotStore {
pocs: observable,
journal: observable,
should_subscribe: observable,
+ selected_strategy: observable,
+ form_data: observable,
+ current_duration_min_max: observable,
+ loss_threshold_warning_data: observable,
setShouldSubscribe: action,
performance: computed,
setListLoading: action,
@@ -136,6 +163,10 @@ export default class ServerBotStore {
setJournal: action,
setBotList: action,
setActiveBotId: action,
+ setLossThresholdWarningData: action,
+ initializeLossThresholdWarningData: action,
+ setCurrentDurationMinMax: action,
+ setSelectedStrategy: action,
});
}
@@ -188,8 +219,6 @@ export default class ServerBotStore {
const { msg_type, echo_req } = data;
if (data?.error) {
- // eslint-disable-next-line no-console
- console.info(data.error);
if (data.error.message) {
this.onJournalMessage(JOURNAL_TYPE.ERROR, {
msg: data.error.message,
@@ -574,4 +603,34 @@ export default class ServerBotStore {
console.dir(error);
}
};
+
+ setLossThresholdWarningData = (data: TLossThresholdWarningData) => {
+ this.loss_threshold_warning_data = {
+ ...this.loss_threshold_warning_data,
+ ...data,
+ };
+ };
+
+ initializeLossThresholdWarningData = () => {
+ this.loss_threshold_warning_data = {
+ show: false,
+ highlight_field: [],
+ already_shown: false,
+ };
+ };
+
+ setCurrentDurationMinMax = (min = 0, max = 10) => {
+ this.current_duration_min_max = {
+ min,
+ max,
+ };
+ };
+
+ setValue = (name: string, value: string | number | boolean) => {
+ this.form_data[name as keyof TFormData] = value;
+ };
+
+ setSelectedStrategy = (strategy: string) => {
+ this.selected_strategy = strategy;
+ };
}