Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ export const DashboardGovernanceActionDetails = () => {
fullProposalId ?? "",
!state?.proposal || !state?.vote,
);
const proposal = (data ?? state)?.proposal;
const [extendedProposal, setExtendedProposal] = useState<ProposalData>(
(data ?? state)?.proposal as ProposalData,
);
const vote = (data ?? state)?.vote;

const [isValidating, setIsValidating] = useState(false);
Expand All @@ -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);
};
Expand Down Expand Up @@ -95,7 +107,7 @@ export const DashboardGovernanceActionDetails = () => {
<Breadcrumbs
elementOne={t("govActions.title")}
elementOnePath={PATHS.dashboardGovernanceActions}
elementTwo={proposal?.title ?? ""}
elementTwo={extendedProposal?.title ?? ""}
isDataMissing={metadataStatus?.current ?? null}
/>
<Link
Expand Down Expand Up @@ -141,9 +153,9 @@ export const DashboardGovernanceActionDetails = () => {
>
<CircularProgress />
</Box>
) : proposal ? (
) : extendedProposal ? (
<GovernanceActionDetailsCard
proposal={proposal}
proposal={extendedProposal}
vote={vote}
isVoter={
voter?.isRegisteredAsDRep || voter?.isRegisteredAsSoleVoter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,36 +17,47 @@ type ActionTypeProps = Omit<
onClick?: () => void;
inProgress?: boolean;
};
export const ValidatedGovernanceActionCard = ({
url,
metadataHash,
...props
}: ActionTypeProps) => {
export const ValidatedGovernanceActionCard = (props: ActionTypeProps) => {
const [isValidating, setIsValidating] = useState(false);
const metadataStatus = useRef<MetadataValidationStatus | undefined>();
const { validateMetadata } = useValidateMutation();
const [extendedProposal, setExtendedProposal] = useState<ProposalData>(
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 (
<GovernanceActionCard
{...props}
url={url}
metadataHash={metadataHash}
{...extendedProposal}
isValidating={isValidating}
metadataStatus={metadataStatus.current}
/>
Expand Down
Original file line number Diff line number Diff line change
@@ -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 = {
Expand All @@ -15,26 +15,41 @@ export const ValidatedGovernanceVotedOnCard = ({
const [isValidating, setIsValidating] = useState(false);
const metadataStatus = useRef<MetadataValidationStatus | undefined>();
const { validateMetadata } = useValidateMutation();
const [extendedVotedProposal, setExtendedVotedProposal] =
useState<VotedProposal>(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();
}, []);

return (
<GovernanceVotedOnCard
votedProposal={votedProposal}
votedProposal={extendedVotedProposal}
inProgress={inProgress}
isValidating={isValidating}
metadataStatus={metadataStatus.current}
Expand Down
31 changes: 21 additions & 10 deletions govtool/frontend/src/pages/GovernanceActionDetails.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useEffect, useRef } from "react";
import { useEffect, useRef, useState } from "react";
import {
useNavigate,
useLocation,
Expand Down Expand Up @@ -51,23 +51,34 @@ export const GovernanceActionDetails = () => {
fullProposalId ?? "",
!state?.proposal,
);
const proposal = (data ?? state)?.proposal;

const [extendedProposal, setExtendedProposal] = useState<ProposalData>(
(data ?? state)?.proposal as ProposalData,
);
const metadataStatus = useRef<MetadataValidationStatus | undefined>();
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 =
Expand Down Expand Up @@ -121,7 +132,7 @@ export const GovernanceActionDetails = () => {
<Breadcrumbs
elementOne={t("govActions.title")}
elementOnePath={PATHS.governanceActions}
elementTwo={proposal?.title ?? ""}
elementTwo={extendedProposal?.title ?? ""}
isDataMissing={metadataStatus?.current ?? null}
/>
<Link
Expand Down Expand Up @@ -158,11 +169,11 @@ export const GovernanceActionDetails = () => {
>
<CircularProgress />
</Box>
) : proposal ? (
) : extendedProposal ? (
<Box data-testid="governance-action-details">
<GovernanceActionDetailsCard
isDataMissing={metadataStatus.current}
proposal={proposal}
proposal={extendedProposal}
/>
</Box>
) : (
Expand Down
15 changes: 8 additions & 7 deletions govtool/metadata-validation/src/app.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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;
Expand Down