From c182cff4d677634f7970bed48675adc4e2e578aa Mon Sep 17 00:00:00 2001 From: Barukimang Date: Wed, 29 May 2024 11:21:56 +0300 Subject: [PATCH] fix: APP-3244 - Fix proposal filters on governance page (#1357) * included explicit filteredProposal function fixing the issue * removing client side filter fix, and adding sdk filter functionality for token voting plugin * adding sdk filter functionality for multisig plugin --- .../aragon-sdk/queries/use-proposals.ts | 12 +++- .../aragon-sdk/selectors/proposals.ts | 66 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/services/aragon-sdk/queries/use-proposals.ts b/src/services/aragon-sdk/queries/use-proposals.ts index eeaaf42fc..fc9c7bb66 100644 --- a/src/services/aragon-sdk/queries/use-proposals.ts +++ b/src/services/aragon-sdk/queries/use-proposals.ts @@ -46,6 +46,8 @@ import {providers} from 'ethers'; import { toMultisigProposalListItem, toTokenVotingProposalListItem, + computeMultisigProposalStatusFilter, + computeTokenVotingProposalStatusFilter, } from '../selectors/proposals'; import { QueryMultisigProposals, @@ -71,7 +73,13 @@ async function getProposalsList( params: IFetchProposalsParams, network: SupportedNetworks ) { - const {daoAddressOrEns, limit, skip, direction, sortBy} = params; + const {daoAddressOrEns, limit, skip, direction, sortBy, status} = params; + + const statusFilter = status + ? isTokenVotingClient(client) + ? computeTokenVotingProposalStatusFilter(status) + : computeMultisigProposalStatusFilter(status) + : {}; if (isTokenVotingClient(client)) { const {tokenVotingProposals} = await request<{ @@ -80,6 +88,7 @@ async function getProposalsList( }>(SUBGRAPH_API_URL[network]!, QueryTokenVotingProposals, { where: { dao: daoAddressOrEns, + ...statusFilter, }, limit, skip, @@ -124,6 +133,7 @@ async function getProposalsList( }>(SUBGRAPH_API_URL[network]!, QueryMultisigProposals, { where: { dao: daoAddressOrEns, + ...statusFilter, }, limit, skip, diff --git a/src/services/aragon-sdk/selectors/proposals.ts b/src/services/aragon-sdk/selectors/proposals.ts index 63117f194..7a760f1ef 100644 --- a/src/services/aragon-sdk/selectors/proposals.ts +++ b/src/services/aragon-sdk/selectors/proposals.ts @@ -11,6 +11,8 @@ import { decodeRatio, getCompactProposalId, hexToBytes, + ProposalStatus, + InvalidProposalStatusError, } from '@aragon/sdk-client-common'; import {SubgraphMultisigProposalListItem} from 'utils/types'; import { @@ -112,3 +114,67 @@ export function toTokenVotingProposalListItem( }), }; } + +export function computeMultisigProposalStatusFilter(status: ProposalStatus) { + let where = {}; + const now = Math.round(new Date().getTime() / 1000).toString(); + switch (status) { + case ProposalStatus.PENDING: + where = {startDate_gte: now}; + break; + case ProposalStatus.ACTIVE: + where = {startDate_lt: now, endDate_gte: now, executed: false}; + break; + case ProposalStatus.EXECUTED: + where = {executed: true}; + break; + case ProposalStatus.SUCCEEDED: + where = { + or: [ + {approvalReached: true, endDate_lt: now, isSignaling: false}, + {approvalReached: true, isSignaling: true}, + ], + }; + break; + case ProposalStatus.DEFEATED: + where = { + endDate_lt: now, + executed: false, + }; + break; + default: + throw new InvalidProposalStatusError(); + } + return where; +} + +export function computeTokenVotingProposalStatusFilter(status: ProposalStatus) { + let where = {}; + const now = Math.round(new Date().getTime() / 1000).toString(); + switch (status) { + case ProposalStatus.PENDING: + where = {startDate_gte: now}; + break; + case ProposalStatus.ACTIVE: + where = {startDate_lt: now, endDate_gte: now, executed: false}; + break; + case ProposalStatus.EXECUTED: + where = {executed: true}; + break; + case ProposalStatus.SUCCEEDED: + where = { + or: [{approvalReached: true, endDate_lt: now}, {earlyExecutable: true}], + }; + break; + case ProposalStatus.DEFEATED: + where = { + potentiallyExecutable: false, + endDate_lt: now, + executed: false, + }; + break; + default: + throw new InvalidProposalStatusError(); + } + return where; +}