Skip to content

Commit e0e5719

Browse files
committed
Merge branch 'dev' into fix/stake-simulator
2 parents 9847803 + b03eb5a commit e0e5719

File tree

4 files changed

+73
-17
lines changed

4 files changed

+73
-17
lines changed

web/.env.devnet.public

+1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ export REACT_APP_GENESIS_BLOCK_ARBSEPOLIA=3084598
77
export REACT_APP_ATLAS_URI=http://localhost:3000
88
export REACT_APP_DEVTOOLS_URL=https://dev--kleros-v2-testnet-devtools.netlify.app
99
export NODE_OPTIONS='--max-old-space-size=7680'
10+
export REACT_APP_SPAM_EVIDENCES_IDS="0-2,3-1"
1011
# devtools
1112
export REACT_APP_GRAPH_API_KEY=

web/src/consts/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,5 @@ export const genesisBlock = () => (isProductionDeployment() ? GENESIS_BLOCK_ARBM
4343

4444
export const INVALID_DISPUTE_DATA_ERROR = `The dispute data is not valid, please vote "Refuse to arbitrate"`;
4545
export const RPC_ERROR = `RPC Error: Unable to fetch dispute data. Please avoid voting.`;
46+
47+
export const spamEvidencesIds: string[] = (import.meta.env.REACT_APP_SPAM_EVIDENCES_IDS ?? "").split(",");

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

+42-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useCallback, useRef, useState } from "react";
1+
import React, { useCallback, useMemo, useRef, useState } from "react";
22
import styled from "styled-components";
33

44
import { useParams } from "react-router-dom";
@@ -17,6 +17,8 @@ import EvidenceCard from "components/EvidenceCard";
1717
import { SkeletonEvidenceCard } from "components/StyledSkeleton";
1818

1919
import EvidenceSearch from "./EvidenceSearch";
20+
import { Divider } from "components/Divider";
21+
import { spamEvidencesIds } from "src/consts";
2022

2123
const Container = styled.div`
2224
width: 100%;
@@ -54,12 +56,19 @@ const ScrollButton = styled(Button)`
5456
}
5557
`;
5658

59+
const SpamLabel = styled.label`
60+
color: ${({ theme }) => theme.primaryBlue};
61+
align-self: center;
62+
cursor: pointer;
63+
`;
64+
5765
const Evidence: React.FC = () => {
5866
const { id } = useParams();
5967
const { data: disputeData } = useDisputeDetailsQuery(id);
6068
const ref = useRef<HTMLDivElement>(null);
6169
const [search, setSearch] = useState<string>();
6270
const [debouncedSearch, setDebouncedSearch] = useState<string>();
71+
const [showSpam, setShowSpam] = useState(false);
6372

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

@@ -74,12 +83,19 @@ const Evidence: React.FC = () => {
7483
latestEvidence.scrollIntoView({ behavior: "smooth" });
7584
}, [ref]);
7685

86+
const evidences = useMemo(() => {
87+
if (!data?.evidences) return;
88+
const spamEvidences = data.evidences.filter((evidence) => isSpam(evidence.id));
89+
const realEvidences = data.evidences.filter((evidence) => !isSpam(evidence.id));
90+
return { realEvidences, spamEvidences };
91+
}, [data]);
92+
7793
return (
7894
<Container ref={ref}>
7995
<EvidenceSearch {...{ search, setSearch, evidenceGroup: disputeData?.dispute?.externalDisputeId }} />
8096
<ScrollButton small Icon={DownArrow} text="Scroll to latest" onClick={scrollToLatest} />
81-
{data ? (
82-
data.evidences.map(({ evidence, sender, timestamp, name, description, fileURI, evidenceIndex }) => (
97+
{evidences?.realEvidences ? (
98+
evidences?.realEvidences.map(({ evidence, sender, timestamp, name, description, fileURI, evidenceIndex }) => (
8399
<EvidenceCard
84100
key={timestamp}
85101
index={parseInt(evidenceIndex)}
@@ -90,9 +106,32 @@ const Evidence: React.FC = () => {
90106
) : (
91107
<SkeletonEvidenceCard />
92108
)}
109+
{evidences?.spamEvidences.length !== 0 ? (
110+
<>
111+
<Divider />
112+
{showSpam ? (
113+
evidences?.spamEvidences.map(
114+
({ evidence, sender, timestamp, name, description, fileURI, evidenceIndex }) => (
115+
<EvidenceCard
116+
key={timestamp}
117+
index={parseInt(evidenceIndex)}
118+
sender={sender?.id}
119+
{...{ evidence, timestamp, name, description, fileURI }}
120+
/>
121+
)
122+
)
123+
) : (
124+
<SpamLabel onClick={() => setShowSpam(true)}>Show likely spam</SpamLabel>
125+
)}
126+
</>
127+
) : null}
93128
{data && data.evidences.length === 0 ? <StyledLabel>There is no evidence submitted yet</StyledLabel> : null}
94129
</Container>
95130
);
96131
};
97132

133+
const isSpam = (id: string) => {
134+
return spamEvidencesIds.includes(id);
135+
};
136+
98137
export default Evidence;

web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx

+28-14
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,24 @@ import { isUndefined } from "utils/index";
2222
import { wrapWithToast } from "utils/wrapWithToast";
2323

2424
import { EnsureChain } from "components/EnsureChain";
25+
import styled from "styled-components";
2526

2627
export enum ActionType {
2728
allowance = "allowance",
2829
stake = "stake",
2930
withdraw = "withdraw",
3031
}
3132

33+
const Container = styled.div`
34+
display: flex;
35+
gap: 8px;
36+
flex-direction: column;
37+
`;
38+
39+
const ErrorLabel = styled.label`
40+
color: ${({ theme }) => theme.error};
41+
`;
42+
3243
interface IActionButton {
3344
isSending: boolean;
3445
parsedAmount: bigint;
@@ -142,20 +153,23 @@ const StakeWithdrawButton: React.FC<IActionButton> = ({
142153
const { text, checkDisabled, onClick } = buttonProps[isAllowance ? ActionType.allowance : action];
143154
return (
144155
<EnsureChain>
145-
<Button
146-
text={text}
147-
isLoading={isSending}
148-
disabled={
149-
isSending ||
150-
parsedAmount == 0n ||
151-
isUndefined(targetStake) ||
152-
isUndefined(courtDetails) ||
153-
checkDisabled() ||
154-
(targetStake !== 0n && targetStake < BigInt(courtDetails.court?.minStake)) ||
155-
(isStaking && !isAllowance && isUndefined(setStakeConfig))
156-
}
157-
onClick={onClick}
158-
/>
156+
<Container>
157+
<Button
158+
text={text}
159+
isLoading={isSending}
160+
disabled={
161+
isSending ||
162+
parsedAmount == 0n ||
163+
isUndefined(targetStake) ||
164+
isUndefined(courtDetails) ||
165+
checkDisabled() ||
166+
(targetStake !== 0n && targetStake < BigInt(courtDetails.court?.minStake)) ||
167+
(isStaking && !isAllowance && isUndefined(setStakeConfig))
168+
}
169+
onClick={onClick}
170+
/>
171+
{setStakeError && <ErrorLabel> {setStakeError.message}</ErrorLabel>}
172+
</Container>
159173
</EnsureChain>
160174
);
161175
};

0 commit comments

Comments
 (0)