From ae0604f16917eb0c7d61d922d7451b6d9927ff18 Mon Sep 17 00:00:00 2001 From: RakeshUP Date: Tue, 7 Nov 2023 14:12:15 +0530 Subject: [PATCH] added isMember check to entrypoint, fixed the useUpdateProposal hook --- package.json | 2 +- src/components/proposalList/index.tsx | 16 ++++++++--- src/containers/navbar/updateBanner.tsx | 26 +++++++++++++++--- src/containers/proposalSnapshot/index.tsx | 8 ++++-- src/hooks/useUpdateProposal.tsx | 33 +++++++++-------------- src/pages/settings.tsx | 22 ++++++++++++--- yarn.lock | 18 ++++++------- 7 files changed, 82 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 909d7a817..1873932a0 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dependencies": { "@apollo/client": "^3.5.8", "@aragon/ods": "^1.0.1", - "@aragon/sdk-client": "^1.18.2", + "@aragon/sdk-client": "^1.19.0", "@elastic/apm-rum-react": "^2.0.0", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-dialog": "^1.0.4", diff --git a/src/components/proposalList/index.tsx b/src/components/proposalList/index.tsx index 2f59ab1d0..89009f86d 100644 --- a/src/components/proposalList/index.tsx +++ b/src/components/proposalList/index.tsx @@ -1,5 +1,6 @@ import {MultisigProposalListItem} from '@aragon/sdk-client'; import {CardProposal, CardProposalProps, Spinner} from '@aragon/ods-old'; +import {DaoAction} from '@aragon/sdk-client-common'; import {BigNumber} from 'ethers'; import React, {useMemo} from 'react'; import {useTranslation} from 'react-i18next'; @@ -52,9 +53,12 @@ function isMultisigProposalListItem( } const ProposalItem: React.FC< - {proposalId: string} & CardProposalProps + {proposalId: string; actions: DaoAction[]} & CardProposalProps > = props => { - const {isAragonVerifiedUpdateProposal} = useUpdateProposal(props.proposalId); + const {isAragonVerifiedUpdateProposal} = useUpdateProposal( + props.proposalId, + props.actions + ); const {t} = useTranslation(); return ( @@ -88,7 +92,10 @@ const ProposalList: React.FC = ({ {countOnly: true} ); - const mappedProposals: ({id: string} & CardProposalProps)[] = useMemo( + const mappedProposals: ({ + id: string; + actions: DaoAction[]; + } & CardProposalProps)[] = useMemo( () => proposals.map(p => proposal2CardProps( @@ -158,7 +165,7 @@ export function proposal2CardProps( t: TFunction, daoAddressOrEns: string, address: string | null -): {id: string} & CardProposalProps { +): {id: string; actions: DaoAction[]} & CardProposalProps { const publisherDisplayName = address && proposal.creatorAddress.toLowerCase() === address.toLowerCase() ? t('labels.you') @@ -173,6 +180,7 @@ export function proposal2CardProps( publisherDisplayName, publishLabel: t('governance.proposals.publishedBy'), process: proposal.status.toLowerCase() as CardProposalProps['process'], + actions: proposal.actions, onClick: () => { trackEvent('governance_viewProposal_clicked', { proposal_id: proposal.id, diff --git a/src/containers/navbar/updateBanner.tsx b/src/containers/navbar/updateBanner.tsx index 0221eb4a1..6f6f76a40 100644 --- a/src/containers/navbar/updateBanner.tsx +++ b/src/containers/navbar/updateBanner.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useEffect, useState} from 'react'; import {useTranslation} from 'react-i18next'; import styled from 'styled-components'; import {ButtonText, IconClose, IconUpdate} from '@aragon/ods-old'; @@ -11,6 +11,9 @@ import { import {useNetwork} from 'context/network'; import {NewProposal} from 'utils/paths'; import {featureFlags} from 'utils/featureFlags'; +import {useDaoDetailsQuery} from 'hooks/useDaoDetails'; +import {PluginTypes, usePluginClient} from 'hooks/usePluginClient'; +import {useWallet} from 'hooks/useWallet'; const UpdateBanner: React.FC = () => { const {t} = useTranslation(); @@ -18,16 +21,33 @@ const UpdateBanner: React.FC = () => { const {network} = useNetwork(); const {dao} = useParams(); const location = useLocation(); + const {address} = useWallet(); + const {data: daoDetails, isLoading} = useDaoDetailsQuery(); + const pluginType = daoDetails?.plugins?.[0]?.id as PluginTypes; + const pluginAddress = daoDetails?.plugins?.[0]?.instanceAddress as string; + const pluginClient = usePluginClient(pluginType); + const [isMember, setIsMember] = useState(false); + + useEffect(() => { + pluginClient?.methods + .isMember({ + address: address as string, + pluginAddress, + }) + .then(value => setIsMember(value)); + }, [address, pluginAddress, pluginClient?.methods]); if ( location.pathname.includes('new-proposal') || location.pathname.includes('settings') || - location.pathname.includes('create') + location.pathname.includes('create') || + isLoading ) return null; const daoUpdateEnabled = - featureFlags.getValue('VITE_FEATURE_FLAG_OSX_UPDATES') === 'true'; + featureFlags.getValue('VITE_FEATURE_FLAG_OSX_UPDATES') === 'true' && + isMember; if (daoUpdateEnabled) return ( diff --git a/src/containers/proposalSnapshot/index.tsx b/src/containers/proposalSnapshot/index.tsx index d31dbfe2b..b92be3dbe 100644 --- a/src/containers/proposalSnapshot/index.tsx +++ b/src/containers/proposalSnapshot/index.tsx @@ -6,6 +6,7 @@ import { IconGovernance, ListItemHeader, } from '@aragon/ods-old'; +import {DaoAction} from '@aragon/sdk-client-common'; import React from 'react'; import {useTranslation} from 'react-i18next'; import {generatePath, useNavigate} from 'react-router-dom'; @@ -34,9 +35,12 @@ type Props = { }; const ProposalItem: React.FC< - {proposalId: string} & CardProposalProps + {proposalId: string; actions: DaoAction[]} & CardProposalProps > = props => { - const {isAragonVerifiedUpdateProposal} = useUpdateProposal(props.proposalId); + const {isAragonVerifiedUpdateProposal} = useUpdateProposal( + props.proposalId, + props.actions + ); const {t} = useTranslation(); return ( diff --git a/src/hooks/useUpdateProposal.tsx b/src/hooks/useUpdateProposal.tsx index 024a6aaa8..3b726bc99 100644 --- a/src/hooks/useUpdateProposal.tsx +++ b/src/hooks/useUpdateProposal.tsx @@ -1,31 +1,25 @@ import {useQuery} from '@tanstack/react-query'; +import {useClient} from './useClient'; +import {DaoAction} from '@aragon/sdk-client-common'; /** * This method is a Mock query of update proposal-related things until the real SDK functions are ready * @param proposalId dao proposal id * @returns queries the indicates the update proposal identity */ -export function useUpdateProposal(proposalId: string | undefined) { - // FIXME: remove this function and use the real SDK function - function getRandomInt(max: number) { - return Math.floor(Math.random() * max); - } - - const updateProposalCheck = useQuery({ - queryKey: ['updateProposalCheck', proposalId], - queryFn: () => - new Promise(resolve => { - setTimeout(() => resolve(Boolean(getRandomInt(2)))); - }), - enabled: Boolean(proposalId), - }); - +export function useUpdateProposal( + proposalId: string | undefined, + proposalActions: DaoAction[] +) { + const {client} = useClient(); const aragonVerifiedUpdateProposalCheck = useQuery({ queryKey: ['aragonVerifiedUpdateProposalCheck', proposalId], - queryFn: () => - new Promise(resolve => { - setTimeout(() => resolve(Boolean(getRandomInt(2)))); - }), + queryFn: () => { + return ( + client?.methods.isDaoUpdate(proposalActions) || + client?.methods.isPluginUpdate(proposalActions) + ); + }, enabled: Boolean(proposalId), }); @@ -34,7 +28,6 @@ export function useUpdateProposal(proposalId: string | undefined) { aragonVerifiedUpdateProposalCheck.data; return { - updateProposalCheck, aragonVerifiedUpdateProposalCheck, isAragonVerifiedUpdateProposal, }; diff --git a/src/pages/settings.tsx b/src/pages/settings.tsx index d4cfd47ca..978f8b56c 100644 --- a/src/pages/settings.tsx +++ b/src/pages/settings.tsx @@ -30,20 +30,33 @@ import {SettingsUpdateCard} from 'containers/settings/updateCard'; import {VersionInfoCard} from 'containers/settings/versionInfoCard'; import {useNetwork} from 'context/network'; import {useDaoDetailsQuery} from 'hooks/useDaoDetails'; -import {PluginTypes} from 'hooks/usePluginClient'; +import {PluginTypes, usePluginClient} from 'hooks/usePluginClient'; import useScreen from 'hooks/useScreen'; import {CHAIN_METADATA} from 'utils/constants'; import {featureFlags} from 'utils/featureFlags'; import {shortenAddress, toDisplayEns} from 'utils/library'; import {EditSettings} from 'utils/paths'; +import {useWallet} from 'hooks/useWallet'; export const Settings: React.FC = () => { const {t} = useTranslation(); const navigate = useNavigate(); const {isDesktop} = useScreen(); - - // move into components when proper loading experience is implemented + const {address} = useWallet(); const {data: daoDetails, isLoading} = useDaoDetailsQuery(); + const pluginType = daoDetails?.plugins?.[0]?.id as PluginTypes; + const pluginAddress = daoDetails?.plugins?.[0]?.instanceAddress as string; + const pluginClient = usePluginClient(pluginType); + const [isMember, setIsMember] = useState(false); + + useEffect(() => { + pluginClient?.methods + .isMember({ + address: address as string, + pluginAddress, + }) + .then(value => setIsMember(value)); + }, [address, pluginAddress, pluginClient?.methods]); if (isLoading) { return ; @@ -54,7 +67,8 @@ export const Settings: React.FC = () => { } const daoUpdateEnabled = - featureFlags.getValue('VITE_FEATURE_FLAG_OSX_UPDATES') === 'true'; + featureFlags.getValue('VITE_FEATURE_FLAG_OSX_UPDATES') === 'true' && + isMember; return ( diff --git a/yarn.lock b/yarn.lock index ec34e2c0f..9ded9d853 100644 --- a/yarn.lock +++ b/yarn.lock @@ -73,10 +73,10 @@ dependencies: ethers "^5.6.2" -"@aragon/sdk-client-common@^1.10.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@aragon/sdk-client-common/-/sdk-client-common-1.10.0.tgz#603b4e4d8a5079283ba1fb08ef22de6d13b51f1b" - integrity sha512-nWkTPA1Tzk2ULcf0lGbwyalZJkhKUnYN4cd4xQiwnEwvy6traYaw9HRB2sNUlEFgPrLIKIkgjGS9diZjXXW0xQ== +"@aragon/sdk-client-common@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@aragon/sdk-client-common/-/sdk-client-common-1.11.0.tgz#37d4f4ab4012fd65e06e40c3f41b9c3163328dcf" + integrity sha512-zn3BP5vnW7NHgc0fDEbAkVzuiOk+hzSh9oCwOcHY9tLGdGR+g+D0Jzpwqu9McBBur6TpzcW3xdNgMMGTqr21ZA== dependencies: "@aragon/osx-ethers" "^1.3.0-rc0.4" "@aragon/osx-ethers-v1.0.0" "npm:@aragon/osx-ethers@1.2.1" @@ -91,13 +91,13 @@ graphql-request "^4.3.0" yup "^1.2.0" -"@aragon/sdk-client@^1.18.2": - version "1.18.2" - resolved "https://registry.yarnpkg.com/@aragon/sdk-client/-/sdk-client-1.18.2.tgz#ecbc244738553fd2d436280c5fb7a670a18633bd" - integrity sha512-ULzfJ0JrWYYUuD0f9E9wB7JBW3+D7O90ISbY8OSPfshpVB32YYzwefntWszqklVDSHewoAlGr2R/wobvO0nFCQ== +"@aragon/sdk-client@^1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@aragon/sdk-client/-/sdk-client-1.19.0.tgz#13f8e95c72aff84c4ff3520220dd8948cd9a3bd4" + integrity sha512-JXxLlkEnTA+ycGl4yTus4y8OvxJXQxoX9k2tfG9pIcVFxgeLAojCAGabDo88S+6AX5rDc0jEF9b3NQbjWo1lnA== dependencies: "@aragon/osx-ethers" "1.3.0-rc0.4" - "@aragon/sdk-client-common" "^1.10.0" + "@aragon/sdk-client-common" "^1.11.0" "@aragon/sdk-ipfs" "^1.1.0" "@ethersproject/abstract-signer" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"