Store claims by claim_id and fileinfo by sd_hash #192
7 changed files with 80 additions and 53 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -16,3 +16,4 @@ dist
|
|||
.#*
|
||||
|
||||
build/daemon.zip
|
||||
.vimrc
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue