diff --git a/src/ui/component/sideBar/view.jsx b/src/ui/component/sideBar/view.jsx
index d915db3b1..122188301 100644
--- a/src/ui/component/sideBar/view.jsx
+++ b/src/ui/component/sideBar/view.jsx
@@ -34,23 +34,23 @@ function SideBar(props: Props) {
...buildLink(null, __('Home'), ICONS.HOME),
},
{
- ...buildLink(PAGES.FOLLOWING, __('Following'), ICONS.SUBSCRIPTION),
+ ...buildLink(PAGES.FOLLOWING, __('Following'), ICONS.SUBSCRIBE),
},
{
...buildLink(PAGES.LIBRARY, __('Library'), ICONS.LIBRARY),
},
{
- ...buildLink(PAGES.PUBLISHED, __('Publishes'), ICONS.PUBLISHED),
+ ...buildLink(PAGES.PUBLISHED, __('Publishes'), ICONS.PUBLISH),
},
].map(renderLink)}
diff --git a/src/ui/component/socialShare/view.jsx b/src/ui/component/socialShare/view.jsx
index 8ba09bf9c..0e265c3ae 100644
--- a/src/ui/component/socialShare/view.jsx
+++ b/src/ui/component/socialShare/view.jsx
@@ -3,10 +3,9 @@ import * as ICONS from 'constants/icons';
import React from 'react';
import Button from 'component/button';
import CopyableText from 'component/copyableText';
-import Tooltip from 'component/common/tooltip';
type Props = {
- claim: StreamClaim,
+ claim: Claim,
onDone: () => void,
speechShareable: boolean,
isChannel: boolean,
@@ -27,21 +26,15 @@ class SocialShare extends React.PureComponent
{
render() {
const { claim, isChannel } = this.props;
- const { claim_id: claimId, name: claimName, channel_name: channelName } = claim;
+ const { claim_id: claimId, name: claimName } = claim;
const { speechShareable, onDone } = this.props;
- const channelClaimId = claim.signing_channel && claim.signing_channel.claim_id;
+ const signingChannel = claim.signing_channel;
+ const channelClaimId = signingChannel && signingChannel.claim_id;
+ const channelName = signingChannel && signingChannel.name;
- const getSpeechUri = (): string => {
- if (isChannel) {
- // For channel claims, the channel name (@something) is in `claim.name`
- return `${claimName}:${claimId}`;
- } else {
- // If it's for a regular claim, check if it has an associated channel
- return channelName && channelClaimId
- ? `${channelName}:${channelClaimId}/${claimName}`
- : `${claimId}/${claimName}`;
- }
+ const getLbryTvUri = (): string => {
+ return `${claimName}/${claimId}`;
};
const getLbryUri = (): string => {
@@ -56,69 +49,57 @@ class SocialShare extends React.PureComponent {
}
};
- const speechPrefix = 'https://spee.ch/';
+ const lbryTvPrefix = 'https://beta.lbry.tv/';
const lbryPrefix = 'https://open.lbry.com/';
const lbryUri = getLbryUri();
- const speechUri = getSpeechUri();
+ const lbryTvUri = getLbryTvUri();
const encodedLbryURL: string = `${lbryPrefix}${encodeURIComponent(lbryUri)}`;
const lbryURL: string = `${lbryPrefix}${getLbryUri()}`;
+ const encodedLbryTvUrl = `${lbryTvPrefix}${encodeURIComponent(lbryTvUri)}`;
+ const lbryTvUrl = `${lbryTvPrefix}${lbryTvUri}`;
- const encodedSpeechURL = `${speechPrefix}${encodeURIComponent(speechUri)}`;
- const speechURL = `${speechPrefix}${speechUri}`;
+ const shareOnFb = __('Share on Facebook');
+ const shareOnTwitter = __('Share On Twitter');
return (
{speechShareable && (
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
)}
-
+
-
-
-
-
-
-
+
+
diff --git a/src/ui/component/subscribeButton/view.jsx b/src/ui/component/subscribeButton/view.jsx
index 776b1de7b..e9c0b266d 100644
--- a/src/ui/component/subscribeButton/view.jsx
+++ b/src/ui/component/subscribeButton/view.jsx
@@ -1,7 +1,7 @@
// @flow
import * as MODALS from 'constants/modal_types';
import * as ICONS from 'constants/icons';
-import React from 'react';
+import React, { useState, useRef, useEffect } from 'react';
import { parseURI } from 'lbry-redux';
import Button from 'component/button';
@@ -32,18 +32,36 @@ export default function SubscribeButton(props: Props) {
showSnackBarOnSubscribe,
doToast,
} = props;
-
+ const buttonRef = useRef();
+ const [isHovering, setIsHovering] = useState(false);
+ const { claimName } = parseURI(uri);
const subscriptionHandler = isSubscribed ? doChannelUnsubscribe : doChannelSubscribe;
const subscriptionLabel = isSubscribed ? __('Following') : __('Follow');
+ const unfollowOverride = isSubscribed && isHovering && __('Unfollow');
- const { claimName } = parseURI(uri);
+ useEffect(() => {
+ function handleHover() {
+ setIsHovering(!isHovering);
+ }
+
+ const button = buttonRef.current;
+ if (button) {
+ button.addEventListener('mouseover', handleHover);
+ button.addEventListener('mouseleave', handleHover);
+ return () => {
+ button.removeEventListener('mouseover', handleHover);
+ button.removeEventListener('mouseleave', handleHover);
+ };
+ }
+ }, [buttonRef, isHovering]);
return (
-
+
diff --git a/src/ui/page/discover/view.jsx b/src/ui/page/discover/view.jsx
index 9b7dff33e..04e16ce8d 100644
--- a/src/ui/page/discover/view.jsx
+++ b/src/ui/page/discover/view.jsx
@@ -10,6 +10,7 @@ type Props = {
function DiscoverPage(props: Props) {
const { followedTags } = props;
+
return (
{hasDownloads ? (
-
+ {__('Your Library')}}
+ defaultSort
+ persistedStorageKey="claim-list-downloaded"
+ uris={downloadedUris}
+ loading={fetching}
+ />
) : (
diff --git a/src/ui/page/fileListPublished/view.jsx b/src/ui/page/fileListPublished/view.jsx
index bb98f9c58..0c79f6aac 100644
--- a/src/ui/page/fileListPublished/view.jsx
+++ b/src/ui/page/fileListPublished/view.jsx
@@ -21,7 +21,14 @@ function FileListPublished(props: Props) {
{uris && uris.length ? (
-
+ {__('Your Publishes')}}
+ loading={fetching}
+ persistedStorageKey="claim-list-published"
+ uris={uris}
+ defaultSort
+ headerAltControls={}
+ />
) : (
diff --git a/src/ui/page/following/view.jsx b/src/ui/page/following/view.jsx
index 31e53c3bc..ae86b84b9 100644
--- a/src/ui/page/following/view.jsx
+++ b/src/ui/page/following/view.jsx
@@ -14,10 +14,10 @@ function FollowingEditPage(props: Props) {
return (
-
+
-
+ {__('Channels You Follow')}} uris={channelUris} />
);
diff --git a/src/ui/page/library/index.js b/src/ui/page/library/index.js
new file mode 100644
index 000000000..abb82e5be
--- /dev/null
+++ b/src/ui/page/library/index.js
@@ -0,0 +1,3 @@
+import LibraryPage from './view';
+
+export default LibraryPage;
diff --git a/src/ui/page/library/view.jsx b/src/ui/page/library/view.jsx
new file mode 100644
index 000000000..71bb0bfac
--- /dev/null
+++ b/src/ui/page/library/view.jsx
@@ -0,0 +1,14 @@
+// @flow
+import React from 'react';
+import Page from 'component/page';
+import DownloadList from 'page/fileListDownloaded';
+
+function LibraryPage() {
+ return (
+
+
+
+ );
+}
+
+export default LibraryPage;
diff --git a/src/ui/page/subscriptions/view.jsx b/src/ui/page/subscriptions/view.jsx
index d7f399c64..9fdcbe5b8 100644
--- a/src/ui/page/subscriptions/view.jsx
+++ b/src/ui/page/subscriptions/view.jsx
@@ -3,6 +3,7 @@ import * as PAGES from 'constants/pages';
import React, { useEffect, useState } from 'react';
import Page from 'component/page';
import ClaimList from 'component/claimList';
+import ClaimPreview from 'component/claimPreview';
import Button from 'component/button';
type Props = {
@@ -79,6 +80,7 @@ export default function SubscriptionsPage(props: Props) {
uris={viewingSuggestedSubs ? suggestedSubscriptions.map(sub => sub.uri) : uris}
onScrollBottom={() => console.log('scroll bottom') || setPage(page + 1)}
/>
+ {loading && page > 1 && new Array(20).fill(1).map((x, i) =>
)}
);
diff --git a/src/ui/page/tags/view.jsx b/src/ui/page/tags/view.jsx
index e56be12bc..ee912a72c 100644
--- a/src/ui/page/tags/view.jsx
+++ b/src/ui/page/tags/view.jsx
@@ -32,9 +32,9 @@ function TagsPage(props: Props) {
tags={tags}
meta={