Skip to content

Commit 3239a3f

Browse files
Cache competitions list (#1433)
* better caching of competition list * remove comments * fix lint errors * use client 0.2.64 * skip npm ci in travis * undo travis skipping of test * update endpoints, test_env * silence warning for not having any genericschemergistry entries on xdai * cache tweak * some cleanup * fix ens addresses in test Co-authored-by: Tibet Sprague <[email protected]>
1 parent 1819e6c commit 3239a3f

File tree

13 files changed

+80
-38
lines changed

13 files changed

+80
-38
lines changed

Diff for: Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ WORKDIR /alchemy
1212
RUN npm ci
1313
COPY . /alchemy
1414

15-
ENTRYPOINT [ "/entry.sh"]
15+
CMD [ "/entry.sh"]

Diff for: package-lock.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
"dependencies": {
7777
"3box": "^1.16.1",
7878
"@burner-wallet/burner-connect-provider": "^0.1.1",
79-
"@daostack/client": "0.2.63",
79+
"@daostack/client": "0.2.64",
8080
"@dorgtech/daocreator-ui-v1": "^0.2.0-rc.20",
8181
"@fortawesome/fontawesome-svg-core": "^1.2.10",
8282
"@fortawesome/free-brands-svg-icons": "^5.6.1",

Diff for: src/components/Scheme/ContributionRewardExtRewarders/Competition/Card.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import RewardsString from "components/Proposal/RewardsString";
55
import { IProfileState } from "reducers/profilesReducer";
66
import { IRootState } from "reducers";
77
import CountdownText from "components/Scheme/ContributionRewardExtRewarders/Competition/CountdownText";
8-
import StatusBlob from "./StatusBlob";
9-
import * as css from "./Competitions.scss";
10-
import { competitionStatus, CompetitionStatus } from "./utils";
118
import { connect } from "react-redux";
129
import { IDAOState, IProposalState } from "@daostack/client";
1310
import { Link } from "react-router-dom";
1411
import * as React from "react";
12+
import { competitionStatus, CompetitionStatus } from "./utils";
13+
import * as css from "./Competitions.scss";
14+
import StatusBlob from "./StatusBlob";
1515

1616
interface IExternalStateProps {
1717
creatorProfile: IProfileState;

Diff for: src/components/Scheme/ContributionRewardExtRewarders/Competition/CreateProposal.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { checkTotalPercent } from "lib/util";
1616
import * as Datetime from "react-datetime";
1717

1818
import moment = require("moment");
19-
import BN = require("bn.js")
19+
import BN = require("bn.js");
2020

2121
interface IExternalProps {
2222
scheme: ISchemeState;

Diff for: src/components/Scheme/ContributionRewardExtRewarders/Competition/Details.tsx

+14-10
Original file line numberDiff line numberDiff line change
@@ -414,16 +414,16 @@ export default withSubscription({
414414
errorComponent: (props) => <div>{ props.error.message }</div>,
415415
checkForUpdate: ["currentAccountAddress"],
416416
createObservable: async (props: IExternalProps & IExternalStateProps ) => {
417-
// prime the cache before creating the observable...
417+
418+
// prime the cache and subscribe
418419
const cacheQuery = gql`query cacheSuggestions {
419-
proposal (id: "${props.proposalState.id}") {
420-
id
421-
# ...ProposalFields
420+
proposals (where: {id: "${props.proposalState.id}"}) {
421+
...ProposalFields
422422
competition {
423423
id
424424
suggestions {
425425
...CompetitionSuggestionFields
426-
}
426+
}
427427
}
428428
}
429429
}
@@ -433,12 +433,16 @@ export default withSubscription({
433433
`;
434434

435435
const arc = await getArc();
436-
await arc.sendQuery(cacheQuery);
436+
// sending the query before subscribing resolves a weird cache error - this would ideally be handled in the client
437+
await arc.sendQuery(cacheQuery);
438+
// eslint-disable-next-line @typescript-eslint/no-empty-function
439+
await arc.getObservable(cacheQuery, {subscribe: true}).subscribe(() => {});
440+
// end cache priming
441+
437442
return combineLatest(
438-
/**
439-
* Passing `true` to create a subscription because we won't get one otherwise.
440-
*/
441-
getProposalSubmissions(props.proposalState.id, true),
443+
// we do not need to subscribe here (second argument = false), because we already subscribed in the line above
444+
getProposalSubmissions(props.proposalState.id, false),
445+
// the next construction gets the suggestions for which the user has voted
442446
props.currentAccountAddress ? getCompetitionVotes(props.proposalState.id, props.currentAccountAddress, true)
443447
.pipe(
444448
map((votes: Array<CompetitionVote>) => {

Diff for: src/components/Scheme/ContributionRewardExtRewarders/Competition/List.tsx

+43-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import * as React from "react";
22
import { BreadcrumbsItem } from "react-breadcrumbs-dynamic";
3-
import { ISchemeState, IDAOState, IProposalState } from "@daostack/client";
3+
import { ISchemeState, IDAOState, IProposalState, CompetitionSuggestion, CompetitionVote } from "@daostack/client";
44
import { SortService } from "lib/sortService";
55
import withSubscription, { ISubscriptionProps } from "components/Shared/withSubscription";
6-
import { CompetitionStatusEnum, CompetitionStatus, primeCacheForSubmissionsAndVotes } from "./utils";
6+
import { combineLatest, of } from "rxjs";
7+
import gql from "graphql-tag";
8+
import { getArc } from "arc";
9+
import { CompetitionStatusEnum, CompetitionStatus } from "./utils";
710
import Card from "./Card";
811
import * as css from "./Competitions.scss";
912

@@ -104,8 +107,44 @@ export default withSubscription({
104107
loadingComponent: null,
105108
errorComponent: (props) => <div>{ props.error.message }</div>,
106109
checkForUpdate: [],
107-
createObservable: async (_props: IExternalProps) => {
108-
return primeCacheForSubmissionsAndVotes();
110+
createObservable: async (props: IExternalProps) => {
111+
// prime the cache before creating the observable...
112+
const cacheQuery = gql`query cacheSuggestions {
113+
proposals (where: {scheme: "${props.scheme.id}"}) {
114+
id
115+
competition {
116+
id
117+
endTime
118+
contract
119+
suggestionsEndTime
120+
createdAt
121+
numberOfVotesPerVoters
122+
numberOfWinners
123+
rewardSplit
124+
snapshotBlock
125+
startTime
126+
suggestions {
127+
...CompetitionSuggestionFields
128+
}
129+
votes {
130+
...CompetitionVoteFields
131+
}
132+
}
133+
}
134+
}
135+
${CompetitionSuggestion.fragments.CompetitionSuggestionFields}
136+
${CompetitionVote.fragments.CompetitionVoteFields}
137+
`;
138+
139+
const arc = await getArc();
140+
await arc.sendQuery(cacheQuery, {subscribe: true});
141+
// end cache priming
142+
143+
// TODO: next lines can use some cleanup up
144+
return combineLatest(
145+
of([]),
146+
of([])
147+
);
109148
},
110149
});
111150

Diff for: src/components/Scheme/ContributionRewardExtRewarders/Competition/StatusBlob.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import * as css from "./Competitions.scss";
2-
import { competitionStatus } from "./utils";
31
import { ICompetitionProposalState } from "@daostack/client";
42
import * as React from "react";
53
import classNames from "classnames";
4+
import { competitionStatus } from "./utils";
5+
import * as css from "./Competitions.scss";
66

77
export interface IExternalProps {
88
competition: ICompetitionProposalState;

Diff for: src/components/Scheme/ContributionRewardExtRewarders/Competition/utils.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import moment = require("moment");
66
import { getArc } from "arc";
77
import { operationNotifierObserver } from "actions/arcActions";
88
import { IRootState } from "reducers";
9-
import { Observable, of, combineLatest } from "rxjs";
9+
import { Observable, of } from "rxjs";
1010
import { map, mergeMap, toArray, first } from "rxjs/operators";
1111

1212
/**
@@ -160,7 +160,7 @@ export const redeemForSubmission = (options: IVoteSubmissionOptions ): ThunkActi
160160
export const getProposalSubmissions = (proposalId: string, subscribe = false): Observable<Array<ICompetitionSuggestionState>> => {
161161
// fetchAllData so .state() comes from cache
162162
const competition = new Competition(proposalId, getArc());
163-
return competition.suggestions(undefined, { subscribe, fetchAllData: true })
163+
return competition.suggestions({}, { subscribe, fetchAllData: true })
164164
.pipe(
165165
mergeMap(submissions => of(submissions).pipe(
166166
mergeMap(submissions => submissions),
@@ -198,9 +198,9 @@ export const getSubmissionVoterHasVoted = (submissionId: string, voterAddress: s
198198
.pipe(map((votes: Array<CompetitionVote>) => !!votes.length));
199199
};
200200

201-
export const primeCacheForSubmissionsAndVotes = (): Observable<any> => {
202-
return combineLatest(
203-
CompetitionSuggestion.search(getArc(), {}, { subscribe: true, fetchAllData: true }),
204-
CompetitionVote.search(getArc(), {}, { subscribe: true, fetchAllData: true })
205-
);
206-
};
201+
// export const primeCacheForSubmissionsAndVotes = (): Observable<any> => {
202+
// return combineLatest(
203+
// CompetitionSuggestion.search(getArc(), {}, { subscribe: true, fetchAllData: true }),
204+
// CompetitionVote.search(getArc(), {}, { subscribe: true, fetchAllData: true })
205+
// );
206+
// };

Diff for: src/components/Scheme/SchemeContainer.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ const SubscribedSchemeContainer = withSubscription({
199199
await props.daoState.dao.proposals(
200200
// eslint-disable-next-line @typescript-eslint/camelcase
201201
{where: { stage_in: [IProposalStage.Boosted, IProposalStage.QuietEndingPeriod, IProposalStage.Queued, IProposalStage.PreBoosted, IProposalStage.Executed ]}},
202+
// eslint-disable-next-line @typescript-eslint/no-empty-function
202203
{ fetchAllData: true, subscribe: true }).subscribe(()=>{});
203204
// end cache priming
204205

Diff for: src/genericSchemeRegistry/index.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ for (const schemeInfo of KNOWNSCHEMES) {
3030
for (const address of schemeInfo.addresses[network]) {
3131
SCHEMEADDRESSES[network][address.toLowerCase()] = schemeInfo;
3232
}
33-
} else {
34-
console.error(`No GenericScheme contract addresses in GenericSchemeRegistry defined for network ${network}`);
35-
}
33+
}
3634
}
3735
}
3836
interface IABISpec {

Diff for: src/genericSchemeRegistry/schemes/ENSPublicResolver.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"0x2396A687f75f1a13e3927F1841B291350b0ED977"
1010
],
1111
"private": [
12-
"0x60c1026e45fb5c987bca25ee4ad90eb98926cf04"
12+
"0x6b85757e0a41f837dbe0b6b4b5157858b62d9a66"
1313
]
1414
},
1515
"actions": [

Diff for: src/genericSchemeRegistry/schemes/RegistryLookup.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"0xf268dc803924f6d9d06c7ddbfc06bf7cc6daf7d4"
1313
],
1414
"private": [
15-
"0x5dce333f3aa83a0397721c36fe3058cd8f32379b"
15+
"0x9e32124cbecc2460e54735d356c0cb5ca8c8aa44"
1616
]
1717
},
1818
"actions": [

0 commit comments

Comments
 (0)