1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Enhance reusable SiteOrigin component (#14720)

* extend and reuse SiteOrigin component
This commit is contained in:
Alex Donesky 2022-05-20 09:35:18 -05:00 committed by GitHub
parent 3964940156
commit 634cf70a71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 103 additions and 49 deletions

View File

@ -14,6 +14,7 @@ import NicknamePopovers from '../../../modals/nickname-popovers';
import Typography from '../../../../ui/typography'; import Typography from '../../../../ui/typography';
import { TYPOGRAPHY } from '../../../../../helpers/constants/design-system'; import { TYPOGRAPHY } from '../../../../../helpers/constants/design-system';
import { ORIGIN_METAMASK } from '../../../../../../shared/constants/app'; import { ORIGIN_METAMASK } from '../../../../../../shared/constants/app';
import SiteOrigin from '../../../../ui/site-origin';
const ConfirmPageContainerSummary = (props) => { const ConfirmPageContainerSummary = (props) => {
const { const {
@ -85,7 +86,10 @@ const ConfirmPageContainerSummary = (props) => {
return ( return (
<div className={classnames('confirm-page-container-summary', className)}> <div className={classnames('confirm-page-container-summary', className)}>
{origin === ORIGIN_METAMASK ? null : ( {origin === ORIGIN_METAMASK ? null : (
<div className="confirm-page-container-summary__origin">{origin}</div> <SiteOrigin
className="confirm-page-container-summary__origin"
siteOrigin={origin}
/>
)} )}
<div className="confirm-page-container-summary__action-row"> <div className="confirm-page-container-summary__action-row">
<div className="confirm-page-container-summary__action"> <div className="confirm-page-container-summary__action">

View File

@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
import Button from '../../ui/button'; import Button from '../../ui/button';
import SiteIcon from '../../ui/site-icon'; import SiteIcon from '../../ui/site-icon';
import { stripHttpsSchemeWithoutPort } from '../../../helpers/utils/util'; import { stripHttpsSchemeWithoutPort } from '../../../helpers/utils/util';
import SiteOrigin from '../../ui/site-origin';
export default class ConnectedSitesList extends Component { export default class ConnectedSitesList extends Component {
static contextTypes = { static contextTypes = {
@ -33,12 +34,11 @@ export default class ConnectedSitesList extends Component {
> >
<div className="connected-sites-list__subject-info"> <div className="connected-sites-list__subject-info">
<SiteIcon icon={subject.iconUrl} name={subject.name} size={32} /> <SiteIcon icon={subject.iconUrl} name={subject.name} size={32} />
<span <SiteOrigin
className="connected-sites-list__subject-name" className="connected-sites-list__subject-name"
title={subject.extensionId || subject.origin} title={subject.extensionId || subject.origin}
> siteOrigin={this.getSubjectDisplayName(subject)}
{this.getSubjectDisplayName(subject)} />
</span>
</div> </div>
<Button <Button
className="connected-sites-list__content-row-link-button" className="connected-sites-list__content-row-link-button"

View File

@ -34,10 +34,6 @@
&__subject-name { &__subject-name {
max-width: 215px; max-width: 215px;
white-space: nowrap;
overflow: hidden;
direction: rtl;
text-overflow: ellipsis;
margin-left: 6px; margin-left: 6px;
} }
} }

View File

@ -170,8 +170,6 @@
&__origin { &__origin {
margin-left: 5px; margin-left: 5px;
overflow: hidden;
text-overflow: ellipsis;
} }
&__notice, &__notice,

View File

@ -13,6 +13,7 @@ import AccountListItem from '../account-list-item';
import { conversionUtil } from '../../../../shared/modules/conversion.utils'; import { conversionUtil } from '../../../../shared/modules/conversion.utils';
import Button from '../../ui/button'; import Button from '../../ui/button';
import SiteIcon from '../../ui/site-icon'; import SiteIcon from '../../ui/site-icon';
import SiteOrigin from '../../ui/site-origin';
export default class SignatureRequestOriginal extends Component { export default class SignatureRequestOriginal extends Component {
static contextTypes = { static contextTypes = {
@ -148,9 +149,10 @@ export default class SignatureRequestOriginal extends Component {
size={24} size={24}
/> />
) : null} ) : null}
<div className="request-signature__origin"> <SiteOrigin
{txData.msgParams.origin} className="request-signature__origin"
</div> siteOrigin={txData.msgParams.origin}
/>
</div> </div>
); );
}; };

View File

@ -68,6 +68,8 @@
&__info { &__info {
@include H7; @include H7;
padding: 0 12px 4px;
} }
&__info--bolded { &__info--bolded {

View File

@ -4,6 +4,7 @@ import Identicon from '../../ui/identicon';
import LedgerInstructionField from '../ledger-instruction-field'; import LedgerInstructionField from '../ledger-instruction-field';
import { sanitizeMessage } from '../../../helpers/utils/util'; import { sanitizeMessage } from '../../../helpers/utils/util';
import { EVENT } from '../../../../shared/constants/metametrics'; import { EVENT } from '../../../../shared/constants/metametrics';
import SiteOrigin from '../../ui/site-origin';
import Header from './signature-request-header'; import Header from './signature-request-header';
import Footer from './signature-request-footer'; import Footer from './signature-request-footer';
import Message from './signature-request-message'; import Message from './signature-request-message';
@ -124,7 +125,10 @@ export default class SignatureRequest extends PureComponent {
<div className="signature-request-content__info--bolded"> <div className="signature-request-content__info--bolded">
{domain.name} {domain.name}
</div> </div>
<div className="signature-request-content__info">{origin}</div> <SiteOrigin
className="signature-request-content__info"
siteOrigin={origin}
/>
<div className="signature-request-content__info"> <div className="signature-request-content__info">
{this.formatWallet(fromAddress)} {this.formatWallet(fromAddress)}
</div> </div>

View File

@ -53,15 +53,9 @@
margin: 0 4px; margin: 0 4px;
} }
&__origin,
&__address { &__address {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
&__origin {
/*rtl:ignore*/
direction: rtl;
}
} }

View File

@ -14,6 +14,7 @@ import {
import CancelButton from '../cancel-button'; import CancelButton from '../cancel-button';
import { cancelSwapsSmartTransaction } from '../../../ducks/swaps/swaps'; import { cancelSwapsSmartTransaction } from '../../../ducks/swaps/swaps';
import SiteOrigin from '../../ui/site-origin';
export default function SmartTransactionListItem({ export default function SmartTransactionListItem({
smartTransaction, smartTransaction,
@ -60,9 +61,11 @@ export default function SmartTransactionListItem({
date={date} date={date}
status={displayedStatusKey} status={displayedStatusKey}
/> />
<span className="transaction-list-item__origin" title={subtitle}> <SiteOrigin
{subtitle} className="transaction-list-item__origin"
</span> siteOrigin={subtitle}
title={subtitle}
/>
</h3> </h3>
} }
> >

View File

@ -39,6 +39,7 @@ import CancelSpeedupPopover from '../cancel-speedup-popover';
import EditGasFeePopover from '../edit-gas-fee-popover'; import EditGasFeePopover from '../edit-gas-fee-popover';
import EditGasPopover from '../edit-gas-popover'; import EditGasPopover from '../edit-gas-popover';
import { MetaMetricsContext } from '../../../contexts/metametrics'; import { MetaMetricsContext } from '../../../contexts/metametrics';
import SiteOrigin from '../../ui/site-origin';
function TransactionListItemInner({ function TransactionListItemInner({
transactionGroup, transactionGroup,
@ -191,16 +192,13 @@ function TransactionListItemInner({
date={date} date={date}
status={displayedStatusKey} status={displayedStatusKey}
/> />
<span {subtitleContainsOrigin ? (
className={ <SiteOrigin siteOrigin={subtitle} />
subtitleContainsOrigin ) : (
? 'transaction-list-item__origin' <span className="transaction-list-item__address" title={subtitle}>
: 'transaction-list-item__address' {subtitle}
} </span>
title={subtitle} )}
>
{subtitle}
</span>
</h3> </h3>
} }
rightContent={ rightContent={

View File

@ -1,12 +1,13 @@
.site-origin { .site-origin {
overflow: hidden;
max-width: 100%; max-width: 100%;
.chip { .chip {
max-width: 100%; max-width: 100%;
}
.chip__left-icon { &__left-icon {
padding: 4px 0 4px 8px; padding: 4px 0 4px 8px;
}
} }
span { span {
@ -17,5 +18,6 @@
/*rtl:ignore*/ /*rtl:ignore*/
direction: rtl; direction: rtl;
max-width: 100%;
} }
} }

View File

@ -1,22 +1,60 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classnames from 'classnames';
import Chip from '../chip'; import Chip from '../chip';
import IconWithFallback from '../icon-with-fallback'; import IconWithFallback from '../icon-with-fallback';
export default function SiteOrigin({ siteOrigin, iconSrc, iconName }) { export default function SiteOrigin({
siteOrigin,
iconSrc,
iconName,
chip,
className,
title,
}) {
return ( return (
<div className="site-origin"> <div className={classnames('site-origin', className)} title={title}>
<Chip {chip ? (
label={siteOrigin} <Chip
maxContent={false} label={siteOrigin}
leftIcon={<IconWithFallback icon={iconSrc} name={iconName} size={32} />} maxContent={false}
/> leftIcon={
<IconWithFallback icon={iconSrc} name={iconName} size={32} />
}
/>
) : (
<span>{siteOrigin}</span>
)}
</div> </div>
); );
} }
SiteOrigin.propTypes = { SiteOrigin.propTypes = {
/**
* The origin of the site generally the URL
*/
siteOrigin: PropTypes.string.isRequired, siteOrigin: PropTypes.string.isRequired,
/**
* Icon name is used for the fallback icon and will display the first letter of the string
* when iconSrc errors or is not provided.
*/
iconName: PropTypes.string, iconName: PropTypes.string,
/**
* The image src of the icon
*/
iconSrc: PropTypes.string, iconSrc: PropTypes.string,
/**
* Additional className added to the root html element
*/
className: PropTypes.string,
/**
* title specifies extra information and is added to a title attribute added to the root html element
* It is most often shown as a tooltip text when the mouse moves over the element.
*/
title: PropTypes.string,
/**
* Whether the SiteOrigin is displayed as a chip or plain text.
* if false iconSrc and iconName props will not be used.
*/
chip: PropTypes.bool,
}; };

View File

@ -16,6 +16,12 @@ export default {
iconName: { iconName: {
control: 'text', control: 'text',
}, },
title: {
control: 'text',
},
chip: {
control: 'boolean',
},
}, },
}; };
@ -25,6 +31,8 @@ DefaultStory.storyName = 'Default';
DefaultStory.args = { DefaultStory.args = {
siteOrigin: 'https://metamask.io', siteOrigin: 'https://metamask.io',
title: 'https://metamask.io',
iconName: 'MetaMask', iconName: 'MetaMask',
iconSrc: './metamark.svg', iconSrc: './metamark.svg',
chip: true,
}; };

View File

@ -7,6 +7,7 @@ import Identicon from '../../components/ui/identicon';
import { EVENT } from '../../../shared/constants/metametrics'; import { EVENT } from '../../../shared/constants/metametrics';
import { conversionUtil } from '../../../shared/modules/conversion.utils'; import { conversionUtil } from '../../../shared/modules/conversion.utils';
import SiteOrigin from '../../components/ui/site-origin';
export default class ConfirmEncryptionPublicKey extends Component { export default class ConfirmEncryptionPublicKey extends Component {
static contextTypes = { static contextTypes = {
@ -118,7 +119,9 @@ export default class ConfirmEncryptionPublicKey extends Component {
const { t } = this.context; const { t } = this.context;
const targetSubjectMetadata = subjectMetadata[txData.origin]; const targetSubjectMetadata = subjectMetadata[txData.origin];
const notice = t('encryptionPublicKeyNotice', [txData.origin]); const notice = t('encryptionPublicKeyNotice', [
<SiteOrigin siteOrigin={txData.origin} key={txData.origin} />,
]);
const name = targetSubjectMetadata?.hostname || txData.origin; const name = targetSubjectMetadata?.hostname || txData.origin;
return ( return (

View File

@ -198,6 +198,7 @@
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
flex: 1; flex: 1;
width: 100%;
} }
&-identicon { &-identicon {

View File

@ -10,7 +10,6 @@ import { useHistory } from 'react-router-dom';
import { isEqual } from 'lodash'; import { isEqual } from 'lodash';
import { produce } from 'immer'; import { produce } from 'immer';
import Box from '../../components/ui/box'; import Box from '../../components/ui/box';
import Chip from '../../components/ui/chip';
import MetaMaskTemplateRenderer from '../../components/app/metamask-template-renderer'; import MetaMaskTemplateRenderer from '../../components/app/metamask-template-renderer';
import SiteIcon from '../../components/ui/site-icon'; import SiteIcon from '../../components/ui/site-icon';
import { DEFAULT_ROUTE } from '../../helpers/constants/routes'; import { DEFAULT_ROUTE } from '../../helpers/constants/routes';
@ -25,6 +24,7 @@ import { useOriginMetadata } from '../../hooks/useOriginMetadata';
import { getUnapprovedTemplatedConfirmations } from '../../selectors'; import { getUnapprovedTemplatedConfirmations } from '../../selectors';
import NetworkDisplay from '../../components/app/network-display/network-display'; import NetworkDisplay from '../../components/app/network-display/network-display';
import Callout from '../../components/ui/callout'; import Callout from '../../components/ui/callout';
import SiteOrigin from '../../components/ui/site-origin';
import ConfirmationFooter from './components/confirmation-footer'; import ConfirmationFooter from './components/confirmation-footer';
import { getTemplateValues, getTemplateAlerts } from './templates'; import { getTemplateValues, getTemplateAlerts } from './templates';
@ -208,9 +208,10 @@ export default function ConfirmationPage() {
name={originMetadata.hostname} name={originMetadata.hostname}
size={36} size={36}
/> />
<Chip <SiteOrigin
label={stripHttpsScheme(originMetadata.origin)} chip
borderColor={COLORS.BORDER_DEFAULT} siteOrigin={stripHttpsScheme(originMetadata.origin)}
title={stripHttpsScheme(originMetadata.origin)}
/> />
</Box> </Box>
<MetaMaskTemplateRenderer sections={templatedValues.content} /> <MetaMaskTemplateRenderer sections={templatedValues.content} />