Skip to content

Commit 2735f07

Browse files
Merge branch 'dev' into feat/upload-restrictions-message
2 parents 73b1551 + 07327fa commit 2735f07

File tree

3 files changed

+89
-36
lines changed

3 files changed

+89
-36
lines changed

prettier-config/index.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module.exports = {
1313
{
1414
files: ["*.sol"],
1515
options: {
16+
parser: "solidity-parse",
1617
printWidth: 120,
1718
tabWidth: 4,
1819
useTabs: false,
@@ -22,5 +23,5 @@ module.exports = {
2223
},
2324
},
2425
],
25-
plugins: [require("prettier-plugin-solidity")],
26+
plugins: ["prettier-plugin-solidity"],
2627
};

web/src/hooks/useSpamEvidence.ts

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { useQuery } from "@tanstack/react-query";
2+
import { gql, request } from "graphql-request";
3+
4+
import { isKlerosNeo, isKlerosUniversity, isTestnetDeployment } from "src/consts";
5+
import { isUndefined } from "src/utils";
6+
7+
const spamEvidenceQuery = gql`
8+
query SpamEvidences($deployment: CourtV2Deployment!, $evidenceGroupId: String!) {
9+
courtv2EvidenceSpamsByGroupId(deployment: $deployment, evidenceGroupId: $evidenceGroupId) {
10+
evidenceIds
11+
}
12+
}
13+
`;
14+
15+
type SpamEvidences = {
16+
courtv2EvidenceSpamsByGroupId: { evidenceIds: string[] };
17+
};
18+
19+
const getAtlasDeployment = () => {
20+
if (isKlerosUniversity()) {
21+
return "university";
22+
} else if (isKlerosNeo()) {
23+
return "beta";
24+
} else if (isTestnetDeployment()) {
25+
return "testnet";
26+
} else {
27+
return "devnet";
28+
}
29+
};
30+
const atlasUri = import.meta.env.REACT_APP_ATLAS_URI;
31+
32+
export const useSpamEvidence = (evidenceGroupId: string) => {
33+
const isEnabled = !isUndefined(atlasUri) && !isUndefined(evidenceGroupId);
34+
35+
const variables = { deployment: getAtlasDeployment(), evidenceGroupId };
36+
return useQuery<SpamEvidences>({
37+
queryKey: [`evidenceSpamQuery`],
38+
enabled: isEnabled,
39+
staleTime: 60000,
40+
queryFn: async () => await request(`${atlasUri}/graphql`, spamEvidenceQuery, variables),
41+
});
42+
};

web/src/pages/Cases/CaseDetails/Evidence/index.tsx

+45-35
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ import { Button } from "@kleros/ui-components-library";
88

99
import DownArrow from "svgs/icons/arrow-down.svg";
1010

11-
import { spamEvidencesIds } from "consts/index";
11+
import { useSpamEvidence } from "hooks/useSpamEvidence";
1212

1313
import { useDisputeDetailsQuery } from "queries/useDisputeDetailsQuery";
1414
import { useEvidences } from "queries/useEvidences";
1515

1616
import { landscapeStyle } from "styles/landscapeStyle";
1717

18+
import { Divider } from "components/Divider";
1819
import EvidenceCard from "components/EvidenceCard";
1920
import { SkeletonEvidenceCard } from "components/StyledSkeleton";
2021

2122
import EvidenceSearch from "./EvidenceSearch";
22-
import { Divider } from "components/Divider";
2323

2424
const Container = styled.div`
2525
width: 100%;
@@ -85,6 +85,7 @@ const Evidence: React.FC = () => {
8585
const [search, setSearch] = useState<string>();
8686
const [debouncedSearch, setDebouncedSearch] = useState<string>();
8787
const [showSpam, setShowSpam] = useState(false);
88+
const { data: spamEvidences } = useSpamEvidence(disputeData?.dispute?.externalDisputeId?.toString());
8889

8990
const { data } = useEvidences(disputeData?.dispute?.externalDisputeId?.toString(), debouncedSearch);
9091

@@ -99,57 +100,66 @@ const Evidence: React.FC = () => {
99100
latestEvidence.scrollIntoView({ behavior: "smooth" });
100101
}, [ref]);
101102

103+
const isSpam = useCallback(
104+
(evidenceId: string) => {
105+
return Boolean(spamEvidences?.courtv2EvidenceSpamsByGroupId.evidenceIds?.includes(evidenceId));
106+
},
107+
[spamEvidences]
108+
);
109+
102110
const evidences = useMemo(() => {
103111
if (!data?.evidences) return;
104112
const spamEvidences = data.evidences.filter((evidence) => isSpam(evidence.id));
105113
const realEvidences = data.evidences.filter((evidence) => !isSpam(evidence.id));
106114
return { realEvidences, spamEvidences };
107-
}, [data]);
115+
}, [data, isSpam]);
108116

109117
return (
110118
<Container ref={ref}>
111119
<EvidenceSearch {...{ search, setSearch, evidenceGroup: disputeData?.dispute?.externalDisputeId }} />
112120
<ScrollButton small Icon={DownArrow} text="Scroll to latest" onClick={scrollToLatest} />
113121
{evidences?.realEvidences ? (
114-
evidences?.realEvidences.map(
115-
({ evidence, sender, timestamp, transactionHash, name, description, fileURI, evidenceIndex }) => (
116-
<EvidenceCard
117-
key={timestamp}
118-
index={parseInt(evidenceIndex)}
119-
sender={sender?.id}
120-
{...{ evidence, timestamp, transactionHash, name, description, fileURI }}
121-
/>
122-
)
123-
)
124-
) : (
125-
<SkeletonEvidenceCard />
126-
)}
127-
{evidences?.spamEvidences.length !== 0 ? (
128122
<>
129-
<Divider />
130-
{showSpam ? (
131-
evidences?.spamEvidences.map(
132-
({ evidence, sender, timestamp, transactionHash, name, description, fileURI, evidenceIndex }) => (
133-
<EvidenceCard
134-
key={timestamp}
135-
index={parseInt(evidenceIndex)}
136-
sender={sender?.id}
137-
{...{ evidence, timestamp, transactionHash, name, description, fileURI }}
138-
/>
139-
)
123+
{evidences?.realEvidences.map(
124+
({ evidence, sender, timestamp, transactionHash, name, description, fileURI, evidenceIndex }) => (
125+
<EvidenceCard
126+
key={timestamp}
127+
index={parseInt(evidenceIndex)}
128+
sender={sender?.id}
129+
{...{ evidence, timestamp, transactionHash, name, description, fileURI }}
130+
/>
140131
)
141-
) : (
142-
<SpamLabel onClick={() => setShowSpam(true)}>Show likely spam</SpamLabel>
143132
)}
133+
{spamEvidences && evidences?.spamEvidences.length !== 0 ? (
134+
<>
135+
<Divider />
136+
{showSpam ? (
137+
<>
138+
<SpamLabel onClick={() => setShowSpam(false)}>Hide spam</SpamLabel>
139+
{evidences?.spamEvidences.map(
140+
({ evidence, sender, timestamp, transactionHash, name, description, fileURI, evidenceIndex }) => (
141+
<EvidenceCard
142+
key={timestamp}
143+
index={parseInt(evidenceIndex)}
144+
sender={sender?.id}
145+
{...{ evidence, timestamp, transactionHash, name, description, fileURI }}
146+
/>
147+
)
148+
)}
149+
</>
150+
) : (
151+
<SpamLabel onClick={() => setShowSpam(true)}>Show likely spam</SpamLabel>
152+
)}
153+
</>
154+
) : null}
144155
</>
145-
) : null}
156+
) : (
157+
<SkeletonEvidenceCard />
158+
)}
159+
146160
{data && data.evidences.length === 0 ? <StyledLabel>There is no evidence submitted yet</StyledLabel> : null}
147161
</Container>
148162
);
149163
};
150164

151-
const isSpam = (id: string) => {
152-
return spamEvidencesIds.includes(id);
153-
};
154-
155165
export default Evidence;

0 commit comments

Comments
 (0)