Store claims by claim_id and fileinfo by sd_hash #192

Merged
6ea86b96 merged 5 commits from claims-by-id into master 2017-06-07 17:09:39 +02:00
7 changed files with 80 additions and 53 deletions

1
.gitignore vendored
View file

@ -16,3 +16,4 @@ dist
.#*
build/daemon.zip
.vimrc

View file

@ -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({

View file

@ -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;

View file

@ -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);
}
}

View file

@ -19,11 +19,15 @@ class FileTile extends React.Component {
}
componentDidMount() {
const { isResolvingUri, resolveUri, claim, uri } = this.props;
if (!isResolvingUri && !claim && uri) {
resolveUri(uri);
this.resolve(this.props);
}
componentWillReceiveProps(nextProps) {
this.resolve(nextProps);
}
resolve({ isResolvingUri, claim, uri, resolveUri }) {
if (!isResolvingUri && claim === undefined && uri) resolveUri(uri);
}
handleMouseOver() {

View file

@ -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 {

View file

@ -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;
}