2018-05-10 02:21:54 +02:00
|
|
|
// @flow
|
2018-10-29 18:23:53 +01:00
|
|
|
import * as MODALS from 'constants/modal_types';
|
|
|
|
import * as ICONS from 'constants/icons';
|
2018-05-10 04:47:08 +02:00
|
|
|
import * as React from 'react';
|
2019-06-13 06:18:35 +02:00
|
|
|
import { isURIValid } from 'lbry-redux';
|
2018-05-10 02:21:54 +02:00
|
|
|
import Button from 'component/button';
|
2019-06-09 08:57:51 +02:00
|
|
|
import ClaimLink from 'component/claimLink';
|
2019-07-04 13:23:22 +02:00
|
|
|
import { isLBRYDomain } from 'util/uri';
|
2018-05-10 02:21:54 +02:00
|
|
|
|
|
|
|
type Props = {
|
2018-05-11 07:40:24 +02:00
|
|
|
href: string,
|
2018-05-10 02:21:54 +02:00
|
|
|
title?: string,
|
2019-06-13 09:18:30 +02:00
|
|
|
embed?: boolean,
|
2018-05-10 02:21:54 +02:00
|
|
|
children: React.Node,
|
2018-10-29 18:23:53 +01:00
|
|
|
openModal: (id: string, { uri: string }) => void,
|
2018-05-10 02:21:54 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExternalLink extends React.PureComponent<Props> {
|
|
|
|
static defaultProps = {
|
|
|
|
href: null,
|
|
|
|
title: null,
|
2019-06-13 09:18:30 +02:00
|
|
|
embed: false,
|
2018-05-10 02:21:54 +02:00
|
|
|
};
|
2018-05-11 07:40:24 +02:00
|
|
|
|
|
|
|
createLink() {
|
2019-06-13 09:18:30 +02:00
|
|
|
const { href, title, embed, children, openModal } = this.props;
|
2018-05-11 07:40:24 +02:00
|
|
|
// Regex for url protocol
|
2019-05-30 01:21:20 +02:00
|
|
|
const protocolRegex = new RegExp('^(https?|lbry|mailto)+:', 'i');
|
2018-05-11 07:40:24 +02:00
|
|
|
const protocol = href ? protocolRegex.exec(href) : null;
|
|
|
|
// Return plain text if no valid url
|
|
|
|
let element = <span>{children}</span>;
|
|
|
|
// Return external link if protocol is http or https
|
2019-05-30 01:21:20 +02:00
|
|
|
if (protocol && (protocol[0] === 'http:' || protocol[0] === 'https:' || protocol[0] === 'mailto:')) {
|
2018-05-11 07:40:24 +02:00
|
|
|
element = (
|
|
|
|
<Button
|
|
|
|
button="link"
|
2019-01-22 21:36:28 +01:00
|
|
|
iconRight={ICONS.EXTERNAL}
|
2018-05-11 23:07:26 +02:00
|
|
|
title={title || href}
|
2018-06-21 03:33:00 +02:00
|
|
|
label={children}
|
2019-02-13 17:27:20 +01:00
|
|
|
className="button--external-link"
|
2019-07-04 13:23:22 +02:00
|
|
|
onClick={() => {
|
|
|
|
const isTrusted = isLBRYDomain(href);
|
|
|
|
openModal(MODALS.CONFIRM_EXTERNAL_RESOURCE, { uri: href, isTrusted: isTrusted });
|
|
|
|
}}
|
2018-06-21 03:33:00 +02:00
|
|
|
/>
|
2018-05-11 07:40:24 +02:00
|
|
|
);
|
|
|
|
}
|
2018-05-11 09:41:22 +02:00
|
|
|
// Return local link if protocol is lbry uri
|
2018-05-11 17:14:08 +02:00
|
|
|
if (protocol && protocol[0] === 'lbry:' && isURIValid(href)) {
|
2019-06-13 06:18:35 +02:00
|
|
|
element = (
|
2019-06-24 18:56:37 +02:00
|
|
|
<ClaimLink uri={href} autoEmbed={embed}>
|
2019-06-13 06:18:35 +02:00
|
|
|
{children}
|
|
|
|
</ClaimLink>
|
|
|
|
);
|
2018-05-11 09:41:22 +02:00
|
|
|
}
|
2018-05-11 08:29:53 +02:00
|
|
|
|
2018-05-11 07:40:24 +02:00
|
|
|
return element;
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const RenderLink = () => this.createLink();
|
|
|
|
return <RenderLink />;
|
2018-05-10 02:21:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default ExternalLink;
|