1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-02 06:07:06 +01:00
metamask-extension/ui/components/institutional/interactive-replacement-token-notification/interactive-replacement-token-notification.js
Albert Olivé 47fe542273
[MMI] Review interactive replacement token flow (#19974)
* Sending showCustodyConfirmLink as a prop and fixing other issues

* Upgraded MMI extension monrepo and trying to fix the issue

* prevents deeplink from closing

* Fixed styles of Custody view and changed the place of it

* Fixed CI issues

* fixing eslint issues

* Update LavaMoat policies

* fixing tests

* Fixed test

* updated snapshots

* Improving IRT flow

* Fixing everything

* Finish fixing all issues

* Fixed institutional entity done page styles

* Fixing boxes

* Fixed issue with checkbox

* Fixed tests and styles

* Removed duplicated lodash

* updated snapshot

* Fixing tests

* Removed unused test

* Fixed snapshot

* Fixed snapshot

---------

Co-authored-by: Antonio Regadas <antonio.regadas@consensys.net>
Co-authored-by: MetaMask Bot <metamaskbot@users.noreply.github.com>
2023-07-13 18:27:49 +02:00

136 lines
4.1 KiB
JavaScript

import React, { useState, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import { getCurrentKeyring, getSelectedAddress } from '../../../selectors';
import { getInteractiveReplacementToken } from '../../../selectors/institutional/selectors';
import { getIsUnlocked } from '../../../ducks/metamask/metamask';
import { useI18nContext } from '../../../hooks/useI18nContext';
import { mmiActionsFactory } from '../../../store/institutional/institution-background';
import { showInteractiveReplacementTokenModal } from '../../../store/institutional/institution-actions';
import { sha256 } from '../../../../shared/modules/hash.utils';
import {
Size,
IconColor,
AlignItems,
Display,
BlockSize,
JustifyContent,
TextColor,
TextVariant,
BackgroundColor,
} from '../../../helpers/constants/design-system';
import {
Icon,
IconName,
IconSize,
ButtonLink,
Text,
Box,
} from '../../component-library';
const InteractiveReplacementTokenNotification = ({ isVisible }) => {
const t = useI18nContext();
const dispatch = useDispatch();
const mmiActions = mmiActionsFactory();
const keyring = useSelector(getCurrentKeyring);
const address = useSelector(getSelectedAddress);
const isUnlocked = useSelector(getIsUnlocked);
const interactiveReplacementToken = useSelector(
getInteractiveReplacementToken,
);
const [showNotification, setShowNotification] = useState(isVisible);
useEffect(() => {
const handleShowNotification = async () => {
const hasInteractiveReplacementToken =
interactiveReplacementToken &&
Boolean(Object.keys(interactiveReplacementToken).length);
if (!/^Custody/u.test(keyring.type) || !hasInteractiveReplacementToken) {
setShowNotification(false);
return;
}
const token = await dispatch(mmiActions.getCustodianToken());
const custodyAccountDetails = await dispatch(
mmiActions.getAllCustodianAccountsWithToken(
keyring.type.split(' - ')[1],
token,
),
);
const showNotificationValue =
isUnlocked &&
interactiveReplacementToken.oldRefreshToken &&
custodyAccountDetails &&
Boolean(Object.keys(custodyAccountDetails).length);
let tokenAccount;
if (Array.isArray(custodyAccountDetails)) {
tokenAccount = custodyAccountDetails
.filter(
(item) => item.address.toLowerCase() === address.toLowerCase(),
)
.map((item) => ({
token: item.authDetails?.refreshToken,
}))[0];
}
const refreshTokenAccount = await sha256(
tokenAccount?.token + interactiveReplacementToken.url,
);
setShowNotification(
showNotificationValue &&
refreshTokenAccount === interactiveReplacementToken.oldRefreshToken,
);
};
handleShowNotification();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [address, interactiveReplacementToken.oldRefreshToken, isUnlocked]);
return showNotification ? (
<Box
width={BlockSize.Full}
display={Display.Flex}
justifyContent={JustifyContent.center}
alignItems={AlignItems.center}
padding={[1, 2]}
backgroundColor={BackgroundColor.backgroundAlternative}
className="interactive-replacement-token-notification"
data-testid="interactive-replacement-token-notification"
>
<Icon
name={IconName.Danger}
color={IconColor.errorDefault}
size={IconSize.Md}
/>
<Text variant={TextVariant.bodySm} gap={2} color={TextColor.errorDefault}>
{t('custodySessionExpired')}
</Text>
<Text variant={TextVariant.bodySm}>
<ButtonLink
data-testid="show-modal"
size={Size.inherit}
marginLeft={1}
onClick={() => {
dispatch(showInteractiveReplacementTokenModal());
}}
>
{t('learnMoreUpperCase')}
</ButtonLink>
</Text>
</Box>
) : null;
};
export default InteractiveReplacementTokenNotification;
InteractiveReplacementTokenNotification.propTypes = {
isVisible: PropTypes.bool,
};