Skip to content

Commit 15430c7

Browse files
feat(web): use-atlas-spam-api
1 parent 6abacc8 commit 15430c7

File tree

3 files changed

+69
-8
lines changed

3 files changed

+69
-8
lines changed

web/src/hooks/useSpamEvidence.ts

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

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

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

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

11+
import { useSpamEvidence } from "hooks/useSpamEvidence";
12+
1113
import { useDisputeDetailsQuery } from "queries/useDisputeDetailsQuery";
1214
import { useEvidences } from "queries/useEvidences";
1315

1416
import { responsiveSize } from "styles/responsiveSize";
1517

18+
import { Divider } from "components/Divider";
1619
import EvidenceCard from "components/EvidenceCard";
1720
import { SkeletonEvidenceCard } from "components/StyledSkeleton";
1821

1922
import EvidenceSearch from "./EvidenceSearch";
20-
import { Divider } from "components/Divider";
21-
import { spamEvidencesIds } from "src/consts";
2223

2324
const Container = styled.div`
2425
width: 100%;
@@ -79,6 +80,7 @@ const Evidence: React.FC = () => {
7980
const [search, setSearch] = useState<string>();
8081
const [debouncedSearch, setDebouncedSearch] = useState<string>();
8182
const [showSpam, setShowSpam] = useState(false);
83+
const { data: spamEvidences } = useSpamEvidence();
8284

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

@@ -93,12 +95,30 @@ const Evidence: React.FC = () => {
9395
latestEvidence.scrollIntoView({ behavior: "smooth" });
9496
}, [ref]);
9597

98+
const flattenedSpamEvidences = useMemo(
99+
() =>
100+
spamEvidences?.courtv2EvidenceSpamsByDeployment.reduce<string[]>((acc, current) => {
101+
if (current.dispute === id) {
102+
return [...acc, current.disputeEvidenceIndex];
103+
}
104+
return acc;
105+
}, []),
106+
[id, spamEvidences]
107+
);
108+
109+
const isSpam = useCallback(
110+
(evidenceId: string) => {
111+
return Boolean(flattenedSpamEvidences?.includes(evidenceId));
112+
},
113+
[flattenedSpamEvidences]
114+
);
115+
96116
const evidences = useMemo(() => {
97117
if (!data?.evidences) return;
98118
const spamEvidences = data.evidences.filter((evidence) => isSpam(evidence.id));
99119
const realEvidences = data.evidences.filter((evidence) => !isSpam(evidence.id));
100120
return { realEvidences, spamEvidences };
101-
}, [data]);
121+
}, [data, isSpam]);
102122

103123
return (
104124
<Container ref={ref}>
@@ -142,8 +162,4 @@ const Evidence: React.FC = () => {
142162
);
143163
};
144164

145-
const isSpam = (id: string) => {
146-
return spamEvidencesIds.includes(id);
147-
};
148-
149165
export default Evidence;

web/tsconfig.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@
6767
"resolveJsonModule": true,
6868
"target": "ES2020",
6969
"lib": [
70-
"ESNext.Array"
70+
"ESNext.Array",
71+
"dom"
7172
],
7273
"types": [
7374
"vite/client",

0 commit comments

Comments
 (0)