diff --git a/packages/p2p/src/components/advertiser-page/advertiser-page.jsx b/packages/p2p/src/components/advertiser-page/advertiser-page.jsx index adfb70058426..9364c1a7e663 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; @@ -48,6 +49,15 @@ const AdvertiserPage = () => { // rating_average_decimal converts rating_average to 1 d.p number const rating_average_decimal = rating_average ? Number(rating_average).toFixed(1) : null; const joined_since = daysSince(created_time); + const error_message = () => { + return !!advertiser_page_store.is_counterparty_advertiser_blocked && !is_my_advert + ? localize("Unblocking wasn't possible as {{name}} is not using Deriv P2P anymore.", { + name: advertiser_page_store.advertiser_details_name, + }) + : localize("Blocking wasn't possible as {{name}} is not using Deriv P2P anymore.", { + name: advertiser_page_store.advertiser_details_name, + }); + }; React.useEffect(() => { advertiser_page_store.onMount(); @@ -57,12 +67,21 @@ 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 + ? error_message() + : 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-list/block-user-list.jsx b/packages/p2p/src/components/my-profile/block-user/block-user-list/block-user-list.jsx index 0683733906b4..2ed788798b4b 100644 --- a/packages/p2p/src/components/my-profile/block-user/block-user-list/block-user-list.jsx +++ b/packages/p2p/src/components/my-profile/block-user/block-user-list/block-user-list.jsx @@ -8,6 +8,7 @@ import BlockUserTable from '../block-user-table'; import BlockUserTableError from '../block-user-table/block-user-table-error'; import debounce from 'lodash.debounce'; import { localize } from 'Components/i18next'; +import { api_error_codes } from 'Constants/api-error-codes'; import './block-user-list.scss'; const BlockUserList = observer(() => { @@ -26,7 +27,11 @@ const BlockUserList = observer(() => { } }; - if (general_store.is_barred && general_store.block_unblock_user_error) { + if ( + (general_store?.error_code === api_error_codes.TEMPORARY_BAR || + general_store?.error_code === api_error_codes.PERMISSION_DENIED) && + general_store.block_unblock_user_error + ) { return ; } 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 71037a43b25e..30733c3c2098 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,56 @@ 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(); + const error_message = () => { + return my_profile_store.selected_trade_partner.is_blocked + ? localize("Unblocking wasn't possible as {{name}} is not using Deriv P2P anymore.", { + name: my_profile_store.selected_trade_partner.name, + }) + : localize("Blocking wasn't possible as {{name}} is not using Deriv P2P anymore.", { + name: my_profile_store.selected_trade_partner.name, + }); + }; + + 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 && + general_store?.error_code !== api_error_codes.TEMPORARY_BAR && + general_store?.error_code !== api_error_codes.PERMISSION_DENIED + ) { + showModal({ + key: 'ErrorModal', + props: { + error_message: + general_store.error_code === api_error_codes.INVALID_ADVERTISER_ID + ? error_message() + : 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 37560c743416..9172f620eedd 100644 --- a/packages/p2p/src/constants/api-error-codes.js +++ b/packages/p2p/src/constants/api-error-codes.js @@ -4,12 +4,14 @@ 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', ORDER_CREATE_FAIL_RATE_CHANGED: 'OrderCreateFailRateChanged', PERMISSION_DENIED: 'PermissionDenied', RESTRICTED_COUNTRY: 'RestrictedCountry', + TEMPORARY_BAR: 'TemporaryBar', AD_EXCEEDS_DAILY_LIMIT: 'advertiser_daily_limit', AD_EXCEEDS_BALANCE: 'advertiser_balance', }); diff --git a/packages/p2p/src/stores/general-store.js b/packages/p2p/src/stores/general-store.js index 75c6d10acab6..8bc3976727cf 100644 --- a/packages/p2p/src/stores/general-store.js +++ b/packages/p2p/src/stores/general-store.js @@ -23,6 +23,7 @@ export default class GeneralStore extends BaseStore { balance; cancels_remaining = null; contact_info = ''; + error_code = ''; external_stores = {}; feature_level = null; formik_ref = null; @@ -86,6 +87,7 @@ export default class GeneralStore extends BaseStore { external_stores: observable, feature_level: observable, formik_ref: observable, + error_code: observable, inactive_notification_count: observable, is_advertiser: observable, is_advertiser_blocked: observable, @@ -134,6 +136,9 @@ export default class GeneralStore extends BaseStore { setAdvertiserId: action.bound, setAdvertiserBuyLimit: action.bound, setAdvertiserSellLimit: action.bound, + setAppProps: action.bound, + setAdvertiserRelationsResponse: action.bound, //TODO: Remove this when backend has fixed is_blocked flag issue + setErrorCode: action.bound, setExternalStores: action.bound, setFeatureLevel: action.bound, setFormikRef: action.bound, @@ -196,7 +201,7 @@ export default class GeneralStore extends BaseStore { } blockUnblockUser(should_block, advertiser_id, should_set_is_counterparty_blocked = true) { - const { advertiser_page_store, general_store } = this.root_store; + const { advertiser_page_store } = this.root_store; this.setIsBlockUnblockUserLoading(true); requestWS({ p2p_advertiser_relations: 1, @@ -204,7 +209,7 @@ export default class GeneralStore extends BaseStore { }).then(response => { if (response) { if (!response.error) { - general_store.hideModal(); + this.hideModal(); if (should_set_is_counterparty_blocked) { const { p2p_advertiser_relations } = response; @@ -216,18 +221,9 @@ export default class GeneralStore extends BaseStore { ); } } else { - this.setBlockUnblockUserError(response.error.message); - if (!general_store.is_barred && !general_store.isCurrentModal('ErrorModal')) { - general_store.showModal({ - key: 'ErrorModal', - props: { - error_message: response.error.message, - error_modal_title: 'Unable to block advertiser', - has_close_icon: false, - width: isMobile() ? '90rem' : '40rem', - }, - }); - } + const { code, message } = response.error; + this.setErrorCode(code); + this.setBlockUnblockUserError(message); } } this.setIsBlockUnblockUserLoading(false); @@ -632,6 +628,10 @@ export default class GeneralStore extends BaseStore { this.default_advert_description = default_advert_description; } + setErrorCode(error_code) { + this.error_code = error_code; + } + setExternalStores(external_stores) { this.external_stores = external_stores; } @@ -865,10 +865,13 @@ export default class GeneralStore extends BaseStore { requestWS({ get_account_status: 1 }).then(account_response => { if (!account_response.error) { const { get_account_status } = account_response; - const { authentication } = get_account_status; + const { authentication, status } = get_account_status; const { identity } = authentication; - this.setPoiStatus(identity.status); + if (status.includes('cashier_locked')) { + this.setIsBlocked(true); + this.hideModal(); + } else this.setPoiStatus(identity.status); } }); } diff --git a/packages/p2p/src/stores/my-profile-store.js b/packages/p2p/src/stores/my-profile-store.js index f1f2339d02f6..f8b012625237 100644 --- a/packages/p2p/src/stores/my-profile-store.js +++ b/packages/p2p/src/stores/my-profile-store.js @@ -519,7 +519,10 @@ export default class MyProfileStore extends BaseStore { this.setTradePartnersList(partners_list); } } else { - general_store.setBlockUnblockUserError(response.error.message); + const { code, message } = response.error; + + general_store.setErrorCode(code); + general_store.setBlockUnblockUserError(message); } } this.setIsBlockUserTableLoading(false);