byId: update only if claim has new data
This was already being done for Content claims, and repeated for Channels, Collections, and other reducers.
This commit is contained in:
parent
7515d21510
commit
ff20663b8d
1 changed files with 58 additions and 41 deletions
|
@ -130,7 +130,7 @@ function resolveDelta(original: any, delta: any) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function claimObjHasNewData(original, fresh) {
|
function claimHasNewData(original, fresh) {
|
||||||
// Don't blow away 'is_my_output' just because the next query didn't ask for it.
|
// Don't blow away 'is_my_output' just because the next query didn't ask for it.
|
||||||
const ignoreIsMyOutput = original.is_my_output !== undefined && fresh.is_my_output === undefined;
|
const ignoreIsMyOutput = original.is_my_output !== undefined && fresh.is_my_output === undefined;
|
||||||
|
|
||||||
|
@ -139,10 +139,14 @@ function claimObjHasNewData(original, fresh) {
|
||||||
// Just do a length comparison for now, which covers 99% of cases while we
|
// Just do a length comparison for now, which covers 99% of cases while we
|
||||||
// figure out what's causing the order to change.
|
// figure out what's causing the order to change.
|
||||||
const ignoreTags =
|
const ignoreTags =
|
||||||
|
original &&
|
||||||
original.value &&
|
original.value &&
|
||||||
fresh.value &&
|
|
||||||
original.value.tags &&
|
original.value.tags &&
|
||||||
|
original.value.tags.length &&
|
||||||
|
fresh &&
|
||||||
|
fresh.value &&
|
||||||
fresh.value.tags &&
|
fresh.value.tags &&
|
||||||
|
fresh.value.tags.length &&
|
||||||
original.value.tags.length !== fresh.value.tags.length;
|
original.value.tags.length !== fresh.value.tags.length;
|
||||||
|
|
||||||
const excludeKeys = (key, value) => {
|
const excludeKeys = (key, value) => {
|
||||||
|
@ -162,8 +166,8 @@ function claimObjHasNewData(original, fresh) {
|
||||||
/**
|
/**
|
||||||
* Adds the new value to the delta if the value is different from the original.
|
* Adds the new value to the delta if the value is different from the original.
|
||||||
*
|
*
|
||||||
* @param original The original object.
|
* @param original The original state object.
|
||||||
* @param delta The delta object containing a list of changes.
|
* @param delta The delta state object containing a list of changes.
|
||||||
* @param key
|
* @param key
|
||||||
* @param newValue
|
* @param newValue
|
||||||
*/
|
*/
|
||||||
|
@ -173,6 +177,21 @@ function updateIfValueChanged(original, delta, key, newValue) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds the new claim to the delta if the claim contains changes that the GUI
|
||||||
|
* would care about.
|
||||||
|
*
|
||||||
|
* @param original The original state object.
|
||||||
|
* @param delta The delta state object containing a list of changes.
|
||||||
|
* @param key
|
||||||
|
* @param newClaim
|
||||||
|
*/
|
||||||
|
function updateIfClaimChanged(original, delta, key, newClaim) {
|
||||||
|
if (!original[key] || claimHasNewData(original[key], newClaim)) {
|
||||||
|
delta[key] = newClaim;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
// handleClaimAction
|
// handleClaimAction
|
||||||
// ****************************************************************************
|
// ****************************************************************************
|
||||||
|
@ -196,9 +215,7 @@ function handleClaimAction(state: State, action: any): State {
|
||||||
if (pendingById[stream.claim_id]) {
|
if (pendingById[stream.claim_id]) {
|
||||||
byIdDelta[stream.claim_id] = mergeClaim(stream, state.byId[stream.claim_id]);
|
byIdDelta[stream.claim_id] = mergeClaim(stream, state.byId[stream.claim_id]);
|
||||||
} else {
|
} else {
|
||||||
if (!state.byId[stream.claim_id] || claimObjHasNewData(state.byId[stream.claim_id], stream)) {
|
updateIfClaimChanged(state.byId, byIdDelta, stream.claim_id, stream);
|
||||||
byIdDelta[stream.claim_id] = stream;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateIfValueChanged(state.claimsByUri, byUriDelta, url, stream.claim_id);
|
updateIfValueChanged(state.claimsByUri, byUriDelta, url, stream.claim_id);
|
||||||
|
@ -229,7 +246,7 @@ function handleClaimAction(state: State, action: any): State {
|
||||||
if (pendingById[channel.claim_id]) {
|
if (pendingById[channel.claim_id]) {
|
||||||
byIdDelta[channel.claim_id] = mergeClaim(channel, state.byId[channel.claim_id]);
|
byIdDelta[channel.claim_id] = mergeClaim(channel, state.byId[channel.claim_id]);
|
||||||
} else {
|
} else {
|
||||||
byIdDelta[channel.claim_id] = channel;
|
updateIfClaimChanged(state.byId, byIdDelta, channel.claim_id, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateIfValueChanged(state.claimsByUri, byUriDelta, channel.permanent_url, channel.claim_id);
|
updateIfValueChanged(state.claimsByUri, byUriDelta, channel.permanent_url, channel.claim_id);
|
||||||
|
@ -242,7 +259,7 @@ function handleClaimAction(state: State, action: any): State {
|
||||||
if (pendingById[collection.claim_id]) {
|
if (pendingById[collection.claim_id]) {
|
||||||
byIdDelta[collection.claim_id] = mergeClaim(collection, state.byId[collection.claim_id]);
|
byIdDelta[collection.claim_id] = mergeClaim(collection, state.byId[collection.claim_id]);
|
||||||
} else {
|
} else {
|
||||||
byIdDelta[collection.claim_id] = collection;
|
updateIfClaimChanged(state.byId, byIdDelta, collection.claim_id, collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateIfValueChanged(state.claimsByUri, byUriDelta, url, collection.claim_id);
|
updateIfValueChanged(state.claimsByUri, byUriDelta, url, collection.claim_id);
|
||||||
|
@ -309,7 +326,7 @@ reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = (state: State, action: any):
|
||||||
const page = result.page;
|
const page = result.page;
|
||||||
const totalItems = result.total_items;
|
const totalItems = result.total_items;
|
||||||
|
|
||||||
const byId = Object.assign({}, state.byId);
|
const byIdDelta = {};
|
||||||
const byUriDelta = {};
|
const byUriDelta = {};
|
||||||
const pendingByIdDelta = {};
|
const pendingByIdDelta = {};
|
||||||
|
|
||||||
|
@ -324,13 +341,13 @@ reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = (state: State, action: any):
|
||||||
if (claim.confirmations < 1) {
|
if (claim.confirmations < 1) {
|
||||||
pendingByIdDelta[claimId] = claim;
|
pendingByIdDelta[claimId] = claim;
|
||||||
|
|
||||||
if (byId[claimId]) {
|
if (state.byId[claimId]) {
|
||||||
byId[claimId] = mergeClaim(claim, byId[claimId]);
|
byIdDelta[claimId] = mergeClaim(claim, state.byId[claimId]);
|
||||||
} else {
|
} else {
|
||||||
byId[claimId] = claim;
|
byIdDelta[claimId] = claim;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
byId[claimId] = claim;
|
updateIfClaimChanged(state.byId, byIdDelta, claimId, claim);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateIfValueChanged(state.claimsByUri, byUriDelta, permanentUri, claimId);
|
updateIfValueChanged(state.claimsByUri, byUriDelta, permanentUri, claimId);
|
||||||
|
@ -342,7 +359,7 @@ reducers[ACTIONS.FETCH_CLAIM_LIST_MINE_COMPLETED] = (state: State, action: any):
|
||||||
return Object.assign({}, state, {
|
return Object.assign({}, state, {
|
||||||
isFetchingClaimListMine: false,
|
isFetchingClaimListMine: false,
|
||||||
myClaims: Array.from(myClaimIds),
|
myClaims: Array.from(myClaimIds),
|
||||||
byId,
|
byId: resolveDelta(state.byId, byIdDelta),
|
||||||
pendingById: resolveDelta(state.pendingById, pendingByIdDelta),
|
pendingById: resolveDelta(state.pendingById, pendingByIdDelta),
|
||||||
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
||||||
myClaimsPageResults: urlsForCurrentPage,
|
myClaimsPageResults: urlsForCurrentPage,
|
||||||
|
@ -359,7 +376,7 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_COMPLETED] = (state: State, action: any): St
|
||||||
let myClaimIds = new Set(state.myClaims);
|
let myClaimIds = new Set(state.myClaims);
|
||||||
const pendingByIdDelta = {};
|
const pendingByIdDelta = {};
|
||||||
let myChannelClaims;
|
let myChannelClaims;
|
||||||
const byId = Object.assign({}, state.byId);
|
const byIdDelta = {};
|
||||||
const byUriDelta = {};
|
const byUriDelta = {};
|
||||||
const channelClaimCounts = Object.assign({}, state.channelClaimCounts);
|
const channelClaimCounts = Object.assign({}, state.channelClaimCounts);
|
||||||
|
|
||||||
|
@ -384,13 +401,13 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_COMPLETED] = (state: State, action: any): St
|
||||||
if (confirmations < 1) {
|
if (confirmations < 1) {
|
||||||
pendingByIdDelta[claimId] = claim;
|
pendingByIdDelta[claimId] = claim;
|
||||||
|
|
||||||
if (byId[claimId]) {
|
if (state.byId[claimId]) {
|
||||||
byId[claimId] = mergeClaim(claim, byId[claimId]);
|
byIdDelta[claimId] = mergeClaim(claim, state.byId[claimId]);
|
||||||
} else {
|
} else {
|
||||||
byId[claimId] = claim;
|
byIdDelta[claimId] = claim;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
byId[claimId] = claim;
|
updateIfClaimChanged(state.byId, byIdDelta, claimId, claim);
|
||||||
}
|
}
|
||||||
|
|
||||||
myClaimIds.add(claimId);
|
myClaimIds.add(claimId);
|
||||||
|
@ -398,7 +415,7 @@ reducers[ACTIONS.FETCH_CHANNEL_LIST_COMPLETED] = (state: State, action: any): St
|
||||||
}
|
}
|
||||||
|
|
||||||
return Object.assign({}, state, {
|
return Object.assign({}, state, {
|
||||||
byId,
|
byId: resolveDelta(state.byId, byIdDelta),
|
||||||
pendingById: resolveDelta(state.pendingById, pendingByIdDelta),
|
pendingById: resolveDelta(state.pendingById, pendingByIdDelta),
|
||||||
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
||||||
channelClaimCounts,
|
channelClaimCounts,
|
||||||
|
@ -425,7 +442,7 @@ reducers[ACTIONS.FETCH_COLLECTION_LIST_COMPLETED] = (state: State, action: any):
|
||||||
let myClaimIds = new Set(myClaims);
|
let myClaimIds = new Set(myClaims);
|
||||||
const pendingByIdDelta = {};
|
const pendingByIdDelta = {};
|
||||||
let myCollectionClaimsSet = new Set([]);
|
let myCollectionClaimsSet = new Set([]);
|
||||||
const byId = Object.assign({}, state.byId);
|
const byIdDelta = {};
|
||||||
const byUriDelta = {};
|
const byUriDelta = {};
|
||||||
|
|
||||||
if (claims.length) {
|
if (claims.length) {
|
||||||
|
@ -443,13 +460,13 @@ reducers[ACTIONS.FETCH_COLLECTION_LIST_COMPLETED] = (state: State, action: any):
|
||||||
if (confirmations < 1) {
|
if (confirmations < 1) {
|
||||||
pendingByIdDelta[claimId] = claim;
|
pendingByIdDelta[claimId] = claim;
|
||||||
|
|
||||||
if (byId[claimId]) {
|
if (state.byId[claimId]) {
|
||||||
byId[claimId] = mergeClaim(claim, byId[claimId]);
|
byIdDelta[claimId] = mergeClaim(claim, state.byId[claimId]);
|
||||||
} else {
|
} else {
|
||||||
byId[claimId] = claim;
|
byIdDelta[claimId] = claim;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
byId[claimId] = claim;
|
updateIfClaimChanged(state.byId, byIdDelta, claimId, claim);
|
||||||
}
|
}
|
||||||
|
|
||||||
myClaimIds.add(claimId);
|
myClaimIds.add(claimId);
|
||||||
|
@ -458,7 +475,7 @@ reducers[ACTIONS.FETCH_COLLECTION_LIST_COMPLETED] = (state: State, action: any):
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
byId,
|
byId: resolveDelta(state.byId, byIdDelta),
|
||||||
pendingById: resolveDelta(state.pendingById, pendingByIdDelta),
|
pendingById: resolveDelta(state.pendingById, pendingByIdDelta),
|
||||||
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
||||||
fetchingMyCollections: false,
|
fetchingMyCollections: false,
|
||||||
|
@ -507,7 +524,7 @@ reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = (state: State, action: any):
|
||||||
const byChannel = claimsInChannel === previousCount ? Object.assign({}, paginatedClaimsByChannel[uri]) : {};
|
const byChannel = claimsInChannel === previousCount ? Object.assign({}, paginatedClaimsByChannel[uri]) : {};
|
||||||
const allClaimIds = new Set(byChannel.all);
|
const allClaimIds = new Set(byChannel.all);
|
||||||
const currentPageClaimIds = [];
|
const currentPageClaimIds = [];
|
||||||
const byId = Object.assign({}, state.byId);
|
const byIdDelta = {};
|
||||||
const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims);
|
const fetchingChannelClaims = Object.assign({}, state.fetchingChannelClaims);
|
||||||
const claimsByUriDelta = {};
|
const claimsByUriDelta = {};
|
||||||
|
|
||||||
|
@ -515,7 +532,7 @@ reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = (state: State, action: any):
|
||||||
claims.forEach((claim) => {
|
claims.forEach((claim) => {
|
||||||
allClaimIds.add(claim.claim_id);
|
allClaimIds.add(claim.claim_id);
|
||||||
currentPageClaimIds.push(claim.claim_id);
|
currentPageClaimIds.push(claim.claim_id);
|
||||||
byId[claim.claim_id] = claim;
|
updateIfClaimChanged(state.byId, byIdDelta, claim.claim_id, claim);
|
||||||
updateIfValueChanged(state.claimsByUri, claimsByUriDelta, claim.canonical_url, claim.claim_id);
|
updateIfValueChanged(state.claimsByUri, claimsByUriDelta, claim.canonical_url, claim.claim_id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -529,7 +546,7 @@ reducers[ACTIONS.FETCH_CHANNEL_CLAIMS_COMPLETED] = (state: State, action: any):
|
||||||
|
|
||||||
return Object.assign({}, state, {
|
return Object.assign({}, state, {
|
||||||
paginatedClaimsByChannel,
|
paginatedClaimsByChannel,
|
||||||
byId,
|
byId: resolveDelta(state.byId, byIdDelta),
|
||||||
fetchingChannelClaims,
|
fetchingChannelClaims,
|
||||||
claimsByUri: resolveDelta(state.claimsByUri, claimsByUriDelta),
|
claimsByUri: resolveDelta(state.claimsByUri, claimsByUriDelta),
|
||||||
channelClaimCounts,
|
channelClaimCounts,
|
||||||
|
@ -550,7 +567,7 @@ reducers[ACTIONS.ABANDON_CLAIM_STARTED] = (state: State, action: any): State =>
|
||||||
|
|
||||||
reducers[ACTIONS.UPDATE_PENDING_CLAIMS] = (state: State, action: any): State => {
|
reducers[ACTIONS.UPDATE_PENDING_CLAIMS] = (state: State, action: any): State => {
|
||||||
const { claims: pendingClaims }: { claims: Array<Claim> } = action.data;
|
const { claims: pendingClaims }: { claims: Array<Claim> } = action.data;
|
||||||
const byId = Object.assign({}, state.byId);
|
const byIdDelta = {};
|
||||||
const pendingById = Object.assign({}, state.pendingById);
|
const pendingById = Object.assign({}, state.pendingById);
|
||||||
const byUriDelta = {};
|
const byUriDelta = {};
|
||||||
let myClaimIds = new Set(state.myClaims);
|
let myClaimIds = new Set(state.myClaims);
|
||||||
|
@ -561,7 +578,7 @@ reducers[ACTIONS.UPDATE_PENDING_CLAIMS] = (state: State, action: any): State =>
|
||||||
let newClaim;
|
let newClaim;
|
||||||
const { permanent_url: uri, claim_id: claimId, type, value_type: valueType } = claim;
|
const { permanent_url: uri, claim_id: claimId, type, value_type: valueType } = claim;
|
||||||
pendingById[claimId] = claim; // make sure we don't need to merge?
|
pendingById[claimId] = claim; // make sure we don't need to merge?
|
||||||
const oldClaim = byId[claimId];
|
const oldClaim = state.byId[claimId];
|
||||||
if (oldClaim && oldClaim.canonical_url) {
|
if (oldClaim && oldClaim.canonical_url) {
|
||||||
newClaim = mergeClaim(oldClaim, claim);
|
newClaim = mergeClaim(oldClaim, claim);
|
||||||
} else {
|
} else {
|
||||||
|
@ -572,14 +589,14 @@ reducers[ACTIONS.UPDATE_PENDING_CLAIMS] = (state: State, action: any): State =>
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type && type.match(/claim|update/)) {
|
if (type && type.match(/claim|update/)) {
|
||||||
byId[claimId] = newClaim;
|
updateIfClaimChanged(state.byId, byIdDelta, claimId, newClaim);
|
||||||
updateIfValueChanged(state.claimsByUri, byUriDelta, uri, claimId);
|
updateIfValueChanged(state.claimsByUri, byUriDelta, uri, claimId);
|
||||||
}
|
}
|
||||||
myClaimIds.add(claimId);
|
myClaimIds.add(claimId);
|
||||||
});
|
});
|
||||||
return Object.assign({}, state, {
|
return Object.assign({}, state, {
|
||||||
myClaims: Array.from(myClaimIds),
|
myClaims: Array.from(myClaimIds),
|
||||||
byId,
|
byId: resolveDelta(state.byId, byIdDelta),
|
||||||
pendingById,
|
pendingById,
|
||||||
myChannelClaims: Array.from(myChannelClaims),
|
myChannelClaims: Array.from(myChannelClaims),
|
||||||
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
||||||
|
@ -591,23 +608,23 @@ reducers[ACTIONS.UPDATE_CONFIRMED_CLAIMS] = (state: State, action: any): State =
|
||||||
claims: confirmedClaims,
|
claims: confirmedClaims,
|
||||||
pending: pendingClaims,
|
pending: pendingClaims,
|
||||||
}: { claims: Array<Claim>, pending: { [string]: Claim } } = action.data;
|
}: { claims: Array<Claim>, pending: { [string]: Claim } } = action.data;
|
||||||
const byId = Object.assign({}, state.byId);
|
const byIdDelta = {};
|
||||||
|
|
||||||
confirmedClaims.forEach((claim: GenericClaim) => {
|
confirmedClaims.forEach((claim: GenericClaim) => {
|
||||||
const { claim_id: claimId, type } = claim;
|
const { claim_id: claimId, type } = claim;
|
||||||
let newClaim = claim;
|
let newClaim = claim;
|
||||||
const oldClaim = byId[claimId];
|
const oldClaim = state.byId[claimId];
|
||||||
if (oldClaim && oldClaim.canonical_url) {
|
if (oldClaim && oldClaim.canonical_url) {
|
||||||
newClaim = mergeClaim(oldClaim, claim);
|
newClaim = mergeClaim(oldClaim, claim);
|
||||||
}
|
}
|
||||||
if (type && type.match(/claim|update|channel/)) {
|
if (type && type.match(/claim|update|channel/)) {
|
||||||
byId[claimId] = newClaim;
|
updateIfClaimChanged(state.byId, byIdDelta, claimId, newClaim);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return Object.assign({}, state, {
|
return Object.assign({}, state, {
|
||||||
pendingById: pendingClaims,
|
pendingById: pendingClaims,
|
||||||
byId,
|
byId: resolveDelta(state.byId, byIdDelta),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -900,7 +917,7 @@ reducers[ACTIONS.PURCHASE_LIST_COMPLETED] = (state: State, action: any): State =
|
||||||
const page = result.page;
|
const page = result.page;
|
||||||
const totalItems = result.total_items;
|
const totalItems = result.total_items;
|
||||||
|
|
||||||
let byId = Object.assign({}, state.byId);
|
let byIdDelta = {};
|
||||||
let byUriDelta = {};
|
let byUriDelta = {};
|
||||||
let urlsForCurrentPage = [];
|
let urlsForCurrentPage = [];
|
||||||
|
|
||||||
|
@ -915,13 +932,13 @@ reducers[ACTIONS.PURCHASE_LIST_COMPLETED] = (state: State, action: any): State =
|
||||||
const claimId = claim.claim_id;
|
const claimId = claim.claim_id;
|
||||||
const uri = claim.canonical_url;
|
const uri = claim.canonical_url;
|
||||||
|
|
||||||
byId[claimId] = claim;
|
updateIfClaimChanged(state.byId, byIdDelta, claimId, claim);
|
||||||
updateIfValueChanged(state.claimsByUri, byUriDelta, uri, claimId);
|
updateIfValueChanged(state.claimsByUri, byUriDelta, uri, claimId);
|
||||||
urlsForCurrentPage.push(uri);
|
urlsForCurrentPage.push(uri);
|
||||||
});
|
});
|
||||||
|
|
||||||
return Object.assign({}, state, {
|
return Object.assign({}, state, {
|
||||||
byId,
|
byId: resolveDelta(state.byId, byIdDelta),
|
||||||
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
claimsByUri: resolveDelta(state.claimsByUri, byUriDelta),
|
||||||
myPurchases: urlsForCurrentPage,
|
myPurchases: urlsForCurrentPage,
|
||||||
myPurchasesPageNumber: page,
|
myPurchasesPageNumber: page,
|
||||||
|
|
Loading…
Reference in a new issue