// @flow import { KNOWN_APP_DOMAINS, SIMPLE_SITE } from 'config'; 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, allowPreview?: boolean, children: React.Node, parentCommentId?: string, isMarkdownPost?: boolean, simpleLinks?: boolean, }; function MarkdownLink(props: Props) { const { children, href, title, embed = false, allowPreview = false, parentCommentId, isMarkdownPost, simpleLinks = false, } = props; let decodedUri; try { decodedUri = decodeURI(href); } catch (e) {} if (!href || !decodedUri) { return children || null; } let element = {children}; // Regex for url protocol const protocolRegex = new RegExp('^(https?|lbry|mailto)+:', 'i'); const protocol = href ? protocolRegex.exec(href) : null; const isLbryLink = href.startsWith('lbry://'); let linkUrlObject; try { linkUrlObject = new URL(decodedUri); } catch (e) {} let lbryUrlFromLink; if (linkUrlObject && !href.startsWith('mailto:')) { const linkDomain = linkUrlObject.host; const isKnownAppDomainLink = KNOWN_APP_DOMAINS.includes(linkDomain); if (isKnownAppDomainLink) { let linkPathname; try { // This could be anything linkPathname = decodeURIComponent( linkUrlObject.pathname.startsWith('//') ? linkUrlObject.pathname.slice(2) : linkUrlObject.pathname.slice(1) ); } catch (e) {} const linkPathPlusHash = linkPathname ? `${linkPathname}${linkUrlObject.hash}` : undefined; const possibleLbryUrl = linkPathPlusHash ? `lbry://${linkPathPlusHash.replace(/:/g, '#')}` : undefined; const lbryLinkIsValid = possibleLbryUrl && isURIValid(possibleLbryUrl); const isMarkdownLinkWithLabel = children && Array.isArray(children) && React.Children.count(children) === 1 && children.toString() !== href; if (lbryLinkIsValid && !isMarkdownLinkWithLabel) { lbryUrlFromLink = possibleLbryUrl; } } } // Return timestamp link if it starts with '?t=' (only possible from remark-timestamp). // Return plain text if no valid url. // Return external link if protocol is http or https. // Return local link if protocol is lbry uri. if (href.startsWith('?t=')) { // Video timestamp markers element = (