mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-22 18:00:18 +01:00
[MMI] 2642 compliance modal component (#18410)
* adds component, styles and storybook file * wip * prettier and adds test * prettier * lint * review fix * lint * updates to IconSize, IconName
This commit is contained in:
parent
6ed72d6934
commit
300bfd6e69
@ -0,0 +1,93 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`ComplianceModal should render the correct content 1`] = `
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="modal-container"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="modal-container__content"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="box box--flex-direction-row"
|
||||||
|
>
|
||||||
|
<header
|
||||||
|
class="box box--display-flex box--flex-direction-row box--justify-content-space-between"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="box box--display-flex box--flex-direction-row box--justify-content-flex-start box--align-items-center"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
alt="Codefi Compliance"
|
||||||
|
height="32"
|
||||||
|
src="images/compliance-logo-small.svg"
|
||||||
|
width="32"
|
||||||
|
/>
|
||||||
|
<h4
|
||||||
|
class="box mm-text mm-text--body-md box--margin-left-2 box--flex-direction-row box--color-text-default"
|
||||||
|
>
|
||||||
|
[codefiCompliance]
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
aria-label="[close]"
|
||||||
|
class="box mm-button-icon mm-button-icon--size-sm box--display-inline-flex box--flex-direction-row box--justify-content-center box--align-items-center box--color-icon-default box--background-color-transparent box--rounded-lg"
|
||||||
|
data-testid="compliance-modal-close"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="box mm-icon mm-icon--size-sm box--display-inline-block box--flex-direction-row box--color-inherit"
|
||||||
|
style="mask-image: url('./images/icons/close.svg');"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</header>
|
||||||
|
<p
|
||||||
|
class="box mm-text mm-text--body-md box--padding-bottom-3 box--flex-direction-row box--color-text-alternative"
|
||||||
|
data-testid="compliance-info"
|
||||||
|
>
|
||||||
|
[complianceBlurb0]
|
||||||
|
</p>
|
||||||
|
<p
|
||||||
|
class="box mm-text mm-text--body-md box--padding-bottom-3 box--flex-direction-row box--color-text-alternative"
|
||||||
|
>
|
||||||
|
[complianceBlurb1]
|
||||||
|
</p>
|
||||||
|
<p
|
||||||
|
class="box mm-text mm-text--body-md box--padding-bottom-3 box--flex-direction-row box--color-text-alternative"
|
||||||
|
>
|
||||||
|
[complianceBlurpStep0]
|
||||||
|
</p>
|
||||||
|
<ol
|
||||||
|
data-testid="compliance-bullets"
|
||||||
|
>
|
||||||
|
<li>
|
||||||
|
[complianceBlurbStep1]
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[complianceBlurbStep2]
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[complianceBlurbStep3]
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[complianceBlurbStep4]
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
[complianceBlurbStep5]
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="modal-container__footer"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="button btn--rounded btn-primary modal-container__footer-button"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
[openCodefiCompliance]
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
@ -0,0 +1,88 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { useDispatch } from 'react-redux';
|
||||||
|
import { useI18nContext } from '../../../hooks/useI18nContext';
|
||||||
|
import { hideModal } from '../../../store/actions';
|
||||||
|
import Modal from '../../app/modal';
|
||||||
|
import Box from '../../ui/box';
|
||||||
|
import { Text, ButtonIcon, IconSize, IconName } from '../../component-library';
|
||||||
|
import {
|
||||||
|
AlignItems,
|
||||||
|
JustifyContent,
|
||||||
|
TextColor,
|
||||||
|
DISPLAY,
|
||||||
|
} from '../../../helpers/constants/design-system';
|
||||||
|
|
||||||
|
const ComplianceModal = () => {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const t = useI18nContext();
|
||||||
|
|
||||||
|
const handleSubmit = () => {
|
||||||
|
global.platform.openTab({
|
||||||
|
url: 'https://start.compliance.codefi.network/',
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleClose = () => dispatch(hideModal());
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
onClose={handleClose}
|
||||||
|
onSubmit={handleSubmit}
|
||||||
|
submitText={t('openCodefiCompliance')}
|
||||||
|
submitType="primary"
|
||||||
|
>
|
||||||
|
<Box>
|
||||||
|
<Box
|
||||||
|
as="header"
|
||||||
|
display={DISPLAY.FLEX}
|
||||||
|
justifyContent={JustifyContent.spaceBetween}
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
display={DISPLAY.FLEX}
|
||||||
|
justifyContent={JustifyContent.flexStart}
|
||||||
|
alignItems={AlignItems.center}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
height={32}
|
||||||
|
width={32}
|
||||||
|
src="images/compliance-logo-small.svg"
|
||||||
|
alt="Codefi Compliance"
|
||||||
|
/>
|
||||||
|
<Text as="h4" marginLeft={2} color={TextColor.textDefault}>
|
||||||
|
{t('codefiCompliance')}
|
||||||
|
</Text>
|
||||||
|
</Box>
|
||||||
|
<ButtonIcon
|
||||||
|
data-testid="compliance-modal-close"
|
||||||
|
iconName={IconName.Close}
|
||||||
|
size={IconSize.Sm}
|
||||||
|
ariaLabel={t('close')}
|
||||||
|
onClick={handleClose}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Text
|
||||||
|
data-testid="compliance-info"
|
||||||
|
paddingBottom={3}
|
||||||
|
color={TextColor.textAlternative}
|
||||||
|
>
|
||||||
|
{t('complianceBlurb0')}
|
||||||
|
</Text>
|
||||||
|
<Text paddingBottom={3} color={TextColor.textAlternative}>
|
||||||
|
{t('complianceBlurb1')}
|
||||||
|
</Text>
|
||||||
|
<Text paddingBottom={3} color={TextColor.textAlternative}>
|
||||||
|
{t('complianceBlurpStep0')}
|
||||||
|
</Text>
|
||||||
|
<ol data-testid="compliance-bullets">
|
||||||
|
<li>{t('complianceBlurbStep1')}</li>
|
||||||
|
<li>{t('complianceBlurbStep2')}</li>
|
||||||
|
<li>{t('complianceBlurbStep3')}</li>
|
||||||
|
<li>{t('complianceBlurbStep4')}</li>
|
||||||
|
<li>{t('complianceBlurbStep5')}</li>
|
||||||
|
</ol>
|
||||||
|
</Box>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ComplianceModal;
|
@ -0,0 +1,6 @@
|
|||||||
|
.compliance-modal {
|
||||||
|
ol {
|
||||||
|
list-style: decimal;
|
||||||
|
list-style-position: inside;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Provider } from 'react-redux';
|
||||||
|
import configureStore from '../../../store/store';
|
||||||
|
import testData from '../../../../.storybook/test-data';
|
||||||
|
import ComplianceModal from '.';
|
||||||
|
|
||||||
|
const store = configureStore(testData);
|
||||||
|
|
||||||
|
export default {
|
||||||
|
title: 'Components/Institutional/ComplianceModal',
|
||||||
|
decorators: [(story) => <Provider store={store}>{story()}</Provider>],
|
||||||
|
component: ComplianceModal,
|
||||||
|
argTypes: {
|
||||||
|
onClick: {
|
||||||
|
action: 'onClick',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const DefaultStory = (args) => <ComplianceModal {...args} />;
|
||||||
|
|
||||||
|
DefaultStory.storyName = 'ComplianceModal';
|
@ -0,0 +1,55 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { render, fireEvent } from '@testing-library/react';
|
||||||
|
import { useDispatch } from 'react-redux';
|
||||||
|
import sinon from 'sinon';
|
||||||
|
import { hideModal } from '../../../store/actions';
|
||||||
|
import ComplianceModal from '.';
|
||||||
|
|
||||||
|
jest.mock('react-redux', () => ({
|
||||||
|
useDispatch: jest.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('../../../store/actions', () => ({
|
||||||
|
hideModal: jest.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('ComplianceModal', () => {
|
||||||
|
let dispatchMock;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
dispatchMock = jest.fn();
|
||||||
|
useDispatch.mockReturnValue(dispatchMock);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
jest.resetAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render the correct content', () => {
|
||||||
|
const { container, getByTestId } = render(<ComplianceModal />);
|
||||||
|
|
||||||
|
expect(getByTestId('compliance-info')).toBeInTheDocument();
|
||||||
|
expect(getByTestId('compliance-bullets')).toBeInTheDocument();
|
||||||
|
expect(container).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should close the modal when close button is clicked', () => {
|
||||||
|
const { getByTestId } = render(<ComplianceModal />);
|
||||||
|
|
||||||
|
fireEvent.click(getByTestId('compliance-modal-close'));
|
||||||
|
|
||||||
|
expect(hideModal).toHaveBeenCalled();
|
||||||
|
expect(dispatchMock).toHaveBeenCalledWith(hideModal());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should open the Compliance page when submit button is clicked', () => {
|
||||||
|
global.platform = { openTab: sinon.spy() };
|
||||||
|
const { container } = render(<ComplianceModal />);
|
||||||
|
|
||||||
|
const btn = container.getElementsByClassName('btn-primary')[0];
|
||||||
|
|
||||||
|
fireEvent.click(btn);
|
||||||
|
|
||||||
|
expect(global.platform.openTab.called).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
1
ui/components/institutional/compliance-modal/index.js
Normal file
1
ui/components/institutional/compliance-modal/index.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { default } from './compliance-modal';
|
Loading…
Reference in New Issue
Block a user