2020-10-20 19:10:02 +02:00
|
|
|
// @flow
|
|
|
|
import { KNOWN_APP_DOMAINS } from 'config';
|
|
|
|
import * as MODALS from 'constants/modal_types';
|
|
|
|
import * as ICONS from 'constants/icons';
|
|
|
|
import * as React from 'react';
|
|
|
|
import { isURIValid } from 'lbry-redux';
|
|
|
|
import Button from 'component/button';
|
|
|
|
import ClaimLink from 'component/claimLink';
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
href: string,
|
|
|
|
title?: string,
|
|
|
|
embed?: boolean,
|
|
|
|
children: React.Node,
|
|
|
|
openModal: (id: string, { uri: string }) => void,
|
|
|
|
parentCommentId?: string,
|
|
|
|
isMarkdownPost?: boolean,
|
2020-10-22 20:16:42 +02:00
|
|
|
simpleLinks?: boolean,
|
2020-10-20 19:10:02 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
function MarkdownLink(props: Props) {
|
2020-10-22 20:16:42 +02:00
|
|
|
const {
|
|
|
|
children,
|
|
|
|
href,
|
|
|
|
title,
|
|
|
|
embed = false,
|
|
|
|
openModal,
|
|
|
|
parentCommentId,
|
|
|
|
isMarkdownPost,
|
|
|
|
simpleLinks = false,
|
|
|
|
} = props;
|
2020-10-20 19:10:02 +02:00
|
|
|
const decodedUri = decodeURI(href);
|
|
|
|
if (!href) {
|
|
|
|
return children || null;
|
|
|
|
}
|
|
|
|
|
2020-10-22 20:06:28 +02:00
|
|
|
let element = <span>{children}</span>;
|
|
|
|
|
2020-10-20 19:10:02 +02:00
|
|
|
// Regex for url protocol
|
|
|
|
const protocolRegex = new RegExp('^(https?|lbry|mailto)+:', 'i');
|
|
|
|
const protocol = href ? protocolRegex.exec(href) : null;
|
2020-10-22 20:06:28 +02:00
|
|
|
|
2020-10-23 00:09:17 +02:00
|
|
|
let linkUrlObject;
|
|
|
|
try {
|
|
|
|
linkUrlObject = new URL(decodedUri);
|
|
|
|
} catch (e) {}
|
|
|
|
|
|
|
|
let lbryUrlFromLink;
|
|
|
|
if (linkUrlObject) {
|
2020-10-22 20:06:28 +02:00
|
|
|
const linkDomain = linkUrlObject.host;
|
|
|
|
const isKnownAppDomainLink = KNOWN_APP_DOMAINS.includes(linkDomain);
|
|
|
|
if (isKnownAppDomainLink) {
|
|
|
|
const linkPathname = decodeURIComponent(
|
|
|
|
linkUrlObject.pathname.startsWith('//') ? linkUrlObject.pathname.slice(2) : linkUrlObject.pathname.slice(1)
|
|
|
|
);
|
2020-10-23 19:14:12 +02:00
|
|
|
|
|
|
|
const linkPathPlusHash = linkPathname + linkUrlObject.hash;
|
|
|
|
const possibleLbryUrl = `lbry://${linkPathPlusHash.replace(/:/g, '#')}`;
|
|
|
|
|
2020-10-22 20:06:28 +02:00
|
|
|
const lbryLinkIsValid = isURIValid(possibleLbryUrl);
|
|
|
|
if (lbryLinkIsValid) {
|
|
|
|
lbryUrlFromLink = possibleLbryUrl;
|
|
|
|
}
|
2020-10-20 19:10:02 +02:00
|
|
|
}
|
2020-10-23 00:09:17 +02:00
|
|
|
}
|
2020-10-20 19:10:02 +02:00
|
|
|
|
2020-10-23 00:09:17 +02:00
|
|
|
// Return plain text if no valid url
|
|
|
|
// Return external link if protocol is http or https
|
|
|
|
// Return local link if protocol is lbry uri
|
2020-10-23 16:30:11 +02:00
|
|
|
if (!simpleLinks && ((protocol && protocol[0] === 'lbry:' && isURIValid(decodedUri)) || lbryUrlFromLink)) {
|
2020-10-20 19:10:02 +02:00
|
|
|
element = (
|
|
|
|
<ClaimLink
|
|
|
|
uri={lbryUrlFromLink || decodedUri}
|
|
|
|
autoEmbed={embed}
|
|
|
|
parentCommentId={parentCommentId}
|
|
|
|
isMarkdownPost={isMarkdownPost}
|
|
|
|
>
|
|
|
|
{children}
|
|
|
|
</ClaimLink>
|
|
|
|
);
|
2020-10-22 20:16:42 +02:00
|
|
|
} else if (
|
|
|
|
simpleLinks ||
|
|
|
|
(protocol && (protocol[0] === 'http:' || protocol[0] === 'https:' || protocol[0] === 'mailto:'))
|
|
|
|
) {
|
2020-10-22 20:30:40 +02:00
|
|
|
const isLbryLink = href.startsWith('lbry://');
|
|
|
|
|
2020-10-20 19:10:02 +02:00
|
|
|
element = (
|
|
|
|
<Button
|
|
|
|
button="link"
|
2020-10-22 20:30:40 +02:00
|
|
|
iconRight={isLbryLink ? undefined : ICONS.EXTERNAL}
|
2020-10-20 19:10:02 +02:00
|
|
|
title={title || decodedUri}
|
|
|
|
label={children}
|
|
|
|
className="button--external-link"
|
2020-10-22 20:30:40 +02:00
|
|
|
navigate={isLbryLink ? href : undefined}
|
2020-10-20 19:10:02 +02:00
|
|
|
onClick={() => {
|
2020-10-22 20:30:40 +02:00
|
|
|
if (!isLbryLink) {
|
|
|
|
openModal(MODALS.CONFIRM_EXTERNAL_RESOURCE, { uri: href, isTrusted: false });
|
|
|
|
}
|
2020-10-20 19:10:02 +02:00
|
|
|
}}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return <>{element}</>;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default MarkdownLink;
|