2019-09-26 18:28:08 +02:00
|
|
|
// @flow
|
2021-04-28 03:16:28 +02:00
|
|
|
import { SITE_NAME, SITE_HELP_EMAIL } from 'config';
|
2020-09-03 22:05:38 +02:00
|
|
|
import * as ICONS from 'constants/icons';
|
2019-09-26 18:28:08 +02:00
|
|
|
import * as React from 'react';
|
2020-09-03 22:05:38 +02:00
|
|
|
import classnames from 'classnames';
|
2019-09-26 18:28:08 +02:00
|
|
|
import Button from 'component/button';
|
|
|
|
import ClaimPreview from 'component/claimPreview';
|
|
|
|
import Card from 'component/common/card';
|
2019-10-01 06:53:33 +02:00
|
|
|
import { YOUTUBE_STATUSES } from 'lbryinc';
|
2021-10-17 10:36:14 +02:00
|
|
|
import { buildURI } from 'util/lbryURI';
|
2020-09-03 22:05:38 +02:00
|
|
|
import Spinner from 'component/spinner';
|
|
|
|
import Icon from 'component/common/icon';
|
2020-12-21 20:47:28 +01:00
|
|
|
import I18nMessage from 'component/i18nMessage';
|
2019-09-26 18:28:08 +02:00
|
|
|
|
|
|
|
type Props = {
|
|
|
|
youtubeChannels: Array<any>,
|
2019-10-01 06:53:33 +02:00
|
|
|
youtubeImportPending: boolean,
|
2019-09-26 18:28:08 +02:00
|
|
|
claimChannels: () => void,
|
|
|
|
updateUser: () => void,
|
|
|
|
checkYoutubeTransfer: () => void,
|
|
|
|
videosImported: ?Array<number>, // [currentAmountImported, totalAmountToImport]
|
2020-09-03 22:05:38 +02:00
|
|
|
alwaysShow: boolean,
|
|
|
|
addNewChannel?: boolean,
|
2019-09-26 18:28:08 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
export default function YoutubeTransferStatus(props: Props) {
|
2019-10-01 06:53:33 +02:00
|
|
|
const {
|
|
|
|
youtubeChannels,
|
|
|
|
youtubeImportPending,
|
|
|
|
claimChannels,
|
|
|
|
videosImported,
|
|
|
|
checkYoutubeTransfer,
|
|
|
|
updateUser,
|
2020-09-03 22:05:38 +02:00
|
|
|
alwaysShow = false,
|
|
|
|
addNewChannel,
|
2019-10-01 06:53:33 +02:00
|
|
|
} = props;
|
2020-09-03 22:05:38 +02:00
|
|
|
const hasChannels = youtubeChannels && youtubeChannels.length > 0;
|
2021-03-09 22:57:23 +01:00
|
|
|
const transferEnabled = youtubeChannels.some((status) => status.transferable);
|
2019-10-01 06:53:33 +02:00
|
|
|
const hasPendingTransfers = youtubeChannels.some(
|
2021-03-09 22:57:23 +01:00
|
|
|
(status) => status.transfer_state === YOUTUBE_STATUSES.YOUTUBE_SYNC_PENDING_TRANSFER
|
2019-10-01 06:53:33 +02:00
|
|
|
);
|
2019-10-03 23:40:54 +02:00
|
|
|
const isYoutubeTransferComplete =
|
2020-09-03 22:05:38 +02:00
|
|
|
hasChannels &&
|
|
|
|
youtubeChannels.every(
|
2021-03-09 22:57:23 +01:00
|
|
|
(channel) =>
|
2020-09-03 22:05:38 +02:00
|
|
|
channel.transfer_state === YOUTUBE_STATUSES.YOUTUBE_SYNC_COMPLETED_TRANSFER ||
|
|
|
|
channel.sync_status === YOUTUBE_STATUSES.YOUTUBE_SYNC_ABANDONDED
|
|
|
|
);
|
2019-09-26 18:28:08 +02:00
|
|
|
|
2020-12-21 20:47:28 +01:00
|
|
|
const isNotElligible =
|
2021-03-09 22:57:23 +01:00
|
|
|
hasChannels && youtubeChannels.every((channel) => channel.sync_status === YOUTUBE_STATUSES.YOUTUBE_SYNC_ABANDONDED);
|
2020-12-21 20:47:28 +01:00
|
|
|
|
2019-09-26 18:28:08 +02:00
|
|
|
let total;
|
|
|
|
let complete;
|
2019-09-30 21:52:53 +02:00
|
|
|
if (hasPendingTransfers && videosImported) {
|
2019-09-26 18:28:08 +02:00
|
|
|
complete = videosImported[0];
|
|
|
|
total = videosImported[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
function getMessage(channel) {
|
|
|
|
const { transferable, transfer_state: transferState, sync_status: syncStatus } = channel;
|
|
|
|
if (!transferable) {
|
|
|
|
switch (transferState) {
|
2020-09-03 22:05:38 +02:00
|
|
|
case YOUTUBE_STATUSES.YOUTUBE_SYNC_NOT_TRANSFERRED:
|
2019-09-26 18:28:08 +02:00
|
|
|
return syncStatus[0].toUpperCase() + syncStatus.slice(1);
|
2020-09-03 22:05:38 +02:00
|
|
|
case YOUTUBE_STATUSES.YOUTUBE_SYNC_PENDING_TRANSFER:
|
2019-09-26 18:28:08 +02:00
|
|
|
return __('Transfer in progress');
|
2020-09-03 22:05:38 +02:00
|
|
|
case YOUTUBE_STATUSES.YOUTUBE_SYNC_COMPLETED_TRANSFER:
|
2019-09-26 18:28:08 +02:00
|
|
|
return __('Completed transfer');
|
2020-09-03 22:05:38 +02:00
|
|
|
case YOUTUBE_STATUSES.YOUTUBE_SYNC_ABANDONDED:
|
|
|
|
return __('This channel not eligible to by synced');
|
2019-09-26 18:28:08 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return __('Ready to transfer');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
React.useEffect(() => {
|
2019-10-13 19:41:51 +02:00
|
|
|
// If a channel is transferable, there's nothing to check
|
2019-09-30 21:52:53 +02:00
|
|
|
if (hasPendingTransfers) {
|
2019-09-26 18:28:08 +02:00
|
|
|
checkYoutubeTransfer();
|
|
|
|
|
|
|
|
let interval = setInterval(() => {
|
|
|
|
checkYoutubeTransfer();
|
|
|
|
updateUser();
|
|
|
|
}, 60 * 1000);
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
clearInterval(interval);
|
|
|
|
};
|
|
|
|
}
|
2020-12-08 22:50:10 +01:00
|
|
|
}, [hasPendingTransfers, checkYoutubeTransfer, updateUser]);
|
2019-09-26 18:28:08 +02:00
|
|
|
|
|
|
|
return (
|
2020-09-03 22:05:38 +02:00
|
|
|
(alwaysShow || (hasChannels && !isYoutubeTransferComplete)) && (
|
2020-06-30 07:51:15 +02:00
|
|
|
<Card
|
2020-12-11 21:25:01 +01:00
|
|
|
title={
|
2020-12-21 20:47:28 +01:00
|
|
|
isNotElligible
|
|
|
|
? __('Process complete')
|
|
|
|
: isYoutubeTransferComplete
|
2020-12-11 22:25:05 +01:00
|
|
|
? __('Transfer complete')
|
2020-12-11 21:25:01 +01:00
|
|
|
: youtubeChannels.length > 1
|
|
|
|
? __('Your YouTube channels')
|
|
|
|
: __('Your YouTube channel')
|
|
|
|
}
|
2020-06-30 07:51:15 +02:00
|
|
|
subtitle={
|
|
|
|
<span>
|
|
|
|
{hasPendingTransfers &&
|
|
|
|
__('Your videos are currently being transferred. There is nothing else for you to do.')}
|
|
|
|
{transferEnabled && !hasPendingTransfers && __('Your videos are ready to be transferred.')}
|
2020-12-11 21:25:01 +01:00
|
|
|
{!transferEnabled &&
|
|
|
|
!hasPendingTransfers &&
|
|
|
|
!isYoutubeTransferComplete &&
|
2020-12-21 20:47:28 +01:00
|
|
|
!isNotElligible &&
|
2021-11-24 21:25:22 +01:00
|
|
|
__('Please check back later, this may take a few hours.')}
|
2020-12-11 21:25:01 +01:00
|
|
|
|
2020-12-21 20:47:28 +01:00
|
|
|
{isYoutubeTransferComplete && !isNotElligible && __('View your channel or choose a new channel to sync.')}
|
|
|
|
{isNotElligible && (
|
|
|
|
<I18nMessage
|
2021-04-28 03:16:28 +02:00
|
|
|
tokens={{
|
2021-10-21 22:21:51 +02:00
|
|
|
here: (
|
|
|
|
<Button button="link" href="https://odysee.com/@OdyseeHelp:b/youtube-sync:b" label={__('here')} />
|
|
|
|
),
|
2021-04-28 03:16:28 +02:00
|
|
|
email: SITE_HELP_EMAIL,
|
|
|
|
}}
|
2020-12-21 20:47:28 +01:00
|
|
|
>
|
2021-04-28 03:16:28 +02:00
|
|
|
Email %email% if you think there has been a mistake. Make sure your channel qualifies %here%.
|
2020-12-21 20:47:28 +01:00
|
|
|
</I18nMessage>
|
|
|
|
)}
|
2020-06-30 07:51:15 +02:00
|
|
|
</span>
|
|
|
|
}
|
|
|
|
body={
|
|
|
|
<section>
|
|
|
|
{youtubeChannels.map((channel, index) => {
|
2020-12-11 20:33:40 +01:00
|
|
|
const {
|
|
|
|
lbry_channel_name: channelName,
|
|
|
|
channel_claim_id: claimId,
|
|
|
|
sync_status: syncStatus,
|
|
|
|
total_subs: totalSubs,
|
|
|
|
total_videos: totalVideos,
|
|
|
|
} = channel;
|
2020-06-30 07:51:15 +02:00
|
|
|
const url = buildURI({ channelName, channelClaimId: claimId });
|
|
|
|
const transferState = getMessage(channel);
|
2020-09-03 22:05:38 +02:00
|
|
|
const isWaitingForSync =
|
|
|
|
syncStatus === YOUTUBE_STATUSES.YOUTUBE_SYNC_QUEUED ||
|
2021-03-09 22:57:23 +01:00
|
|
|
syncStatus === YOUTUBE_STATUSES.YOUTUBE_SYNC_PENDING ||
|
|
|
|
syncStatus === YOUTUBE_STATUSES.YOUTUBE_SYNC_PENDING_EMAIL ||
|
2020-09-03 22:05:38 +02:00
|
|
|
syncStatus === YOUTUBE_STATUSES.YOUTUBE_SYNC_PENDINGUPGRADE ||
|
|
|
|
syncStatus === YOUTUBE_STATUSES.YOUTUBE_SYNC_SYNCING;
|
|
|
|
|
|
|
|
const isNotEligible = syncStatus === YOUTUBE_STATUSES.YOUTUBE_SYNC_ABANDONDED;
|
|
|
|
|
2020-06-30 07:51:15 +02:00
|
|
|
return (
|
|
|
|
<div key={url} className="card--inline">
|
|
|
|
{claimId ? (
|
|
|
|
<ClaimPreview
|
|
|
|
uri={url}
|
|
|
|
actions={<span className="help">{transferState}</span>}
|
|
|
|
properties={false}
|
|
|
|
/>
|
|
|
|
) : (
|
|
|
|
<div className="section--padded">
|
2020-09-03 22:05:38 +02:00
|
|
|
{isNotEligible ? (
|
|
|
|
<div>{__('%channelName% is not eligible to be synced', { channelName })}</div>
|
|
|
|
) : (
|
|
|
|
<div className="progress">
|
|
|
|
<div className="progress__item">
|
|
|
|
{__('Claim your handle %handle%', { handle: channelName })}
|
|
|
|
<Icon icon={ICONS.COMPLETED} className="progress__complete-icon--completed" />
|
|
|
|
</div>
|
|
|
|
<div className="progress__item">
|
|
|
|
{__('Agree to sync')}{' '}
|
|
|
|
<Icon icon={ICONS.COMPLETED} className="progress__complete-icon--completed" />
|
|
|
|
</div>
|
|
|
|
<div className="progress__item">
|
|
|
|
{__('Wait for your videos to be synced')}
|
|
|
|
{isWaitingForSync ? (
|
|
|
|
<Spinner type="small" />
|
|
|
|
) : (
|
|
|
|
<Icon icon={ICONS.COMPLETED} className="progress__complete-icon--completed" />
|
|
|
|
)}
|
|
|
|
</div>
|
2020-12-11 20:33:40 +01:00
|
|
|
<div className="help--inline">
|
|
|
|
{__('Syncing %total_videos% videos from your channel with %total_subs% subscriptions.', {
|
|
|
|
total_videos: totalVideos,
|
|
|
|
total_subs: totalSubs,
|
|
|
|
})}
|
|
|
|
</div>
|
2020-09-03 22:05:38 +02:00
|
|
|
<div className="progress__item">
|
|
|
|
{__('Claim your channel')}
|
|
|
|
<Icon icon={ICONS.NOT_COMPLETED} className={classnames('progress__complete-icon')} />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)}
|
2020-06-30 07:51:15 +02:00
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
{videosImported && (
|
|
|
|
<div className="section help">{__('%complete% / %total% videos transferred', { complete, total })}</div>
|
|
|
|
)}
|
|
|
|
</section>
|
|
|
|
}
|
|
|
|
actions={
|
2020-09-03 22:05:38 +02:00
|
|
|
<>
|
|
|
|
<div className="section__actions">
|
2020-12-11 21:25:01 +01:00
|
|
|
{!isYoutubeTransferComplete && (
|
|
|
|
<Button
|
|
|
|
button="primary"
|
|
|
|
disabled={youtubeImportPending || !transferEnabled}
|
|
|
|
onClick={claimChannels}
|
|
|
|
label={youtubeChannels.length > 1 ? __('Claim Channels') : __('Claim Channel')}
|
|
|
|
/>
|
|
|
|
)}
|
2020-06-30 07:51:15 +02:00
|
|
|
<Button
|
2020-12-11 21:25:01 +01:00
|
|
|
button={isYoutubeTransferComplete ? 'primary' : 'link'}
|
|
|
|
label={__('Explore %SITE_NAME%', { SITE_NAME })}
|
|
|
|
navigate="/"
|
2020-06-30 07:51:15 +02:00
|
|
|
/>
|
|
|
|
</div>
|
2020-09-03 22:05:38 +02:00
|
|
|
|
|
|
|
<p className="help">
|
|
|
|
{youtubeChannels.length > 1
|
|
|
|
? __('You will be able to claim your channels once they finish syncing.')
|
|
|
|
: __('You will be able to claim your channel once it has finished syncing.')}{' '}
|
2021-03-22 23:56:50 +01:00
|
|
|
{youtubeImportPending &&
|
|
|
|
__('You will not be able to edit the channel or content until the transfer process completes.')}{' '}
|
2021-10-21 22:21:51 +02:00
|
|
|
<Button
|
|
|
|
button="link"
|
|
|
|
label={__('Learn More')}
|
|
|
|
href="https://odysee.com/@OdyseeHelp:b/youtube-sync:b#transfer"
|
|
|
|
/>{' '}
|
2020-09-04 22:11:28 +02:00
|
|
|
{addNewChannel && <Button button="link" label={__('Add Another Channel')} onClick={addNewChannel} />}
|
2020-09-03 22:05:38 +02:00
|
|
|
</p>
|
|
|
|
</>
|
2020-06-30 07:51:15 +02:00
|
|
|
}
|
|
|
|
/>
|
2019-09-26 18:28:08 +02:00
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|