Skip to content

Commit 15497de

Browse files
committed
feat: make addresses clickable in evidence, hide button if no file attached, transaction hash
1 parent 884674e commit 15497de

File tree

5 files changed

+56
-16
lines changed

5 files changed

+56
-16
lines changed

subgraph/core/schema.graphql

+1
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ type ClassicEvidence implements Evidence @entity(immutable: true) {
318318
sender: User!
319319
senderAddress: String!
320320
timestamp: BigInt!
321+
transactionHash: Bytes!
321322
name: String
322323
description: String
323324
fileURI: String

subgraph/core/src/EvidenceModule.ts

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export function handleEvidenceEvent(event: EvidenceEvent): void {
1717
evidence.evidenceIndex = evidenceIndex.plus(ONE).toString();
1818
const userId = event.params._party.toHexString();
1919
evidence.timestamp = event.block.timestamp;
20+
evidence.transactionHash = event.transaction.hash;
2021
evidence.evidence = event.params._evidence;
2122
evidence.evidenceGroup = evidenceGroupID.toString();
2223
evidence.sender = userId;

web/src/components/EvidenceCard.tsx

+41-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from "react";
1+
import React, { useMemo } from "react";
22
import styled, { css } from "styled-components";
33

44
import Identicon from "react-identicons";
@@ -9,6 +9,7 @@ import { Card } from "@kleros/ui-components-library";
99

1010
import AttachmentIcon from "svgs/icons/attachment.svg";
1111

12+
import { DEFAULT_CHAIN, getChain } from "consts/chains";
1213
import { formatDate } from "utils/date";
1314
import { getIpfsUrl } from "utils/getIpfsUrl";
1415
import { shortenAddress } from "utils/shortenAddress";
@@ -116,6 +117,19 @@ const StyledLink = styled(Link)`
116117
)}
117118
`;
118119

120+
const StyledA = styled.a`
121+
:hover {
122+
text-decoration: underline;
123+
p {
124+
color: ${({ theme }) => theme.primaryBlue};
125+
}
126+
label {
127+
cursor: pointer;
128+
color: ${({ theme }) => theme.primaryBlue};
129+
}
130+
}
131+
`;
132+
119133
const AttachedFileText: React.FC = () => (
120134
<>
121135
<DesktopText>View attached file</DesktopText>
@@ -128,7 +142,24 @@ interface IEvidenceCard extends Pick<Evidence, "evidence" | "timestamp" | "name"
128142
index: number;
129143
}
130144

131-
const EvidenceCard: React.FC<IEvidenceCard> = ({ evidence, sender, index, timestamp, name, description, fileURI }) => {
145+
const EvidenceCard: React.FC<IEvidenceCard> = ({
146+
evidence,
147+
sender,
148+
index,
149+
timestamp,
150+
transactionHash,
151+
name,
152+
description,
153+
fileURI,
154+
}) => {
155+
const addressExplorerLink = useMemo(() => {
156+
return `${getChain(DEFAULT_CHAIN)?.blockExplorers?.default.url}/address/${sender}`;
157+
}, [sender]);
158+
159+
const transactionExplorerLink = useMemo(() => {
160+
return `${getChain(DEFAULT_CHAIN)?.blockExplorers?.default.url}/tx/${transactionHash}`;
161+
}, [transactionHash]);
162+
132163
return (
133164
<StyledCard>
134165
<TextContainer>
@@ -145,15 +176,19 @@ const EvidenceCard: React.FC<IEvidenceCard> = ({ evidence, sender, index, timest
145176
<BottomShade>
146177
<AccountContainer>
147178
<Identicon size="24" string={sender} />
148-
<p>{shortenAddress(sender)}</p>
179+
<StyledA href={addressExplorerLink} rel="noreferrer" target="_blank">
180+
<p>{shortenAddress(sender)}</p>
181+
</StyledA>
149182
</AccountContainer>
150-
<Timestamp>{formatDate(Number(timestamp), true)}</Timestamp>
151-
{fileURI && (
183+
<StyledA href={transactionExplorerLink} rel="noreferrer" target="_blank">
184+
<Timestamp>{formatDate(Number(timestamp), true)}</Timestamp>
185+
</StyledA>
186+
{fileURI && fileURI !== "-" ? (
152187
<StyledLink to={`attachment/?url=${getIpfsUrl(fileURI)}`}>
153188
<AttachmentIcon />
154189
<AttachedFileText />
155190
</StyledLink>
156-
)}
191+
) : null}
157192
</BottomShade>
158193
</StyledCard>
159194
);

web/src/hooks/queries/useEvidences.ts

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const evidenceFragment = graphql(`
1515
id
1616
}
1717
timestamp
18+
transactionHash
1819
name
1920
description
2021
fileURI

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

+12-10
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,16 @@ const Evidence: React.FC = () => {
9595
<EvidenceSearch {...{ search, setSearch, evidenceGroup: disputeData?.dispute?.externalDisputeId }} />
9696
<ScrollButton small Icon={DownArrow} text="Scroll to latest" onClick={scrollToLatest} />
9797
{evidences?.realEvidences ? (
98-
evidences?.realEvidences.map(({ evidence, sender, timestamp, name, description, fileURI, evidenceIndex }) => (
99-
<EvidenceCard
100-
key={timestamp}
101-
index={parseInt(evidenceIndex)}
102-
sender={sender?.id}
103-
{...{ evidence, timestamp, name, description, fileURI }}
104-
/>
105-
))
98+
evidences?.realEvidences.map(
99+
({ evidence, sender, timestamp, transactionHash, name, description, fileURI, evidenceIndex }) => (
100+
<EvidenceCard
101+
key={timestamp}
102+
index={parseInt(evidenceIndex)}
103+
sender={sender?.id}
104+
{...{ evidence, timestamp, transactionHash, name, description, fileURI }}
105+
/>
106+
)
107+
)
106108
) : (
107109
<SkeletonEvidenceCard />
108110
)}
@@ -111,12 +113,12 @@ const Evidence: React.FC = () => {
111113
<Divider />
112114
{showSpam ? (
113115
evidences?.spamEvidences.map(
114-
({ evidence, sender, timestamp, name, description, fileURI, evidenceIndex }) => (
116+
({ evidence, sender, timestamp, transactionHash, name, description, fileURI, evidenceIndex }) => (
115117
<EvidenceCard
116118
key={timestamp}
117119
index={parseInt(evidenceIndex)}
118120
sender={sender?.id}
119-
{...{ evidence, timestamp, name, description, fileURI }}
121+
{...{ evidence, timestamp, transactionHash, name, description, fileURI }}
120122
/>
121123
)
122124
)

0 commit comments

Comments
 (0)