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

Commit 5bb97de

Browse files
Hubert KosterHubert Koster
authored andcommitted
chore: fixing search function when logged in
1 parent 7c1dd1b commit 5bb97de

File tree

7 files changed

+121
-65
lines changed

7 files changed

+121
-65
lines changed

src/components/AccountSwitcher/account_switcher.module.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
}
5151
}
5252

53-
> button {
53+
> .accountSwitcherButton {
5454
display: flex;
5555
cursor: pointer;
5656
font-weight: bold;

src/components/AccountSwitcher/index.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,30 @@ import CurrencyIcon from '../CurrencyIcon';
77
import SelectedAccount from '../CustomSelectDropdown/account-dropdown/SelectedAccount';
88
import AccountDropdown from '../CustomSelectDropdown/account-dropdown/AccountDropdown';
99
import styles from './account_switcher.module.scss';
10+
import SearchButton from '../SearchButton';
1011

1112
const AccountSwitcher = () => {
1213
const { logout } = useLogout();
1314

1415
const { currentLoginAccount } = useAuthContext();
1516
const [is_toggle_dropdown, setToggleDropdown] = useState(false);
17+
const [toggle_search, setToggleSearch] = useState<boolean>(false);
1618
const dropdown_toggle = is_toggle_dropdown ? styles.active : styles.inactive;
19+
const search_toggle = toggle_search ? 'search-open' : 'search-closed';
1720
const is_demo = currentLoginAccount.name.includes('VRTC') ? styles.demo : '';
1821

1922
const dropdownRef = useRef(null);
2023
useClickOutsideDropdown(dropdownRef, setToggleDropdown, false);
2124

2225
return (
23-
<div ref={dropdownRef} className={`${styles.accountSwitcher} ${dropdown_toggle}`}>
24-
<button onClick={() => setToggleDropdown((prev) => !prev)} className={is_demo}>
26+
<div
27+
ref={dropdownRef}
28+
className={`right-navigation ${styles.accountSwitcher} ${dropdown_toggle} ${search_toggle}`}
29+
>
30+
<button
31+
onClick={() => setToggleDropdown((prev) => !prev)}
32+
className={`${is_demo} ${styles.accountSwitcherButton}`}
33+
>
2534
<div className={styles.currencyIconContainer}>
2635
<CurrencyIcon currency={isNotDemoCurrency(currentLoginAccount)} />
2736
</div>
@@ -55,6 +64,7 @@ const AccountSwitcher = () => {
5564
</div>
5665
</div>
5766
)}
67+
<SearchButton setToggleSearch={setToggleSearch} toggle_search={toggle_search} />
5868
</div>
5969
);
6070
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
@use 'src/styles/utility' as *;
2+
3+
.searchButton {
4+
width: rem(2.4);
5+
height: rem(2.4);
6+
background-image: url('/img/search-bold.svg');
7+
background-repeat: no-repeat;
8+
background-size: rem(1.6) rem(1.6);
9+
background-position: center;
10+
cursor: pointer;
11+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import React, { Dispatch, SetStateAction, useEffect } from 'react';
2+
import { useLocation } from '@docusaurus/router';
3+
import styles from './SearchButton.module.scss';
4+
5+
type TSearchButton = {
6+
setToggleSearch: Dispatch<SetStateAction<boolean>>;
7+
toggle_search: boolean;
8+
};
9+
10+
const SearchButton = ({ setToggleSearch, toggle_search }: TSearchButton) => {
11+
const location = useLocation();
12+
13+
const closeSearchHotkey = (event) => {
14+
const press_escape = event.key === 'Escape';
15+
const press_cmd_and_k = event.metaKey && event.key === 'k';
16+
17+
if (press_escape) setToggleSearch(false);
18+
if (press_cmd_and_k) setToggleSearch(false);
19+
};
20+
21+
const openSearchHotkey = (event) => {
22+
const press_cmd_and_k = event.metaKey && event.key === 'k';
23+
if (press_cmd_and_k) setToggleSearch(true);
24+
};
25+
26+
const focusSearchInput = () => {
27+
// Using vanilla JS to get the element since it's a 3rd party library. I cannot access through React.
28+
const search_input = document.querySelector('.navbar__search-input');
29+
if (search_input) {
30+
const focusInput = () => (search_input as HTMLElement).focus();
31+
focusInput();
32+
}
33+
};
34+
35+
useEffect(() => {
36+
setToggleSearch(false);
37+
}, [location]);
38+
39+
useEffect(() => {
40+
if (toggle_search) {
41+
focusSearchInput();
42+
window.addEventListener('keydown', closeSearchHotkey);
43+
return () => window.removeEventListener('keydown', closeSearchHotkey);
44+
} else {
45+
window.addEventListener('keydown', openSearchHotkey);
46+
return () => window.removeEventListener('keydown', openSearchHotkey);
47+
}
48+
}, [toggle_search]);
49+
50+
return (
51+
<React.Fragment>
52+
<button
53+
onClick={() => setToggleSearch((prev) => !prev)}
54+
className={styles.searchButton}
55+
data-testid='dt_search_button'
56+
/>
57+
<div
58+
className='search-overlay'
59+
onClick={() => setToggleSearch(false)}
60+
data-testid='dt_search_overlay'
61+
/>
62+
</React.Fragment>
63+
);
64+
};
65+
66+
export default SearchButton;

src/components/UserNavbarItem/UserNavbarItem.module.scss

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
11
@use 'src/styles/utility' as *;
22

3-
.searchButton {
4-
width: rem(2.4);
5-
height: rem(2.4);
6-
background-image: url('/img/search-bold.svg');
7-
background-repeat: no-repeat;
8-
background-size: rem(1.6) rem(1.6);
9-
background-position: center;
10-
cursor: pointer;
11-
}
12-
133
.LogInButton {
144
color: var(--colors-coral500);
155
font-weight: bold;

src/components/UserNavbarItem/item.desktop.tsx

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,13 @@
11
import Link from '@docusaurus/Link';
22
import clsx from 'clsx';
3-
import React, { useState, useEffect, useRef } from 'react';
3+
import React, { useState } from 'react';
44
import AccountSwitcher from '../AccountSwitcher';
55
import { IUserNavbarItemProps } from './item.types';
6-
import { useLocation } from '@docusaurus/router';
76
import styles from './UserNavbarItem.module.scss';
7+
import SearchButton from '../SearchButton';
88

99
const UserNavbarDesktopItem = ({ authUrl, is_logged_in }: IUserNavbarItemProps) => {
1010
const [toggle_search, setToggleSearch] = useState<boolean>(false);
11-
const location = useLocation();
12-
13-
const closeSearchHotkey = (event) => {
14-
const press_escape = event.key === 'Escape';
15-
const press_cmd_and_k = event.metaKey && event.key === 'k';
16-
17-
if (press_escape) setToggleSearch(false);
18-
if (press_cmd_and_k) setToggleSearch(false);
19-
};
20-
21-
const openSearchHotkey = (event) => {
22-
const press_cmd_and_k = event.metaKey && event.key === 'k';
23-
if (press_cmd_and_k) setToggleSearch(true);
24-
};
25-
26-
const focusSearchInput = () => {
27-
// Using vanilla JS to get the element since it's a 3rd party library. I cannot access through React.
28-
const search_input = document.querySelector('.navbar__search-input');
29-
if (search_input) {
30-
const focusInput = () => (search_input as HTMLElement).focus();
31-
focusInput();
32-
}
33-
};
34-
35-
useEffect(() => {
36-
setToggleSearch(false);
37-
}, [location]);
38-
39-
useEffect(() => {
40-
if (toggle_search) {
41-
focusSearchInput();
42-
window.addEventListener('keydown', closeSearchHotkey);
43-
return () => window.removeEventListener('keydown', closeSearchHotkey);
44-
} else {
45-
window.addEventListener('keydown', openSearchHotkey);
46-
return () => window.removeEventListener('keydown', openSearchHotkey);
47-
}
48-
}, [toggle_search]);
4911

5012
const logInButtonClasses = clsx(
5113
'navbar__item navbar__link',
@@ -68,16 +30,7 @@ const UserNavbarDesktopItem = ({ authUrl, is_logged_in }: IUserNavbarItemProps)
6830
<Link to={'https://deriv.com/signup/'} className={signUpButtonClasses} target='_blank'>
6931
Sign up
7032
</Link>
71-
<button
72-
onClick={() => setToggleSearch((prev) => !prev)}
73-
className={styles.searchButton}
74-
data-testid='dt_search_button'
75-
/>
76-
<div
77-
className='search-overlay'
78-
onClick={() => setToggleSearch(false)}
79-
data-testid='dt_search_overlay'
80-
/>
33+
<SearchButton setToggleSearch={setToggleSearch} toggle_search={toggle_search} />
8134
</nav>
8235
);
8336
};

src/styles/index.scss

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,20 +191,41 @@ div[class*='sidebarViewport'] {
191191
height: 100vh;
192192
background-color: rgba(0, 0, 0, 0.4);
193193
inset: 0;
194+
195+
@media (max-width: 768px) {
196+
width: rem(2.5);
197+
height: rem(2.5);
198+
background-color: unset;
199+
background-image: url('/img/close_dialog.svg');
200+
background-repeat: no-repeat;
201+
background-position: center;
202+
background-size: rem(1.5);
203+
inset: rem(1) rem(1) auto auto;
204+
z-index: 1;
205+
}
194206
}
195207
&+ div[class*='searchBox'] {
196208
position: fixed;
197209
min-width: rem(32);
198210
max-width: rem(79.2);
199211
max-height: rem(48);
200-
top: rem(9);
212+
top: 5%;
201213
width: 100%;
202214
height: 100%;
203215
border-radius: rem(1.6);
204216
left: 50%;
205217
transform: translateX(-50%);
206218
padding: 0;
207219
background-color: var(--ifm-color-white);
220+
221+
@media (max-width: 768px) {
222+
min-width: unset;
223+
max-width: unset;
224+
max-height: unset;
225+
border-radius: unset;
226+
top: 0;
227+
}
228+
208229
span[class*='searchBar'] {
209230
width: 100%;
210231
span[class*='dropdownMenu'] {
@@ -240,11 +261,16 @@ div[class*='sidebarViewport'] {
240261
}
241262
.navbar__search {
242263
margin: 0;
243-
margin-top: rem(1.6);
264+
margin-top: rem(2);
244265
display: flex;
245266
justify-content: center;
246267
text-align: center;
247268
width: 100%;
269+
270+
@media (max-width: 768px) {
271+
margin-top: rem(4);
272+
}
273+
248274
button[class*='searchClearButton'] {
249275
right: rem(3);
250276
}

0 commit comments

Comments
 (0)