// @flow import * as ICONS from 'constants/icons'; import * as PAGES from 'constants/pages'; import React from 'react'; import Button from 'component/button'; import CopyableText from 'component/copyableText'; import EmbedTextArea from 'component/embedTextArea'; import Spinner from 'component/spinner'; import { generateDownloadUrl, generateNewestUrl } from 'util/web'; import { useIsMobile } from 'effects/use-screensize'; import { FormField } from 'component/common/form'; import { hmsToSeconds, secondsToHms } from 'util/time'; import { generateLbryContentUrl, generateLbryWebUrl, generateEncodedLbryURL, generateShareUrl, generateRssUrl, } from 'util/url'; import { URL, TWITTER_ACCOUNT, SHARE_DOMAIN_URL } from 'config'; const SHARE_DOMAIN = SHARE_DOMAIN_URL || URL; const IOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform); const SUPPORTS_SHARE_API = typeof navigator.share !== 'undefined'; // Twitter share const TWITTER_INTENT_API = 'https://twitter.com/intent/tweet?'; type Props = { claim: StreamClaim, title: ?string, webShareable: boolean, inviteStatusFetched: boolean, referralCode: string, user: any, position: number, collectionId?: number, doFetchInviteStatus: (boolean) => void, disableDownloadButton: boolean, isMature: boolean, }; function SocialShare(props: Props) { const { claim, title, inviteStatusFetched, referralCode, user, webShareable, position, collectionId, doFetchInviteStatus, disableDownloadButton, isMature, } = props; const [showEmbed, setShowEmbed] = React.useState(false); const [includeCollectionId, setIncludeCollectionId] = React.useState(Boolean(collectionId)); // unless it *is* a collection? const [showClaimLinks, setShowClaimLinks] = React.useState(false); const [includeStartTime, setincludeStartTime]: [boolean, any] = React.useState(false); const [startTime, setStartTime]: [string, any] = React.useState(secondsToHms(position)); const startTimeSeconds: number = hmsToSeconds(startTime); const isMobile = useIsMobile(); React.useEffect(() => { if (!inviteStatusFetched) { doFetchInviteStatus(false); } }, [inviteStatusFetched, doFetchInviteStatus]); if (!claim) { return null; } else if (!inviteStatusFetched) { return (
); } const { canonical_url: canonicalUrl, permanent_url: permanentUrl, name, claim_id: claimId } = claim; const isChannel = claim.value_type === 'channel'; const isCollection = claim.value_type === 'collection'; const isStream = claim.value_type === 'stream'; const isVideo = isStream && claim.value.stream_type === 'video'; const isAudio = isStream && claim.value.stream_type === 'audio'; const showStartAt = isVideo || isAudio; const rewardsApproved = user && user.is_reward_approved; const lbryUrl: string = generateLbryContentUrl(canonicalUrl, permanentUrl); const lbryWebUrl: string = generateLbryWebUrl(lbryUrl); const rssUrl = isChannel && generateRssUrl(SHARE_DOMAIN, claim); const includedCollectionId = collectionId && includeCollectionId ? collectionId : null; const encodedLbryURL: string = generateEncodedLbryURL( SHARE_DOMAIN, lbryWebUrl, includeStartTime, startTimeSeconds, includedCollectionId ); const shareUrl: string = generateShareUrl( SHARE_DOMAIN, lbryUrl, referralCode, rewardsApproved, includeStartTime, startTimeSeconds, includedCollectionId ); const downloadUrl = `${generateDownloadUrl(name, claimId)}`; // Tweet params let tweetIntentParams = { url: shareUrl, text: title || claim.name, hashtags: 'Odysee', }; if (TWITTER_ACCOUNT) { // $FlowFixMe tweetIntentParams.via = TWITTER_ACCOUNT; } // Generate twitter web intent url const tweetIntent = TWITTER_INTENT_API + new URLSearchParams(tweetIntentParams).toString(); function handleWebShareClick() { if (navigator.share) { navigator.share({ title: title || claim.name, url: window.location.href, }); } } return ( {showStartAt && (
setincludeStartTime(!includeStartTime)} checked={includeStartTime} label={__('Start at')} /> setStartTime(event.target.value)} />
)} {Boolean(collectionId) && (
setIncludeCollectionId(!includeCollectionId)} checked={includeCollectionId} label={__('Include List ID')} />
)}
{SUPPORTS_SHARE_API && isMobile && (
)} {showEmbed && (!isChannel ? ( ) : ( <> ))} {showClaimLinks && (
{Boolean(isStream) && !disableDownloadButton && !isMature && ( )} {Boolean(rssUrl) && } {Boolean(isChannel) && ( <> )}
)}
); } export default SocialShare;