diff --git a/.gitignore b/.gitignore index 17a8ad330..022473023 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ dist .#* build/daemon.zip +.vimrc diff --git a/ui/js/actions/cost_info.js b/ui/js/actions/cost_info.js index e8485deff..9f7506b5f 100644 --- a/ui/js/actions/cost_info.js +++ b/ui/js/actions/cost_info.js @@ -10,23 +10,9 @@ export function doFetchCostInfoForUri(uri) { return function(dispatch, getState) { const state = getState(), claim = selectClaimsByUri(state)[uri], - isResolving = selectResolvingUris(state).indexOf(uri) !== -1, isGenerous = selectSettingsIsGenerous(state); - if (claim === null) { - //claim doesn't exist, nothing to fetch a cost for - return; - } - - if (!claim) { - setTimeout(() => { - dispatch(doFetchCostInfoForUri(uri)); - }, 1000); - if (!isResolving) { - dispatch(doResolveUri(uri)); - } - return; - } + if (!claim) return null function begin() { dispatch({ diff --git a/ui/js/component/filePrice/index.js b/ui/js/component/filePrice/index.js index d97249e3f..aa8f692aa 100644 --- a/ui/js/component/filePrice/index.js +++ b/ui/js/component/filePrice/index.js @@ -4,16 +4,21 @@ import { doFetchCostInfoForUri } from "actions/cost_info"; import { makeSelectCostInfoForUri, makeSelectFetchingCostInfoForUri, -} from "selectors/cost_info"; -import FilePrice from "./view"; +} from 'selectors/cost_info' +import { + makeSelectClaimForUri, +} from 'selectors/claims' +import FilePrice from './view' const makeSelect = () => { const selectCostInfoForUri = makeSelectCostInfoForUri(); const selectFetchingCostInfoForUri = makeSelectFetchingCostInfoForUri(); + const selectClaim = makeSelectClaimForUri(); const select = (state, props) => ({ costInfo: selectCostInfoForUri(state, props), fetching: selectFetchingCostInfoForUri(state, props), + claim: selectClaim(state, props), }); return select; diff --git a/ui/js/component/filePrice/view.jsx b/ui/js/component/filePrice/view.jsx index 4bbb163dc..a807db071 100644 --- a/ui/js/component/filePrice/view.jsx +++ b/ui/js/component/filePrice/view.jsx @@ -11,9 +11,15 @@ class FilePrice extends React.Component { } fetchCost(props) { - const { costInfo, fetchCostInfo, uri, fetching } = props; + const { + costInfo, + fetchCostInfo, + uri, + fetching, + claim, + } = props; - if (costInfo === undefined && !fetching) { + if (costInfo === undefined && !fetching && claim) { fetchCostInfo(uri); } } diff --git a/ui/js/component/fileTile/view.jsx b/ui/js/component/fileTile/view.jsx index d76d75ec2..34b1476dd 100644 --- a/ui/js/component/fileTile/view.jsx +++ b/ui/js/component/fileTile/view.jsx @@ -19,11 +19,15 @@ class FileTile extends React.Component { } componentDidMount() { - const { isResolvingUri, resolveUri, claim, uri } = this.props; + this.resolve(this.props); + } - if (!isResolvingUri && !claim && uri) { - resolveUri(uri); - } + componentWillReceiveProps(nextProps) { + this.resolve(nextProps); + } + + resolve({ isResolvingUri, claim, uri, resolveUri }) { + if (!isResolvingUri && claim === undefined && uri) resolveUri(uri); } handleMouseOver() { diff --git a/ui/js/reducers/claims.js b/ui/js/reducers/claims.js index c6c5801d4..d3cde592e 100644 --- a/ui/js/reducers/claims.js +++ b/ui/js/reducers/claims.js @@ -7,23 +7,24 @@ const defaultState = {}; reducers[types.RESOLVE_URI_COMPLETED] = function(state, action) { const { uri, certificate, claim } = action.data; - const newClaims = Object.assign({}, state.claimsByUri); + const byUri = Object.assign({}, state.claimsByUri); + const byId = Object.assign({}, state.byId); - newClaims[uri] = claim; - - //This needs a sanity boost... - if (certificate !== undefined && claim === undefined) { - const uriParts = lbryuri.parse(uri); - // newChannelClaims[uri] = certificate - if (claim === undefined) { - newClaims[uri] = certificate; - } + if (claim) { + byId[claim.claim_id] = claim; + byUri[uri] = claim.claim_id; + } else if (claim === undefined && certificate !== undefined) { + byId[certificate.claim_id] = certificate; + byUri[uri] = certificate.claim_id; + } else { + byUri[uri] = null; } return Object.assign({}, state, { - claimsByUri: newClaims, + byId, + claimsByUri: byUri }); -}; +} reducers[types.RESOLVE_URI_CANCELED] = function(state, action) { const uri = action.data.uri; @@ -41,26 +42,24 @@ reducers[types.FETCH_CLAIM_LIST_MINE_STARTED] = function(state, action) { }; reducers[types.FETCH_CLAIM_LIST_MINE_COMPLETED] = function(state, action) { - const { claims } = action.data; + const { + claims, + } = action.data; const myClaims = new Set(state.myClaims); const byUri = Object.assign({}, state.claimsByUri); + const byId = Object.assign({}, state.byId); claims.forEach(claim => { - const uri = lbryuri.build({ - contentName: claim.name, - claimId: claim.claim_id, - claimSequence: claim.nout, - }); - myClaims.add(uri); - byUri[uri] = claim; - }); + myClaims.add(claim.claim_id); + byId[claim.claim_id] = claim; + }) return Object.assign({}, state, { isClaimListMinePending: false, myClaims: myClaims, - claimsByUri: byUri, + byId, }); -}; +} // reducers[types.FETCH_CHANNEL_CLAIMS_STARTED] = function(state, action) { // const { diff --git a/ui/js/selectors/claims.js b/ui/js/selectors/claims.js index 0a4c9b61a..11e3b1e86 100644 --- a/ui/js/selectors/claims.js +++ b/ui/js/selectors/claims.js @@ -1,12 +1,38 @@ import { createSelector } from "reselect"; import lbryuri from "lbryuri"; -export const _selectState = state => state.claims || {}; +const _selectState = state => state.claims || {}; + +export const selectClaimsById = createSelector( + _selectState, + (state) => state.byId || {} +); export const selectClaimsByUri = createSelector( _selectState, - state => state.claimsByUri || {} -); + selectClaimsById, + (state, byId) => { + const byUri = state.claimsByUri || {}; + const claims = {}; + + Object.keys(byUri).forEach(uri => { + const claimId = byUri[uri]; + + // NOTE returning a null claim allows us to differentiate between an + // undefined (never fetched claim) and one which just doesn't exist. Not + // the cleanest solution but couldn't think of anything better right now + if (claimId === null) { + claims[uri] = null; + } else { + const claim = byId[claimId]; + + claims[uri] = claim; + } + }) + + return claims; + } +) export const selectAllClaimsByChannel = createSelector( _selectState, @@ -74,14 +100,14 @@ export const selectMyClaims = createSelector( export const selectMyClaimsOutpoints = createSelector( selectMyClaims, - selectClaimsByUri, - (claimIds, byUri) => { + selectClaimsById, + (claimIds, byId) => { const outpoints = []; claimIds.forEach(claimId => { - const claim = byUri[claimId]; + const claim = byId[claimId]; if (claim) outpoints.push(`${claim.txid}:${claim.nout}`); - }); + }) return outpoints; }