diff --git a/govtool/frontend/src/components/organisms/DashboardGovernanceActionDetails.tsx b/govtool/frontend/src/components/organisms/DashboardGovernanceActionDetails.tsx index 5db1bd7cc..1c6bdd6c1 100644 --- a/govtool/frontend/src/components/organisms/DashboardGovernanceActionDetails.tsx +++ b/govtool/frontend/src/components/organisms/DashboardGovernanceActionDetails.tsx @@ -49,7 +49,9 @@ export const DashboardGovernanceActionDetails = () => { fullProposalId ?? "", !state?.proposal || !state?.vote, ); - const proposal = (data ?? state)?.proposal; + const [extendedProposal, setExtendedProposal] = useState( + (data ?? state)?.proposal as ProposalData, + ); const vote = (data ?? state)?.vote; const [isValidating, setIsValidating] = useState(false); @@ -60,12 +62,22 @@ export const DashboardGovernanceActionDetails = () => { const validate = async () => { setIsValidating(true); - const { status } = await validateMetadata({ + const { status, metadata } = await validateMetadata({ standard: MetadataStandard.CIP108, - url: proposal?.url ?? "", - hash: proposal?.metadataHash ?? "", + url: extendedProposal?.url ?? "", + hash: extendedProposal?.metadataHash ?? "", }); + if (metadata) { + setExtendedProposal((prevProposal) => ({ + ...(prevProposal || {}), + ...(metadata as Pick< + ProposalData, + "title" | "abstract" | "motivation" | "rationale" + >), + })); + } + metadataStatus.current = status; setIsValidating(false); }; @@ -95,7 +107,7 @@ export const DashboardGovernanceActionDetails = () => { { > - ) : proposal ? ( + ) : extendedProposal ? ( void; inProgress?: boolean; }; -export const ValidatedGovernanceActionCard = ({ - url, - metadataHash, - ...props -}: ActionTypeProps) => { +export const ValidatedGovernanceActionCard = (props: ActionTypeProps) => { const [isValidating, setIsValidating] = useState(false); const metadataStatus = useRef(); const { validateMetadata } = useValidateMutation(); + const [extendedProposal, setExtendedProposal] = useState( + props as ProposalData, + ); useEffect(() => { const validate = async () => { setIsValidating(true); - const { status } = await validateMetadata({ + const { status, metadata } = await validateMetadata({ standard: MetadataStandard.CIP108, - url: url ?? "", - hash: metadataHash ?? "", + url: props?.url ?? "", + hash: props?.metadataHash ?? "", }); metadataStatus.current = status; + + if (metadata) { + setExtendedProposal( + (prevProposal) => + ({ + ...(prevProposal || {}), + ...(metadata as Pick< + ProposalData, + "title" | "abstract" | "motivation" | "rationale" + >), + } as ProposalData), + ); + } + setIsValidating(false); }; validate(); - }, []); + }, [props?.url, props?.metadataHash]); return ( diff --git a/govtool/frontend/src/components/organisms/ValidatedGovernanceVotedOnCard.tsx b/govtool/frontend/src/components/organisms/ValidatedGovernanceVotedOnCard.tsx index ec551d4c7..e5581fd34 100644 --- a/govtool/frontend/src/components/organisms/ValidatedGovernanceVotedOnCard.tsx +++ b/govtool/frontend/src/components/organisms/ValidatedGovernanceVotedOnCard.tsx @@ -1,7 +1,7 @@ import { useState, useRef, useEffect } from "react"; import { useValidateMutation } from "@/hooks/mutations"; -import { MetadataStandard, VotedProposal } from "@/models"; +import { MetadataStandard, ProposalData, VotedProposal } from "@/models"; import { GovernanceVotedOnCard } from "../molecules"; type Props = { @@ -15,18 +15,33 @@ export const ValidatedGovernanceVotedOnCard = ({ const [isValidating, setIsValidating] = useState(false); const metadataStatus = useRef(); const { validateMetadata } = useValidateMutation(); + const [extendedVotedProposal, setExtendedVotedProposal] = + useState(votedProposal); useEffect(() => { const validate = async () => { setIsValidating(true); - const { status } = await validateMetadata({ + const { status, metadata } = await validateMetadata({ standard: MetadataStandard.CIP108, url: votedProposal.proposal.url, hash: votedProposal.proposal.metadataHash, }); metadataStatus.current = status; + + if (metadata) { + setExtendedVotedProposal((prevProposal) => ({ + ...(prevProposal || {}), + proposal: { + ...(prevProposal.proposal || {}), + ...(metadata as Pick< + ProposalData, + "title" | "abstract" | "motivation" | "rationale" + >), + }, + })); + } setIsValidating(false); }; validate(); @@ -34,7 +49,7 @@ export const ValidatedGovernanceVotedOnCard = ({ return ( { fullProposalId ?? "", !state?.proposal, ); - const proposal = (data ?? state)?.proposal; - + const [extendedProposal, setExtendedProposal] = useState( + (data ?? state)?.proposal as ProposalData, + ); const metadataStatus = useRef(); const { validateMetadata } = useValidateMutation(); useEffect(() => { const validate = async () => { - const { status } = await validateMetadata({ + const { status, metadata } = await validateMetadata({ standard: MetadataStandard.CIP108, - url: proposal?.url ?? "", - hash: proposal?.metadataHash ?? "", + url: extendedProposal?.url ?? "", + hash: extendedProposal?.metadataHash ?? "", }); metadataStatus.current = status; + + if (metadata) { + setExtendedProposal((prevProposal) => ({ + ...(prevProposal || {}), + ...(metadata as Pick< + ProposalData, + "title" | "abstract" | "motivation" | "rationale" + >), + })); + } }; validate(); - }, [proposal?.url, proposal?.metadataHash]); + }, [extendedProposal?.url, extendedProposal?.metadataHash]); useEffect(() => { const isProposalNotFound = @@ -121,7 +132,7 @@ export const GovernanceActionDetails = () => { { > - ) : proposal ? ( + ) : extendedProposal ? ( ) : ( diff --git a/govtool/metadata-validation/src/app.service.ts b/govtool/metadata-validation/src/app.service.ts index 82f0bb1af..cfb1bb0d0 100644 --- a/govtool/metadata-validation/src/app.service.ts +++ b/govtool/metadata-validation/src/app.service.ts @@ -7,7 +7,7 @@ import * as jsonld from 'jsonld'; import { ValidateMetadataDTO } from '@dto'; import { LoggerMessage, MetadataValidationStatus } from '@enums'; import { validateMetadataStandard, parseMetadata, getStandard } from '@utils'; -import { MetadataStandard, ValidateMetadataResult } from '@types'; +import { /* MetadataStandard, */ ValidateMetadataResult } from '@types'; @Injectable() export class AppService { @@ -57,12 +57,13 @@ export class AppService { throw MetadataValidationStatus.INCORRECT_FORMAT; } - if ( - standard === MetadataStandard.CIP108 && - !Array.isArray(parsedData.authors) - ) { - throw MetadataValidationStatus.INCORRECT_FORMAT; - } + // TODO: Uncomment this when gov action: 7f320409d9998712ff3a3cdf0c9439e1543f236a3d746766f78f1fdbe1e06bf8#0 expires + // if ( + // standard === MetadataStandard.CIP108 && + // !Array.isArray(parsedData.authors) + // ) { + // throw MetadataValidationStatus.INCORRECT_FORMAT; + // } if (!parsedData?.body) { throw MetadataValidationStatus.INCORRECT_FORMAT;