Skip to content
This repository was archived by the owner on May 13, 2024. It is now read-only.

Commit b1513a2

Browse files
authored
Merge pull request #226 from hubert-deriv/subscription_history
2 parents 1b69e1f + 5fd8954 commit b1513a2

File tree

42 files changed

+695
-18994
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+695
-18994
lines changed

package-lock.json

Lines changed: 0 additions & 18815 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
"react-dom": "^17.0.2",
4646
"react-hook-form": "^7.41.5",
4747
"react-json-view": "^1.21.3",
48-
"react-loader-spinner": "^5.3.4",
4948
"react-table": "^7.8.0",
5049
"sass": "^1.57.1",
5150
"sass-loader": "^13.2.0",

src/components/AccountSwitcher/__tests__/AccountSwitcher.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import React from 'react';
22
import { cleanup, render, screen } from '@site/src/test-utils';
33
import userEvent from '@testing-library/user-event';
44
import AccountSwitcher from '..';
5+
import AuthProvider from '@site/src/contexts/auth/auth.provider';
56
import useLogout from '@site/src/hooks/useLogout';
67
import useAuthContext from '@site/src/hooks/useAuthContext';
78
import { IAuthContext } from '@site/src/contexts/auth/auth.context';
8-
import AuthProvider from '@site/src/contexts/auth/auth.provider';
99
import { IUserLoginAccount } from '@site/src/contexts/auth/auth.context';
1010

1111
jest.mock('@site/src/hooks/useAuthContext');

src/components/AccountSwitcher/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useState, useRef } from 'react';
22
import { isNotDemoCurrency } from '@site/src/utils';
33
import useLogout from '@site/src/hooks/useLogout';
44
import useAuthContext from '@site/src/hooks/useAuthContext';
5-
import useClickOutsideDropdown from '@site/src/hooks/useClickOutsideDropdown';
5+
import useOnClickOutside from '@site/src/hooks/useOnClickOutside';
66
import CurrencyIcon from '../CurrencyIcon';
77
import SelectedAccount from '../CustomSelectDropdown/account-dropdown/SelectedAccount';
88
import AccountDropdown from '../CustomSelectDropdown/account-dropdown/AccountDropdown';
@@ -20,7 +20,7 @@ const AccountSwitcher = () => {
2020
const is_demo = currentLoginAccount.name.includes('VRTC') ? styles.demo : '';
2121

2222
const dropdownRef = useRef(null);
23-
useClickOutsideDropdown(dropdownRef, setToggleDropdown, false);
23+
useOnClickOutside(dropdownRef, () => setToggleDropdown(false));
2424

2525
return (
2626
<div

src/components/ApiTokenNavbarItem/__tests__/ApiTokenNavbarItem.test.tsx

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,51 @@ describe('Api Token Navbar Item', () => {
4848
expect(renderResult.container).toBeEmptyDOMElement();
4949
});
5050

51+
it('Should close the token dropdown when clicking outside of it', async () => {
52+
mockUseAuthContext.mockImplementation(() => ({
53+
is_authorized: true,
54+
is_logged_in: true,
55+
}));
56+
57+
mockUseApiToken.mockImplementation(() => ({
58+
tokens: [
59+
{
60+
display_name: 'first_token',
61+
last_used: '',
62+
scopes: ['read', 'trade'],
63+
token: 'token_1',
64+
valid_for_ip: '',
65+
},
66+
{
67+
display_name: 'michio_app_pages',
68+
last_used: '2022-10-04 10:33:51',
69+
scopes: ['read', 'trade', 'payments', 'trading_information', 'admin'],
70+
token: 'token_2',
71+
valid_for_ip: '',
72+
},
73+
],
74+
currentToken: {
75+
display_name: 'first_token',
76+
last_used: '',
77+
scopes: ['read', 'trade'],
78+
token: 'token_1',
79+
valid_for_ip: '',
80+
},
81+
isLoadingTokens: false,
82+
}));
83+
84+
render(<ApiTokenNavbarItem />);
85+
86+
const current_account_button = screen.getByText(/first_token/i);
87+
await userEvent.click(current_account_button);
88+
89+
const alternative_account = screen.getByText(/michio_app_pages/i);
90+
expect(alternative_account).toBeVisible();
91+
92+
await userEvent.click(document.body);
93+
expect(alternative_account).not.toBeVisible();
94+
});
95+
5196
it('Should render current api token', async () => {
5297
mockUseAuthContext.mockImplementation(() => ({
5398
is_authorized: true,

src/components/ApiTokenNavbarItem/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Link from '@docusaurus/Link';
33
import useApiToken from '@site/src/hooks/useApiToken';
44
import useAuthContext from '@site/src/hooks/useAuthContext';
55
import TokenDropdown from '../CustomSelectDropdown/token-dropdown/TokenDropdown';
6-
import useClickOutsideDropdown from '@site/src/hooks/useClickOutsideDropdown';
6+
import useOnClickOutside from '@site/src/hooks/useOnClickOutside';
77
import useAppManager from '@site/src/hooks/useAppManager';
88
import styles from './api_token_switcher.module.scss';
99
import RenderOfficialContents from '../RenderOfficialContents';
@@ -18,7 +18,8 @@ const ApiTokenNavbarItem = () => {
1818
tokens.length <= 1 && is_dashboard && currentTab === 'MANAGE_TOKENS' ? styles.oneToken : '';
1919

2020
const dropdownRef = useRef(null);
21-
useClickOutsideDropdown(dropdownRef, setToggleDropdown, false);
21+
22+
useOnClickOutside(dropdownRef, () => setToggleDropdown(false));
2223

2324
if (!is_logged_in || !is_authorized || isLoadingTokens) {
2425
return null;

src/components/CustomSelectDropdown/index.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useState, useRef, ReactElement } from 'react';
2-
import useClickOutsideDropdown from '@site/src/hooks/useClickOutsideDropdown';
2+
import useOnClickOutside from '@site/src/hooks/useOnClickOutside';
33
import { UseFormRegisterReturn } from 'react-hook-form';
44
import styles from './custom_select_dropdown.module.scss';
55

@@ -26,23 +26,24 @@ const CustomSelectDropdown = ({
2626
const ErrorMessage = () => children[2];
2727

2828
const dropdownRef = useRef(null);
29-
useClickOutsideDropdown(dropdownRef, setToggleDropdown, false);
29+
30+
useOnClickOutside(dropdownRef, () => setToggleDropdown(false));
3031

3132
return (
3233
<div className={styles.customSelectField}>
3334
<div
3435
tabIndex={0}
3536
ref={dropdownRef}
36-
onClick={() => setToggleDropdown(!is_toggle_dropdown)}
37-
onKeyDown={(e) => e.key === 'ArrowDown' && setToggleDropdown(!is_toggle_dropdown)}
37+
onClick={(e) => setToggleDropdown((prev) => !prev)}
38+
onKeyDown={(e) => e.key === 'ArrowDown' && setToggleDropdown((prev) => !prev)}
3839
className={`${styles.selectWrapper} ${toggle_dropdown} ${is_error ? styles.error : ''}`}
3940
data-testid={`dt_custom_dropdown_${value}`}
4041
>
4142
<label className={`${styles.selectLabel} ${value ? styles.active : ''}`}>{label}</label>
4243
<SelectInput />
4344
<input {...register} type='hidden' value={value ? value : ''} />
4445
<div className={`${styles.dropdownWrapper} ${toggle_dropdown}`}>
45-
<div className={styles.dropdown} onClick={() => setToggleDropdown(!is_toggle_dropdown)}>
46+
<div className={styles.dropdown} onClick={(e) => setToggleDropdown((prev) => !prev)}>
4647
<SelectDropdown />
4748
</div>
4849
</div>

src/components/Loader/__tests__/Loader.test.tsx

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/components/Loader/index.tsx

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
@use 'src/styles/utility' as *;
2+
.spinnerContainer {
3+
position: relative;
4+
width: 100%;
5+
display: flex;
6+
align-items: center;
7+
justify-content: center;
8+
padding: rem(2);
9+
.spinner {
10+
position: relative;
11+
width: var(--spinner-width);
12+
height: var(--spinner-height);
13+
border-radius: 100%;
14+
overflow: hidden;
15+
animation: rotating 0.5s linear infinite;
16+
&:before {
17+
content: "";
18+
left: 50%;
19+
top: 50%;
20+
width: 70%;
21+
height: 70%;
22+
position: absolute;
23+
border-radius: 100%;
24+
transform: translate(-50%, -50%);
25+
box-shadow: rem(10) rem(-20) rem(5) rem(15) var(--colors-coral500);
26+
}
27+
}
28+
29+
@keyframes rotating {
30+
from {
31+
transform: rotate(0deg);
32+
}
33+
to {
34+
transform: rotate(360deg);
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)