From 20d0fd6fe2e3383239b7a45b0d5fe9a40f32bf03 Mon Sep 17 00:00:00 2001 From: Dmytro Shcherbonos Date: Fri, 12 Jul 2024 14:51:25 +0300 Subject: [PATCH 1/5] BadConnectionModal: show only on enabled dms --- .../BadConnectionModal.container.js | 8 ++++---- .../BadConnectionModal/BadConnectionModal.js | 10 +++------- .../NoConnectionActionModal.container.js | 2 +- src/redux/actions/ui.js | 5 +++++ src/redux/constants/modals.js | 1 + src/redux/constants/ui.js | 2 ++ src/redux/middleware/ws/on_close.js | 3 +-- src/redux/middleware/ws/on_message.js | 2 +- src/redux/sagas/ui/index.js | 2 ++ src/redux/sagas/ui/on_bad_connection.js | 16 ++++++++++++++++ 10 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 src/redux/sagas/ui/on_bad_connection.js diff --git a/src/modals/BadConnectionModal/BadConnectionModal.container.js b/src/modals/BadConnectionModal/BadConnectionModal.container.js index 5c56912e6..c3c8e79aa 100644 --- a/src/modals/BadConnectionModal/BadConnectionModal.container.js +++ b/src/modals/BadConnectionModal/BadConnectionModal.container.js @@ -1,16 +1,16 @@ import { connect } from 'react-redux' import UIActions from '../../redux/actions/ui' -import { UI_KEYS } from '../../redux/constants/ui_keys' -import { getUIState } from '../../redux/selectors/ui' +import { getUIModalStateForKey } from '../../redux/selectors/ui' import BadConnectionModal from './BadConnectionModal' +import { UI_MODAL_KEYS } from '../../redux/constants/modals' const mapStateToProps = (state = {}) => ({ - visible: getUIState(state, UI_KEYS.isBadInternetConnection, false), + visible: getUIModalStateForKey(state, UI_MODAL_KEYS.BAD_INTERNET_CONNECTION_MODAL), }) const mapDispatchToProps = dispatch => ({ - changeBadInternetConnectionState: (visible) => dispatch(UIActions.setUIValue(UI_KEYS.isBadInternetConnection, visible)), + onClose: (visible) => dispatch(UIActions.changeUIModalState(UI_MODAL_KEYS.BAD_INTERNET_CONNECTION_MODAL, visible)), }) export default connect(mapStateToProps, mapDispatchToProps)(BadConnectionModal) diff --git a/src/modals/BadConnectionModal/BadConnectionModal.js b/src/modals/BadConnectionModal/BadConnectionModal.js index a5aac2266..dd9eb9519 100644 --- a/src/modals/BadConnectionModal/BadConnectionModal.js +++ b/src/modals/BadConnectionModal/BadConnectionModal.js @@ -8,14 +8,10 @@ import { isElectronApp } from '../../redux/config' import './style.css' const BadConnection = ({ - changeBadInternetConnectionState, visible, + onClose, visible, }) => { const { t } = useTranslation() - const onClose = () => { - changeBadInternetConnectionState(false) - } - const onRestart = () => { const path = isElectronApp ? '/index.html' : '' location.replace(path) // eslint-disable-line @@ -37,7 +33,7 @@ const BadConnection = ({ {action} - {t('ui.ok')} + {t('ui.proceed')} @@ -45,7 +41,7 @@ const BadConnection = ({ } BadConnection.propTypes = { - changeBadInternetConnectionState: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, visible: PropTypes.bool.isRequired, } diff --git a/src/modals/NoConnectionActionModal/NoConnectionActionModal.container.js b/src/modals/NoConnectionActionModal/NoConnectionActionModal.container.js index 32ce75683..24e1c3d96 100644 --- a/src/modals/NoConnectionActionModal/NoConnectionActionModal.container.js +++ b/src/modals/NoConnectionActionModal/NoConnectionActionModal.container.js @@ -10,7 +10,7 @@ const mapStateToProps = (state = {}) => ({ }) const mapDispatchToProps = dispatch => ({ - changeIsNoConnectionModalState: (isOpen) => dispatch(UIActions.changeUIModalState(UI_MODAL_KEYS.NO_CONNECTION_MODAL, isOpen)), + onClose: () => dispatch(UIActions.changeUIModalState(UI_MODAL_KEYS.NO_CONNECTION_MODAL, false)), }) export default connect(mapStateToProps, mapDispatchToProps)(NoConnectionActionModal) diff --git a/src/redux/actions/ui.js b/src/redux/actions/ui.js index ea78706de..e3a2dd8f6 100644 --- a/src/redux/actions/ui.js +++ b/src/redux/actions/ui.js @@ -180,6 +180,10 @@ export const setBacktestActiveSection = (section) => ({ payload: { section }, }) +export const handleBadConnectionAction = { + type: types.HANDLE_BAD_CONNECTION, +} + export default { setUIValue, updateUIValue, @@ -207,4 +211,5 @@ export default { logInformation, setBacktestActiveSection, setNotifications, + handleBadConnectionAction, } diff --git a/src/redux/constants/modals.js b/src/redux/constants/modals.js index 1c394afa3..8575b3eee 100644 --- a/src/redux/constants/modals.js +++ b/src/redux/constants/modals.js @@ -14,4 +14,5 @@ export const UI_MODAL_KEYS = { RESET_LIVE_API_KEY_MODAL: 'ResetLiveApiKeyModal', RESET_PAPER_API_KEY_MODAL: 'ResetPaperApiKeyModal', HELP_US_IMPROVE_HONEY_MODAL: 'HelpUsImproveHoneyModal', + BAD_INTERNET_CONNECTION_MODAL: 'BadInternetConnectionModal', } diff --git a/src/redux/constants/ui.js b/src/redux/constants/ui.js index a596fc01e..7ad54e71c 100644 --- a/src/redux/constants/ui.js +++ b/src/redux/constants/ui.js @@ -45,4 +45,6 @@ module.exports = { LOG: 'UI_LOG', SET_BACKTEST_ACTIVE_SECTION: 'UI_SET_BACKTEST_ACTIVE_SECTION', + + HANDLE_BAD_CONNECTION: 'UI_HANDLE_BAD_CONNECTION', } diff --git a/src/redux/middleware/ws/on_close.js b/src/redux/middleware/ws/on_close.js index be9675993..4374edbb2 100644 --- a/src/redux/middleware/ws/on_close.js +++ b/src/redux/middleware/ws/on_close.js @@ -3,7 +3,6 @@ import WSActions from '../../actions/ws' import UIActions from '../../actions/ui' import { getAuthToken, getSocket } from '../../selectors/ws' import { isElectronApp, env } from '../../config' -import { UI_KEYS } from '../../constants/ui_keys' import { LOG_LEVELS } from '../../../constants/logging' export default (alias, store) => () => { @@ -15,7 +14,7 @@ export default (alias, store) => () => { // do not show in hosted mode since it re-attepmpts new connection // do not mark bad connection if user is still on login screen and ws onClose is triggered if (!_isNil(socket?.lastActivity) && isElectronApp && isLoggedIn) { - store.dispatch(UIActions.setUIValue(UI_KEYS.isBadInternetConnection, true)) + store.dispatch(UIActions.handleBadConnectionAction) } if (env === 'electron') { diff --git a/src/redux/middleware/ws/on_message.js b/src/redux/middleware/ws/on_message.js index 9b214553a..e4a80897a 100644 --- a/src/redux/middleware/ws/on_message.js +++ b/src/redux/middleware/ws/on_message.js @@ -324,7 +324,7 @@ export default (alias, store) => (e = {}) => { store.dispatch(WSActions.recvClientStatusUpdate({ status, mode })) if (status === WS_CONNECTION.CLOSED) { - store.dispatch(UIActions.setUIValue(UI_KEYS.isBadInternetConnection, true)) + store.dispatch(UIActions.handleBadConnectionAction) } if (status === WS_CONNECTION.OPENED) { diff --git a/src/redux/sagas/ui/index.js b/src/redux/sagas/ui/index.js index a0c17fe96..67d16c48b 100644 --- a/src/redux/sagas/ui/index.js +++ b/src/redux/sagas/ui/index.js @@ -14,6 +14,7 @@ import removeComponent from './on_remove_component' import createLayout from './on_create_layout' import deleteLayout from './on_delete_layout' import onLog from './on_log' +import onBadConnection from './on_bad_connection' import { isElectronApp } from '../../config' export default function* () { @@ -27,6 +28,7 @@ export default function* () { yield takeEvery(UITypes.REMOVE_COMPONENT, removeComponent) yield takeEvery(UITypes.CREATE_LAYOUT, createLayout) yield takeEvery(UITypes.DELETE_LAYOUT, deleteLayout) + yield takeEvery(UITypes.HANDLE_BAD_CONNECTION, onBadConnection) if (isElectronApp) { yield takeEvery(UITypes.DATA_NOTIFICATION, onShowNotification) diff --git a/src/redux/sagas/ui/on_bad_connection.js b/src/redux/sagas/ui/on_bad_connection.js new file mode 100644 index 000000000..e2d04c598 --- /dev/null +++ b/src/redux/sagas/ui/on_bad_connection.js @@ -0,0 +1,16 @@ +import { put, select } from 'redux-saga/effects' +import UIActions from '../../actions/ui' +import { UI_KEYS } from '../../constants/ui_keys' +import { UI_MODAL_KEYS } from '../../constants/modals' +import { getDMSSetting } from '../../selectors/ui' + +function* onBadConnection() { + yield put(UIActions.setUIValue(UI_KEYS.isBadInternetConnection, true)) + const dms = yield select(getDMSSetting) + + if (dms) { + yield put(UIActions.changeUIModalState(UI_MODAL_KEYS.BAD_INTERNET_CONNECTION_MODAL, true)) + } +} + +export default onBadConnection From 8f67cd5a93a5bb86f4b560a00879a236d2cd0863 Mon Sep 17 00:00:00 2001 From: Dmytro Shcherbonos Date: Fri, 12 Jul 2024 14:51:42 +0300 Subject: [PATCH 2/5] remove unused property from ui reducer --- src/redux/reducers/ui/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/redux/reducers/ui/index.js b/src/redux/reducers/ui/index.js index 81811b774..26d597eaa 100644 --- a/src/redux/reducers/ui/index.js +++ b/src/redux/reducers/ui/index.js @@ -81,7 +81,6 @@ function getInitialState() { modals: {}, orderToEdit: {}, isBadInternetConnection: false, - isNoConnectionModalVisible: false, closePositionModalData: {}, isOrderExecuting: false, strategyEditor: { From a5c9a2a1fecb546de4fcae9f1846adb1f80a9176 Mon Sep 17 00:00:00 2001 From: Dmytro Shcherbonos Date: Fri, 12 Jul 2024 14:57:56 +0300 Subject: [PATCH 3/5] simplify some functions --- .../BadConnectionModal/BadConnectionModal.container.js | 2 +- .../NoConnectionActionModal/NoConnectionActionModal.js | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/modals/BadConnectionModal/BadConnectionModal.container.js b/src/modals/BadConnectionModal/BadConnectionModal.container.js index c3c8e79aa..906aa044f 100644 --- a/src/modals/BadConnectionModal/BadConnectionModal.container.js +++ b/src/modals/BadConnectionModal/BadConnectionModal.container.js @@ -10,7 +10,7 @@ const mapStateToProps = (state = {}) => ({ }) const mapDispatchToProps = dispatch => ({ - onClose: (visible) => dispatch(UIActions.changeUIModalState(UI_MODAL_KEYS.BAD_INTERNET_CONNECTION_MODAL, visible)), + onClose: () => dispatch(UIActions.changeUIModalState(UI_MODAL_KEYS.BAD_INTERNET_CONNECTION_MODAL, false)), }) export default connect(mapStateToProps, mapDispatchToProps)(BadConnectionModal) diff --git a/src/modals/NoConnectionActionModal/NoConnectionActionModal.js b/src/modals/NoConnectionActionModal/NoConnectionActionModal.js index c803532ae..147e9475b 100644 --- a/src/modals/NoConnectionActionModal/NoConnectionActionModal.js +++ b/src/modals/NoConnectionActionModal/NoConnectionActionModal.js @@ -7,14 +7,10 @@ import Modal from '../../ui/Modal' import './style.css' const NoConnectionActionModal = ({ - changeIsNoConnectionModalState, visible, + onClose, visible, }) => { const { t } = useTranslation() - const onClose = () => { - changeIsNoConnectionModalState(false) - } - return ( Date: Fri, 12 Jul 2024 15:34:11 +0300 Subject: [PATCH 4/5] add settings update failure message --- public/locales/en-US/translations.json | 1 + 1 file changed, 1 insertion(+) diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json index e07f89478..e5b4ea365 100644 --- a/public/locales/en-US/translations.json +++ b/public/locales/en-US/translations.json @@ -531,6 +531,7 @@ "requestedAlgoOrderNotRunningCannotStop": "Requested algo order not running, cannot stop", "favouriteTradingPairsSuccessfullySaved": "Favourite trading pairs successfully saved", "settingsSuccessfullyUpdated": "Settings successfully updated", + "settingsUpdateFailed": "Failed to update settings", "reconnectingWithNewDmsSetting": "Reconnecting with new DMS setting...", "connectingTo": "Connecting to {{target}}...", "connectedTo": "Connected to {{target}}", From 8fe8e70ed17e09907fac23b5b628e1f2ab553093 Mon Sep 17 00:00:00 2001 From: Dmytro Shcherbonos Date: Fri, 12 Jul 2024 16:05:45 +0300 Subject: [PATCH 5/5] BadConnectionModal: close modal if connection is resumed --- src/redux/actions/ui.js | 9 +++++---- src/redux/constants/ui.js | 2 +- src/redux/middleware/ws/on_close.js | 2 +- src/redux/middleware/ws/on_message.js | 4 ++-- src/redux/sagas/ui/index.js | 4 ++-- ...n_bad_connection.js => on_bad_internet_connection.js} | 8 ++++---- 6 files changed, 15 insertions(+), 14 deletions(-) rename src/redux/sagas/ui/{on_bad_connection.js => on_bad_internet_connection.js} (71%) diff --git a/src/redux/actions/ui.js b/src/redux/actions/ui.js index e3a2dd8f6..33e436532 100644 --- a/src/redux/actions/ui.js +++ b/src/redux/actions/ui.js @@ -180,9 +180,10 @@ export const setBacktestActiveSection = (section) => ({ payload: { section }, }) -export const handleBadConnectionAction = { - type: types.HANDLE_BAD_CONNECTION, -} +export const setBadInternetConnection = (isBadConnection) => ({ + type: types.SET_BAD_INTERNET_CONNECTION, + payload: { isBadConnection }, +}) export default { setUIValue, @@ -211,5 +212,5 @@ export default { logInformation, setBacktestActiveSection, setNotifications, - handleBadConnectionAction, + setBadInternetConnection, } diff --git a/src/redux/constants/ui.js b/src/redux/constants/ui.js index 7ad54e71c..49b19a32c 100644 --- a/src/redux/constants/ui.js +++ b/src/redux/constants/ui.js @@ -46,5 +46,5 @@ module.exports = { SET_BACKTEST_ACTIVE_SECTION: 'UI_SET_BACKTEST_ACTIVE_SECTION', - HANDLE_BAD_CONNECTION: 'UI_HANDLE_BAD_CONNECTION', + SET_BAD_INTERNET_CONNECTION: 'UI_SET_BAD_INTERNET_CONNECTION', } diff --git a/src/redux/middleware/ws/on_close.js b/src/redux/middleware/ws/on_close.js index 4374edbb2..a2474c215 100644 --- a/src/redux/middleware/ws/on_close.js +++ b/src/redux/middleware/ws/on_close.js @@ -14,7 +14,7 @@ export default (alias, store) => () => { // do not show in hosted mode since it re-attepmpts new connection // do not mark bad connection if user is still on login screen and ws onClose is triggered if (!_isNil(socket?.lastActivity) && isElectronApp && isLoggedIn) { - store.dispatch(UIActions.handleBadConnectionAction) + store.dispatch(UIActions.setBadInternetConnection(true)) } if (env === 'electron') { diff --git a/src/redux/middleware/ws/on_message.js b/src/redux/middleware/ws/on_message.js index e4a80897a..6913dadf1 100644 --- a/src/redux/middleware/ws/on_message.js +++ b/src/redux/middleware/ws/on_message.js @@ -324,11 +324,11 @@ export default (alias, store) => (e = {}) => { store.dispatch(WSActions.recvClientStatusUpdate({ status, mode })) if (status === WS_CONNECTION.CLOSED) { - store.dispatch(UIActions.handleBadConnectionAction) + store.dispatch(UIActions.setBadInternetConnection(true)) } if (status === WS_CONNECTION.OPENED) { - store.dispatch(UIActions.setUIValue(UI_KEYS.isBadInternetConnection, false)) + store.dispatch(UIActions.setBadInternetConnection(false)) } break diff --git a/src/redux/sagas/ui/index.js b/src/redux/sagas/ui/index.js index 67d16c48b..3f99675d9 100644 --- a/src/redux/sagas/ui/index.js +++ b/src/redux/sagas/ui/index.js @@ -14,7 +14,7 @@ import removeComponent from './on_remove_component' import createLayout from './on_create_layout' import deleteLayout from './on_delete_layout' import onLog from './on_log' -import onBadConnection from './on_bad_connection' +import onBadInternetConnection from './on_bad_internet_connection' import { isElectronApp } from '../../config' export default function* () { @@ -28,7 +28,7 @@ export default function* () { yield takeEvery(UITypes.REMOVE_COMPONENT, removeComponent) yield takeEvery(UITypes.CREATE_LAYOUT, createLayout) yield takeEvery(UITypes.DELETE_LAYOUT, deleteLayout) - yield takeEvery(UITypes.HANDLE_BAD_CONNECTION, onBadConnection) + yield takeEvery(UITypes.SET_BAD_INTERNET_CONNECTION, onBadInternetConnection) if (isElectronApp) { yield takeEvery(UITypes.DATA_NOTIFICATION, onShowNotification) diff --git a/src/redux/sagas/ui/on_bad_connection.js b/src/redux/sagas/ui/on_bad_internet_connection.js similarity index 71% rename from src/redux/sagas/ui/on_bad_connection.js rename to src/redux/sagas/ui/on_bad_internet_connection.js index e2d04c598..8a75f89f4 100644 --- a/src/redux/sagas/ui/on_bad_connection.js +++ b/src/redux/sagas/ui/on_bad_internet_connection.js @@ -4,13 +4,13 @@ import { UI_KEYS } from '../../constants/ui_keys' import { UI_MODAL_KEYS } from '../../constants/modals' import { getDMSSetting } from '../../selectors/ui' -function* onBadConnection() { - yield put(UIActions.setUIValue(UI_KEYS.isBadInternetConnection, true)) +function* onBadInternetConnection({ payload: { isBadConnection } }) { + yield put(UIActions.setUIValue(UI_KEYS.isBadInternetConnection, isBadConnection)) const dms = yield select(getDMSSetting) if (dms) { - yield put(UIActions.changeUIModalState(UI_MODAL_KEYS.BAD_INTERNET_CONNECTION_MODAL, true)) + yield put(UIActions.changeUIModalState(UI_MODAL_KEYS.BAD_INTERNET_CONNECTION_MODAL, isBadConnection)) } } -export default onBadConnection +export default onBadInternetConnection