Skip to content

Commit

Permalink
feat(cashier-v2): ✨ add fiat deposit module (deriv-com#13588)
Browse files Browse the repository at this point in the history
  • Loading branch information
heorhi-deriv authored Feb 16, 2024
1 parent 5fc08a7 commit bc44c2d
Show file tree
Hide file tree
Showing 10 changed files with 139 additions and 10 deletions.
2 changes: 1 addition & 1 deletion packages/cashier-v2/src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react';
import { makeLazyLoader, moduleLoader } from './utils/loader';
import { makeLazyLoader, moduleLoader } from './utils';

const LazyApp = makeLazyLoader(
() => moduleLoader(() => import(/* webpackChunkName: "cashier-v2", webpackPreload: true */ './App')),
Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.iframe {
max-width: 58.8rem;
width: 100%;
flex: 1;
margin-inline: auto;
}
43 changes: 43 additions & 0 deletions packages/cashier-v2/src/lib/DepositFiat/DepositFiat.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import React, { useEffect, useState } from 'react';
import { useAuthorize, useCashierFiatAddress } from '@deriv/api';
import { Loader } from '@deriv-com/ui';
import { ErrorScreen } from '../../components/ErrorScreen';
import { isServerError } from '../../utils';
import styles from './DepositFiat.module.scss';

const DepositFiat = () => {
const { isSuccess: isAuthorizeSuccess } = useAuthorize();
const { data: iframeUrl, error: depositError, isError, mutate } = useCashierFiatAddress();
const [isLoading, setIsLoading] = useState(true);

useEffect(() => {
if (isAuthorizeSuccess) {
mutate('deposit');
}
}, [isAuthorizeSuccess, mutate]);

useEffect(() => {
setIsLoading(true);
}, []);

if (isError && isServerError(depositError.error)) return <ErrorScreen message={depositError.error.message} />;

return (
<React.Fragment>
{isLoading && <Loader />}
{iframeUrl && (
<iframe
className={styles.iframe}
data-testid='dt_deposit-fiat-iframe'
key={iframeUrl}
onLoad={() => setIsLoading(false)}
src={iframeUrl}
style={{ display: isLoading ? 'none' : 'block' }}
title='deposit_fiat_iframe'
/>
)}
</React.Fragment>
);
};

export default DepositFiat;
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import React from 'react';
import { useAuthorize, useCashierFiatAddress } from '@deriv/api';
import { act, render, screen, waitFor } from '@testing-library/react';
import DepositFiat from '../DepositFiat';

jest.mock('@deriv/api', () => ({
useAuthorize: jest.fn(),
useCashierFiatAddress: jest.fn(),
}));

jest.mock('@deriv-com/ui', () => ({
...jest.requireActual('@deriv-com/ui'),
Loader: jest.fn(() => <div>Loader</div>),
}));

describe('DepositFiat', () => {
beforeEach(() => {
(useAuthorize as jest.Mock).mockReturnValueOnce({ isSuccess: true });
});

afterEach(() => {
jest.clearAllMocks();
});

it('should render error screen if isError and depositError is a server error', () => {
const serverError = { code: '500', message: 'Server Error' };

(useCashierFiatAddress as jest.Mock).mockReturnValueOnce({
data: null,
error: { error: serverError },
isError: true,
isLoading: false,
mutate: jest.fn(),
});

render(<DepositFiat />);
expect(screen.getByText('Server Error')).toBeInTheDocument();
});

it('should render loader while loading', () => {
(useAuthorize as jest.Mock).mockReturnValueOnce({ isSuccess: false });
(useCashierFiatAddress as jest.Mock).mockReturnValueOnce({
data: null,
error: null,
isError: false,
isLoading: true,
mutate: jest.fn(),
});

render(<DepositFiat />);
expect(screen.getByText('Loader')).toBeInTheDocument();
expect(screen.queryByTestId('dt_deposit-fiat-iframe')).not.toBeInTheDocument();
});

it('should render iframe after loading is completed and iframe url is received', async () => {
(useCashierFiatAddress as jest.Mock).mockReturnValueOnce({
data: 'https://iframe_url',
error: null,
isError: false,
isLoading: false,
mutate: jest.fn(),
});

await act(async () => {
render(<DepositFiat />);
await waitFor(() => {
expect(screen.queryByTestId('Loader')).not.toBeInTheDocument();
});
const iframe = screen.getByTestId('dt_deposit-fiat-iframe');
expect(iframe).toHaveAttribute('src', 'https://iframe_url');
});
});
});
1 change: 1 addition & 0 deletions packages/cashier-v2/src/lib/DepositFiat/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as DepositFiatModule } from './DepositFiat';
1 change: 1 addition & 0 deletions packages/cashier-v2/src/lib/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './DepositFiat';
export * from './WithdrawalVerification';
4 changes: 2 additions & 2 deletions packages/cashier-v2/src/routes/Router.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React from 'react';
import { Switch } from 'react-router-dom';
import { DummyComponent } from '../components';
import { Cashier } from '../containers';
import { WithdrawalVerificationModule } from '../lib';
import { DepositFiatModule, WithdrawalVerificationModule } from '../lib';
import { TRouteTypes } from '../types';
import RouteWithSubRoutes from './RouteWithSubRoutes';

Expand All @@ -25,7 +25,7 @@ const routesConfig: TRouteTypes.IRouteConfig[] = [
routes: [
{
path: cashierPathRoutes.cashierDeposit,
component: DummyComponent,
component: DepositFiatModule,
title: 'Deposit',
},
{
Expand Down
10 changes: 10 additions & 0 deletions packages/cashier-v2/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ export namespace TRouteTypes {
export type TRouteComponent = React.ComponentProps<IRouteConfig['component']>;
}

// eslint-disable-next-line @typescript-eslint/no-namespace
export namespace TErrorTypes {
export type TServerError = {
code: string;
details?: { [key: string]: string };
fields?: string[];
message: string;
};
}

export type TSideNotes = {
notes: JSX.Element[] | [];
position?: 'bottom' | 'top';
Expand Down
9 changes: 2 additions & 7 deletions packages/cashier-v2/src/utils/utils.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
type TServerError = {
code: string;
details?: { [key: string]: string };
fields?: string[];
message: string;
};
import type { TErrorTypes } from '../types';

export const isServerError = (error: unknown): error is TServerError =>
export const isServerError = (error: unknown): error is TErrorTypes.TServerError =>
typeof error === 'object' && error !== null && 'code' in error;

0 comments on commit bc44c2d

Please sign in to comment.