Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sergei / wall 272 / wallet desktop header #8334

Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
f7d0253
feat: create scratch of the header
sergei-deriv Apr 19, 2023
d39c6af
feat: add WalletsImage component
sergei-deriv Apr 19, 2023
c710fed
feat: add limiting types
sergei-deriv Apr 19, 2023
24acfc1
feat: trying to add size changing for SVG (not completed)
sergei-deriv Apr 20, 2023
4f430db
feat: add some icons
sergei-deriv Apr 20, 2023
7605b06
feat: optimise svgs
sergei-deriv Apr 20, 2023
faf60d4
feat: add buttons
sergei-deriv Apr 20, 2023
09901d1
feat: collapsed wallet header
sergei-deriv Apr 21, 2023
a71c3be
feat: commit to check in test link
sergei-deriv Apr 21, 2023
3032433
feat: add wallet bg with css
sergei-deriv Apr 21, 2023
8099741
feat: add check for dark mode
sergei-deriv Apr 21, 2023
97a807c
feat: change color for svg for light/dark themes
sergei-deriv Apr 21, 2023
8c18a2e
feat: add hover on buttons
sergei-deriv Apr 21, 2023
2eb4110
feat: add some check for demo wallet
sergei-deriv Apr 21, 2023
6af236a
feat: delete uploaded icons because these icons already exists
sergei-deriv Apr 26, 2023
d9070f4
feat: delete currency icons because its already exist
sergei-deriv Apr 26, 2023
5d48673
feat: add some svgs
sergei-deriv Apr 26, 2023
7e97347
feat: add demo color and mixin
sergei-deriv Apr 26, 2023
6abe031
Merge remote-tracking branch 'upstream/feature/wallets_with_traders_h…
sergei-deriv Apr 27, 2023
7c42f21
feat: create wallet-currency-card component
sergei-deriv Apr 27, 2023
a47e9b5
feat: divide component to some small components
sergei-deriv Apr 27, 2023
2ffedf1
feat: add status badge
sergei-deriv Apr 27, 2023
97a66b4
feat: repair background image for appstore
sergei-deriv Apr 28, 2023
c62ca2e
feat: add bg svg
sergei-deriv Apr 28, 2023
f24a763
feat: move background image
sergei-deriv Apr 28, 2023
a8ab781
feat: add disabled buttons
sergei-deriv Apr 28, 2023
25bdf4d
feat: delete unnecessary prop
sergei-deriv Apr 28, 2023
b39cf77
feat: delete comments
sergei-deriv Apr 28, 2023
ddd6063
feat: delete some comments
sergei-deriv Apr 28, 2023
6c100d1
feat: add some test cases
sergei-deriv Apr 29, 2023
951bf82
fix: fix one test
sergei-deriv Apr 29, 2023
19091ce
feat: change some types and add util function
sergei-deriv Apr 29, 2023
046fd81
refactor: delete comment
sergei-deriv Apr 29, 2023
4dcb497
refactor: delete comment
sergei-deriv Apr 29, 2023
e8ad016
feat: delete unnecessary icons
sergei-deriv Apr 29, 2023
f170a1b
feat: add some suggestions
sergei-deriv Apr 29, 2023
d29c931
refactor: delete comments
sergei-deriv Apr 29, 2023
12dc9b6
feat: add check for fiat
sergei-deriv Apr 29, 2023
efecdfe
feat: delete default values for component props
sergei-deriv Apr 29, 2023
9d4c467
feat: complete tests
sergei-deriv Apr 29, 2023
4b5dbdd
refactor: change var name
sergei-deriv Apr 29, 2023
7749512
feat: add 3 more tests
sergei-deriv Apr 29, 2023
8ab92a2
feat: add actions and button types
sergei-deriv Apr 30, 2023
f245fa0
fix: fix scss var color
sergei-deriv Apr 30, 2023
09d1ad4
feat: move wallet buttons creation function to utils
sergei-deriv Apr 30, 2023
db1c60a
refactor: delete curly braces
sergei-deriv May 2, 2023
1b0c45c
Merge branch 'feature/wallets_with_traders_hub' into sergei/wall-272/…
sergei-deriv May 3, 2023
4a81b4a
refactor: change import order
sergei-deriv May 3, 2023
74d1d4c
refactor: delete line which breaks eslint test
sergei-deriv May 3, 2023
8fff425
Merge remote-tracking branch 'upstream/feature/wallets_with_traders_h…
sergei-deriv May 3, 2023
b600f72
feat: use Badge component
sergei-deriv May 3, 2023
245b307
feat: add suggestions
sergei-deriv May 3, 2023
461dc7a
feat: change types and shortcode for some wallets
sergei-deriv May 10, 2023
95a873a
Merge branch 'feature/wallets_with_traders_hub' into sergei/wall-272/…
sergei-deriv May 10, 2023
a0869fd
Merge remote-tracking branch 'upstream/feature/wallets_with_traders_h…
sergei-deriv May 10, 2023
061f046
Merge branch 'sergei/wall-272/wallet-desktop-header' of github.com:se…
sergei-deriv May 10, 2023
f79b5ca
feat: make account_type prop as optional
sergei-deriv May 10, 2023
62439b2
feat: empty just to start deployment
sergei-deriv May 10, 2023
72e8d8c
feat: change bg color to gray
sergei-deriv May 10, 2023
b26e655
Merge branch 'feature/wallets_with_traders_hub' into sergei/wall-272/…
sergei-deriv May 11, 2023
5c350cd
Merge remote-tracking branch 'upstream/feature/wallets_with_traders_h…
sergei-deriv May 11, 2023
7b85b32
feat: build icons
sergei-deriv May 11, 2023
6007b52
feat: change getWalletCurrencyIcon and add some icons
sergei-deriv May 12, 2023
0f4dd84
feat: empty to restart vercel
sergei-deriv May 12, 2023
929e65a
feat: update getWalletCurrencyIcon function
sergei-deriv May 13, 2023
285e58e
feat: format balance money
sergei-deriv May 15, 2023
13328ef
fix: repair test
sergei-deriv May 15, 2023
abad18a
fix: move wallet-balance to the right side of the screen
sergei-deriv May 15, 2023
1a5a629
refactor: change opacity
sergei-deriv May 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import React from 'react';
import { render, screen } from '@testing-library/react';
import '@testing-library/jest-dom';
// import { isMobile } from '@deriv/shared';
import { useStore } from '@deriv/stores';
import WalletHeader from '..';

const mocked_root_store: DeepPartial<ReturnType<typeof useStore>> = {
ui: {
is_dark_mode_on: false,
},
};

jest.mock('@deriv/stores', () => ({
__esModule: true,
default: 'mockedDefaultExport',
observer: <T,>(Component: T) => Component,
useStore: () => mocked_root_store,
}));
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved

// jest.mock('@deriv/shared', () => ({
// ...jest.requireActual('@deriv/shared'),
// }));

// jest.mock('@deriv/components', () => {
// const original_module = jest.requireActual('@deriv/components');
// return {
// ...original_module,
// // Icon: jest.fn(() => <div>IcCross</div>),
// };
// });

// jest.mock('@deriv/shared', () => ({
// ...jest.requireActual('@deriv/shared'),
// // isMobile: jest.fn(() => false),
// }));

describe('<WalletHeader />', () => {
describe('Demo wallet', () => {
it('Should render right currency card', () => {
const account_type = 'demo';
const currency = 'USD';
const dt_currency = account_type === 'demo' ? 'demo' : currency.toLowerCase();
render(<WalletHeader account_type={account_type} />);
const currency_card = screen.queryByTestId(`dt_${dt_currency}`);
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved

expect(currency_card).toBeInTheDocument();
});

// it('Should render image properly for desktop', () => {
// isMobile.mockReturnValue(false);
// render(<WalletsBannerUpgrade />);
// const desktop_image = screen.queryByTestId(desktop);
// const mobile_image = screen.queryByTestId(mobile);

// expect(desktop_image).toBeInTheDocument();
// expect(mobile_image).not.toBeInTheDocument();
// });

// it('Should render image properly for mobile', () => {
// isMobile.mockReturnValue(true);
// render(<WalletsBannerUpgrade />);
// const desktop_image = screen.queryByTestId(desktop);
// const mobile_image = screen.queryByTestId(mobile);

// expect(mobile_image).toBeInTheDocument();
// expect(desktop_image).not.toBeInTheDocument();
// });
});
});
4 changes: 4 additions & 0 deletions packages/appstore/src/components/wallet-header/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import WalletHeader from './wallet-header';
import './wallet-header.scss';
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved

export default WalletHeader;
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import React from 'react';
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved
import { Icon } from '@deriv/components';
import { observer, useStore } from '@deriv/stores';

type TWalletCurrencyCard = {
account_type: 'demo' | 'real';
currency: 'USD' | 'EUR' | 'AUD' | 'BTC' | 'ETH' | 'USDT' | 'eUSDT' | 'tUSDT' | 'LTC' | 'USDC';
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved
};

const WalletCurrencyCard = observer(({ account_type = 'real', currency = 'USD' }: TWalletCurrencyCard) => {
const {
ui: { is_dark_mode_on },
} = useStore();

const is_demo = account_type === 'demo';
const theme = is_dark_mode_on ? '--dark' : '';
const demo_icon_path = is_dark_mode_on ? 'IcWalletDerivDemoDark' : 'IcWalletDerivDemoLight';
const class_currency = is_demo ? 'demo' : currency.toLowerCase();

const currency_icon_path = React.useMemo(
() => ({
USD: is_demo ? demo_icon_path : 'IcCurrencyUsd',
EUR: 'IcCurrencyEur',
AUD: 'IcCurrencyAud',
BTC: is_dark_mode_on ? 'IcCashierBitcoinDark' : 'IcCashierBitcoinLight',
ETH: is_dark_mode_on ? 'IcWalletEtheriumDark' : 'IcWalletEtheriumLight',
USDT: is_dark_mode_on ? 'IcWalletTetherDark' : 'IcWalletTetherLight',
eUSDT: is_dark_mode_on ? 'IcWalletTetherDark' : 'IcWalletTetherLight',
tUSDT: is_dark_mode_on ? 'IcWalletTetherDark' : 'IcWalletTetherLight',
LTC: is_dark_mode_on ? 'IcWalletLitecoinDark' : 'IcWalletLitecoinLight',
USDC: is_dark_mode_on ? 'IcWalletUsdcDark' : 'IcWalletUsdcLight',
}),
[demo_icon_path, is_dark_mode_on, is_demo]
);

const is_fiat = currency === 'USD' || currency === 'EUR' || currency === 'AUD';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sergei-deriv could you check, maybe we can use current_currency_type from client store?
const is_fiat = current_currency_type === 'fiat'

Copy link
Contributor Author

@sergei-deriv sergei-deriv Apr 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@heorhi-deriv current_currency_type is for current account, but one account can has many wallets and I have to check wallet currency. I tried to check currency type from client store (website_status.currencies_config) like this: const is_fiat = !isCryptocurrency(currency)
but there is no USDT currency from BE, just UST and in result I have case when USDT is fiat. At this moment I decided to add check for 'USDT' too

const currency_icon_name = currency_icon_path[currency] || 'Unknown';
const currency_icon_size = is_fiat && !is_demo ? 48 : 100;
return (
<div
className={`wallet-header__currency wallet__${class_currency}-bg${theme}`}
data-testid={`dt_${class_currency}`}
>
<Icon icon={currency_icon_name} size={currency_icon_size} />
</div>
);
});
WalletCurrencyCard.displayName = 'WalletCurrencyCard';
export default WalletCurrencyCard;
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import React from 'react';
import { Text, StatusBadge } from '@deriv/components';
import { Localize } from '@deriv/translations';
import { getStatusBadgeConfig } from '@deriv/account';
import { TAccountStatus } from './wallet-header';

type TWalletHeaderBalance = {
account_status: TAccountStatus;
balance: string;
currency: 'USD' | 'EUR' | 'AUD' | 'BTC' | 'ETH' | 'USDT' | 'eUSDT' | 'tUSDT' | 'LTC' | 'USDC';
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved
};

const WalletHeaderBalance = React.memo(
({ account_status = '', balance = '0.00', currency = 'USD' }: TWalletHeaderBalance) => {
const balance_title_size = 'xxs';
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved
const balance_amount_size = 'm';

const balance_title_text = '<0>Wallet balance</0>';
const balance_amount_text = `<0>${balance} ${currency}</0>`;

// TODO: just for test use blank function and empty object. When BE will be ready change it!!!
// eslint-disable-next-line @typescript-eslint/no-empty-function
const { text: badge_text, icon: badge_icon } = getStatusBadgeConfig(account_status, () => {}, {});

return (
<div className='wallet-header__balance-title-amount'>
{account_status ? (
<StatusBadge account_status={account_status} icon={badge_icon} text={badge_text} />
) : (
<React.Fragment>
<Localize
i18n_default_text={balance_title_text}
components={[<Text key={0} color='less-prominent' size={balance_title_size} />]}
/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sergei-deriv although this is a working variant to render the text:

<Localize
                            i18n_default_text={balance_title_text}
                            components={[<Text key={0} color='less-prominent' size={balance_title_size} />]}
                        />

I suggest you to use the next variant:

 <Text
                    size='xxs'
                    color='less-prominent' 
                >
                    {localize('Wallet balance')}
                </Text>

for me it has few benefits:

  • readability
  • if you are not using any interpolation in text you can use localize function from @deriv/translations
  • and i recommend you not hide size in separate variable at least in this case

<Localize
i18n_default_text={balance_amount_text}
components={[<Text key={0} weight='bold' size={balance_amount_size} />]}
/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sergei-deriv same thing

</React.Fragment>
)}
</div>
);
}
);
WalletHeaderBalance.displayName = 'WalletHeaderBalance';
export default WalletHeaderBalance;
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import React from 'react';
import { Icon, Text } from '@deriv/components';
import { Localize } from '@deriv/translations';
import classNames from 'classnames';

type TWalletHeaderButtons = {
is_disabled?: boolean;
is_open: boolean;
account_type: 'demo' | 'real';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sergei-deriv can use type from packages/appstore/src/types/common.types.ts

};

const WalletHeaderButtons = ({ is_disabled = false, is_open, account_type = 'real' }: TWalletHeaderButtons) => {
const is_demo = account_type === 'demo';
const button_text_size = 'xs';

const btn_names = is_demo
? ['Transfer', 'Transactions', 'Deposit']
: ['Deposit', 'Withdraw', 'Transfer', 'Transactions'];
const icon_names = is_demo
? ['IcAccountTransfer', 'IcStatement', 'IcCashierAdd']
: ['IcCashierAdd', 'IcCashierMinus', 'IcAccountTransfer', 'IcStatement'];

return (
<div className='wallet-header__description-buttons'>
{btn_names.map((name, index) => (
<div key={name} className='wallet-header__description-buttons-item'>
<Icon icon={icon_names[index]} custom_color={'var(--text-general)'} />
<Localize
i18n_default_text={`<0>${is_demo && name === 'Deposit' ? 'Reset balance' : name}</0>`}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hey @sergei-deriv using variables in Localize is not allowed. please check this link (https://deriv-group.slack.com/archives/C3AHMSM3P/p1677553396124379)
again i recommend you to use
<Text>{localize(string)}</Text>
pattern or
<Text> <Localize i18n_default_text='string' /> </Text>

components={[
<Text
key={0}
weight='bold'
size={button_text_size}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sergei-deriv size='xs'

className={classNames('wallet-header__description-buttons-item-text', {
'wallet-header__description-buttons-item-active': is_open,
})}
/>,
]}
/>
</div>
))}
</div>
);
};
WalletHeaderButtons.displayName = 'WalletHeaderButtons';
export default WalletHeaderButtons;
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import React from 'react';
import { Text } from '@deriv/components';
import { Localize } from '@deriv/translations';

type TWalletHeaderTitle = {
is_demo: boolean;
currency: 'USD' | 'EUR' | 'AUD' | 'BTC' | 'ETH' | 'USDT' | 'eUSDT' | 'tUSDT' | 'LTC' | 'USDC';
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved
jurisdiction: 'svg' | 'malta';
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved
};

const WalletHeaderTitle = React.memo(({ is_demo, currency, jurisdiction }: TWalletHeaderTitle) => {
const title_size = 'sm';
const badge_size = 'xxxs';
const badge_lh_size = 'xxxs';
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved

const title_text = `<0>${is_demo ? `Demo ${currency}` : currency} Wallet</0>`;
sergei-deriv marked this conversation as resolved.
Show resolved Hide resolved
const badge_text = `<0>${jurisdiction.toUpperCase()}</0>`;

return (
<div className='wallet-header__description-title'>
<Localize i18n_default_text={title_text} components={[<Text key={0} weight='bold' size={title_size} />]} />
{!is_demo && (
<Localize
i18n_default_text={badge_text}
components={[
<Text
key={0}
weight='bold'
size={badge_size}
line_height={badge_lh_size}
className='wallet-header__description-badge'
/>,
]}
/>
)}
</div>
);
});
WalletHeaderTitle.displayName = 'WalletHeaderTitle';
export default WalletHeaderTitle;
102 changes: 102 additions & 0 deletions packages/appstore/src/components/wallet-header/wallet-header.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
.wallet-header {
margin: 2.4rem 0;
padding: 2.4rem;
background-color: var(--general-main-1);
border-radius: $BORDER_RADIUS * 4;
height: 12.8rem;

&__demo {
background-color: #fff8f9;
background-image: url('./../../../src/public/ic-wallet-deriv-demo-dark.svg');
// background-image: url('./../../../../components/src/components/icon/wallet/ic-wallet-deriv-demo-dark.svg');

// /Users/sergeibaranovski/Documents/Projects/deriv-app/packages/components/src/components/icon/wallet/ic-wallet-deriv-demo-dark.svg

// background-image: url('./../../../../appstore/src/assets/svgs/trading-platform/ic-appstore-cfds.svg');
// background-image: url('./../public/sprites/wallet.905c3e8ec16af3c9f44930eae8ad2943.svg#ic-wallet-deriv-demo-dark');
}

&__container {
display: flex;
height: 8rem;
}

&__currency {
display: flex;
justify-content: center;
align-items: center;
width: 12.8rem;
margin-right: 2.4rem;
border-radius: $BORDER_RADIUS * 2;
}

&__description {
display: flex;
flex-direction: column;
justify-content: space-between;
padding-block: 0.5rem;

&-title {
display: flex;
align-items: center;
}

&-badge {
border: 1px solid var(--text-general);
padding-inline: 0.4rem;
margin-left: 0.8rem;
}

&-buttons {
display: flex;

&-item {
display: flex;
align-items: center;
// cursor: pointer;
height: 3.2rem;
border-radius: $BORDER_RADIUS * 4;
padding: 0.6rem 1.6rem;
margin-right: 0.8rem;
border: 1px solid var(--text-general);
background-color: var(--general-main-1);

&:hover {
background-color: var(--shadow-drop);
}

&-text {
display: none;
margin-left: 0.8rem;
}

&-active {
display: block;
}
}
}
}

&__balance {
display: flex;
align-self: center;
padding-block: 1.3rem;
margin-left: auto;

&-title-amount {
display: flex;
flex-direction: column;
padding-inline: 2.4rem;
}

&-arrow-icon {
cursor: pointer;
transition: transform 0.3s ease;
transform: rotate(0deg);
align-self: center;
}
&-arrow-icon-active {
transform: rotate(180deg);
}
}
}
Loading