Skip to content

Commit c5c573b

Browse files
authored
Merge pull request #38 from agrim-deriv/Agrim/DAPI-536/copyproduction
Agrim/dapi 536/copyproduction
2 parents 1052175 + 3013462 commit c5c573b

File tree

17 files changed

+266
-164
lines changed

17 files changed

+266
-164
lines changed

package-lock.json

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

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
},
2323
"dependencies": {
2424
"@deriv/deriv-api": "^1.0.11",
25+
"@deriv/quill-icons": "^1.22.10",
2526
"@deriv/ui": "^0.8.0",
2627
"@docusaurus/core": "^3.3.2",
2728
"@docusaurus/plugin-client-redirects": "^3.3.2",

src/contexts/api-token/api-token.context.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export interface IApiTokenContext {
66
isLoadingTokens: boolean;
77
currentToken: TTokenType;
88
updateCurrentToken: (token: TTokenType) => void;
9+
lastTokenDisplayName: string;
10+
setLastTokenDisplayName: (name: string) => void;
911
}
1012

1113
export const ApiTokenContext = React.createContext<IApiTokenContext | null>(null);

src/contexts/api-token/api-token.provider.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type TTokenProviderProps = {
1111
const ApiTokenProvider = ({ children }: TTokenProviderProps) => {
1212
const [tokens, setTokens] = useState<TTokensArrayType>([]);
1313
const [currentToken, setCurrentToken] = useState<TTokenType>();
14+
const [lastTokenDisplayName, setLastTokenDisplayName] = useState<string>('');
1415

1516
const { send: getAllTokens, data, is_loading } = useWS('api_token');
1617
const { is_authorized } = useAuthContext();
@@ -46,8 +47,18 @@ const ApiTokenProvider = ({ children }: TTokenProviderProps) => {
4647
currentToken,
4748
updateCurrentToken,
4849
updateTokens,
50+
lastTokenDisplayName,
51+
setLastTokenDisplayName,
4952
};
50-
}, [currentToken, is_loading, tokens, updateCurrentToken, updateTokens]);
53+
}, [
54+
currentToken,
55+
is_loading,
56+
tokens,
57+
updateCurrentToken,
58+
updateTokens,
59+
lastTokenDisplayName,
60+
setLastTokenDisplayName,
61+
]);
5162

5263
return <ApiTokenContext.Provider value={contextValue}>{children}</ApiTokenContext.Provider>;
5364
};

src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const CreateTokenField = ({
4444
setFormIsCleared(false);
4545
}
4646
}, [form_is_cleared]);
47+
4748
const getTokenNames = useMemo(() => {
4849
const token_names = [];
4950
for (const token_object of tokens) {

src/features/dashboard/components/ApiTokenForm/__tests__/api-token.form.test.tsx

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ describe('Home Page', () => {
7777
valid_for_ip: '',
7878
},
7979
],
80+
lastTokenDisplayName: '',
8081
}));
8182

8283
render(<ApiTokenForm />);
@@ -207,21 +208,6 @@ describe('Home Page', () => {
207208

208209
expect(mockCreateToken).not.toHaveBeenCalled();
209210
});
210-
it('Should open success dialog when token is created ', async () => {
211-
const nameInput = screen.getByRole('textbox');
212-
await act(async () => {
213-
await userEvent.type(nameInput, 'test create token');
214-
});
215-
216-
const submitButton = screen.getByRole('button', { name: /Create/i });
217-
218-
await act(async () => {
219-
await userEvent.click(submitButton);
220-
});
221-
222-
const modal = await screen.getByText('Your API token is ready to be used.');
223-
expect(modal).toBeVisible();
224-
});
225211

226212
it('Should have create button disabled in case of empty input or error message', async () => {
227213
const submitButton = screen.getByRole('button', { name: /Create/i });

src/features/dashboard/components/ApiTokenTable/CopyButton/__tests__/CopyButton.test.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ describe('CopyButton', () => {
1414
jest.spyOn(navigator.clipboard, 'writeText');
1515

1616
it('should render the CopyButton', () => {
17-
render(<CopyButton value='testvalue' has_admin />);
17+
render(<CopyButton value='testvalue' has_admin={false} />);
1818

1919
const copy_button = screen.getByRole('button');
2020
expect(copy_button).toBeInTheDocument();
@@ -79,7 +79,6 @@ describe('CopyButton', () => {
7979

8080
expect(modal).not.toBeInTheDocument();
8181
});
82-
8382
it('should show a green check for 2 seconds when copied', async () => {
8483
const user = userEvent.setup({ delay: null });
8584
jest.useFakeTimers();

src/features/dashboard/components/ApiTokenTable/CopyButton/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, { useState } from 'react';
22
import CopyTokenDialog from '../CopyTokenDialog';
33
import styles from '../token-cell.module.scss';
4+
import { StandaloneCopyRegularIcon } from '@deriv/quill-icons';
45

56
type TCopyButton = {
67
value: string;

src/features/dashboard/components/ApiTokenTable/table.token.cell.tsx

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React, { useEffect, useState } from 'react';
22
import { TTokenType } from '@site/src/types';
33
import { CellProps } from 'react-table';
44
import styles from './token-cell.module.scss';
5-
import CopyButton from './CopyButton';
65

76
const ApiTokenCell = ({ cell }: React.PropsWithChildren<CellProps<TTokenType, string>>) => {
87
const [is_hiding_token, setIsHidingToken] = useState(true);
@@ -24,16 +23,7 @@ const ApiTokenCell = ({ cell }: React.PropsWithChildren<CellProps<TTokenType, st
2423

2524
return (
2625
<div data-testid={'token-cell'} className={styles.token_cell}>
27-
<div>{is_hiding_token ? <HiddenToken /> : cell.value}</div>
28-
<CopyButton has_admin={has_admin_scope} value={token} />
29-
<button
30-
onClick={() => setIsHidingToken(!is_hiding_token)}
31-
className={styles.eye_button}
32-
data-testid='eye-button'
33-
style={{
34-
backgroundImage: is_hiding_token ? 'url(/img/eye_closed.svg)' : 'url(/img/eye_open.svg)',
35-
}}
36-
/>
26+
<div>{cell.value}</div>
3727
</div>
3828
);
3929
};
Lines changed: 65 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,73 @@
11
@use 'src/styles/utility' as *;
22

33
.hidden_container {
4-
display: flex;
5-
gap: rem(0.45);
6-
.hidden_character {
7-
width: rem(0.5);
8-
height: rem(0.5);
9-
border-radius: 100%;
10-
background-color: var(--ifm-color-emphasis-900);
4+
display: flex;
5+
gap: rem(0.45);
6+
.hidden_character {
7+
width: rem(0.5);
8+
height: rem(0.5);
9+
border-radius: 100%;
10+
background-color: var(--ifm-color-emphasis-900);
11+
}
12+
}
13+
14+
.copy_button {
15+
background-repeat: no-repeat;
16+
background-position: 50%;
17+
width: rem(2.4);
18+
height: rem(2.4);
19+
cursor: copy;
20+
background-image: url(/img/copy.svg);
21+
&:hover {
22+
&::after {
23+
content: 'Copy this token';
24+
text-align: center;
25+
position: absolute;
26+
display: inline-block;
27+
border-radius: 4px;
28+
padding: rem(1);
29+
color: var(--ifm-color-emphasis-100);
30+
background-color: var(--ifm-color-emphasis-700);
31+
font-size: var(--fontSizes-3xs);
32+
top: calc(50% - 15px);
33+
min-width: 100px;
34+
transform: translate(-50%, -50%);
35+
@media (max-width: 425px) {
36+
top: calc(50% + 5px);
37+
}
38+
}
39+
&::before {
40+
content: 'Token copied!';
41+
text-align: center;
42+
position: absolute;
43+
display: inline-block;
44+
border-radius: 4px;
45+
padding: rem(1);
46+
color: var(--ifm-color-emphasis-100);
47+
background-color: var(--ifm-color-emphasis-700);
48+
font-size: var(--fontSizes-3xs);
49+
top: calc(50% - 15px);
50+
min-width: 100px;
51+
transform: translate(-50%, -50%);
52+
@media (max-width: 425px) {
53+
top: calc(50% + 5px);
54+
}
1155
}
56+
}
57+
&.is_copying {
58+
background-image: url(/img/check.svg);
59+
border-radius: 100%;
60+
background-color: var(--ifm-color-primary-lightest);
61+
border: 1px solid var(--ifm-color-primary);
62+
&:hover::after {
63+
content: 'Token copied!';
64+
}
65+
}
1266
}
1367

1468
.token_cell {
15-
display: flex;
16-
justify-content: center;
17-
align-items: center;
18-
gap: rem(1);
19-
button {
20-
position: relative;
21-
min-width: rem(1.5);
22-
min-height: rem(1.5);
23-
background-repeat: no-repeat;
24-
background-position: center;
25-
background-color: var(--colors-greyLight200);
26-
border: 1px solid var(--colors-greyLight400);
27-
border-radius: 100%;
28-
padding: rem(0.3);
29-
&.copy_button {
30-
cursor: copy;
31-
background-image: url(/img/copy.svg);
32-
}
33-
&:hover {
34-
&::after {
35-
content: '';
36-
text-align: center;
37-
position: absolute;
38-
display: inline-block;
39-
border-radius: 4px;
40-
padding: rem(1);
41-
color: var(--ifm-color-emphasis-100);
42-
background-color: var(--ifm-color-emphasis-700);
43-
font-size: var(--fontSizes-3xs);
44-
top: calc(-50% - 20px);
45-
left: 50%;
46-
min-width: 100px;
47-
transform: translate(-50%, -50%);
48-
}
49-
&::before {
50-
content: '';
51-
position: absolute;
52-
width: 0;
53-
height: 0;
54-
border-left: rem(0.7) solid transparent;
55-
border-right: rem(0.7) solid transparent;
56-
border-top: rem(0.7) solid var(--ifm-color-emphasis-700);
57-
top: calc(-50% + 2px);
58-
transform: translate(-50%, -50%);
59-
left: 50%;
60-
}
61-
}
62-
&.eye_button {
63-
cursor: pointer;
64-
&:hover::after {
65-
content: 'Hide this token';
66-
}
67-
}
68-
&.copy_button {
69-
&:hover::after {
70-
content: 'Copy this token';
71-
}
72-
&.is_copying {
73-
background-image: url(/img/check.svg);
74-
background-color: var(--ifm-color-primary-lightest);
75-
border: 1px solid var(--ifm-color-primary);
76-
&:hover::after {
77-
content: 'Token copied!';
78-
}
79-
}
80-
}
81-
}
69+
display: flex;
70+
justify-content: left;
71+
align-items: center;
72+
gap: 0.625rem;
8273
}

0 commit comments

Comments
 (0)