1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-23 02:10:12 +01:00
metamask-extension/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.tsx
Danica Shen a85a4cf97e
feat(878): add new incomingTxn component and change styles of settings (#20374)
* feat(878): add new incomingTxn component and change styles of settings

* feat(878): relocate openSea tab from rebase regression

* feat(878): make UI and test modifications

* feat(878): transfer to ts

* feat(878): rename network-toggle.tsx
2023-08-04 12:33:47 +01:00

146 lines
4.3 KiB
TypeScript

import React, { useContext, useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import { I18nContext } from '../../../contexts/i18n';
import ToggleButton from '../../ui/toggle-button';
import { Box, Text } from '../../component-library';
import {
Display,
FlexDirection,
JustifyContent,
TextVariant,
FontWeight,
TextColor,
} from '../../../helpers/constants/design-system';
import { PolymorphicRef } from '../../component-library/box';
import { TEST_CHAINS } from '../../../../shared/constants/network';
import NetworkToggle from './network-toggle';
interface IncomingTransactionToggleProps {
wrapperRef: PolymorphicRef<any>;
incomingTransactionsPreferences: Record<string, boolean>;
allNetworks: [Record<string, any>];
setIncomingTransactionsPreferences: (
chainId: string,
isAllEnabledValue: boolean,
) => void;
}
const IncomingTransactionToggle = ({
wrapperRef,
incomingTransactionsPreferences,
allNetworks,
setIncomingTransactionsPreferences,
}: IncomingTransactionToggleProps) => {
const t = useContext(I18nContext);
const [networkPreferences, setNetworkPreferences] = useState(
generateIncomingNetworkPreferences(
incomingTransactionsPreferences,
allNetworks,
),
);
const [isAllEnabled, setIsAllEnabled] = useState(
checkAllNetworks(incomingTransactionsPreferences),
);
useEffect(() => {
setNetworkPreferences(
generateIncomingNetworkPreferences(
incomingTransactionsPreferences,
allNetworks,
),
);
}, [incomingTransactionsPreferences, allNetworks]);
useEffect(() => {
setIsAllEnabled(checkAllNetworks(incomingTransactionsPreferences));
}, [incomingTransactionsPreferences]);
const toggleAllEnabled = (isAllEnabledValue: boolean): void => {
Object.keys(incomingTransactionsPreferences).forEach((chainId) => {
if (incomingTransactionsPreferences[chainId] !== isAllEnabledValue) {
setIncomingTransactionsPreferences(chainId, isAllEnabledValue);
}
});
};
const toggleSingleNetwork = (chainId: string, value: boolean): void => {
setIncomingTransactionsPreferences(chainId, value);
};
return (
<Box ref={wrapperRef} className="mm-incoming-transaction-toggle">
<Text variant={TextVariant.bodyLgMedium} fontWeight={FontWeight.Bold}>
{t('showIncomingTransactions')}
</Text>
<Text variant={TextVariant.bodyMd} color={TextColor.textAlternative}>
{t('showIncomingTransactionsInformation')}
</Text>
<Box
marginTop={3}
display={Display.Flex}
flexDirection={FlexDirection.Row}
justifyContent={JustifyContent.spaceBetween}
data-testid="incoming-transaction-toggle-enable-all"
>
<Text variant={TextVariant.bodyMd}> {t('enableForAllNetworks')}</Text>
<ToggleButton
value={isAllEnabled}
onToggle={(value) => toggleAllEnabled(!value)}
offLabel={t('off')}
onLabel={t('on')}
/>
</Box>
{Object.keys(networkPreferences).map((chainId, index) => {
return (
<NetworkToggle
key={index}
chainId={chainId}
networkPreferences={networkPreferences[chainId]}
toggleSingleNetwork={toggleSingleNetwork}
/>
);
})}
</Box>
);
};
export default IncomingTransactionToggle;
IncomingTransactionToggle.propTypes = {
wrapperRef: PropTypes.object,
incomingTransactionsPreferences: PropTypes.object.isRequired,
allNetworks: PropTypes.array.isRequired,
setIncomingTransactionsPreferences: PropTypes.func.isRequired,
};
function generateIncomingNetworkPreferences(
incomingTransactionsPreferences: Record<string, boolean>,
allNetworks: Record<string, any>,
): Record<string, any> {
const incomingTxnPreferences: Record<string, any> = {};
Object.keys(allNetworks).forEach((id) => {
const { chainId } = allNetworks[id];
incomingTxnPreferences[chainId] = {
isShowIncomingTransactions: incomingTransactionsPreferences[chainId],
isATestNetwork: TEST_CHAINS.includes(chainId),
label: allNetworks[id].nickname,
imageUrl: allNetworks[id].rpcPrefs?.imageUrl,
};
});
return incomingTxnPreferences;
}
function checkAllNetworks(
incomingTransactionsPreferences: Record<string, boolean>,
): boolean {
return Object.values(incomingTransactionsPreferences).every(Boolean);
}