Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added QR code #23428

Merged
merged 64 commits into from
May 2, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
6fb6df3
Added QR code
albertolive Mar 12, 2024
36ec5f6
Improved code
albertolive Mar 13, 2024
355e5e0
Clean stuff
albertolive Mar 15, 2024
e4e8966
initial handshake work
albertolive Mar 20, 2024
8cd8b94
Merge branch 'develop' into MMI-4693-QR-code
albertolive Mar 21, 2024
6259201
Merge branch 'develop' into MMI-4693-QR-code
albertolive Mar 21, 2024
73a32e3
Improved code
albertolive Mar 21, 2024
c925859
Merge branch 'develop' into MMI-4693-QR-code
albertolive Mar 21, 2024
7a8356a
Improving code
albertolive Mar 21, 2024
5318444
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 5, 2024
abd835a
Continue working on it
albertolive Apr 5, 2024
14184b2
Merge branch 'MMI-4693-QR-code' of https://github.com/MetaMask/metama…
albertolive Apr 5, 2024
b81d203
Added logic to decrypt the connect request
albertolive Apr 12, 2024
c271122
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 15, 2024
c0a55f9
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 16, 2024
244f554
updated packages, lavamoat and qr code modal
albertolive Apr 17, 2024
53513b4
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 17, 2024
8793db8
Update LavaMoat policies
metamaskbot Apr 17, 2024
e3ae6de
improved qr modal component
albertolive Apr 18, 2024
4e55314
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 18, 2024
bccb5dc
Improved qr code modal
albertolive Apr 18, 2024
6a1e6ef
Added unit tests
albertolive Apr 19, 2024
114b00d
Added storybook story and improved tests
albertolive Apr 19, 2024
00554ba
Added sentry errors
albertolive Apr 24, 2024
ae44c3b
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 24, 2024
7f7950d
fixed issues
albertolive Apr 24, 2024
770b541
updated lavamoat
albertolive Apr 24, 2024
dff9172
Update LavaMoat policies
metamaskbot Apr 24, 2024
c5fc2f2
Fixed lavamoat
albertolive Apr 24, 2024
65268de
chore: fix lavamoat and small code change
zone-live Apr 24, 2024
c62c3f2
Merge branch 'develop' into MMI-4693-QR-code
zone-live Apr 24, 2024
996f2b7
Update LavaMoat policies
metamaskbot Apr 24, 2024
0b7f644
chore: fix audit failing and test
zone-live Apr 24, 2024
f7af556
adding back connectRequest as is needed to listen for new connectRequ…
albertolive Apr 25, 2024
8b081a3
Fixed tests, added e2e tests and improved code
albertolive Apr 26, 2024
58c563f
test
albertolive Apr 28, 2024
b394db3
test
albertolive Apr 28, 2024
471fc77
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 29, 2024
d2619e5
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 29, 2024
6acd368
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 29, 2024
8d52d28
FIx PW issue
albertolive Apr 29, 2024
c8f0c47
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 30, 2024
2a10cef
Merge branch 'develop' into MMI-4693-QR-code
albertolive Apr 30, 2024
0ad5890
remove console log
albertolive Apr 30, 2024
a1e90fb
Merge branch 'MMI-4693-QR-code' of https://github.com/MetaMask/metama…
albertolive Apr 30, 2024
0b42348
updated to tsx
albertolive Apr 30, 2024
5e113ab
move to tsx
albertolive Apr 30, 2024
3ff89a2
fix tsx
albertolive Apr 30, 2024
2124074
fixed tsx
albertolive Apr 30, 2024
5f9e120
fix lint
albertolive May 2, 2024
3703a12
Merge branch 'develop' into MMI-4693-QR-code
albertolive May 2, 2024
546abb6
lint issues
albertolive May 2, 2024
a4afe1b
fix lint
albertolive May 2, 2024
2e65fbe
fix lint
albertolive May 2, 2024
5eff79d
test
zone-live May 2, 2024
22b5e3a
test 2
zone-live May 2, 2024
74e41d2
clean up
zone-live May 2, 2024
38a9719
test 3
zone-live May 2, 2024
d63ae12
clean up test changes
zone-live May 2, 2024
5b29830
test logging element
zone-live May 2, 2024
014d577
test logging env var
zone-live May 2, 2024
9e19a21
clean up
zone-live May 2, 2024
8ecc17f
clean up
zone-live May 2, 2024
87761a1
updates visual snapshots
zone-live May 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions ui/components/institutional/qr-code-modal/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './qr-code-modal';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we convert this file to typescript too?

101 changes: 101 additions & 0 deletions ui/components/institutional/qr-code-modal/qr-code-modal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import React, { useState, useEffect, useContext } from 'react';
import PropTypes from 'prop-types';
import QRCode from 'qrcode.react';
import { Modal, ModalOverlay, Text, Box } from '../../component-library';
import { ModalContent } from '../../component-library/modal-content/modal-content';
import { ModalHeader } from '../../component-library/modal-header/modal-header';
import {
TextColor,
TextVariant,
} from '../../../helpers/constants/design-system';
import { I18nContext } from '../../../contexts/i18n';
import Spinner from '../../ui/spinner';

export default function QRCodeModal({ onClose, custodianName }) {
const t = useContext(I18nContext);
const [publicKeyData, setPublicKeyData] = useState(null);
const [error, setError] = useState('');

async function generatePublicKey() {
try {
const { publicKey } = await window.crypto.subtle.generateKey(
{
name: 'RSA-OAEP',
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: 'SHA-256',
},
true,
['encrypt', 'decrypt'],
);

const exportedPublicKey = await window.crypto.subtle.exportKey(
'spki',
publicKey,
);

const publicKeyBase64 = Buffer.from(exportedPublicKey)
.toString('base64')
.replace(/\+/gu, '-')
albertolive marked this conversation as resolved.
Show resolved Hide resolved
.replace(/\//gu, '_')
.replace(/[=]+$/u, '');

setPublicKeyData(publicKeyBase64);
} catch (e) {
console.error('Error generating public key:', e);
setError('Error generating public key. Please try again.');
}
}

useEffect(() => {
generatePublicKey();
}, []);

const qrCodeValue = JSON.stringify({
custodianName,
publicKey: publicKeyData,
});

return (
<Modal isOpen onClose={onClose}>
<ModalOverlay />
<ModalContent>
<ModalHeader onClose={onClose}>
{t('connectCustodianAccounts', [custodianName || 'custodian'])}
</ModalHeader>
<Text
as="p"
paddingRight={10}
paddingLeft={10}
paddingBottom={4}
color={TextColor.textDefault}
variant={TextVariant.bodySm}
>
{t('custodianQRCodeScan')}
</Text>
{error && <Text color={TextColor.error}>{error}</Text>}
{publicKeyData === null && (
<Spinner color="var(--color-warning-default)" />
)}
{publicKeyData && (
<Box
style={{
padding: 20,
backgroundColor: 'var(--qr-code-white-background)',
display: 'flex',
alignItems: 'center',
flexDirection: 'column',
}}
>
<QRCode value={qrCodeValue} size={270} />
</Box>
)}
</ModalContent>
</Modal>
);
}

QRCodeModal.propTypes = {
onClose: PropTypes.func.isRequired,
custodianName: PropTypes.string.isRequired,
};
17 changes: 16 additions & 1 deletion ui/pages/institutional/custody/custody.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,10 @@ import PulseLoader from '../../../components/ui/pulse-loader/pulse-loader';
import ConfirmConnectCustodianModal from '../confirm-connect-custodian-modal';
import { findCustodianByEnvName } from '../../../helpers/utils/institutional/find-by-custodian-name';
import { setSelectedAddress } from '../../../store/actions';
import QRCodeModal from '../../../components/institutional/qr-code-modal/qr-code-modal';

const GK8_DISPLAY_NAME = 'gk8';
const SATURN_DISPLAY_NAME = 'saturn custody';

const CustodyPage = () => {
const t = useI18nContext();
Expand Down Expand Up @@ -88,6 +90,7 @@ const CustodyPage = () => {
const [chainId, setChainId] = useState(parseInt(currentChainId, 16));
const connectRequests = useSelector(getInstitutionalConnectRequests, isEqual);
const [accounts, setAccounts] = useState();
const [showQRCodeModal, setShowQRCodeModal] = useState(false);
const address = useSelector(getSelectedAddress);
const connectRequest = connectRequests ? connectRequests[0] : undefined;
const isCheckBoxSelected =
Expand Down Expand Up @@ -148,7 +151,10 @@ const CustodyPage = () => {
setSelectedCustodianType(custodian.type);
} else {
setMatchedCustodian(custodianByDisplayName);
setIsConfirmConnectCustodianModalVisible(true);
custodianByDisplayName?.displayName?.toLocaleLowerCase() ===
SATURN_DISPLAY_NAME
albertolive marked this conversation as resolved.
Show resolved Hide resolved
? setShowQRCodeModal(true)
: setIsConfirmConnectCustodianModalVisible(true);
}

trackEvent({
Expand Down Expand Up @@ -701,6 +707,15 @@ const CustodyPage = () => {
}
/>
)}

{showQRCodeModal && (
<QRCodeModal
onClose={() => {
setShowQRCodeModal(false);
}}
custodianName={selectedCustodianDisplayName}
/>
)}
</Box>
);
};
Expand Down