From bfffc53a943a3089536e338c111eb1f74ae795ef Mon Sep 17 00:00:00 2001 From: bluerabbit001 Date: Fri, 1 Oct 2021 13:00:57 -0700 Subject: [PATCH] Implement Download Progress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement Download Progress Revert "Stream Key Button (#7127)" I forgot to lint before merging. Reverting for now, will fix in a bit. This reverts commit 5c8878353f10696e4e20dd86ca32a63eee048764. Restore "Stream Key Button (#7127)" + lint and modifications - Consolidate functionality into existing component. - Use proper strings. Localize sunset nag Changed the text a bit so that we can re-use the existing 'Learn more'. Don't allow assigning yourself as moderator Also fixed split-string (hard to localize). Comment: Swap the order of "Edit" and "Remove" This order is more common. Blocklist page: fix perpetual spinner when trying to refresh with no channels There's nothing to do when you don't have a channel, so hide the button and ensure redux fails gracefully. i18n Livestream category improvements (#7115) * ❌ Remove old method of displaying active livestreams Completely remove it for now to make the commit deltas clearer. We'll replace it with the new method at the end. * Fetch and store active-livestream info in redux * Tiles can now query active-livestream state from redux instead of getting from parent. * ⏪ ClaimTilesDiscover: revert and cleanup - Simplify to just `uris` instead of having multiple arrays (`uris`, `modifiedUris`, `prevUris`) - The `prevUris` is for CLS prevention. With this removal, the CLS issue is back, but we'll handle it differently later. - Temporarily disable the view-count fetching. Code is left there so that I don't forget. - `shouldPerformSearch` was never true when `prefixUris` is present. Corrected the logic. - Aside: prefix and pin is so similar in function. Hm .... * ClaimTilesDiscover: factor out options Move the `option` code outside and passed in as a pre-calculated prop. To skip rendering while waiting for `claim_search`, we need to add `React.memo(areEqual)`. However, the flag that determines if we are fetching `claim_search` (fetchingClaimSearchByQuery[]) depends on the derived options as the key. Instead of calculating `options` twice, we moved it to the props so both sides can use it. It also makes the component a bit more readable. The downside is that the prop-passing might not be clear. * ClaimTilesDiscover: reduce ~17 renders at startup to just 2. * ClaimTilesDiscover: fill with placeholder while waiting for claim_search Livestream claims are fetched seperately, so they might already exists. While claim_search is running, the list only consists of livestreams (collapsed). Fill up the space with placeholders to prevent layout shift. * Add 'useFetchViewCount' to handle fetching from lists This effect also stashes fetched uris, so that we won't re-fetch the same uris during the same instance (e.g. during infinite scroll). * ⏪ ClaimListDiscover: revert and cleanup - Removed the 'finalUris' stuff that was meant to "pause" visual changes when fetching. I think it'll be cleaner to use React.memo to achieve that. - Added `renderUri` to make it clear which array that this component will render. - Re-do the way we fetch view counts now that 'finalUris' is gone. Not the best method, but at least correct for now. * ClaimListDiscover: add prefixUris, similar to ClaimTilesDiscover This will be initially used to append livestreams at the top. * ✅ Re-enable active livestream tiles using the new method * doFetchActiveLivestreams: add interval check - Added a default minimum of 5 minutes between fetches. Clients can bypass this through `forceFetch` if needed. * doFetchActiveLivestreams: add option check We'll need to support different 'orderBy', so adding an "options check" when determining if we just made the same fetch. * WildWest: limit livestream tiles + add ability to show more Most likely this behavior will change in the future, so we'll leave `ClaimListDiscover` untouched and handle the logic at the page level. This solution uses 2 `ClaimListDiscover` -- if the reduced livestream list is visible, it handles the header; else the normal list handles the header. * Use better tile-count on larger screens. Used the same method as how the homepage does it. Fix video embeds in comments not playing and resize issues (#7163) -- tmp revert -- This reverts commit 3b47edc3b9744418d8ea78bd30dcd2671633aebb to allow putting back in the original commits. ❌ Remove old method of displaying active livestreams Completely remove it for now to make the commit deltas clearer. We'll replace it with the new method at the end. Fetch and store active-livestream info in redux Tiles can now query active-livestream state from redux instead of getting from parent. ⏪ ClaimTilesDiscover: revert and cleanup - Simplify to just `uris` instead of having multiple arrays (`uris`, `modifiedUris`, `prevUris`) - The `prevUris` is for CLS prevention. With this removal, the CLS issue is back, but we'll handle it differently later. - Temporarily disable the view-count fetching. Code is left there so that I don't forget. - `shouldPerformSearch` was never true when `prefixUris` is present. Corrected the logic. - Aside: prefix and pin is so similar in function. Hm .... ClaimTilesDiscover: factor out options Move the `option` code outside and passed in as a pre-calculated prop. To skip rendering while waiting for `claim_search`, we need to add `React.memo(areEqual)`. However, the flag that determines if we are fetching `claim_search` (fetchingClaimSearchByQuery[]) depends on the derived options as the key. Instead of calculating `options` twice, we moved it to the props so both sides can use it. It also makes the component a bit more readable. The downside is that the prop-passing might not be clear. ClaimTilesDiscover: reduce ~17 renders at startup to just 2. ClaimTilesDiscover: fill with placeholder while waiting for claim_search Livestream claims are fetched seperately, so they might already exists. While claim_search is running, the list only consists of livestreams (collapsed). Fill up the space with placeholders to prevent layout shift. Add 'useFetchViewCount' to handle fetching from lists This effect also stashes fetched uris, so that we won't re-fetch the same uris during the same instance (e.g. during infinite scroll). ⏪ ClaimListDiscover: revert and cleanup - Removed the 'finalUris' stuff that was meant to "pause" visual changes when fetching. I think it'll be cleaner to use React.memo to achieve that. - Added `renderUri` to make it clear which array that this component will render. - Re-do the way we fetch view counts now that 'finalUris' is gone. Not the best method, but at least correct for now. ClaimListDiscover: add prefixUris, similar to ClaimTilesDiscover This will be initially used to append livestreams at the top. ✅ Re-enable active livestream tiles using the new method doFetchActiveLivestreams: add interval and options checking - Added a default minimum of 5 minutes between fetches. Clients can bypass this through `forceFetch` if needed. - We'll need to support different 'orderBy', so adding an "options check" when determining if we just made the same fetch. WildWest: limit livestream tiles + add ability to show more Most likely this behavior will change in the future, so we'll leave `ClaimListDiscover` untouched and handle the logic at the page level. This solution uses 2 `ClaimListDiscover` -- if the reduced livestream list is visible, it handles the header; else the normal list handles the header. Fix homepage tiles not filtering blocked channels 7165 homepage queries don't take into account blocked channel ids (mute does) resolveSearchOptions: was not grabbing redux data correctly. Adjust comment fade-out height 6944 Comment expansion sometimes doesn't reveal extra text (already showing everything) Reconcile some constants between JS and CSS. force mp3 extension vs mpga Fix autoplay next default value (#7173) Fix missed render when blocklist is fetched 7176 Pitfalls of pausing render via React.memo: - We'll miss the `doClaimSearch()` since that is sparked by an `useEffect`. Seems like we can't avoid having a redundant copy of the previously-displayed URIs. Memoize 'mutedAndBlockedChannelIds' It was being recalculated repeatedly. This memoizes it, although it still re-calculates occasionally despite none of the source arrays changed. I think it is due to the state change in the Preference Sync. Note: input selectors to `createSelector` needs to be extractions-only (i.e. must not have transformations). I think most of our `makeSelect*` selectors violate this and broke memoization. Fix “Your Account” popup on mobile (#5652) (#7172) * Fix “Your Account” popup on mobile (#5652) * Update changelog Co-authored-by: Branko Tomic Fix issue where channel upload viewcounts were creating a new line (#7154) * fix issue where viewcounts were creating a new line * conditionally add large view css * conditionally apply class based on if view count should be shown * last couple touchups * clean up the css * add scss to flow config * add scss component to flow config use homepage LATEST for following discover (#7185) Commentron now includes `replies` for `ByID` request Wasn't aware of that, and that was causing 7146 ("show replies" visible when there are no replies). Fix page titles for SiteLinks Part of `7166 improve search metadata`, where page titles are important clues for Google to generate Site-Links. Add icons (#7194) fix playlist resolving collectionurls (#7178) * fix playlist resolving collectionurls * Update CHANGELOG.md Co-authored-by: Thomas Zarebczan Fix plant icon (#7195) * Fix plant icon * Also change phone icon name Add Channel Mention selection ability (#7151) * Add Channel Mention selection ability * Fix mentioned user name being smaller than other text * Improve logic for locating a mention * Fix mentioning with enter on livestream * Fix breaking for invalid URI query * Handle punctuation after mention * Fix name display and appeareance * Use canonical url * Fix missing search i18n - ChannelMention and other fixes Fix wrong 'recsysId' sent due to search-key mismatch .../archives/C02FQBM00Q0/p1633044695010600 When querying a search key, it has to be an exact match. This was broken by the insertion of `free_only` in the fetch. Added a function to generate the options, so that all clients stay in sync. Fix linked-comment scrolling I think this the best solution so far, at the expense of a slight delay in scrolling if the network call stalls. - Added "fetching by ID" state so that we don't need to use the ugly N-retries method. - `scrollIntoView` doesn't work if the element is already in the viewport, and the `scrollBy` adjustment doesn't take into account the y-position restoration that we perform on certain type of pages. Use `window.scrollTo` instead and taking into account current scroll position. Prevent random description in Google Search results for "odysee" (#7206) 7166 improve search metadata Depending on the search term and timing, Google extracts data from the sidebar or page content to use as the search-result description. Defined `description` (on top of the existing `og:description` and `twitter:description`. While I couldn't find a definitive doc saying that this is the solution, this is present in all other sites (and matches their description in a Google Search results). Add favicon for Google Search results (#7205) - A side-quest from "7166 improve search metadata". - The favicon must be from the same domain as the homepage, so the CDN URL couldn't be used, hence the additional upload. - The favicon also needs to be multiples of 48x48 and above. - Wanted to use SVG for the smallest size possible, but seems like Safari does not fully support it. Got Dejan to give me a reasonably-sized PNG. https://developers.google.com/search/docs/advanced/appearance/favicon-in-search#guidelines List own comments (#7171) * Add option to pass in url-search params. Impetus: allow linked comment ID and setting the discussion tab when clicking on the `ClaimPreview`. * comment.list: fix typos and renamed variables - Switch from 'author' to 'creator' to disambiguate between comment author and content author. For comment author, we'll use 'commenter' from now on. - Corrected 'commenterClaimId' to 'creatorClaimId' (just a typo, no functional change). * doCommentReset: change param from uri to claimId This reduces one lookup as clients will always have the claimID ready, but might not have the full URI. It was using URI previously just to match the other APIs. * Add doCommentListOwn -- command to fetch own comments Since the redux slice is set up based on content or channel ID (for Channel Discussion page), re-use the channel ID for the case of "own comments". We always clear each ID when fetching page-0, so no worries of conflict when actually browsing the Channel Discussion page. * Comment: add option to hide the actions section * Implement own-comments page * Use new param to remove sort-pins-first. comment.List currently always pushes pins to the top to support pagination. This new param removes this behavior. Fix resolving invalid claims (#7210) Update icons.js --- tmp revert --- This reverts commit de6c6f9bfd0383e9087a38f1f54e13bb54754945. Add option to pass in url-search params. Impetus: allow linked comment ID and setting the discussion tab when clicking on the `ClaimPreview`. comment.list: fix typos and renamed variables - Switch from 'author' to 'creator' to disambiguate between comment author and content author. For comment author, we'll use 'commenter' from now on. - Corrected 'commenterClaimId' to 'creatorClaimId' (just a typo, no functional change). doCommentReset: change param from uri to claimId This reduces one lookup as clients will always have the claimID ready, but might not have the full URI. It was using URI previously just to match the other APIs. Add doCommentListOwn -- command to fetch own comments Since the redux slice is set up based on content or channel ID (for Channel Discussion page), re-use the channel ID for the case of "own comments". We always clear each ID when fetching page-0, so no worries of conflict when actually browsing the Channel Discussion page. Comment: add option to hide the actions section Implement own-comments page Use new param to remove sort-pins-first. comment.List currently always pushes pins to the top to support pagination. This new param removes this behavior. Corrected meta for "description" (patch for #7206) It should be `name`, not `property`. Copy-paste error from the OG version. Fix 'pinnedUrl' error. Part of "6989 Fix console spam in dev" EXTRA_SIDEBAR_LINKS should be a `SideNavLink` object, so trim down the return object from `GetLinksData`. Temp workaround SDK 0 count Temp workaround claims in channel count 0 patch creator analytics with hub without channel claim count patch hubs claims_in_channel temporarily OG: fix url for categories Category cards are showing up as "odysee.com" cards in Facebook. - `og:url` is supposed to be the canonical URL. It was hardcoded to "odysee.com", so every category was being redirected when the card is being generated. - Removed `twitter:url`. The documentation says it will fall back to `og:url`, so there is not need to define both if it's the same. OG: Technology category missing due to rename - 'technology' was renamed to 'tech'. - Leave both entries there for now. Not sure if other homepages still use the old link or not. Fix spacing / centering live stream + comments section (#7225) Add copy comment link menu option (#7224) adjust css for toast message so that it behaves as expected (text truncation via ellipsis) (#7213) Refactor commentsList Remove expand/collapse from channel discussion page Prevent comment content from breaking the layout on mobile ESLint fix Update Dark theme and fix playing issue Fix playlist strings Add sitemap to influence Sitelinks Part of `7166 improve search metadata` This is an experiment to influence the Sitelinks in our search results. Our current sitemap only consists of claims, so claims appear in Sitelinks more often. We (Julian) want categories to have higher priority, if possible. For now, the sitemap will be defined in Google Console instead of robots.txt. If it works, the file should be uploaded to sitemap.odysee.com, alongside the claim list sitemap. Revert "Add sitemap to influence Sitelinks" Seems like I messed up robots.txt? This reverts commit 95654955b1ef5c6ba55ada50f2419949c56cf10a. Bump url-parse from 1.5.1 to 1.5.3 (#7230) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3) --- updated-dependencies: - dependency-name: url-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> fix notifications page on unauthed app (#7226) move file actions from lbry-redux Send video bitrate and user bandwidth to Watchman (#7145) * adding functionality to detect user download speed * calculating bandwidth speed more intelligently * saving download speed and updating it every 30s * all the functionality should be done needs testing * fix linting * use a 1mb file for calculating bandwidth * add optional chaining plugin to babel and get bitrate from texttrack * allow optional chaining for flow * ignore flow error * disable bandwidth checking functionality * fix flow error Fix ESLint Update Download Progress Update CSS --- static/img/dark_loading.gif | Bin 0 -> 80100 bytes static/img/white_loading.gif | Bin 0 -> 80537 bytes ui/component/claimPreview/index.js | 1 + ui/component/claimPreviewTile/view.jsx | 4 +- ui/component/downloadProgress/index.js | 48 ++++ ui/component/downloadProgress/view.jsx | 286 ++++++++++++++++++++++ ui/component/page/view.jsx | 1 + ui/component/viewers/videoViewer/view.jsx | 8 + ui/redux/actions/content.js | 28 ++- ui/scss/all.scss | 1 + ui/scss/component/_claim-list.scss | 1 + ui/scss/component/_download-progress.scss | 224 +++++++++++++++++ ui/scss/component/menu-button.scss | 6 + ui/util/array.js | 18 ++ ui/util/livestream.js | 24 ++ ui/util/remark-lbry.js | 15 ++ 16 files changed, 659 insertions(+), 6 deletions(-) create mode 100644 static/img/dark_loading.gif create mode 100644 static/img/white_loading.gif create mode 100644 ui/component/downloadProgress/index.js create mode 100644 ui/component/downloadProgress/view.jsx create mode 100644 ui/scss/component/_download-progress.scss create mode 100644 ui/util/array.js create mode 100644 ui/util/livestream.js diff --git a/static/img/dark_loading.gif b/static/img/dark_loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..edb99a6ebcba4b2d5c45cae0b26795f85a23680d GIT binary patch literal 80100 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 IFtkGe0MV;UEdT%j literal 0 HcmV?d00001 diff --git a/static/img/white_loading.gif b/static/img/white_loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b65b4c25aa3fa63190a27aedefce185d93534628 GIT binary patch literal 80537 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 Y3mZ1l>zU@8A6Y76bM&2CwkpStN)#lAnW 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

NK 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 literal 0 HcmV?d00001 diff --git a/ui/component/claimPreview/index.js b/ui/component/claimPreview/index.js index b63696f69..15b48cc7e 100644 --- a/ui/component/claimPreview/index.js +++ b/ui/component/claimPreview/index.js @@ -26,6 +26,7 @@ import { selectShowMatureContent } from 'redux/selectors/settings'; import { makeSelectHasVisitedUri } from 'redux/selectors/content'; import { makeSelectIsSubscribed } from 'redux/selectors/subscriptions'; import { selectModerationBlockList } from 'redux/selectors/comments'; +import { doFileGet } from 'redux/actions/file'; import ClaimPreview from './view'; import formatMediaDuration from 'util/formatMediaDuration'; diff --git a/ui/component/claimPreviewTile/view.jsx b/ui/component/claimPreviewTile/view.jsx index 1c921f64e..1c1bd1116 100644 --- a/ui/component/claimPreviewTile/view.jsx +++ b/ui/component/claimPreviewTile/view.jsx @@ -187,7 +187,7 @@ function ClaimPreviewTile(props: Props) {

@@ -247,7 +247,7 @@ function ClaimPreviewTile(props: Props) {
{isChannel ? ( diff --git a/ui/component/downloadProgress/index.js b/ui/component/downloadProgress/index.js new file mode 100644 index 000000000..d5a4fa943 --- /dev/null +++ b/ui/component/downloadProgress/index.js @@ -0,0 +1,48 @@ +import { connect } from 'react-redux'; +import DownloadProgress from './view'; +import { doSetPlayingUri, doStopDownload, doContinueDownloading, doPurchaseUriWrapper } from 'redux/actions/content'; +import { selectFileInfosByOutpoint, SETTINGS } from 'lbry-redux'; +import { selectPrimaryUri, selectPlayingUri } from 'redux/selectors/content'; +import { makeSelectClientSetting } from 'redux/selectors/settings'; + +const select = (state) => { + const byOutpoint = selectFileInfosByOutpoint(state); + const runningByOutpoint = []; + const primaryUri = selectPrimaryUri(state); + const playingUri = selectPlayingUri(state); + const uri = playingUri ? playingUri.uri : null; + let primaryOutpoint = null; + let playingOutpoint = null; + + for (const key in byOutpoint) { + const item = byOutpoint[key]; + + if (item && primaryUri && primaryUri.includes(`/${item.claim_name}`)) primaryOutpoint = item.outpoint; + if (item && uri && uri.includes(`/${item.claim_name}`)) playingOutpoint = item.outpoint; + + if (item && item.status === 'running') { + runningByOutpoint.push(item); + } + } + + return { + byOutpoint: selectFileInfosByOutpoint(state), + primary: { + uri: primaryUri, + outpoint: primaryOutpoint, + }, + playing: { + uri, + outpoint: playingOutpoint, + }, + currentTheme: makeSelectClientSetting(SETTINGS.THEME)(state), + }; +}; + +const perform = (dispatch) => ({ + pause: () => dispatch(doSetPlayingUri({ uri: null })), + doContinueDownloading: (outpoint, force) => dispatch(doContinueDownloading(outpoint, force)), + stopDownload: (outpoint) => dispatch(doStopDownload(outpoint)), + download: (uri) => dispatch(doPurchaseUriWrapper(uri, false, true)), +}); +export default connect(select, perform)(DownloadProgress); diff --git a/ui/component/downloadProgress/view.jsx b/ui/component/downloadProgress/view.jsx new file mode 100644 index 000000000..dd95b5c7c --- /dev/null +++ b/ui/component/downloadProgress/view.jsx @@ -0,0 +1,286 @@ +// @flow +import React, { useState, useEffect } from 'react'; +import { shell } from 'electron'; +import Button from 'component/button'; +import * as ICONS from 'constants/icons'; +import { buildURI } from 'lbry-redux'; +import { formatBytes } from 'util/format-bytes'; +import { areEqual, removeItem } from 'util/array'; +import loadingIcon from '../../../static/img/white_loading.gif'; +import darkLoadingIcon from '../../../static/img/dark_loading.gif'; +import usePersistedState from 'effects/use-persisted-state'; + +type Props = { + byOutpoint: any, + primary: any, + playing: any, + currentTheme: string, + stopDownload: (outpoint: string) => void, + doContinueDownloading: (outpoint: string, force: boolean) => void, + download: (uri: string) => void, +}; + +function DownloadProgress({ byOutpoint, primary, playing, currentTheme, stopDownload, doContinueDownloading }: Props) { + const [isShow, setIsShow] = usePersistedState('download-progress', true); + const [downloading, setDownloading] = usePersistedState('download-progress-downloading', []); + const [cancelHash] = useState({}); + const [initDownloadingHash] = useState({}); + const [prevPlaying, setPrevPlaying] = useState({}); + const [prevPrimary, setPrevPrimary] = useState({}); + + const handleCancel = (hash, value) => { + cancelHash[hash] = value; + }; + + const handleStopDownload = (outpoint) => { + const updated = [...downloading]; + removeItem(updated, outpoint); + setDownloading(updated); + stopDownload(outpoint); + }; + + const runningByOutpoint = {}; + const currentDownloading = [...downloading]; + + for (const key in byOutpoint) { + const item = byOutpoint[key]; + if (item && item.status === 'running') runningByOutpoint[item.outpoint] = item; + } + + Object.keys(runningByOutpoint) + .filter((outpoint) => downloading.indexOf(outpoint) === -1) + .map((outpoint) => { + if (primary.outpoint !== outpoint && playing.outpoint !== outpoint) { + currentDownloading.push(outpoint); + } + }); + + downloading + .filter((outpoint) => (byOutpoint[outpoint] && byOutpoint[outpoint].status !== 'running') || !byOutpoint[outpoint]) + .map((outpoint) => { + removeItem(currentDownloading, outpoint); + }); + if (!areEqual(downloading, currentDownloading)) setDownloading(currentDownloading); + + if (currentDownloading.length === 0) return null; + + if (playing.outpoint !== prevPlaying.outpoint) { + if (downloading.includes(prevPlaying.outpoint)) { + setTimeout(() => { + doContinueDownloading(prevPlaying.outpoint, true); + }, 1000); + } + setPrevPlaying(playing); + } + + if (primary.outpoint !== prevPrimary.outpoint) { + if (downloading.includes(prevPrimary.outpoint)) { + setTimeout(() => { + doContinueDownloading(prevPrimary.outpoint, true); + }, 1000); + } + setPrevPrimary(primary); + } + + currentDownloading.map((outpoint) => { + if (!initDownloadingHash[outpoint]) { + initDownloadingHash[outpoint] = true; + doContinueDownloading(outpoint, false); + } + }); + + if (!isShow) { + return ( + <> + + + ); + } + + return ( +
+ + + {currentDownloading.map((outpoint, index) => { + const item = runningByOutpoint[outpoint]; + let releaseTime = ''; + let isPlaying = false; + if (item.metadata && item.metadata.release_time) { + releaseTime = new Date(parseInt(item.metadata.release_time) * 1000).toISOString().split('T')[0]; + } + if (outpoint === primary.outpoint || outpoint === playing.outpoint) { + isPlaying = true; + } + return ( +
+ {index !== 0 &&
} + +
+ ); + })} +
+ ); +} + +type DownloadProgressItemProps = { + fileName: string, + writtenBytes: number, + totalBytes: number, + addedOn: number, + title: string, + releaseTime: string, + directory: string, + outpoint: string, + isCancel: boolean, + claimID: string, + claimName: string, + playing: boolean, + currentTheme: string, + stopDownload: (outpoint: string) => void, + handleCancel: (hash: string, value: boolean) => void, +}; + +function DownloadProgressItem({ + fileName, + writtenBytes, + totalBytes, + addedOn, + title, + releaseTime, + directory, + outpoint, + isCancel, + claimID, + claimName, + playing, + currentTheme, + stopDownload, + handleCancel, +}: DownloadProgressItemProps) { + const processStopDownload = () => { + handleCancel(outpoint, false); + stopDownload(outpoint); + }; + + const [percent, setPercent] = useState(0); + const [progressText, setProgressText] = useState(''); + + useEffect(() => { + const updatePercent = ((writtenBytes / totalBytes) * 100).toFixed(0); + setPercent(updatePercent); + + let updateText = ''; + const downloadSpeed = Math.ceil(writtenBytes / (Date.now() / 1000 - addedOn)); + const remainingSecond = Math.ceil((totalBytes - writtenBytes) / downloadSpeed); + const remainingMinutes = Math.floor(remainingSecond / 60); + + if (remainingMinutes > 0) { + updateText += __('%remainingMinutes% minutes %remainSecond% seconds remaining', { + remainingMinutes: remainingMinutes, + remainSecond: remainingSecond - 60 * remainingMinutes, + }); + } else { + updateText += __('%remainSecond% seconds remaining', { remainSecond: remainingSecond - 60 * remainingMinutes }); + } + updateText += ' -- '; + + updateText += __('%written% of %total%', { + written: formatBytes(writtenBytes), + total: formatBytes(totalBytes), + }); + updateText += ' '; + + updateText += __('(%speed%/sec)', { + speed: formatBytes(downloadSpeed), + }); + + setProgressText(updateText); + }, [writtenBytes, totalBytes, addedOn]); + + const openDownloadFolder = () => { + shell.openPath(directory); + }; + return ( +
+
+
+
+ + {fileName} + +

{releaseTime}

+
+
+
+
+
+
+

{progressText}

+ {isCancel && ( +
+

{__('Do you cancel download this file?')}

+
+
+
+ )} +
+ ); +} + +export default DownloadProgress; diff --git a/ui/component/page/view.jsx b/ui/component/page/view.jsx index 1cb21c7ae..5fac4f8e8 100644 --- a/ui/component/page/view.jsx +++ b/ui/component/page/view.jsx @@ -5,6 +5,7 @@ import classnames from 'classnames'; import SideNavigation from 'component/sideNavigation'; import SettingsSideNavigation from 'component/settingsSideNavigation'; import Header from 'component/header'; +import DownloadProgress from 'component/downloadProgress'; /* @if TARGET='app' */ import StatusBar from 'component/common/status-bar'; /* @endif */ diff --git a/ui/component/viewers/videoViewer/view.jsx b/ui/component/viewers/videoViewer/view.jsx index 50f229231..4adef7722 100644 --- a/ui/component/viewers/videoViewer/view.jsx +++ b/ui/component/viewers/videoViewer/view.jsx @@ -150,6 +150,14 @@ function VideoViewer(props: Props) { bitrateAsBitsPerSecond = Math.round(contentInBits / durationInSeconds); } + // convert bytes to bits, and then divide by seconds + const contentInBits = Number(claim.value.source.size) * 8; + const durationInSeconds = claim.value.video && claim.value.video.duration; + let bitrateAsBitsPerSecond; + if (durationInSeconds) { + bitrateAsBitsPerSecond = Math.round(contentInBits / durationInSeconds); + } + fetch(source, { method: 'HEAD', cache: 'no-store' }).then((response) => { let playerPoweredBy = response.headers.get('x-powered-by') || ''; analytics.videoStartEvent( diff --git a/ui/redux/actions/content.js b/ui/redux/actions/content.js index 045987665..0cff1836f 100644 --- a/ui/redux/actions/content.js +++ b/ui/redux/actions/content.js @@ -14,29 +14,30 @@ import { } from 'redux/selectors/file_info'; import { makeSelectUrlsForCollectionId } from 'redux/selectors/collections'; import { doToast } from 'redux/actions/notifications'; -import { doPurchaseUri } from 'redux/actions/file'; +import { doPurchaseUri, doDeleteFile } from 'redux/actions/file'; import Lbry from 'lbry'; import * as SETTINGS from 'constants/settings'; import { makeSelectCostInfoForUri, Lbryio } from 'lbryinc'; import { makeSelectClientSetting, selectosNotificationsEnabled, selectDaemonSettings } from 'redux/selectors/settings'; const DOWNLOAD_POLL_INTERVAL = 1000; +var timeOutHash = {}; -export function doUpdateLoadStatus(uri: string, outpoint: string) { +export function doUpdateLoadStatus(uri: any, outpoint: string) { // Updates the loading status for a uri as it's downloading // Calls file_list and checks the written_bytes value to see if the number has increased // Not needed on web as users aren't actually downloading the file // @if TARGET='app' return (dispatch: Dispatch, getState: GetState) => { const setNextStatusUpdate = () => - setTimeout(() => { + (timeOutHash[outpoint] = setTimeout(() => { // We need to check if outpoint still exists first because user are able to delete file (outpoint) while downloading. // If a file is already deleted, no point to still try update load status const byOutpoint = selectFileInfosByOutpoint(getState()); if (byOutpoint[outpoint]) { dispatch(doUpdateLoadStatus(uri, outpoint)); } - }, DOWNLOAD_POLL_INTERVAL); + }, DOWNLOAD_POLL_INTERVAL)); Lbry.file_list({ outpoint, @@ -96,6 +97,25 @@ export function doUpdateLoadStatus(uri: string, outpoint: string) { // @endif } +export function doContinueDownloading(outpoint: string, force: boolean) { + return (dispatch: Dispatch) => { + if (!timeOutHash[outpoint] || force) { + dispatch(doUpdateLoadStatus(null, outpoint)); + } + }; +} + +export function doStopDownload(outpoint: string) { + return (dispatch: Dispatch) => { + if (timeOutHash[outpoint]) { + clearInterval(timeOutHash[outpoint]); + timeOutHash[outpoint] = undefined; + } + + dispatch(doDeleteFile(outpoint, false, false, null)); + }; +} + export function doSetPrimaryUri(uri: ?string) { return (dispatch: Dispatch) => { dispatch({ diff --git a/ui/scss/all.scss b/ui/scss/all.scss index 77ca90423..6911dc68b 100644 --- a/ui/scss/all.scss +++ b/ui/scss/all.scss @@ -66,3 +66,4 @@ @import 'component/empty'; @import 'component/stripe-card'; @import 'component/wallet-tip-send'; +@import 'component/download-progress'; diff --git a/ui/scss/component/_claim-list.scss b/ui/scss/component/_claim-list.scss index 8aed6c484..de482cc48 100644 --- a/ui/scss/component/_claim-list.scss +++ b/ui/scss/component/_claim-list.scss @@ -720,6 +720,7 @@ margin: 0 0; padding: var(--spacing-xxs) var(--spacing-xxs); height: unset; + background-color: var(--color-header-background); // label (with 'Add' text) hidden by default .button__label { diff --git a/ui/scss/component/_download-progress.scss b/ui/scss/component/_download-progress.scss new file mode 100644 index 000000000..5b0f29346 --- /dev/null +++ b/ui/scss/component/_download-progress.scss @@ -0,0 +1,224 @@ +.download-progress__header { + padding: 15px; + position: fixed; + bottom: 0; + right: 0; + width: 400px; + display: flex; + flex-direction: column; + background-color: var(--color-header-background); //var(--color-gray-9):dark-mode + border-radius: var(--border-radius); + // border: 1px solid var(--color-gray-3); + z-index: 9999; +} +.download-progress__top-close-button { + position: absolute; + top: 7px; + right: 15px; + font-size: 35px; + background-color: transparent; + width: 15px; + height: 15px; + div { + height: 2px; + width: 13px; + background-color: var(--color-gray-4); + border-radius: var(--border-radius); + } +} +.download-progress__state-container { + margin-top: 10px; + padding-bottom: 10px; + display: flex; + flex-direction: column; + width: 100%; +} +.download-progress__state-filename { + margin: 0; + font-weight: 800; + font-size: 13px; + flex: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-right: 10px; + span.button__label { + color: var(--color-text); + } +} +.download-progress__state-filename-link { + margin: 0; + font-weight: 800; + font-size: 13px; + flex: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-right: 10px; + text-decoration: underline; + cursor: pointer; +} +.download-progress__release-time { + margin: 0; + font-weight: 800; + font-size: 12px; + margin-left: auto; + font-style: italic; +} +.download-progress__state-bar { + display: flex; + flex-direction: row; + width: 100%; + align-items: center; + margin-bottom: 2px; +} +.download-progress__bar-container { + width: 100%; + background-color: var(--color-gray-5); + height: 6px; + border-radius: var(--border-radius); +} +.download-progress__bar-content { + border-radius: var(--border-radius); + height: 100%; + background-color: var(--color-primary); +} +.download-progress__close-button { + flex-shrink: 0; + margin-left: auto; + font-size: 20px; + cursor: pointer; +} +.download-progress__playing-button { + flex-shrink: 0; + margin-left: auto; + width: 29.6px; + height: 29.6px; +} +.download-progress__count-time { + font-size: 11px; + letter-spacing: -0.6px; +} +.download-progress__divider { + border-top: 1px solid var(--color-gray-6); + margin-left: -15px; + width: 110%; +} +.download-progress__cancel { + margin-top: 7px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} +.download-progress__cancel p { + margin: 0; + font-size: 12px; + margin: 0; + white-space: nowrap; + width: 285px; + overflow: hidden; + text-overflow: ellipsis; +} +.download-progress__cancel b { + font-size: 13px; +} +.download-progress__cancel-confirm { + width: 90px; + display: flex; + justify-content: space-around; + align-items: center; +} +.download-progress__cancel-ok { + border: none; + background-color: transparent; + font-size: 13px; + color: var(--color-text); +} +.download-progress__cancel-ok:hover { + color: var(--color-primary); +} +.download__container { + position: fixed; + bottom: 10px; + right: 10px; + width: 400px; + height: 300px; + border-radius: var(--border-radius); + box-shadow: 2px 2px 5px var(--color-gray-4); + background-color: var(--color-white); + transition: width 2s; +} +.download-progress__toggle-button { + position: fixed; + bottom: 10px; + right: 10px; + border: none; + background: var(--color-header-background); + color: var(--color-gray-6); + width: 50px; + height: 50px; + border-radius: var(--border-radius); + box-shadow: 0px 5px 4px var(--color-gray-4); + display: flex; + justify-content: center; + align-items: center; +} +.download_close_modal { + float: right; + margin-right: 10px; + font-size: 25px; +} +.download-progress__current-downloading { + position: fixed; + bottom: 25px; + right: 15px; + border: none; + width: 30px; + height: 30px; + display: flex; + justify-content: center; + align-items: center; + margin: 0; + animation-name: downloadcount; + animation-duration: 1.3s; + animation-iteration-count: infinite; + + .notification__bubble { + height: 1.5rem; + width: 1.5rem; + border-radius: 50%; + background-color: var(--color-editor-tag); + position: absolute; + top: -0.5rem; + right: -0.5rem; + color: white; + font-size: var(--font-small); + font-weight: bold; + line-height: 1; + display: flex; + align-items: center; + justify-content: center; + } + + .notification__bubble--small { + font-size: var(--font-xsmall); + } + + .notification__bubble--inline { + @extend .notification__bubble; + top: 0.75rem; + right: 1rem; + } +} +@keyframes downloadcount { + 0% { + transform: translateY(-10px); + } + 50% { + transform: translateY(-3px); + } + 100% { + transform: translateY(-10px); + } +} diff --git a/ui/scss/component/menu-button.scss b/ui/scss/component/menu-button.scss index 593ffa47a..03b097903 100644 --- a/ui/scss/component/menu-button.scss +++ b/ui/scss/component/menu-button.scss @@ -121,6 +121,12 @@ overflow-x: hidden; } +.menu__link-disable { + @extend .menu__link; + color: var(--color-text-subtitle)!important; +} + + .menu__link--notification { width: 100%; display: flex; diff --git a/ui/util/array.js b/ui/util/array.js new file mode 100644 index 000000000..4badb3006 --- /dev/null +++ b/ui/util/array.js @@ -0,0 +1,18 @@ +export function areEqual(first, second) { + if (first.length !== second.length) { + return false; + } + for (let i = 0; i < first.length; i++) { + if (!second.includes(first[i])) { + return false; + } + } + return true; +} + +export function removeItem(array, item) { + const index = array.indexOf(item); + if (index > -1) { + array.splice(index, 1); + } +} diff --git a/ui/util/livestream.js b/ui/util/livestream.js new file mode 100644 index 000000000..2cf026194 --- /dev/null +++ b/ui/util/livestream.js @@ -0,0 +1,24 @@ +// @flow + +/** + * Helper to extract livestream claim uris from the output of + * `selectActiveLivestreams`. + * + * @param activeLivestreams Object obtained from `selectActiveLivestreams`. + * @param channelIds List of channel IDs to filter the results with. + * @returns {[]|Array<*>} + */ +export function getLivestreamUris(activeLivestreams: ?LivestreamInfo, channelIds: ?Array) { + let values = (activeLivestreams && Object.values(activeLivestreams)) || []; + + if (channelIds && channelIds.length > 0) { + // $FlowFixMe + values = values.filter((v) => channelIds.includes(v.creatorId) && Boolean(v.latestClaimUri)); + } else { + // $FlowFixMe + values = values.filter((v) => Boolean(v.latestClaimUri)); + } + + // $FlowFixMe + return values.map((v) => v.latestClaimUri); +} diff --git a/ui/util/remark-lbry.js b/ui/util/remark-lbry.js index 1350370dc..d0850bc50 100644 --- a/ui/util/remark-lbry.js +++ b/ui/util/remark-lbry.js @@ -26,6 +26,21 @@ function handlePunctuation(value) { return punctuationIndex ? value.substring(0, punctuationIndex) : value; } +function handlePunctuation(value) { + const modifierIndex = + (value.indexOf(':') >= 0 && value.indexOf(':')) || (value.indexOf('#') >= 0 && value.indexOf('#')); + + let punctuationIndex; + punctuationMarks.some((p) => { + if (modifierIndex) { + punctuationIndex = value.indexOf(p, modifierIndex + 1) >= 0 && value.indexOf(p, modifierIndex + 1); + } + return punctuationIndex; + }); + + return punctuationIndex ? value.substring(0, punctuationIndex) : value; +} + // Find channel mention function locateMention(value, fromIndex) { const index = value.indexOf(mentionToken, fromIndex);