Skip to content

Commit

Permalink
Merge pull request #96 from thisyahlen-deriv/thisyahlen/trade-modal
Browse files Browse the repository at this point in the history
chore: trademodal
  • Loading branch information
thisyahlen-deriv authored Apr 16, 2024
2 parents 22604a9 + 76da873 commit 041afd9
Show file tree
Hide file tree
Showing 22 changed files with 632 additions and 3 deletions.
9 changes: 9 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"react-router-dom": "^6.22.3",
"tailwind-merge": "^2.2.1",
"usehooks-ts": "^3.0.2",
"qrcode.react": "^3.1.0",
"yup": "^1.4.0"
},
"devDependencies": {
Expand Down
108 changes: 106 additions & 2 deletions src/cfd/constants/constants.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
import { ReactNode } from 'react';

import { ComponentType, ReactNode, SVGAttributes } from 'react';

import CTraderLabelIcon from '@/assets/svgs/ctrader-label.svg?react';
import DerivXLabelIcon from '@/assets/svgs/derivx-label.svg?react';
import InstallationAppleIcon from '@/assets/svgs/ic-installation-apple.svg?react';
import InstallationGoogleIcon from '@/assets/svgs/ic-installation-google.svg?react';
import InstallationHuaweiIcon from '@/assets/svgs/ic-installation-huawei.svg?react';
import LinuxIcon from '@/assets/svgs/ic-linux-logo.svg?react';
import MacOSIcon from '@/assets/svgs/ic-macos-logo.svg?react';
import MT5Icon from '@/assets/svgs/ic-mt5.svg?react';
import WindowsIcon from '@/assets/svgs/ic-windows-logo.svg?react';
import { IconComponent } from '@/components';
import { TJurisdiction, TMarketTypes, TPlatforms } from '@/types';

Expand All @@ -12,6 +21,20 @@ type TAppContent = {
title: string;
};

type TDesktopLinks =
| 'ctrader_mac'
| 'ctrader_web'
| 'ctrader_windows'
| 'dxtrade_web'
| 'mt5_linux'
| 'mt5_macos'
| 'mt5_web'
| 'mt5_windows';

type TAppToContentMapper = {
[key in TDesktopLinks]: Omit<TAppContent, 'description'>;
};

export type TAppLinks = {
android: string;
huawei?: string;
Expand All @@ -29,6 +52,14 @@ type TcompanyNamesAndUrls = {
[key in TTM5FilterLandingCompany]: TLandingCompanyDetails;
};

type TPlatformUrls = {
[key in TPlatforms.OtherAccounts]: {
demo?: string;
live: string;
staging?: string;
};
};

export const CFDPlatforms = {
CFDS: 'CFDs',
CTRADER: 'ctrader',
Expand Down Expand Up @@ -146,3 +177,76 @@ export const LinksMapper: Record<TPlatforms.All, TAppLinks> = {
ios: 'https://download.mql5.com/cdn/mobile/mt5/ios?server=Deriv-Demo,Deriv-Server,Deriv-Server-02',
},
};

export const PlatformUrls: TPlatformUrls = {
ctrader: {
live: 'https://ct.deriv.com',
staging: 'https://ct-uat.deriv.com',
},
dxtrade: {
demo: 'https://dx-demo.deriv.com',
live: 'https://dx.deriv.com',
},
};

export const PlatformToLabelIconMapper: Record<TPlatforms.OtherAccounts, ReactNode> = {
ctrader: <CTraderLabelIcon />,
dxtrade: <DerivXLabelIcon />,
};

export const AppToContentMapper: TAppToContentMapper = {
ctrader_web: {
icon: '',
link: '',
text: 'Open',
title: 'cTrader web',
},
dxtrade_web: {
icon: '',
link: '',
text: 'Open',
title: 'DerivX web',
},
ctrader_windows: {
icon: <WindowsIcon />,
link: 'https://getctrader.com/deriv/ctrader-deriv-setup.exe',
text: 'Download',
title: 'cTrader Windows App',
},
ctrader_mac: {
icon: <MacOSIcon />,
link: 'https://getctradermac.com/deriv/ctrader-deriv-setup.dmg',
text: 'Download',
title: 'cTrader MacOS App',
},
mt5_linux: {
icon: <LinuxIcon />,
link: 'https://www.metatrader5.com/en/terminal/help/start_advanced/install_linux',
text: 'Learn more',
title: 'MetaTrader 5 Linux app',
},
mt5_macos: {
icon: <MacOSIcon />,
link: 'https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/MetaTrader5.dmg',
text: 'Download',
title: 'MetaTrader 5 MacOS app',
},
mt5_web: {
icon: <MT5Icon />,
link: '',
text: 'Open',
title: 'MetaTrader 5 web',
},
mt5_windows: {
icon: <WindowsIcon />,
link: 'https://download.mql5.com/cdn/web/deriv.com.limited/mt5/deriv5setup.exe',
text: 'Download',
title: 'MetaTrader 5 Windows app',
},
};

export const AppToIconMapper: Record<string, ComponentType<SVGAttributes<SVGElement>>> = {
android: InstallationGoogleIcon,
huawei: InstallationHuaweiIcon,
ios: InstallationAppleIcon,
};
1 change: 1 addition & 0 deletions src/cfd/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './components';
export * from './constants';
export * from './flows';
export * from './screens';
74 changes: 74 additions & 0 deletions src/cfd/modals/TradeModal/TradeModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { useEffect } from 'react';
import QRCode from 'qrcode.react';

import { AppToIconMapper, CFDPlatforms, LinksMapper, PlatformDetails, TAppLinks } from '@cfd/constants';
import { TradeScreen } from '@cfd/screens';
import { Modal, Text, useDevice } from '@deriv-com/ui';

import { useQueryParams } from '@/hooks';
import { useCFDContext } from '@/providers';
import { THooks } from '@/types';

export const TradeModal = () => {
const { isDesktop } = useDevice();
const { setCfdState, cfdState } = useCFDContext();
const { isModalOpen, closeModal } = useQueryParams();

const { account, marketType, platform = CFDPlatforms.MT5 } = cfdState;

useEffect(() => {
setCfdState({
marketType,
platform,
});
if (platform === CFDPlatforms.MT5) setCfdState({ accountId: (account as THooks.MT5AccountsList)?.loginid });
}, [account, marketType, platform, setCfdState]);

const appOrder = ['ios', 'android', 'huawei'];

return (
<Modal ariaHideApp={false} isOpen={isModalOpen('TradeModal')} onRequestClose={closeModal}>
<Modal.Header onRequestClose={closeModal}>
<Text weight='bold'>Trade</Text>
</Modal.Header>
<Modal.Body className='w-auto h-auto'>
<TradeScreen account={account} />
</Modal.Body>
<Modal.Footer>
<div className='pt-0 min-h-[190px] flex justify-center items-center flex-col h-fit w-full gap-16'>
<Text align='center' size='xs' weight='bold'>
Download {PlatformDetails[platform]?.title} on your phone to trade with the{' '}
{PlatformDetails[platform].title} account
</Text>
<div className='flex gap-16'>
<div className='flex flex-col justify-center gap-8'>
{appOrder.map(app => {
const AppsLinkMapper = LinksMapper[platform][app as keyof TAppLinks];
if (AppsLinkMapper) {
const AppIcon = AppToIconMapper[app];
const appLink = AppsLinkMapper;
return (
<AppIcon
className='w-[137px] h-[40px] cursor-pointer'
key={app}
onClick={() => window.open(appLink)}
/>
);
}
return null;
})}
</div>
{isDesktop && (
<div className='border-1 border-solid border-system-light-hover-background rounded-xs flex flex-col justify-center items-center w-[150px] gap-[5px] p-8'>
<QRCode size={80} value={PlatformDetails[platform].link} />
<Text align='center' size='xs'>
Scan the QR code to download {PlatformDetails[platform].title}
</Text>
</div>
)}
</div>
</div>
</Modal.Footer>
</Modal>
);
};
1 change: 1 addition & 0 deletions src/cfd/modals/TradeModal/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { TradeModal } from './TradeModal';
1 change: 1 addition & 0 deletions src/cfd/modals/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './DxtradePasswordModal';
export * from './MT5PasswordModal';
export * from './MT5SuccessModal';
export * from './TradeModal';
58 changes: 58 additions & 0 deletions src/cfd/screens/TradeScreen/TradeDetailsItem/TradeDetailsItem.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { useRef } from 'react';
import { twMerge } from 'tailwind-merge';
import { useHover } from 'usehooks-ts';

import { Button, Text, Tooltip, useDevice } from '@deriv-com/ui';

import EditIcon from '@/assets/svgs/ic-edit.svg?react';
import { Clipboard } from '@/components';
import { useQueryParams } from '@/hooks';

type TTradeDetailsItemProps = {
className?: string;
label?: string;
value: string;
variant?: 'clipboard' | 'info' | 'password';
};

export const TradeDetailsItem = ({ className, label, value, variant = 'clipboard' }: TTradeDetailsItemProps) => {
const { isDesktop } = useDevice();
const hoverRef = useRef(null);
const isHovered = useHover(hoverRef);
const { openModal } = useQueryParams();
return (
<div
className={twMerge(
'flex items-center h-32 justify-between bg-system-light-secondary-background p-5 pl-8',
className
)}
>
{label && <Text size='sm'>{label}</Text>}
<div className='flex items-center gap-x-8'>
{variant === 'info' ? (
<Text color='less-prominent' size='sm'>
{value}
</Text>
) : (
<Text size='sm' weight='bold'>
{value}
</Text>
)}
{variant === 'clipboard' && <Clipboard textCopy={value} />}
{variant === 'password' && (
<Tooltip
position='left'
triggerAction={isHovered && isDesktop ? 'hover' : 'click'}
message='Change password'
>
<div ref={hoverRef}>
<Button className='underline' color='white' size='sm' variant='ghost'>
<EditIcon className='cursor-pointer' onClick={() => openModal('ChangePassword')} />
</Button>
</div>
</Tooltip>
)}
</div>
</div>
);
};
1 change: 1 addition & 0 deletions src/cfd/screens/TradeScreen/TradeDetailsItem/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { TradeDetailsItem } from './TradeDetailsItem';
Loading

0 comments on commit 041afd9

Please sign in to comment.