Skip to content

Commit 5aa9a81

Browse files
Merge pull request #125 from niloofar-deriv/drawer
Niloofar/SideMenu base component
2 parents eec8776 + 2e7cae8 commit 5aa9a81

15 files changed

+674
-559
lines changed

package-lock.json

+7-505
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"@babel/preset-env": "^7.24.5",
1818
"@deriv-com/api-hooks": "^1.1.1",
1919
"@deriv-com/translations": "^1.2.4",
20-
"@deriv-com/ui": "^1.28.0",
20+
"@deriv-com/ui": "^1.28.2",
2121
"@deriv-com/utils": "^0.0.25",
2222
"@deriv/deriv-api": "^1.0.15",
2323
"@deriv/quill-design": "^1.2.24",

src/components/AppFooter/AppFooter.scss

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
height: 3.6rem;
33
display: flex;
44
flex-direction: row-reverse;
5-
padding: 0 10px;
5+
padding: 0 1rem;
66
align-items: center;
77
position: fixed;
88
bottom: 0;
@@ -14,6 +14,10 @@
1414

1515
&__icon {
1616
padding: 0.8rem;
17+
18+
@include mobile {
19+
padding: 0;
20+
}
1721
}
1822

1923
&__vertical-line {
@@ -49,6 +53,10 @@
4953
&-blinking {
5054
animation: blink 1s infinite alternate;
5155
}
56+
57+
@include mobile {
58+
margin-left: 1.2rem;
59+
}
5260
}
5361

5462
&__endpoint {

src/components/AppFooter/ServerTime.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { DATE_TIME_FORMAT_WITH_GMT, DATE_TIME_FORMAT_WITH_OFFSET } from '@/constants';
22
import { useSyncedTime } from '@/hooks';
33
import { epochToLocal, epochToUTC } from '@/utils';
4-
import { Text, TooltipMenuIcon } from '@deriv-com/ui';
4+
import { Text, TooltipMenuIcon, useDevice } from '@deriv-com/ui';
55

66
const ServerTime = () => {
77
const time = useSyncedTime();
88
const UTCFormat = epochToUTC(time, DATE_TIME_FORMAT_WITH_GMT);
99
const localFormat = epochToLocal(time, DATE_TIME_FORMAT_WITH_OFFSET);
10+
const { isMobile } = useDevice();
1011

1112
return (
1213
<TooltipMenuIcon
@@ -16,7 +17,7 @@ const ServerTime = () => {
1617
disableHover
1718
tooltipContent={localFormat}
1819
>
19-
<Text size='xs'>{UTCFormat}</Text>
20+
<Text size={isMobile ? 'sm' : 'xs'}>{UTCFormat}</Text>
2021
</TooltipMenuIcon>
2122
);
2223
};

src/components/AppHeader/AppHeader.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const AppHeader = () => {
2323
<Wrapper variant='left'>
2424
<AppLogo />
2525
<MobileMenu />
26-
<PlatformSwitcher />
26+
{isDesktop && <PlatformSwitcher />}
2727
<MenuItems />
2828
</Wrapper>
2929
<Wrapper variant='right'>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { LegacyChevronLeft1pxIcon } from '@deriv/quill-icons';
2+
import { Text, useDevice } from '@deriv-com/ui';
3+
4+
type TBackButton = {
5+
buttonText: string;
6+
onClick: () => void;
7+
};
8+
9+
export const BackButton = ({ buttonText, onClick }: TBackButton) => {
10+
const { isMobile } = useDevice();
11+
12+
return (
13+
<button className='flex items-center w-full pt-8 p-[3.2rem]' onClick={onClick}>
14+
<LegacyChevronLeft1pxIcon iconSize='xs' />
15+
16+
<Text className='ml-[1.6rem]' size={isMobile ? 'lg' : 'md'} weight='bold'>
17+
{buttonText}
18+
</Text>
19+
</button>
20+
);
21+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { useState } from 'react';
2+
import { MenuItem, Submenu, Text, useDevice } from '@deriv-com/ui';
3+
import { PlatformSwitcher } from '../PlatformSwitcher';
4+
import { MobileMenuConfig, TSubmenuSection } from './MobileMenuConfig';
5+
import { SubmenuContent } from './SubmenuContent';
6+
7+
export const MenuContent = () => {
8+
const [isSubmenuOpen, setIsSubmenuOpen] = useState(false);
9+
const [renderSubmenuFor, setRenderSubmenuFor] = useState<TSubmenuSection>('accountSettings');
10+
const { isMobile } = useDevice();
11+
12+
const data = MobileMenuConfig().menuConfig;
13+
14+
return (
15+
<div className='flex flex-col h-full'>
16+
{!isSubmenuOpen && (
17+
<div className='flex items-center justify-center h-28 border-b border-[#f2f3f4]'>
18+
<PlatformSwitcher />
19+
</div>
20+
)}
21+
22+
<div className='relative h-full pt-4'>
23+
{data.map((item, index) => (
24+
<div className='pl-[4.8rem] pr-[1.6rem] border-b border-[#f2f3f4]' key={index}>
25+
{item.map(({ LeftComponent, RightComponent, as, href, label, onClick, submenu }) => {
26+
const textSize = isMobile ? 'md' : 'sm';
27+
28+
if (as === 'a') {
29+
return (
30+
<MenuItem
31+
as='a'
32+
className='h-[5.6rem]'
33+
disableHover
34+
href={href}
35+
key={label}
36+
leftComponent={<LeftComponent className='mr-[1.6rem]' height={16} width={16} />}
37+
>
38+
<Text size={textSize}>{label}</Text>
39+
</MenuItem>
40+
);
41+
}
42+
return (
43+
<MenuItem
44+
as='button'
45+
className='w-full h-[5.6rem]'
46+
disableHover
47+
key={label}
48+
leftComponent={<LeftComponent className='mr-[1.6rem]' iconSize='xs' />}
49+
onClick={() => {
50+
if (submenu) {
51+
setRenderSubmenuFor(submenu);
52+
setIsSubmenuOpen(true);
53+
} else onClick?.();
54+
}}
55+
rightComponent={RightComponent}
56+
>
57+
<Text className='mr-auto' size={textSize}>
58+
{label}
59+
</Text>
60+
</MenuItem>
61+
);
62+
})}
63+
</div>
64+
))}
65+
66+
<Submenu className='overflow-y-auto z-10' isOpen={isSubmenuOpen}>
67+
<SubmenuContent onBackClick={() => setIsSubmenuOpen(false)} renderContentFor={renderSubmenuFor} />
68+
</Submenu>
69+
</div>
70+
</div>
71+
);
72+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { ComponentProps, useMemo } from 'react';
2+
import { LANGUAGES } from '@/constants';
3+
import { useTranslations } from '@deriv-com/translations';
4+
import { Text, useDevice } from '@deriv-com/ui';
5+
6+
type TMenuHeader = {
7+
hideLanguageSetting: boolean;
8+
openLanguageSetting: ComponentProps<'button'>['onClick'];
9+
};
10+
11+
export const MenuHeader = ({ hideLanguageSetting, openLanguageSetting }: TMenuHeader) => {
12+
const { currentLang, localize } = useTranslations();
13+
const { isMobile } = useDevice();
14+
15+
const countryIcon = useMemo(
16+
() => LANGUAGES.find(({ code }) => code === currentLang)?.placeholderIconInMobile,
17+
[currentLang]
18+
);
19+
20+
return (
21+
<div className='flex items-center justify-between w-full pr-[1.6rem] pl-[0.4rem]'>
22+
<Text size={isMobile ? 'lg' : 'md'} weight='bold'>
23+
{localize('Menu')}
24+
</Text>
25+
26+
{!hideLanguageSetting && (
27+
<button className='flex items-center' onClick={openLanguageSetting}>
28+
{countryIcon}
29+
<Text className='ml-[0.4rem]' size={isMobile ? 'sm' : 'xs'} weight='bold'>
30+
{currentLang}
31+
</Text>
32+
</button>
33+
)}
34+
</div>
35+
);
36+
};

0 commit comments

Comments
 (0)