diff --git a/packages/p2p/src/components/advertiser-page/advertiser-page.jsx b/packages/p2p/src/components/advertiser-page/advertiser-page.jsx index adfb70058426..2ffac3add786 100644 --- a/packages/p2p/src/components/advertiser-page/advertiser-page.jsx +++ b/packages/p2p/src/components/advertiser-page/advertiser-page.jsx @@ -6,6 +6,7 @@ import { observer } from 'mobx-react-lite'; import { useStores } from 'Stores'; import { Localize, localize } from 'Components/i18next'; import { my_profile_tabs } from 'Constants/my-profile-tabs'; +import { api_error_codes } from 'Constants/api-error-codes'; import PageReturn from 'Components/page-return/page-return.jsx'; import RecommendedBy from 'Components/recommended-by'; import UserAvatar from 'Components/user/user-avatar/user-avatar.jsx'; @@ -21,7 +22,7 @@ import { useModalManagerContext } from 'Components/modal-manager/modal-manager-c import './advertiser-page.scss'; const AdvertiserPage = () => { - const { general_store, advertiser_page_store, buy_sell_store, my_profile_store } = useStores(); + const { advertiser_page_store, buy_sell_store, general_store, my_profile_store } = useStores(); const { hideModal, showModal, useRegisterModalProps } = useModalManagerContext(); const is_my_advert = advertiser_page_store.advertiser_details_id === general_store.advertiser_id; @@ -57,12 +58,23 @@ const AdvertiserPage = () => { () => [advertiser_page_store.active_index, general_store.block_unblock_user_error], () => { advertiser_page_store.onTabChange(); - if (general_store.block_unblock_user_error) { + if (general_store.block_unblock_user_error && buy_sell_store.show_advertiser_page) { showModal({ key: 'ErrorModal', props: { - error_message: general_store.block_unblock_user_error, - error_modal_title: 'Unable to block advertiser', + error_message: + general_store.error_code === api_error_codes.INVALID_ADVERTISER_ID + ? localize("Blocking wasn't possible as {{name}} is not using Deriv P2P anymore.", { + name: advertiser_page_store.advertiser_details_name, + }) + : general_store.block_unblock_user_error, + error_modal_button_text: localize('Got it'), + error_modal_title: + general_store.error_code === api_error_codes.INVALID_ADVERTISER_ID + ? localize('{{name}} is no longer on Deriv P2P', { + name: advertiser_page_store.advertiser_details_name, + }) + : localize('Unable to block advertiser'), has_close_icon: false, onClose: () => { buy_sell_store.hideAdvertiserPage(); diff --git a/packages/p2p/src/components/modal-manager/modals/error-modal/error-modal.jsx b/packages/p2p/src/components/modal-manager/modals/error-modal/error-modal.jsx index 575d422ffc27..b3a2ef3d2bf4 100644 --- a/packages/p2p/src/components/modal-manager/modals/error-modal/error-modal.jsx +++ b/packages/p2p/src/components/modal-manager/modals/error-modal/error-modal.jsx @@ -5,7 +5,14 @@ import { Button, Modal } from '@deriv/components'; import { Localize } from 'Components/i18next'; import { useModalManagerContext } from 'Components/modal-manager/modal-manager-context'; -const ErrorModal = ({ error_message, error_modal_title, has_close_icon, onClose, width }) => { +const ErrorModal = ({ + error_message, + error_modal_button_text = 'Ok', + error_modal_title, + has_close_icon, + onClose, + width, +}) => { const { hideModal, is_modal_open } = useModalManagerContext(); return ( @@ -19,7 +26,7 @@ const ErrorModal = ({ error_message, error_modal_title, has_close_icon, onClose, {error_message} @@ -28,6 +35,7 @@ const ErrorModal = ({ error_message, error_modal_title, has_close_icon, onClose, ErrorModal.propTypes = { error_message: PropTypes.string, + error_modal_button_text: PropTypes.string, error_modal_title: PropTypes.string, has_close_icon: PropTypes.bool, onClose: PropTypes.func, diff --git a/packages/p2p/src/components/my-profile/block-user/block-user.jsx b/packages/p2p/src/components/my-profile/block-user/block-user.jsx index 3bf7aae5da26..a02f3d93c3e8 100644 --- a/packages/p2p/src/components/my-profile/block-user/block-user.jsx +++ b/packages/p2p/src/components/my-profile/block-user/block-user.jsx @@ -1,7 +1,10 @@ import React from 'react'; +import { reaction } from 'mobx'; import { observer } from 'mobx-react-lite'; import { useStores } from 'Stores'; import { DesktopWrapper, MobileFullPageModal, MobileWrapper } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; +import { api_error_codes } from 'Constants/api-error-codes'; import { my_profile_tabs } from 'Constants/my-profile-tabs'; import { localize } from 'Components/i18next'; import { useModalManagerContext } from 'Components/modal-manager/modal-manager-context'; @@ -10,8 +13,47 @@ import BlockUserFilterModal from './block-user-filter-modal'; import './block-user.scss'; const BlockUser = () => { - const { my_profile_store } = useStores(); - const { hideModal, useRegisterModalProps } = useModalManagerContext(); + const { general_store, buy_sell_store, my_profile_store } = useStores(); + const { hideModal, showModal, useRegisterModalProps } = useModalManagerContext(); + + reaction( + () => general_store.block_unblock_user_error, + () => { + if ( + general_store.block_unblock_user_error && + general_store.active_index === 3 && + !buy_sell_store.show_advertiser_page + ) { + showModal({ + key: 'ErrorModal', + props: { + error_message: + general_store.error_code === api_error_codes.INVALID_ADVERTISER_ID + ? localize("Blocking wasn't possible as {{name}} is not using Deriv P2P anymore.", { + name: my_profile_store.selected_trade_partner.name, + }) + : general_store.block_unblock_user_error, + error_modal_button_text: localize('Got it'), + error_modal_title: + general_store.error_code === api_error_codes.INVALID_ADVERTISER_ID + ? localize('{{name}} is no longer on Deriv P2P', { + name: my_profile_store.selected_trade_partner.name, + }) + : localize('Unable to block advertiser'), + + has_close_icon: false, + onClose: () => { + general_store.setBlockUnblockUserError(''); + hideModal(); + }, + width: isMobile() ? '90rem' : '40rem', + }, + }); + general_store.setBlockUnblockUserError(null); + } + }, + { fireImmediately: true } + ); useRegisterModalProps({ key: 'BlockUserModal', diff --git a/packages/p2p/src/constants/api-error-codes.js b/packages/p2p/src/constants/api-error-codes.js index 1ce48e565c79..059dcb84b654 100644 --- a/packages/p2p/src/constants/api-error-codes.js +++ b/packages/p2p/src/constants/api-error-codes.js @@ -4,6 +4,7 @@ export const api_error_codes = Object.freeze({ DUPLICATE_ADVERT: 'DuplicateAdvert', EXCESSIVE_VERIFICATION_FAILURES: 'ExcessiveVerificationFailures', EXCESSIVE_VERIFICATION_REQUESTS: 'ExcessiveVerificationRequests', + INVALID_ADVERTISER_ID: 'InvalidAdvertiserID', INVALID_VERIFICATION_TOKEN: 'InvalidVerificationToken', ORDER_EMAIL_VERIFICATION_REQUIRED: 'OrderEmailVerificationRequired', ORDER_CREATE_FAIL_CLIENT_BALANCE: 'OrderCreateFailClientBalance', diff --git a/packages/p2p/src/stores/general-store.js b/packages/p2p/src/stores/general-store.js index 2f275e2986ca..2c843954b7b1 100644 --- a/packages/p2p/src/stores/general-store.js +++ b/packages/p2p/src/stores/general-store.js @@ -8,7 +8,7 @@ import { createExtendedOrderDetails } from 'Utils/orders'; import { init as WebsocketInit, requestWS, subscribeWS } from 'Utils/websocket'; import { order_list } from 'Constants/order-list'; import { buy_sell } from 'Constants/buy-sell'; -import { api_error_codes } from '../constants/api-error-codes'; +import { api_error_codes } from 'Constants/api-error-codes'; export default class GeneralStore extends BaseStore { active_index = 0; @@ -22,6 +22,7 @@ export default class GeneralStore extends BaseStore { balance; cancels_remaining = null; contact_info = ''; + error_code = ''; feature_level = null; formik_ref = null; inactive_notification_count = 0; @@ -77,6 +78,7 @@ export default class GeneralStore extends BaseStore { balance: observable, feature_level: observable, formik_ref: observable, + error_code: observable, inactive_notification_count: observable, is_advertiser: observable, is_advertiser_blocked: observable, @@ -133,6 +135,7 @@ export default class GeneralStore extends BaseStore { setAdvertiserSellLimit: action.bound, setAppProps: action.bound, setAdvertiserRelationsResponse: action.bound, //TODO: Remove this when backend has fixed is_blocked flag issue + setErrorCode: action.bound, setFeatureLevel: action.bound, setFormikRef: action.bound, setSavedFormState: action.bound, @@ -230,7 +233,10 @@ export default class GeneralStore extends BaseStore { ); } } else { - this.setBlockUnblockUserError(response.error.message); + const { code, message } = response.error; + this.setErrorCode(code); + this.setBlockUnblockUserError(message); + if (!general_store.is_barred && !general_store.isCurrentModal('ErrorModal')) { general_store.showModal({ key: 'ErrorModal', @@ -635,6 +641,10 @@ export default class GeneralStore extends BaseStore { this.default_advert_description = default_advert_description; } + setErrorCode(error_code) { + this.error_code = error_code; + } + setFeatureLevel(feature_level) { this.feature_level = feature_level; } diff --git a/packages/p2p/src/stores/my-profile-store.js b/packages/p2p/src/stores/my-profile-store.js index c26db5360e8b..13d25e0e90c4 100644 --- a/packages/p2p/src/stores/my-profile-store.js +++ b/packages/p2p/src/stores/my-profile-store.js @@ -470,7 +470,8 @@ export default class MyProfileStore extends BaseStore { key: 'ErrorModal', props: { error_message: response.error.message, - error_modal_title: 'Unable to block advertiser', + error_modal_button_text: localize('Got it'), + error_modal_title: 'Permission Denied', has_close_icon: false, width: isMobile() ? '90rem' : '40rem', },