From 1afbb1da574a120ef60bc0b9c8e15205d3cbc4a7 Mon Sep 17 00:00:00 2001 From: Diogo Soares <32431609+DiogoSoaress@users.noreply.github.com> Date: Thu, 8 Feb 2024 13:27:07 +0100 Subject: [PATCH] feat: dynamically fetch DAO voting stats (#268) * refactor: replace images * fetch number of proposals * fetch voting stats at build time * improve parsing of proposal titles * dynamically import ParallaxDaoStats to fix runtime error * bump version v1.3.10 --- package.json | 2 +- .../Parallaxes/DaoStats/delegates.png | Bin 24584 -> 0 bytes .../Parallaxes/DaoStats/delegators.png | Bin 25425 -> 0 bytes .../Parallaxes/DaoStats/proposals.png | Bin 9229 -> 0 bytes .../ParallaxDaoStats/ParallaxDaoStats.tsx | 12 +++++ .../ParallaxDaoStatsElement.tsx | 34 +++++++++--- .../Governance/ParallaxDaoStats/index.tsx | 13 ++--- .../ParallaxDaoStats/styles.module.css | 50 +++++++++++++++++- .../Governance/Proposals/Proposals.tsx | 3 +- src/components/Governance/index.tsx | 11 +++- src/config/constants.ts | 1 + src/content/governance.json | 16 +++++- src/contexts/VotingDelegationContext.ts | 13 +++++ src/hooks/useSafeSnapshot.ts | 10 +--- src/hooks/useSafeStats.ts | 12 ++--- src/hooks/useVotingDelegation.ts | 23 ++++++++ src/lib/__test__/parseSnapshotTitle.test.ts | 5 ++ src/lib/duneQueryUrlBuilder.ts | 2 + src/lib/parseSnapshotTitle.ts | 2 +- src/pages/governance.tsx | 21 ++++++-- 20 files changed, 185 insertions(+), 45 deletions(-) delete mode 100644 public/images/Governance/Parallaxes/DaoStats/delegates.png delete mode 100644 public/images/Governance/Parallaxes/DaoStats/delegators.png delete mode 100644 public/images/Governance/Parallaxes/DaoStats/proposals.png create mode 100644 src/components/Governance/ParallaxDaoStats/ParallaxDaoStats.tsx create mode 100644 src/contexts/VotingDelegationContext.ts create mode 100644 src/hooks/useVotingDelegation.ts create mode 100644 src/lib/duneQueryUrlBuilder.ts diff --git a/package.json b/package.json index d031d0a47..27aa03dc2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "safe-homepage", "homepage": "https://github.com/safe-global/safe-homepage", - "version": "1.3.9", + "version": "1.3.10", "scripts": { "build": "next build && next export", "lint": "tsc && next lint", diff --git a/public/images/Governance/Parallaxes/DaoStats/delegates.png b/public/images/Governance/Parallaxes/DaoStats/delegates.png deleted file mode 100644 index f170ce71fe6682ed2a43ec1e19268f52e89a3324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24584 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�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 N { + return ( + + + + ) +} + +export default ParallaxDaoStats diff --git a/src/components/Governance/ParallaxDaoStats/ParallaxDaoStatsElement.tsx b/src/components/Governance/ParallaxDaoStats/ParallaxDaoStatsElement.tsx index 46a7e22ad..b7e820b33 100644 --- a/src/components/Governance/ParallaxDaoStats/ParallaxDaoStatsElement.tsx +++ b/src/components/Governance/ParallaxDaoStats/ParallaxDaoStatsElement.tsx @@ -1,23 +1,41 @@ -import Image from 'next/image' import FrameImage from '@/public/images/Governance/Parallaxes/DaoStats/background.svg' -import ProposalsImage from '@/public/images/Governance/Parallaxes/DaoStats/proposals.png' -import DelegatesImage from '@/public/images/Governance/Parallaxes/DaoStats/delegates.png' -import DelegatorsImage from '@/public/images/Governance/Parallaxes/DaoStats/delegators.png' import ParallaxWrapper from '@/components/common/ParallaxWrapper' import css from './styles.module.css' +import { Typography } from '@mui/material' +import { useSafeSnapshot } from '@/hooks/useSafeSnapshot' +import { useVotingDelegation } from '@/hooks/useVotingDelegation' +import type { BaseBlock } from '@/components/Home/types' + +const ParallaxDaoStatsElement = ({ items }: Partial) => { + const { data: proposals } = useSafeSnapshot() + const [totalDelegates, totalDelegators] = useVotingDelegation() -const ParallaxDaoStatsElement = () => { return (
- 8 proposals +
+ {proposals?.length || items?.[0].title} + + {items?.[0].text} + +
- 2.5K delegates +
+ {totalDelegates || items?.[1].title} + + {items?.[1].text} + +
- 11.2K delegators +
+ {totalDelegators || items?.[2].title} + + {items?.[2].text} + +
) diff --git a/src/components/Governance/ParallaxDaoStats/index.tsx b/src/components/Governance/ParallaxDaoStats/index.tsx index ea189a2de..8271bcda1 100644 --- a/src/components/Governance/ParallaxDaoStats/index.tsx +++ b/src/components/Governance/ParallaxDaoStats/index.tsx @@ -1,12 +1,5 @@ -import ParallaxDaoStatsElement from '@/components/Governance/ParallaxDaoStats/ParallaxDaoStatsElement' -import ParallaxText, { type ParallaxTextProps } from '@/components/common/ParallaxText' +import dynamic from 'next/dynamic' -const ParallaxDaoStats = (props: ParallaxTextProps) => { - return ( - - - - ) -} +const Proposals = dynamic(() => import('./ParallaxDaoStats')) -export default ParallaxDaoStats +export default Proposals diff --git a/src/components/Governance/ParallaxDaoStats/styles.module.css b/src/components/Governance/ParallaxDaoStats/styles.module.css index 7201cb00b..a3e8f4cd3 100644 --- a/src/components/Governance/ParallaxDaoStats/styles.module.css +++ b/src/components/Governance/ParallaxDaoStats/styles.module.css @@ -10,11 +10,26 @@ height: 290px; } +.card { + padding: 14px 24px; + border: 1px solid var(--mui-palette-border-main); + border-radius: 12px; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + + background-color: var(--mui-palette-background-default); +} + .proposals { position: absolute; bottom: 242px; left: 60px; - width: 144px; + + width: 101px; + height: 124px; } .delegates { @@ -22,6 +37,7 @@ bottom: 150px; left: 190px; width: 162px; + height: 118px; } .delegators { @@ -29,6 +45,23 @@ bottom: 0px; left: 126px; width: 162px; + height: 118px; +} + +.value { + font-size: 57px; + line-height: 72px; + background: linear-gradient(260.13deg, #12ff80 1.24%, #5fddff 102.14%); + background-clip: text; + color: transparent; + text-align: left; +} + +.caption { + font-size: 8.6px; + line-height: 17px; + display: flex; + align-items: flex-start; } @media (min-width: 600px) { @@ -43,18 +76,31 @@ .proposals { bottom: 333px; left: 75px; - width: 226px; + width: 141px; + height: 174px; } .delegates { bottom: 207px; left: 275px; width: 227px; + height: 164px; } .delegators { bottom: 27px; left: 160px; width: 226px; + height: 165px; + } + + .value { + font-size: 80px; + line-height: 100px; + } + + .caption { + font-size: 12px; + line-height: 24px; } } diff --git a/src/components/Governance/Proposals/Proposals.tsx b/src/components/Governance/Proposals/Proposals.tsx index 23cd0cbea..d219bf092 100644 --- a/src/components/Governance/Proposals/Proposals.tsx +++ b/src/components/Governance/Proposals/Proposals.tsx @@ -6,6 +6,7 @@ import { useSafeSnapshot } from '@/hooks/useSafeSnapshot' import layoutCss from '@/components/common/styles.module.css' import css from './styles.module.css' +const PROPOSAL_AMOUNT = 4 const PROPOSAL_LINK_BASE_URL = 'https://snapshot.org/#/safe.eth/proposal/' type SnapshotProposal = { @@ -60,7 +61,7 @@ const Proposals = (props: BaseBlock) => { - {proposals?.map((proposal) => ( + {proposals?.slice(0, PROPOSAL_AMOUNT).map((proposal) => ( { - return +export const Governance = (props: InferGetStaticPropsType) => { + return ( + + + + ) } diff --git a/src/config/constants.ts b/src/config/constants.ts index eae2f9dae..2d821f7c7 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -6,6 +6,7 @@ export const GOOGLE_ANALYTICS_DOMAIN = process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS_ export const HOTJAR_ID = process.env.NEXT_PUBLIC_HOTJAR_ID || '' export const HOTJAR_ID_STAGING = process.env.NEXT_PUBLIC_HOTJAR_ID_STAGING || '' export const HOTJAR_VERSION = process.env.NEXT_PUBLIC_HOTJAR_VERSION || '6' +export const DUNE_API_KEY = process.env.DUNE_API_KEY || '' // Links export const WALLET_LINK = 'https://app.safe.global' diff --git a/src/content/governance.json b/src/content/governance.json index 26816fcb3..049e2bc17 100644 --- a/src/content/governance.json +++ b/src/content/governance.json @@ -28,7 +28,21 @@ "component": "Governance/ParallaxDaoStats", "variant": "image-text", "mobileVariant": "text-image", - "title": "Safe DAO is a decentralised collective stewarding the Safe ecosystem" + "title": "Safe DAO is a decentralised collective stewarding the Safe ecosystem", + "items": [ + { + "title": "20", + "text": "Proposals" + }, + { + "title": "5.5K", + "text": "Delegates" + }, + { + "title": "16K", + "text": "Delegators" + } + ] }, { "component": "Governance/Proposals", diff --git a/src/contexts/VotingDelegationContext.ts b/src/contexts/VotingDelegationContext.ts new file mode 100644 index 000000000..5dc971e40 --- /dev/null +++ b/src/contexts/VotingDelegationContext.ts @@ -0,0 +1,13 @@ +import { createContext } from 'react' + +type VotingDelegation = { + totalDelegates: number | null + totalDelegators: number | null +} + +const VotingDelegationContext = createContext({ + totalDelegates: null, + totalDelegators: null, +}) + +export default VotingDelegationContext diff --git a/src/hooks/useSafeSnapshot.ts b/src/hooks/useSafeSnapshot.ts index 63b1e26a4..7d7c1b83b 100644 --- a/src/hooks/useSafeSnapshot.ts +++ b/src/hooks/useSafeSnapshot.ts @@ -2,8 +2,6 @@ import useSWRImmutable from 'swr/immutable' type ShapshotProposalVars = { space: string - first: number - skip: number orderBy: 'created' orderDirection: 'desc' | 'asc' } @@ -26,10 +24,8 @@ const getSnapshot = async (variables: ShapshotProposalVars): Promise => { - const PROPOSAL_AMOUNT = 4 - return getSnapshot({ space, - first: PROPOSAL_AMOUNT, - skip: 0, orderBy: 'created', orderDirection: 'desc', }) diff --git a/src/hooks/useSafeStats.ts b/src/hooks/useSafeStats.ts index f2e129d93..2bf80124c 100644 --- a/src/hooks/useSafeStats.ts +++ b/src/hooks/useSafeStats.ts @@ -1,31 +1,29 @@ import { useContext } from 'react' import { formatValue } from '@/lib/formatValue' import SafeStatsContext from '@/contexts/SafeStatsContext' +import { DUNE_API_KEY } from '@/config/constants' +import { duneQueryUrlBuilder } from '@/lib/duneQueryUrlBuilder' const QUERY_ID_TOTAL_TRANSACTIONS = 2093960 const QUERY_ID_TOTAL_ASSETS = 2893829 const QUERY_ID_TOTAL_SAFES_DEPLOYED = 2459401 -function totalAssetsEndpoint(queryId: number): string { - return `https://api.dune.com/api/v1/query/${queryId}/results?api_key=${process.env.DUNE_API_KEY}` -} - export const fetchTotalTransactions = async (): Promise => { - return fetch(totalAssetsEndpoint(QUERY_ID_TOTAL_TRANSACTIONS)) + return fetch(duneQueryUrlBuilder(QUERY_ID_TOTAL_TRANSACTIONS, DUNE_API_KEY)) .then((res) => res.json()) .then((data) => data.result.rows[0].num_txs) .catch(() => null) } export const fetchTotalAssets = async (): Promise => { - return fetch(totalAssetsEndpoint(QUERY_ID_TOTAL_ASSETS)) + return fetch(duneQueryUrlBuilder(QUERY_ID_TOTAL_ASSETS, DUNE_API_KEY)) .then((res) => res.json()) .then((data) => data.result.rows[0].usd_value) .catch(() => null) } export const fetchTotalSafesDeployed = async (): Promise => { - return fetch(totalAssetsEndpoint(QUERY_ID_TOTAL_SAFES_DEPLOYED)) + return fetch(duneQueryUrlBuilder(QUERY_ID_TOTAL_SAFES_DEPLOYED, DUNE_API_KEY)) .then((res) => res.json()) .then((data) => data.result.rows[0].num_safes) .catch(() => null) diff --git a/src/hooks/useVotingDelegation.ts b/src/hooks/useVotingDelegation.ts new file mode 100644 index 000000000..969d502bc --- /dev/null +++ b/src/hooks/useVotingDelegation.ts @@ -0,0 +1,23 @@ +import { DUNE_API_KEY } from '@/config/constants' +import VotingDelegationContext from '@/contexts/VotingDelegationContext' +import { duneQueryUrlBuilder } from '@/lib/duneQueryUrlBuilder' +import { formatValue } from '@/lib/formatValue' +import { useContext } from 'react' + +const QUERY_ID_TOTAL_DELEGATIONS = 3407074 + +export const fetchTotalDelegates = async (): Promise<{ delegate_unique: number; delegator_count: number } | null> => { + return fetch(duneQueryUrlBuilder(QUERY_ID_TOTAL_DELEGATIONS, DUNE_API_KEY)) + .then((res) => res.json()) + .then((data) => data.result.rows[0]) + .catch(() => null) +} + +export const useVotingDelegation = (): Array => { + const { totalDelegates, totalDelegators } = useContext(VotingDelegationContext) + + const formattedTotalDelegates = totalDelegates ? formatValue(totalDelegates) : null + const formattedTotalDelegators = totalDelegators ? formatValue(totalDelegators) : null + + return [formattedTotalDelegates, formattedTotalDelegators] +} diff --git a/src/lib/__test__/parseSnapshotTitle.test.ts b/src/lib/__test__/parseSnapshotTitle.test.ts index b43bbbf66..d96347712 100644 --- a/src/lib/__test__/parseSnapshotTitle.test.ts +++ b/src/lib/__test__/parseSnapshotTitle.test.ts @@ -7,6 +7,7 @@ const realTitles = [ ' [SEP #4] SafeDAO Constitution', '[SEP #5] Redistributing Unredeemed Tokens From User Airdrop Allocation', '# [SEP #6] Safe Grants Program (SGP)', + '[SEP #20] [OBRA] Formalizing the Guardian Role onchain with Hats Protocol - Hats Protocol', ] const badTitles = [ @@ -31,6 +32,10 @@ describe('parseSnapshotTitle', () => { 'Redistributing Unredeemed Tokens From User Airdrop Allocation', ]) expect(parseSnapshotTitle(realTitles[5])).toEqual(['6', 'Safe Grants Program (SGP)']) + expect(parseSnapshotTitle(realTitles[6])).toEqual([ + '20', + '[OBRA] Formalizing the Guardian Role onchain with Hats Protocol - Hats Protocol', + ]) }) it('returns 0 and the original title if the both groups are not present in the title', () => { diff --git a/src/lib/duneQueryUrlBuilder.ts b/src/lib/duneQueryUrlBuilder.ts new file mode 100644 index 000000000..c35072dd1 --- /dev/null +++ b/src/lib/duneQueryUrlBuilder.ts @@ -0,0 +1,2 @@ +export const duneQueryUrlBuilder = (queryId: number, apiKey: string) => + `https://api.dune.com/api/v1/query/${queryId}/results?api_key=${apiKey}` diff --git a/src/lib/parseSnapshotTitle.ts b/src/lib/parseSnapshotTitle.ts index a4f10a59e..a677605be 100644 --- a/src/lib/parseSnapshotTitle.ts +++ b/src/lib/parseSnapshotTitle.ts @@ -1,6 +1,6 @@ // Fist group: SEP number // Second group: SEP title -const snapshotRegex = /SEP #(\d+)\]?[^A-Za-z]*(.*)/ +const snapshotRegex = /SEP #(\d+)\]?[^A-Za-z[]*(.*)/ /** * Parses a snapshot title to extract the numeric identifier and description. diff --git a/src/pages/governance.tsx b/src/pages/governance.tsx index 0c494f5b6..b27cf8b11 100644 --- a/src/pages/governance.tsx +++ b/src/pages/governance.tsx @@ -1,8 +1,23 @@ -import type { NextPage } from 'next' +import type { InferGetStaticPropsType, NextPage } from 'next' import { Governance } from '@/components/Governance' +import { fetchTotalDelegates } from '@/hooks/useVotingDelegation' -const GovernancePage: NextPage = () => { - return +const GovernancePage: NextPage> = (props) => { + return +} + +export async function getStaticProps() { + const votingDelegation = await fetchTotalDelegates() + const { delegate_unique, delegator_count } = votingDelegation || { delegate_unique: null, delegator_count: null } + + return { + props: { + votingDelegation: { + totalDelegates: delegate_unique, + totalDelegators: delegator_count, + }, + }, + } } export default GovernancePage