From 205dfd0e778fa455e89c5b1afd30e79b6c7f412b Mon Sep 17 00:00:00 2001 From: Szymon Szlachtowicz <38212223+Szymx95@users.noreply.github.com> Date: Tue, 6 Jul 2021 08:46:21 +0200 Subject: [PATCH] Filter votes cards (#81) --- packages/DApp/src/components/Card.tsx | 22 ++++--- .../DApp/src/components/card/CardFeature.tsx | 17 ++++- .../DApp/src/components/card/OngoingVote.tsx | 9 ++- .../DApp/src/components/votes/VotingCard.tsx | 35 +++++------ .../DApp/src/components/votes/VotingCards.tsx | 17 ++--- .../DApp/src/hooks/useVotingCommunities.ts | 63 +++++++++++++++++++ packages/DApp/src/models/smartContract.ts | 4 ++ .../DApp/test/helpers/voting/fromRoom.test.ts | 2 + 8 files changed, 121 insertions(+), 48 deletions(-) create mode 100644 packages/DApp/src/hooks/useVotingCommunities.ts diff --git a/packages/DApp/src/components/Card.tsx b/packages/DApp/src/components/Card.tsx index 025973f..a47d802 100644 --- a/packages/DApp/src/components/Card.tsx +++ b/packages/DApp/src/components/Card.tsx @@ -18,7 +18,8 @@ import { getVotingWinner } from '../helpers/voting' import { useVotesAggregate } from '../hooks/useVotesAggregate' import rightIcon from '../assets/images/arrowRight.svg' import { VoteAnimatedModal } from './card/VoteAnimatedModal' - +import voting from '../helpers/voting' +import { DetailedVotingRoom } from '../models/smartContract' interface CardCommunityProps { community: CommunityDetail showRemoveButton?: boolean @@ -104,12 +105,11 @@ export const CardCommunity = ({ community, showRemoveButton }: CardCommunityProp } interface CardVoteProps { - community: CommunityDetail - room: number + room: DetailedVotingRoom hideModalFunction?: (val: boolean) => void } -export const CardVote = ({ community, room, hideModalFunction }: CardVoteProps) => { +export const CardVote = ({ room, hideModalFunction }: CardVoteProps) => { const { account } = useEthers() const [showVoteModal, setShowVoteModal] = useState(false) const [showConfirmModal, setShowConfirmModal] = useState(false) @@ -117,11 +117,13 @@ export const CardVote = ({ community, room, hideModalFunction }: CardVoteProps) const [selectedVoted, setSelectedVoted] = useState(voteTypes['Add'].for) const { votingContract } = useContracts() - const { votes } = useVotesAggregate(room) + + const { votes } = useVotesAggregate(room.room) + const { send } = useContractFunction(votingContract, 'castVotes') const finalizeVoting = useContractFunction(votingContract, 'finalizeVotingRoom') - + const community = room.details const setNext = (val: boolean) => { setShowConfirmModal(val) setShowVoteModal(false) @@ -134,7 +136,7 @@ export const CardVote = ({ community, room, hideModalFunction }: CardVoteProps) setShowConfirmModal(val) } - const vote = community.currentVoting + const vote = voting.fromRoom(room) if (!vote) { return @@ -154,7 +156,7 @@ export const CardVote = ({ community, room, hideModalFunction }: CardVoteProps) {voteConstants.question} - {votes.length > 0 && community.currentVoting && community?.currentVoting.timeLeft > 0 && ( + {votes.length > 0 && vote && vote.timeLeft > 0 && ( send(votes)}> {votes.length} votes need saving )} @@ -196,7 +198,7 @@ export const CardVote = ({ community, room, hideModalFunction }: CardVoteProps) {winner ? ( - finalizeVoting.send(room)} disabled={!account}> + finalizeVoting.send(room.room)} disabled={!account}> Finalize the vote ✍️ ) : ( diff --git a/packages/DApp/src/components/card/CardFeature.tsx b/packages/DApp/src/components/card/CardFeature.tsx index 6577e0f..62ed6b5 100644 --- a/packages/DApp/src/components/card/CardFeature.tsx +++ b/packages/DApp/src/components/card/CardFeature.tsx @@ -34,7 +34,7 @@ export const CardFeature = ({ community, heading, text, icon, sum, timeLeft }: C setShowFeatureModal(false) } const { votingContract } = useContracts() - const [roomList] = + const [roomNumber] = useContractCall({ abi: votingContract.interface, address: votingContract.address, @@ -42,14 +42,25 @@ export const CardFeature = ({ community, heading, text, icon, sum, timeLeft }: C args: [community.publicKey], }) ?? [] + const room = useContractCall({ + abi: votingContract.interface, + address: votingContract.address, + method: 'votingRoomMap', + args: [roomNumber], + }) as any + return ( {heading} - {roomList > 0 && ( + {roomNumber > 0 && room && (
{showOngoingVote && ( - + )} setShowOngoingVote(true)}>Ongoing vote for removal
diff --git a/packages/DApp/src/components/card/OngoingVote.tsx b/packages/DApp/src/components/card/OngoingVote.tsx index 7b4e426..8777aff 100644 --- a/packages/DApp/src/components/card/OngoingVote.tsx +++ b/packages/DApp/src/components/card/OngoingVote.tsx @@ -1,23 +1,26 @@ import React from 'react' +import { votingFromRoom } from '../../helpers/voting' import { CommunityDetail } from '../../models/community' +import { VotingRoom } from '../../models/smartContract' import { CardVote, CardVoteBlock } from '../Card' import { Modal } from '../Modal' export interface OngoingVoteProps { community: CommunityDetail setShowOngoingVote: (show: boolean) => void - room: number + room: VotingRoom } export function OngoingVote({ community, setShowOngoingVote, room }: OngoingVoteProps) { - const vote = community.currentVoting + const vote = votingFromRoom(room) + const detailedVoting = { ...room, details: community } if (!vote) { return } return ( - + ) } diff --git a/packages/DApp/src/components/votes/VotingCard.tsx b/packages/DApp/src/components/votes/VotingCard.tsx index 0819c11..3886207 100644 --- a/packages/DApp/src/components/votes/VotingCard.tsx +++ b/packages/DApp/src/components/votes/VotingCard.tsx @@ -1,29 +1,22 @@ import React from 'react' +import { DetailedVotingRoom } from '../../models/smartContract' import { Card, CardCommunity, CardCommunityWrap, CardVote, CardVoteWrap } from '../Card' -import { useCommunity } from '../../hooks/useCommunity' -import { VotingCardSkeleton } from './VotingCardSkeleton' interface VotingCardProps { - room: number + room: DetailedVotingRoom } export function VotingCard({ room }: VotingCardProps) { - const { community } = useCommunity(room) - - if (community) { - return ( - - - {' '} - - - - {' '} - - - - ) - } - - return + return ( + + + {' '} + + + + {' '} + + + + ) } diff --git a/packages/DApp/src/components/votes/VotingCards.tsx b/packages/DApp/src/components/votes/VotingCards.tsx index 8f0f9aa..0103bdd 100644 --- a/packages/DApp/src/components/votes/VotingCards.tsx +++ b/packages/DApp/src/components/votes/VotingCards.tsx @@ -7,22 +7,16 @@ import { ButtonPrimary } from '../Button' import { Colors } from '../../constants/styles' import { VotingCard } from './VotingCard' import { Search } from '../Input' -import { useContractCall } from '@usedapp/core' import { VotingSortingOptions } from '../../constants/SortingOptions' -import { useContracts } from '../../hooks/useContracts' +import { VotingCardSkeleton } from './VotingCardSkeleton' +import { useVotingCommunities } from '../../hooks/useVotingCommunities' export function VotingCards() { - const { votingContract } = useContracts() const [sortedBy, setSortedBy] = useState(VotingSortingEnum.EndingSoonest) const [voteType, setVoteType] = useState('') const [filterKeyword, setFilterKeyword] = useState('') + const roomsToShow = useVotingCommunities(filterKeyword) - const [roomList] = useContractCall({ - abi: votingContract.interface, - address: votingContract.address, - method: 'getActiveVotingRooms', - args: [], - }) ?? [[]] return (
@@ -51,9 +45,10 @@ export function VotingCards() { - {roomList.map((room: any) => ( - + {roomsToShow.map((room: any) => ( + ))} + {roomsToShow.length === 0 && }
) } diff --git a/packages/DApp/src/hooks/useVotingCommunities.ts b/packages/DApp/src/hooks/useVotingCommunities.ts new file mode 100644 index 0000000..9b14a7a --- /dev/null +++ b/packages/DApp/src/hooks/useVotingCommunities.ts @@ -0,0 +1,63 @@ +import { useContractCall, useContractCalls } from '@usedapp/core' +import { useEffect, useState } from 'react' +import { getCommunityDetails } from '../helpers/apiMock' +import { DetailedVotingRoom } from '../models/smartContract' +import { useContracts } from './useContracts' + +export function useVotingCommunities(filterKeyword: string): DetailedVotingRoom[] { + const [roomsWithCommunity, setRoomsWithCommunity] = useState([]) + const [roomsToShow, setRoomsToShow] = useState([]) + + const { votingContract } = useContracts() + const [roomList] = useContractCall({ + abi: votingContract.interface, + address: votingContract.address, + method: 'getActiveVotingRooms', + args: [], + }) ?? [[]] + + const contractCalls = roomList.map((el: any) => { + return { + abi: votingContract.interface, + address: votingContract.address, + method: 'votingRoomMap', + args: [el], + } + }) + + const votingRooms = useContractCalls(contractCalls) + + useEffect(() => { + if (votingRooms.length > 0) { + const getPromises = async () => { + const rooms = await Promise.all( + votingRooms.map(async (el: any, idx) => { + if (el) { + return { ...el, room: roomList[idx].toNumber(), details: await getCommunityDetails(el.community) } + } + return undefined + }) + ) + setRoomsWithCommunity(rooms) + } + getPromises() + } + }, [JSON.stringify(votingRooms)]) + + useEffect(() => { + setRoomsToShow( + roomsWithCommunity.filter((room: any) => { + if (room) { + return ( + room.details.name.toLowerCase().includes(filterKeyword.toLowerCase()) || + room.details.description.toLowerCase().includes(filterKeyword.toLowerCase()) || + room.details.tags.findIndex((item: any) => filterKeyword.toLowerCase() === item.toLowerCase()) > -1 + ) + } + return false + }) + ) + }, [roomsWithCommunity, filterKeyword]) + + return roomsToShow +} diff --git a/packages/DApp/src/models/smartContract.ts b/packages/DApp/src/models/smartContract.ts index 69331e9..11dcb67 100644 --- a/packages/DApp/src/models/smartContract.ts +++ b/packages/DApp/src/models/smartContract.ts @@ -1,4 +1,5 @@ import { BigNumber } from 'ethers' +import { CommunityDetail } from './community' export type VotingRoom = { startBlock: BigNumber @@ -9,4 +10,7 @@ export type VotingRoom = { totalVotesFor: BigNumber totalVotesAgainst: BigNumber voters: string[] + room: number } + +export type DetailedVotingRoom = VotingRoom & { details: CommunityDetail } diff --git a/packages/DApp/test/helpers/voting/fromRoom.test.ts b/packages/DApp/test/helpers/voting/fromRoom.test.ts index 9b555c0..d1c0496 100644 --- a/packages/DApp/test/helpers/voting/fromRoom.test.ts +++ b/packages/DApp/test/helpers/voting/fromRoom.test.ts @@ -15,6 +15,7 @@ describe('voting', () => { totalVotesFor: BigNumber.from(100), totalVotesAgainst: BigNumber.from(100), voters: ['0x01', '0x02'], + room: 1, } const room = voting.fromRoom(votingRoom) @@ -32,6 +33,7 @@ describe('voting', () => { totalVotesFor: BigNumber.from(1000), totalVotesAgainst: BigNumber.from(100), voters: ['0x01', '0x02'], + room: 1, } const room = voting.fromRoom(votingRoom)