diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 8403ec135..035c1e0aa 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.11.4 +current_version = 0.11.5rc1 commit = True tag = True parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)((?P<release>[a-z]+)(?P<candidate>\d+))? diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a7f237d2..253d97ad0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,8 +16,10 @@ Web UI version numbers should always match the corresponding version of LBRY App * ### Fixed - * - * + * Eliminated instance of costs being double fetched + * Fixed issue preventing file re-download + * Fixed race condition that could prevent file playbac + * Fixed issue with batch actions and thunk ### Deprecated * diff --git a/app/package.json b/app/package.json index a3c2e86fd..d33d9adca 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "LBRY", - "version": "0.11.4", + "version": "0.11.5rc1", "main": "main.js", "description": "LBRY is a fully decentralized, open-source protocol facilitating the discovery, access, and (sometimes) purchase of data.", "author": { diff --git a/ui/js/component/fileActions/index.js b/ui/js/component/fileActions/index.js index a570cd413..e9dc10705 100644 --- a/ui/js/component/fileActions/index.js +++ b/ui/js/component/fileActions/index.js @@ -16,6 +16,9 @@ import { import { selectCurrentModal, } from 'selectors/app' +import { + makeSelectCostInfoForUri, +} from 'selectors/cost_info' import { doCloseModal, doOpenModal, @@ -39,6 +42,7 @@ const makeSelect = () => { const selectFileInfoForUri = makeSelectFileInfoForUri() const selectIsAvailableForUri = makeSelectIsAvailableForUri() const selectDownloadingForUri = makeSelectDownloadingForUri() + const selectCostInfoForUri = makeSelectCostInfoForUri() const select = (state, props) => ({ fileInfo: selectFileInfoForUri(state, props), @@ -46,6 +50,7 @@ const makeSelect = () => { platform: selectPlatform(state), modal: selectCurrentModal(state), downloading: selectDownloadingForUri(state, props), + costInfo: selectCostInfoForUri(state, props), }) return select @@ -62,7 +67,7 @@ const perform = (dispatch) => ({ }, openModal: (modal) => dispatch(doOpenModal(modal)), startDownload: (uri) => dispatch(doPurchaseUri(uri)), - loadVideo: (uri) => dispatch(doLoadVideo(uri)) + loadVideo: (uri) => dispatch(doLoadVideo(uri)), }) export default connect(makeSelect, perform)(FileActions) \ No newline at end of file diff --git a/ui/js/component/fileActions/view.jsx b/ui/js/component/fileActions/view.jsx index f72893df1..686dfd98f 100644 --- a/ui/js/component/fileActions/view.jsx +++ b/ui/js/component/fileActions/view.jsx @@ -62,6 +62,7 @@ class FileActions extends React.Component { openModal, closeModal, startDownload, + costInfo, } = this.props const deleteChecked = this.state.deleteChecked, @@ -99,8 +100,11 @@ class FileActions extends React.Component { </div> } else if (fileInfo === null && !downloading) { - - content = <Link button="text" label={__("Download")} icon="icon-download" onClick={() => { startDownload(uri) } } />; + if (!costInfo) { + content = <BusyMessage message="Fetching cost info" /> + } else { + content = <Link button="text" label="Download" icon="icon-download" onClick={() => { startDownload(uri) } } />; + } } else if (fileInfo && fileInfo.download_path) { content = <Link label={__("Open")} button="text" icon="icon-folder-open" onClick={() => openInShell(fileInfo)} />; diff --git a/ui/js/component/filePrice/index.js b/ui/js/component/filePrice/index.js index 726ceb3ee..65e870a58 100644 --- a/ui/js/component/filePrice/index.js +++ b/ui/js/component/filePrice/index.js @@ -7,14 +7,17 @@ import { } from 'actions/cost_info' import { makeSelectCostInfoForUri, + makeSelectFetchingCostInfoForUri, } from 'selectors/cost_info' import FilePrice from './view' const makeSelect = () => { const selectCostInfoForUri = makeSelectCostInfoForUri() + const selectFetchingCostInfoForUri = makeSelectFetchingCostInfoForUri() const select = (state, props) => ({ costInfo: selectCostInfoForUri(state, props), + fetching: selectFetchingCostInfoForUri(state, props), }) return select diff --git a/ui/js/component/filePrice/view.jsx b/ui/js/component/filePrice/view.jsx index 4edc3a3e7..2a0872492 100644 --- a/ui/js/component/filePrice/view.jsx +++ b/ui/js/component/filePrice/view.jsx @@ -16,10 +16,11 @@ class FilePrice extends React.Component{ const { costInfo, fetchCostInfo, - uri + uri, + fetching, } = props - if (costInfo === undefined) { + if (costInfo === undefined && !fetching) { fetchCostInfo(uri) } } diff --git a/ui/js/component/video/view.jsx b/ui/js/component/video/view.jsx index 431c2ee82..8f0c99720 100644 --- a/ui/js/component/video/view.jsx +++ b/ui/js/component/video/view.jsx @@ -101,7 +101,9 @@ class Video extends React.Component { let loadStatusMessage = '' - if (isLoading) { + if(fileInfo && fileInfo.completed && !fileInfo.written_bytes) { + loadStatusMessage = "It looks like you deleted or moved this file. We're rebuilding it now. It will only take a few seconds." + } else if (isLoading) { loadStatusMessage = __("Requesting stream... it may sit here for like 15-20 seconds in a really awkward way... we're working on it") } else if (isDownloading) { loadStatusMessage = __("Downloading stream... not long left now!") diff --git a/ui/js/main.js b/ui/js/main.js index e50f6f6c0..957921563 100644 --- a/ui/js/main.js +++ b/ui/js/main.js @@ -12,7 +12,6 @@ import lighthouse from './lighthouse.js'; import App from 'component/app/index.js'; import SnackBar from 'component/snackBar'; import { Provider } from 'react-redux'; -import batchActions from 'util/batchActions' import store from 'store.js'; import SplashScreen from 'component/splash.js'; import {AuthOverlay} from 'component/auth.js'; @@ -86,12 +85,10 @@ var init = function() { window.sessionStorage.setItem('loaded', 'y'); //once we've made it here once per session, we don't need to show splash again const actions = [] - actions.push(doDaemonReady()) - actions.push(doChangePath('/discover')) - actions.push(doFetchDaemonSettings()) - actions.push(doFileList()) - - app.store.dispatch(batchActions(actions)) + app.store.dispatch(doDaemonReady()) + app.store.dispatch(doChangePath('/discover')) + app.store.dispatch(doFetchDaemonSettings()) + app.store.dispatch(doFileList()) ReactDOM.render(<Provider store={store}><div>{ lbryio.enabled ? <AuthOverlay/> : '' }<App /><SnackBar /></div></Provider>, canvas) } diff --git a/ui/js/selectors/cost_info.js b/ui/js/selectors/cost_info.js index 242ec6b0d..84bbb5f02 100644 --- a/ui/js/selectors/cost_info.js +++ b/ui/js/selectors/cost_info.js @@ -17,3 +17,19 @@ export const makeSelectCostInfoForUri = () => { (costInfo) => costInfo ) } + +export const selectFetchingCostInfo = createSelector( + _selectState, + (state) => state.fetching || {} +) + +const selectFetchingCostInfoForUri = (state, props) => { + return selectFetchingCostInfo(state)[props.uri] +} + +export const makeSelectFetchingCostInfoForUri = () => { + return createSelector( + selectFetchingCostInfoForUri, + (fetching) => !!fetching + ) +} diff --git a/ui/package.json b/ui/package.json index 7ee6d6272..18519d144 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "lbry-web-ui", - "version": "0.11.4", + "version": "0.11.5rc1", "description": "LBRY UI", "scripts": { "test": "echo \"Error: no test specified\" && exit 1",