From 287f0fab3e79a21c2bf2455fa52c293bc5d5a77c Mon Sep 17 00:00:00 2001 From: Matthew Russell Date: Fri, 12 Jan 2024 18:42:46 -0500 Subject: [PATCH] chore: fix type issues --- .../links/proposal-link/proposal-link.tsx | 13 +++++- .../txs/details/proposal/proposal-date.tsx | 9 ++++- .../details/proposal/proposal-status-icon.tsx | 40 ++++++++----------- .../proposal-header.spec.tsx | 16 +++++++- .../proposal-header.tsx | 6 ++- .../proposal-cancel-transfer-details.tsx | 4 +- .../components/proposal/proposal.tsx | 2 +- .../proposals-list-item.tsx | 5 ++- .../test-helpers/generate-proposals.ts | 4 +- .../use-cancel-transfer-proposal-details.ts | 16 ++++++-- .../use-new-transfer-proposal-details.ts | 14 +++++-- 11 files changed, 88 insertions(+), 41 deletions(-) diff --git a/apps/explorer/src/app/components/links/proposal-link/proposal-link.tsx b/apps/explorer/src/app/components/links/proposal-link/proposal-link.tsx index c9ae74675..c7bd14820 100644 --- a/apps/explorer/src/app/components/links/proposal-link/proposal-link.tsx +++ b/apps/explorer/src/app/components/links/proposal-link/proposal-link.tsx @@ -1,7 +1,11 @@ -import { useExplorerProposalQuery } from './__generated__/Proposal'; +import { + useExplorerProposalQuery, + type ExplorerProposalQuery, +} from './__generated__/Proposal'; import { ExternalLink } from '@vegaprotocol/ui-toolkit'; import { ENV } from '../../../config/env'; import Hash from '../hash'; + export type ProposalLinkProps = { id: string; text?: string; @@ -16,8 +20,13 @@ const ProposalLink = ({ id, text }: ProposalLinkProps) => { variables: { id }, }); + const proposal = data?.proposal as Extract< + ExplorerProposalQuery['proposal'], + { __typename?: 'Proposal' } + >; + const base = ENV.dataSources.governanceUrl; - const label = data?.proposal?.rationale.title || id; + const label = proposal?.rationale.title || id; return ( diff --git a/apps/explorer/src/app/components/txs/details/proposal/proposal-date.tsx b/apps/explorer/src/app/components/txs/details/proposal/proposal-date.tsx index a94aa7b49..b02415173 100644 --- a/apps/explorer/src/app/components/txs/details/proposal/proposal-date.tsx +++ b/apps/explorer/src/app/components/txs/details/proposal/proposal-date.tsx @@ -18,12 +18,17 @@ export function getDate( data: ExplorerProposalStatusQuery | undefined, terms: Terms ): string { + const proposal = data?.proposal as Extract< + ExplorerProposalStatusQuery['proposal'], + { __typename?: 'Proposal' } + >; + const DEFAULT = t('Unknown'); - if (!data?.proposal?.state) { + if (!proposal?.state) { return DEFAULT; } - switch (data.proposal.state) { + switch (proposal.state) { case 'STATE_DECLINED': return `${t('Rejected on')}: ${format(terms.closingTimestamp, DEFAULT)}`; case 'STATE_ENACTED': diff --git a/apps/explorer/src/app/components/txs/details/proposal/proposal-status-icon.tsx b/apps/explorer/src/app/components/txs/details/proposal/proposal-status-icon.tsx index 41ff4db87..61d617373 100644 --- a/apps/explorer/src/app/components/txs/details/proposal/proposal-status-icon.tsx +++ b/apps/explorer/src/app/components/txs/details/proposal/proposal-status-icon.tsx @@ -2,17 +2,8 @@ import { Icon, Tooltip } from '@vegaprotocol/ui-toolkit'; import type { IconProps } from '@vegaprotocol/ui-toolkit'; import { useExplorerProposalStatusQuery } from './__generated__/Proposal'; import type { ExplorerProposalStatusQuery } from './__generated__/Proposal'; -import type * as Apollo from '@apollo/client'; -import type * as Types from '@vegaprotocol/types'; import { t } from '@vegaprotocol/i18n'; -type ProposalQueryResult = Apollo.QueryResult< - ExplorerProposalStatusQuery, - Types.Exact<{ - id: string; - }> ->; - interface ProposalStatusIconProps { id: string; } @@ -29,29 +20,38 @@ type IconAndLabel = { * @param data a data result from useExplorerProposalStatusQuery * @returns Icon name */ -export function getIconAndLabelForStatus( - res: ProposalQueryResult -): IconAndLabel { +export function useIconAndLabelForStatus(id: string): IconAndLabel { + const { data, loading, error } = useExplorerProposalStatusQuery({ + variables: { + id, + }, + }); + + const proposal = data?.proposal as Extract< + ExplorerProposalStatusQuery['proposal'], + { __typename?: 'Proposal' } + >; + const DEFAULT: IconAndLabel = { icon: 'error', label: t('Proposal state unknown'), }; - if (res.loading) { + if (loading) { return { icon: 'more', label: t('Loading data'), }; } - if (!res?.data?.proposal || res.error) { + if (!data?.proposal || error) { return { icon: 'error', - label: res.error?.message || DEFAULT.label, + label: error?.message || DEFAULT.label, }; } - switch (res.data.proposal.state) { + switch (proposal.state) { case 'STATE_DECLINED': return { icon: 'stop', @@ -99,13 +99,7 @@ export function getIconAndLabelForStatus( /** */ export const ProposalStatusIcon = ({ id }: ProposalStatusIconProps) => { - const { icon, label } = getIconAndLabelForStatus( - useExplorerProposalStatusQuery({ - variables: { - id, - }, - }) - ); + const { icon, label } = useIconAndLabelForStatus(id); return (
diff --git a/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.spec.tsx b/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.spec.tsx index 1f1f25788..5f7428cd4 100644 --- a/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.spec.tsx +++ b/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.spec.tsx @@ -36,7 +36,7 @@ jest.mock('@vegaprotocol/proposals', () => ({ })); const renderComponent = ( - proposal: ProposalQuery['proposal'], + proposal: Extract, isListItem = true, mocks: MockedResponse[] = [], voteState?: VoteState @@ -64,6 +64,7 @@ describe('Proposal header', () => { it('Renders New market proposal', () => { useFeatureFlags.setState({ flags: { SUCCESSOR_MARKETS: true } }); renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ rationale: { title: 'New some market', @@ -102,6 +103,7 @@ describe('Proposal header', () => { it('Renders Update market proposal', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ rationale: { title: 'New market id', @@ -130,6 +132,7 @@ describe('Proposal header', () => { it('Renders New asset proposal - ERC20', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ rationale: { title: 'New asset: Fake currency', @@ -159,6 +162,7 @@ describe('Proposal header', () => { it('Renders New asset proposal - BuiltInAsset', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ terms: { change: { @@ -184,6 +188,7 @@ describe('Proposal header', () => { it('Renders Update network', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ rationale: { title: 'Network parameter', @@ -213,6 +218,7 @@ describe('Proposal header', () => { it('Renders Freeform proposal - short rationale', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ id: 'short', rationale: { @@ -234,6 +240,7 @@ describe('Proposal header', () => { it('Renders Freeform proposal - long rationale (105 chars) - listing', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ id: 'long', rationale: { @@ -259,6 +266,7 @@ describe('Proposal header', () => { // Remove once proposals have rationale and re-enable above tests it('Renders Freeform proposal - id for title', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ id: 'freeform id', rationale: { @@ -280,6 +288,7 @@ describe('Proposal header', () => { it('Renders asset change proposal header', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ terms: { change: { @@ -297,6 +306,7 @@ describe('Proposal header', () => { it("Renders unknown proposal if it's a different proposal type", () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ terms: { change: { @@ -313,6 +323,7 @@ describe('Proposal header', () => { it('Renders proposal state: Enacted', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ state: ProposalState.STATE_ENACTED, terms: { @@ -325,6 +336,7 @@ describe('Proposal header', () => { it('Renders proposal state: Passed', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ state: ProposalState.STATE_PASSED, terms: { @@ -338,6 +350,7 @@ describe('Proposal header', () => { it('Renders proposal state: Waiting for node vote', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ state: ProposalState.STATE_WAITING_FOR_NODE_VOTE, terms: { @@ -352,6 +365,7 @@ describe('Proposal header', () => { it('Renders proposal state: Open', () => { renderComponent( + // @ts-ignore we aren't using batch yet generateProposal({ state: ProposalState.STATE_OPEN, votes: { diff --git a/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.tsx b/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.tsx index 243a3f5f6..50c31bc04 100644 --- a/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.tsx +++ b/apps/governance/src/routes/proposals/components/proposal-detail-header/proposal-header.tsx @@ -30,12 +30,14 @@ import type { VoteState } from '../vote-details/use-user-vote'; import { VoteBreakdown } from '../vote-breakdown'; import { GovernanceTransferKindMapping } from '@vegaprotocol/types'; +type Proposal = Extract; + export const ProposalHeader = ({ proposal, isListItem = true, voteState, }: { - proposal: ProposalQuery['proposal']; + proposal: Proposal; isListItem?: boolean; voteState?: VoteState | null; }) => { @@ -53,7 +55,7 @@ export const ProposalHeader = ({ const titleContent = shorten(title ?? '', 100); - const getAsset = (proposal: ProposalQuery['proposal']) => { + const getAsset = (proposal: Proposal) => { const terms = proposal?.terms; if ( terms?.change.__typename === 'NewMarket' && diff --git a/apps/governance/src/routes/proposals/components/proposal-transfer/proposal-cancel-transfer-details.tsx b/apps/governance/src/routes/proposals/components/proposal-transfer/proposal-cancel-transfer-details.tsx index 6f51bd39b..1b3562a84 100644 --- a/apps/governance/src/routes/proposals/components/proposal-transfer/proposal-cancel-transfer-details.tsx +++ b/apps/governance/src/routes/proposals/components/proposal-transfer/proposal-cancel-transfer-details.tsx @@ -12,7 +12,9 @@ import { SubHeading } from '../../../../components/heading'; export const ProposalCancelTransferDetails = ({ proposal, }: { - proposal: ProposalFieldsFragment | ProposalQuery['proposal']; + proposal: + | ProposalFieldsFragment + | Extract; }) => { const { t } = useTranslation(); const details = useCancelTransferProposalDetails(proposal?.id); diff --git a/apps/governance/src/routes/proposals/components/proposal/proposal.tsx b/apps/governance/src/routes/proposals/components/proposal/proposal.tsx index 1fd25c5de..5eae3149c 100644 --- a/apps/governance/src/routes/proposals/components/proposal/proposal.tsx +++ b/apps/governance/src/routes/proposals/components/proposal/proposal.tsx @@ -30,7 +30,7 @@ import { useFeatureFlags } from '@vegaprotocol/environment'; import { ProposalUpdateBenefitTiers } from '../proposal-update-benefit-tiers'; export interface ProposalProps { - proposal: ProposalQuery['proposal']; + proposal: Extract; networkParams: Partial; marketData?: MarketInfo | null; parentMarketData?: MarketInfo | null; diff --git a/apps/governance/src/routes/proposals/components/proposals-list-item/proposals-list-item.tsx b/apps/governance/src/routes/proposals/components/proposals-list-item/proposals-list-item.tsx index 09747d2b6..71e2d6557 100644 --- a/apps/governance/src/routes/proposals/components/proposals-list-item/proposals-list-item.tsx +++ b/apps/governance/src/routes/proposals/components/proposals-list-item/proposals-list-item.tsx @@ -5,7 +5,10 @@ import { useUserVote } from '../vote-details/use-user-vote'; import type { ProposalQuery } from '../../proposal/__generated__/Proposal'; interface ProposalsListItemProps { - proposal?: ProposalQuery['proposal'] | null; + proposal?: Extract< + ProposalQuery['proposal'], + { __typename?: 'Proposal' } + > | null; } export const ProposalsListItem = ({ proposal }: ProposalsListItemProps) => { diff --git a/apps/governance/src/routes/proposals/test-helpers/generate-proposals.ts b/apps/governance/src/routes/proposals/test-helpers/generate-proposals.ts index 48fb0aae6..1a43df400 100644 --- a/apps/governance/src/routes/proposals/test-helpers/generate-proposals.ts +++ b/apps/governance/src/routes/proposals/test-helpers/generate-proposals.ts @@ -43,7 +43,9 @@ export function generateProtocolUpgradeProposal( } export function generateProposal( - override: PartialDeep = {} + override: PartialDeep< + Extract + > = {} ): ProposalQuery['proposal'] { const defaultProposal: ProposalQuery['proposal'] = { __typename: 'Proposal', diff --git a/libs/proposals/src/lib/proposals-hooks/use-cancel-transfer-proposal-details.ts b/libs/proposals/src/lib/proposals-hooks/use-cancel-transfer-proposal-details.ts index d3ecf5f5f..f39b3e07a 100644 --- a/libs/proposals/src/lib/proposals-hooks/use-cancel-transfer-proposal-details.ts +++ b/libs/proposals/src/lib/proposals-hooks/use-cancel-transfer-proposal-details.ts @@ -1,5 +1,8 @@ -import type { CancelTransferFieldsFragment } from '../proposals-data-provider'; -import { useCancelTransferDetailsQuery } from './__generated__/Proposal'; +import { type CancelTransferFieldsFragment } from '../proposals-data-provider'; +import { + useCancelTransferDetailsQuery, + type CancelTransferDetailsQuery, +} from './__generated__/Proposal'; export const useCancelTransferProposalDetails = ( proposalId?: string | null @@ -11,8 +14,13 @@ export const useCancelTransferProposalDetails = ( skip: !proposalId || proposalId.length === 0, }); - if (data?.proposal?.terms.change.__typename === 'CancelTransfer') { - return data?.proposal?.terms.change as CancelTransferFieldsFragment; + const proposal = data?.proposal as Extract< + CancelTransferDetailsQuery['proposal'], + { __typename?: 'Proposal' } + >; + + if (proposal?.terms.change.__typename === 'CancelTransfer') { + return proposal?.terms.change as CancelTransferFieldsFragment; } return undefined; diff --git a/libs/proposals/src/lib/proposals-hooks/use-new-transfer-proposal-details.ts b/libs/proposals/src/lib/proposals-hooks/use-new-transfer-proposal-details.ts index 70f1204bb..5c5374122 100644 --- a/libs/proposals/src/lib/proposals-hooks/use-new-transfer-proposal-details.ts +++ b/libs/proposals/src/lib/proposals-hooks/use-new-transfer-proposal-details.ts @@ -1,5 +1,8 @@ import type { NewTransferFieldsFragment } from '../proposals-data-provider'; -import { useNewTransferDetailsQuery } from './__generated__/Proposal'; +import { + useNewTransferDetailsQuery, + type NewTransferDetailsQuery, +} from './__generated__/Proposal'; export const useNewTransferProposalDetails = (proposalId?: string | null) => { const { data } = useNewTransferDetailsQuery({ @@ -9,8 +12,13 @@ export const useNewTransferProposalDetails = (proposalId?: string | null) => { skip: !proposalId || proposalId.length === 0, }); - if (data?.proposal?.terms.change.__typename === 'NewTransfer') { - return data?.proposal?.terms.change as NewTransferFieldsFragment; + const proposal = data?.proposal as Extract< + NewTransferDetailsQuery['proposal'], + { __typename?: 'Proposal' } + >; + + if (proposal?.terms.change.__typename === 'NewTransfer') { + return proposal?.terms.change as NewTransferFieldsFragment; } return undefined;