Skip to content

Commit 451ad04

Browse files
[WEBREL] / Ameerul / WEBREL-2302 Integrate Verification and NicknameModal components (deriv-com#13249)
* feat: added verification + nickname modal flow * fix: route to buy-sell onCancel button in nickname modal * fix: check for p2p poa required * chore: added suggestion
1 parent e43ab85 commit 451ad04

File tree

10 files changed

+109
-59
lines changed

10 files changed

+109
-59
lines changed

packages/p2p-v2/src/components/AdvertiserName/AdvertiserName.tsx

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
2-
import { Loader, Text } from '@deriv-com/ui';
2+
import { useSettings } from '@deriv/api';
3+
import { Text } from '@deriv-com/ui';
34
import { useAdvertiserStats, useDevice } from '../../hooks';
45
import { UserAvatar } from '../UserAvatar';
56
import AdvertiserNameBadges from './AdvertiserNameBadges';
@@ -8,18 +9,21 @@ import AdvertiserNameToggle from './AdvertiserNameToggle';
89
import './AdvertiserName.scss';
910

1011
const AdvertiserName = () => {
11-
const { data: advertiserStats, isLoading } = useAdvertiserStats();
12+
const { data: advertiserStats } = useAdvertiserStats();
13+
const {
14+
data: { email },
15+
} = useSettings();
1216
const { isDesktop } = useDevice();
1317

14-
if (isLoading || !advertiserStats) return <Loader />;
18+
const name = advertiserStats?.name || email;
1519

1620
return (
1721
<div className='p2p-v2-advertiser-name'>
18-
<UserAvatar nickname={advertiserStats.name!} size={isDesktop ? 64 : 42} textSize='lg' />
22+
<UserAvatar nickname={name!} size={isDesktop ? 64 : 42} textSize='lg' />
1923
<div className='p2p-v2-advertiser-name__details'>
2024
<Text size='md' weight='bold'>
21-
{advertiserStats.name}{' '}
22-
{advertiserStats.show_name && (
25+
{name}{' '}
26+
{advertiserStats?.show_name && (
2327
<Text color='less-prominent' size='sm'>
2428
({advertiserStats.fullName})
2529
</Text>

packages/p2p-v2/src/components/AdvertiserName/AdvertiserNameBadges.tsx

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import React from 'react';
2-
import { Loader } from '@deriv-com/ui';
32
import { useAdvertiserStats } from '../../hooks';
43
import { Badge } from '../Badge';
54
import './AdvertiserNameBadges.scss';
@@ -11,11 +10,9 @@ import './AdvertiserNameBadges.scss';
1110
* Use cases are usually in My Profile page and Advertiser page used under the advertiser's name
1211
*/
1312
const AdvertiserNameBadges = () => {
14-
const { data: advertiserStats, isLoading } = useAdvertiserStats();
13+
const { data: advertiserStats } = useAdvertiserStats();
1514

16-
if (isLoading || !advertiserStats) return <Loader />;
17-
18-
const { isAddressVerified, isIdentityVerified, totalOrders } = advertiserStats;
15+
const { isAddressVerified, isIdentityVerified, totalOrders } = advertiserStats || {};
1916

2017
return (
2118
<div className='p2p-v2-advertiser-name-badges'>

packages/p2p-v2/src/components/AdvertiserName/AdvertiserNameStats.tsx

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { Loader, Text } from '@deriv-com/ui';
2+
import { Text } from '@deriv-com/ui';
33
import { useAdvertiserStats, useDevice } from '../../hooks';
44
import ThumbUpIcon from '../../public/ic-thumb-up.svg';
55
import BlockedUserOutlineIcon from '../../public/ic-user-blocked-outline.svg';
@@ -14,12 +14,11 @@ import './AdvertiserNameStats.scss';
1414
* Use cases are to show this in My Profile and Advertiser page
1515
*/
1616
const AdvertiserNameStats = () => {
17-
const { data: advertiserStats, isLoading } = useAdvertiserStats();
17+
const { data: advertiserStats } = useAdvertiserStats();
1818
const { isMobile } = useDevice();
1919

20-
if (isLoading || !advertiserStats) return <Loader />;
21-
22-
const { blocked_by_count, daysSinceJoined, rating_average, rating_count, recommended_average } = advertiserStats;
20+
const { blocked_by_count, daysSinceJoined, rating_average, rating_count, recommended_average } =
21+
advertiserStats || {};
2322

2423
return (
2524
<div className='p2p-v2-advertiser-name-stats'>
@@ -61,7 +60,7 @@ const AdvertiserNameStats = () => {
6160
<div>
6261
<BlockedUserOutlineIcon />
6362
<Text color='less-prominent' size='sm'>
64-
{blocked_by_count}
63+
{blocked_by_count || 0}
6564
</Text>
6665
</div>
6766
</div>

packages/p2p-v2/src/components/Modals/NicknameModal/NicknameModal.tsx

+29-14
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,18 @@ import Modal from 'react-modal';
55
import { p2p } from '@deriv/api';
66
import { Button, Text } from '@deriv-com/ui';
77
import { useDevice } from '../../../hooks';
8+
import { useSwitchTab } from '../../../hooks/useSwitchTab';
89
import P2PUserIcon from '../../../public/ic-cashier-p2p-user.svg';
910
import { Input } from '../../Input';
1011
import { customStyles } from '../helpers';
1112
import './NicknameModal.scss';
1213

13-
const NicknameModal = () => {
14+
type TNicknameModalProps = {
15+
isModalOpen: boolean | undefined;
16+
setIsModalOpen: React.Dispatch<React.SetStateAction<boolean | undefined>>;
17+
};
18+
19+
const NicknameModal = ({ isModalOpen, setIsModalOpen }: TNicknameModalProps) => {
1420
const ReactModal = Modal as ComponentType<ReactModal['props']>;
1521
const {
1622
control,
@@ -24,14 +30,14 @@ const NicknameModal = () => {
2430
mode: 'onChange',
2531
});
2632

27-
const { error, isError, mutate, reset } = p2p.advertiser.useCreate();
33+
const switchTab = useSwitchTab();
34+
const { error, isError, isSuccess, mutate, reset } = p2p.advertiser.useCreate();
2835
const { isMobile } = useDevice();
2936
const textSize = isMobile ? 'md' : 'sm';
3037
const debouncedReset = debounce(reset, 3000);
3138

3239
const onSubmit = () => {
3340
mutate({ name: getValues('nickname') });
34-
debouncedReset();
3541
};
3642

3743
const errorMessage = error?.error?.message || 'Can only contain letters, numbers, and special characters .-_@.';
@@ -42,16 +48,16 @@ const NicknameModal = () => {
4248
Modal.setAppElement('#v2_modal_root');
4349
}, []);
4450

51+
useEffect(() => {
52+
if (isSuccess) {
53+
setIsModalOpen(false);
54+
} else if (isError) {
55+
debouncedReset();
56+
}
57+
}, [isError, isSuccess]);
58+
4559
return (
46-
<ReactModal
47-
className='p2p-v2-nickname-modal'
48-
isOpen={true}
49-
onRequestClose={() => {
50-
// Implement return function here
51-
}}
52-
shouldCloseOnOverlayClick
53-
style={customStyles}
54-
>
60+
<ReactModal className='p2p-v2-nickname-modal' isOpen={!!isModalOpen} style={customStyles}>
5561
<form className='p2p-v2-nickname-modal__form' onSubmit={handleSubmit(onSubmit)}>
5662
<P2PUserIcon />
5763
<Text className='p2p-v2-nickname-modal__form-title' weight='bold'>
@@ -72,12 +78,21 @@ const NicknameModal = () => {
7278
Your nickname cannot be changed later.
7379
</Text>
7480
<div className='p2p-v2-nickname-modal__form__button-group'>
75-
<Button className='p2p-v2-nickname-modal__form__button-group__cancel' size='lg' variant='outlined'>
81+
<Button
82+
className='p2p-v2-nickname-modal__form__button-group__cancel'
83+
onClick={() => {
84+
switchTab('buy-sell');
85+
setIsModalOpen(false);
86+
}}
87+
size='lg'
88+
type='button'
89+
variant='outlined'
90+
>
7691
<Text size={textSize} weight='bold'>
7792
Cancel
7893
</Text>
7994
</Button>
80-
<Button disabled={watchNickname === '' || hasError} size='lg'>
95+
<Button disabled={watchNickname === '' || hasError} size='lg' type='submit'>
8196
<Text color='white' size={textSize} weight='bold'>
8297
Confirm
8398
</Text>

packages/p2p-v2/src/components/Verification/Verification.scss

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22
display: flex;
33
flex-direction: column;
44
align-items: center;
5-
padding-top: 6.8rem;
6-
width: 100%;
5+
margin-top: 4rem;
6+
width: 67.2rem;
77

88
@include mobile {
9+
margin-top: 2rem;
910
padding: 2.4rem;
11+
width: 100%;
1012
}
1113

1214
&__text {
1315
margin-bottom: 1.6rem;
1416
}
1517

1618
&__icon {
17-
height: 12.8rem;
18-
width: 12.8rem;
19+
margin-bottom: 3rem;
1920
}
2021
}

packages/p2p-v2/src/components/Verification/Verification.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,19 @@ const Verification = () => {
5656
{
5757
isDisabled: isPoiPending,
5858
onClick: () => {
59-
if (!isPoaVerified) redirectToVerification('/account/proof-of-identity');
59+
if (!isPoiVerified) redirectToVerification('/account/proof-of-identity');
6060
},
61-
status: isPoaVerified ? 'done' : 'action',
61+
status: isPoiVerified ? 'done' : 'action',
6262
text: getPoiAction(poiStatus),
6363
},
6464
...(isP2PPoaRequired
6565
? [
6666
{
6767
isDisabled: isPoaPending,
6868
onClick: () => {
69-
if (!isPoiVerified) redirectToVerification('/account/proof-of-address');
69+
if (!isPoaVerified) redirectToVerification('/account/proof-of-address');
7070
},
71-
status: isPoiVerified ? 'done' : 'action',
71+
status: isPoaVerified ? 'done' : 'action',
7272
text: getPoaAction(poaStatus),
7373
},
7474
]

packages/p2p-v2/src/pages/my-profile/screens/MyProfile/MyProfile.tsx

+24-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import React from 'react';
2-
import { Tab, Tabs } from '@deriv-com/ui';
3-
import { useDevice, useQueryString } from '../../../../hooks';
1+
import React, { useEffect, useState } from 'react';
2+
import { Loader, Tab, Tabs } from '@deriv-com/ui';
3+
import { NicknameModal } from '../../../../components/Modals/NicknameModal';
4+
import { Verification } from '../../../../components/Verification';
5+
import { useAdvertiserStats, useDevice, usePoiPoaStatus, useQueryString } from '../../../../hooks';
46
import { MyProfileAdDetails } from '../MyProfileAdDetails';
57
import { MyProfileContent } from '../MyProfileContent';
68
import { MyProfileCounterparties } from '../MyProfileCounterparties';
@@ -14,13 +16,31 @@ const TABS = ['Stats', 'Payment methods', 'Ad details', 'My counterparties'];
1416
const MyProfile = () => {
1517
const { isMobile } = useDevice();
1618
const { queryString, setQueryString } = useQueryString();
19+
const { data } = usePoiPoaStatus();
20+
const { data: advertiserStats, failureReason, isLoading } = useAdvertiserStats();
21+
const { isP2PPoaRequired, isPoaVerified, isPoiVerified } = data || {};
22+
const [isNicknameModalOpen, setIsNicknameModalOpen] = useState<boolean | undefined>(false);
1723

1824
const currentTab = queryString.get('tab');
1925

26+
useEffect(() => {
27+
const isPoaPoiVerified = (!isP2PPoaRequired || isPoaVerified) && isPoiVerified;
28+
if (isPoaPoiVerified && !!failureReason) setIsNicknameModalOpen(true);
29+
}, [failureReason, isP2PPoaRequired, isPoaVerified, isPoiVerified]);
30+
31+
if (isLoading && !advertiserStats) {
32+
return <Loader />;
33+
}
34+
35+
if (!isPoiVerified || !isPoaVerified) {
36+
return <Verification />;
37+
}
38+
2039
if (isMobile) {
2140
return (
2241
<div className='p2p-v2-my-profile'>
2342
<MyProfileMobile />
43+
<NicknameModal isModalOpen={isNicknameModalOpen} setIsModalOpen={setIsNicknameModalOpen} />
2444
</div>
2545
);
2646
}
@@ -51,6 +71,7 @@ const MyProfile = () => {
5171
<MyProfileCounterparties />
5272
</Tab>
5373
</Tabs>
74+
<NicknameModal isModalOpen={isNicknameModalOpen} setIsModalOpen={setIsNicknameModalOpen} />
5475
</div>
5576
);
5677
};

packages/p2p-v2/src/pages/my-profile/screens/MyProfileBalance/MyProfileBalance.scss

+7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
flex-direction: column;
1414
gap: 1rem;
1515

16+
@include mobile {
17+
gap: 0;
18+
}
19+
1620
& div {
1721
display: flex;
1822
align-items: center;
@@ -47,6 +51,8 @@
4751

4852
@include mobile {
4953
border-right: 1px solid #f2f3f7;
54+
gap: 1rem;
55+
5056
&:last-child {
5157
border-right: none;
5258
padding: 0 1.6rem;
@@ -60,6 +66,7 @@
6066
@include mobile {
6167
grid-template-columns: 1fr;
6268
grid-template-rows: 1fr 1fr;
69+
gap: 0.8rem;
6370
}
6471

6572
& div {

0 commit comments

Comments
 (0)