2018-09-12 18:42:15 +02:00
|
|
|
// @flow
|
2018-11-26 02:21:25 +01:00
|
|
|
import * as ICONS from 'constants/icons';
|
|
|
|
import React from 'react';
|
2018-09-12 18:42:15 +02:00
|
|
|
import Button from 'component/button';
|
2018-10-04 15:39:14 +02:00
|
|
|
import CopyableText from 'component/copyableText';
|
2019-12-30 20:54:53 +01:00
|
|
|
import EmbedTextArea from 'component/embedTextArea';
|
2020-03-28 03:42:26 +01:00
|
|
|
import { generateDownloadUrl } from 'util/lbrytv';
|
2020-03-30 21:43:27 +02:00
|
|
|
import useIsMobile from 'effects/use-is-mobile';
|
2020-05-06 05:05:59 +02:00
|
|
|
import { FormField } from 'component/common/form';
|
|
|
|
import { hmsToSeconds, secondsToHms } from 'util/time';
|
|
|
|
import { generateLbryUrl, generateLbryWebUrl, generateEncodedLbryURL, generateOpenDotLbryDotComUrl } from 'util/url';
|
2020-03-27 19:57:03 +01:00
|
|
|
|
|
|
|
const IOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);
|
2020-03-30 21:43:27 +02:00
|
|
|
const SUPPORTS_SHARE_API = typeof navigator.share !== 'undefined';
|
2018-09-12 18:42:15 +02:00
|
|
|
|
|
|
|
type Props = {
|
2020-03-30 21:43:27 +02:00
|
|
|
claim: StreamClaim,
|
|
|
|
title: ?string,
|
2019-10-29 17:23:56 +01:00
|
|
|
webShareable: boolean,
|
2020-01-14 21:44:07 +01:00
|
|
|
referralCode: string,
|
|
|
|
user: any,
|
2020-05-06 05:05:59 +02:00
|
|
|
position: number,
|
2018-09-12 18:42:15 +02:00
|
|
|
};
|
|
|
|
|
2020-03-30 21:43:27 +02:00
|
|
|
function SocialShare(props: Props) {
|
2020-05-06 05:05:59 +02:00
|
|
|
const { claim, title, referralCode, user, webShareable, position } = props;
|
2020-03-30 21:43:27 +02:00
|
|
|
const [showEmbed, setShowEmbed] = React.useState(false);
|
|
|
|
const [showExtra, setShowExtra] = React.useState(false);
|
2020-05-06 05:05:59 +02:00
|
|
|
const [includeStartTime, setincludeStartTime]: [boolean, any] = React.useState(false);
|
|
|
|
const [startTime, setStartTime]: [string, any] = React.useState(secondsToHms(position));
|
|
|
|
const [startTimeSeconds, setStartTimeSeconds]: [number, any] = React.useState(Math.floor(position));
|
2020-03-30 21:43:27 +02:00
|
|
|
const isMobile = useIsMobile();
|
2018-09-12 18:42:15 +02:00
|
|
|
|
2020-05-06 05:05:59 +02:00
|
|
|
let canonicalUrl = 'lbry://';
|
|
|
|
let permanentUrl = 'lbry://';
|
|
|
|
let name = '';
|
|
|
|
let claimId = '';
|
|
|
|
|
|
|
|
if (claim) {
|
|
|
|
canonicalUrl = claim.canonical_url;
|
|
|
|
permanentUrl = claim.permanent_url;
|
|
|
|
name = claim.name;
|
|
|
|
claimId = claim.claim_id;
|
2018-09-12 18:42:15 +02:00
|
|
|
}
|
|
|
|
|
2020-03-30 21:43:27 +02:00
|
|
|
const isChannel = claim.value_type === 'channel';
|
|
|
|
const rewardsApproved = user && user.is_reward_approved;
|
|
|
|
const OPEN_URL = 'https://open.lbry.com/';
|
2020-05-06 05:05:59 +02:00
|
|
|
const lbryUrl: string = generateLbryUrl(canonicalUrl, permanentUrl);
|
|
|
|
const lbryWebUrl: string = generateLbryWebUrl(lbryUrl);
|
|
|
|
const [encodedLbryURL, setEncodedLbryURL]: [string, any] = React.useState(
|
|
|
|
generateEncodedLbryURL(OPEN_URL, lbryWebUrl, includeStartTime, startTime)
|
|
|
|
);
|
|
|
|
const [openDotLbryDotComUrl, setOpenDotLbryDotComUrl]: [string, any] = React.useState(
|
|
|
|
generateOpenDotLbryDotComUrl(
|
|
|
|
OPEN_URL,
|
|
|
|
lbryWebUrl,
|
|
|
|
canonicalUrl,
|
|
|
|
permanentUrl,
|
|
|
|
referralCode,
|
|
|
|
rewardsApproved,
|
|
|
|
includeStartTime,
|
|
|
|
startTime
|
|
|
|
)
|
|
|
|
);
|
2020-03-30 21:43:27 +02:00
|
|
|
const downloadUrl = `${generateDownloadUrl(name, claimId)}`;
|
2018-09-12 18:42:15 +02:00
|
|
|
|
2020-05-06 05:05:59 +02:00
|
|
|
if (!claim) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-03-30 21:43:27 +02:00
|
|
|
function handleWebShareClick() {
|
|
|
|
if (navigator.share) {
|
|
|
|
navigator.share({
|
|
|
|
title: title || claim.name,
|
|
|
|
url: window.location.href,
|
|
|
|
});
|
2020-03-27 19:57:03 +01:00
|
|
|
}
|
2020-03-30 21:43:27 +02:00
|
|
|
}
|
2018-10-04 15:39:14 +02:00
|
|
|
|
2020-05-06 05:05:59 +02:00
|
|
|
function handleTimeCheckboxChange(checked) {
|
|
|
|
setincludeStartTime(checked);
|
|
|
|
updateUrls(checked, startTimeSeconds);
|
|
|
|
}
|
|
|
|
|
|
|
|
function handleTimeChange(value) {
|
|
|
|
setStartTime(value);
|
|
|
|
const startSeconds = hmsToSeconds(value);
|
|
|
|
setStartTimeSeconds(startSeconds);
|
|
|
|
updateUrls(true, startSeconds);
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateUrls(includeStartTime, startTime) {
|
|
|
|
setOpenDotLbryDotComUrl(
|
|
|
|
generateOpenDotLbryDotComUrl(
|
|
|
|
OPEN_URL,
|
|
|
|
lbryWebUrl,
|
|
|
|
canonicalUrl,
|
|
|
|
permanentUrl,
|
|
|
|
referralCode,
|
|
|
|
rewardsApproved,
|
|
|
|
includeStartTime,
|
|
|
|
startTime
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
setEncodedLbryURL(generateEncodedLbryURL(OPEN_URL, lbryWebUrl, includeStartTime, startTime));
|
|
|
|
}
|
|
|
|
|
2020-03-30 21:43:27 +02:00
|
|
|
return (
|
|
|
|
<React.Fragment>
|
|
|
|
<CopyableText label={__('LBRY Link')} copyable={openDotLbryDotComUrl} />
|
2020-05-06 05:05:59 +02:00
|
|
|
<div className="section__start-at">
|
|
|
|
<FormField
|
|
|
|
type="checkbox"
|
|
|
|
name="share_start_at_checkbox"
|
|
|
|
onChange={() => handleTimeCheckboxChange(!includeStartTime)}
|
|
|
|
checked={includeStartTime}
|
|
|
|
label={__('Start at')}
|
|
|
|
/>
|
|
|
|
<FormField
|
|
|
|
type="text"
|
|
|
|
name="share_start_at"
|
|
|
|
value={startTime}
|
|
|
|
disabled={!includeStartTime}
|
|
|
|
onChange={event => handleTimeChange(event.target.value)}
|
|
|
|
/>
|
|
|
|
</div>
|
2020-03-30 21:43:27 +02:00
|
|
|
<div className="section__actions">
|
|
|
|
<Button
|
|
|
|
className="share"
|
|
|
|
iconSize={24}
|
|
|
|
icon={ICONS.TWITTER}
|
|
|
|
href={`https://twitter.com/intent/tweet?text=${encodedLbryURL}`}
|
|
|
|
/>
|
|
|
|
<Button
|
|
|
|
className="share"
|
|
|
|
iconSize={24}
|
|
|
|
icon={ICONS.REDDIT}
|
|
|
|
title={__('Share on Facebook')}
|
|
|
|
href={`https://reddit.com/submit?url=${encodedLbryURL}`}
|
|
|
|
/>
|
|
|
|
{IOS && (
|
|
|
|
// Only ios client supports share urls
|
2020-03-27 19:57:03 +01:00
|
|
|
<Button
|
|
|
|
className="share"
|
|
|
|
iconSize={24}
|
2020-03-30 21:43:27 +02:00
|
|
|
icon={ICONS.TELEGRAM}
|
|
|
|
title={__('Share on Telegram')}
|
|
|
|
href={`tg://msg_url?url=${encodedLbryURL}&text=text`}
|
2020-03-27 19:57:03 +01:00
|
|
|
/>
|
2020-03-30 21:43:27 +02:00
|
|
|
)}
|
|
|
|
<Button
|
|
|
|
className="share"
|
|
|
|
iconSize={24}
|
|
|
|
icon={ICONS.LINKEDIN}
|
|
|
|
title={__('Share on LinkedIn')}
|
|
|
|
href={`https://www.linkedin.com/sharing/share-offsite/?url=${encodedLbryURL}`}
|
|
|
|
/>
|
|
|
|
<Button
|
|
|
|
className="share"
|
|
|
|
iconSize={24}
|
|
|
|
icon={ICONS.FACEBOOK}
|
|
|
|
title={__('Share on Facebook')}
|
|
|
|
href={`https://facebook.com/sharer/sharer.php?u=${encodedLbryURL}`}
|
|
|
|
/>
|
|
|
|
{webShareable && !isChannel && (
|
|
|
|
<React.Fragment>
|
2020-03-27 19:57:03 +01:00
|
|
|
<Button
|
|
|
|
className="share"
|
|
|
|
iconSize={24}
|
2020-03-30 21:43:27 +02:00
|
|
|
icon={ICONS.EMBED}
|
|
|
|
title={__('Embed this content')}
|
|
|
|
onClick={() => {
|
|
|
|
setShowEmbed(!showEmbed);
|
|
|
|
setShowExtra(false);
|
|
|
|
}}
|
2020-03-27 19:57:03 +01:00
|
|
|
/>
|
2020-03-30 21:43:27 +02:00
|
|
|
<Button
|
|
|
|
className="share"
|
|
|
|
iconSize={24}
|
|
|
|
icon={ICONS.MORE}
|
|
|
|
title={__('More actions')}
|
|
|
|
onClick={() => {
|
|
|
|
setShowExtra(!showExtra);
|
|
|
|
setShowEmbed(false);
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</React.Fragment>
|
2020-03-27 19:57:03 +01:00
|
|
|
)}
|
2020-03-30 21:43:27 +02:00
|
|
|
</div>
|
|
|
|
|
|
|
|
{SUPPORTS_SHARE_API && isMobile && (
|
|
|
|
<div className="section__actions">
|
|
|
|
<Button icon={ICONS.SHARE} button="primary" label={__('Share via...')} onClick={handleWebShareClick} />
|
|
|
|
</div>
|
|
|
|
)}
|
2020-05-06 05:05:59 +02:00
|
|
|
{showEmbed && (
|
|
|
|
<EmbedTextArea
|
|
|
|
label={__('Embedded')}
|
|
|
|
claim={claim}
|
|
|
|
includeStartTime={includeStartTime}
|
|
|
|
startTime={startTimeSeconds}
|
|
|
|
/>
|
|
|
|
)}
|
2020-03-30 21:43:27 +02:00
|
|
|
{showExtra && (
|
|
|
|
<div className="section">
|
|
|
|
<CopyableText label={__('LBRY URL')} copyable={`lbry://${lbryUrl}`} />
|
|
|
|
<CopyableText label={__('Download Link')} copyable={downloadUrl} />
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</React.Fragment>
|
|
|
|
);
|
2018-09-12 18:42:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export default SocialShare;
|