Skip to content

Commit 9daf106

Browse files
authored
Merge pull request #1808 from kleros/feat/lang-direction
feat(web): lang-direction
2 parents 1fa3e7d + 2f055e2 commit 9daf106

File tree

21 files changed

+80
-39
lines changed

21 files changed

+80
-39
lines changed

web/src/components/CasesDisplay/Search.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ const Search: React.FC = () => {
9090
)}
9191
<SearchBarContainer>
9292
<StyledSearchbar
93+
dir="auto"
9394
type="text"
9495
placeholder="Search By ID"
9596
value={search}

web/src/components/DisputePreview/Alias.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const AliasDisplay: React.FC<IAlias> = ({ name, address }) => {
4646
const resolvedAddress = addressFromENS ?? (address as `0x${string}`);
4747

4848
return (
49-
<AliasContainer>
49+
<AliasContainer dir="auto">
5050
{isLoading ? <Skeleton width={30} height={24} /> : <IdenticonOrAvatar address={resolvedAddress} size="24" />}
5151
<TextContainer>
5252
{isLoading ? <Skeleton width={30} height={24} /> : <AddressOrName address={resolvedAddress} />}&nbsp;

web/src/components/DisputePreview/DisputeContext.tsx

+8-5
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ import { responsiveSize } from "styles/responsiveSize";
1212
import ReactMarkdown from "components/ReactMarkdown";
1313
import { StyledSkeleton } from "components/StyledSkeleton";
1414

15-
import AliasDisplay from "./Alias";
1615
import { Divider } from "../Divider";
1716
import { ExternalLink } from "../ExternalLink";
1817

18+
import AliasDisplay from "./Alias";
19+
1920
const StyledH1 = styled.h1`
2021
margin: 0;
2122
word-wrap: break-word;
@@ -75,16 +76,18 @@ export const DisputeContext: React.FC<IDisputeContext> = ({ disputeDetails, isRp
7576

7677
return (
7778
<>
78-
<StyledH1>{isUndefined(disputeDetails) ? <StyledSkeleton /> : (disputeDetails?.title ?? errMsg)}</StyledH1>
79+
<StyledH1 dir="auto">
80+
{isUndefined(disputeDetails) ? <StyledSkeleton /> : (disputeDetails?.title ?? errMsg)}
81+
</StyledH1>
7982
{disputeDetails?.question?.trim() || disputeDetails?.description?.trim() ? (
8083
<div>
8184
{disputeDetails?.question?.trim() ? (
82-
<ReactMarkdownWrapper>
85+
<ReactMarkdownWrapper dir="auto">
8386
<ReactMarkdown>{disputeDetails.question}</ReactMarkdown>
8487
</ReactMarkdownWrapper>
8588
) : null}
8689
{disputeDetails?.description?.trim() ? (
87-
<ReactMarkdownWrapper>
90+
<ReactMarkdownWrapper dir="auto">
8891
<ReactMarkdown>{disputeDetails.description}</ReactMarkdown>
8992
</ReactMarkdownWrapper>
9093
) : null}
@@ -100,7 +103,7 @@ export const DisputeContext: React.FC<IDisputeContext> = ({ disputeDetails, isRp
100103
{isUndefined(disputeDetails) ? null : <AnswersHeader>Voting Options</AnswersHeader>}
101104
<AnswersContainer>
102105
{disputeDetails?.answers?.map((answer: IAnswer, i: number) => (
103-
<AnswerTitleAndDescription key={answer.title}>
106+
<AnswerTitleAndDescription dir="auto" key={answer.title}>
104107
<label>{i + 1}. </label>
105108
<AnswerTitle>{answer.title}</AnswerTitle>
106109
<AnswerDescription>{answer.description.trim() ? ` - ${answer.description}` : null}</AnswerDescription>

web/src/components/DisputeView/DisputeCardView.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const StyledCaseCardTitleSkeleton = styled(StyledSkeleton)`
4646

4747
const TruncatedTitle = ({ text, maxLength }) => {
4848
const truncatedText = text.length <= maxLength ? text : text.slice(0, maxLength) + "…";
49-
return <StyledCaseCardTitle>{truncatedText}</StyledCaseCardTitle>;
49+
return <StyledCaseCardTitle dir="auto">{truncatedText}</StyledCaseCardTitle>;
5050
};
5151

5252
interface IDisputeCardView {

web/src/components/DisputeView/DisputeListView.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { Card } from "@kleros/ui-components-library";
88

99
import { Periods } from "consts/periods";
1010

11-
import { responsiveSize } from "styles/responsiveSize";
1211
import { hoverShortTransitionTiming } from "styles/commonStyles";
12+
import { responsiveSize } from "styles/responsiveSize";
1313

1414
import DisputeInfo from "./DisputeInfo";
1515
import PeriodBanner from "./PeriodBanner";
@@ -37,11 +37,12 @@ const TitleContainer = styled.div<{ isLabel?: boolean }>`
3737
width: ${({ isLabel }) => (isLabel ? responsiveSize(150, 340, 900) : "fit-content")};
3838
h3 {
3939
margin: 0;
40+
flex: 1;
4041
}
4142
`;
4243
const TruncatedTitle = ({ text, maxLength }) => {
4344
const truncatedText = text.length <= maxLength ? text : text.slice(0, maxLength) + "…";
44-
return <h3>{truncatedText}</h3>;
45+
return <h3 dir="auto">{truncatedText}</h3>;
4546
};
4647
interface IDisputeListView {
4748
title: string;

web/src/components/EvidenceCard.tsx

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

4-
import { landscapeStyle } from "styles/landscapeStyle";
5-
import { responsiveSize } from "styles/responsiveSize";
6-
import { hoverShortTransitionTiming } from "styles/commonStyles";
7-
84
import Identicon from "react-identicons";
95
import ReactMarkdown from "react-markdown";
106

@@ -19,6 +15,10 @@ import { shortenAddress } from "utils/shortenAddress";
1915

2016
import { type Evidence } from "src/graphql/graphql";
2117

18+
import { hoverShortTransitionTiming } from "styles/commonStyles";
19+
import { landscapeStyle } from "styles/landscapeStyle";
20+
import { responsiveSize } from "styles/responsiveSize";
21+
2222
import { ExternalLink } from "./ExternalLink";
2323
import { InternalLink } from "./InternalLink";
2424

@@ -65,6 +65,7 @@ const Index = styled.p`
6565
color: ${({ theme }) => theme.secondaryText};
6666
`;
6767

68+
const ReactMarkdownWrapper = styled.div``;
6869
const StyledReactMarkdown = styled(ReactMarkdown)`
6970
a {
7071
font-size: 16px;
@@ -229,12 +230,18 @@ const EvidenceCard: React.FC<IEvidenceCard> = ({
229230

230231
return (
231232
<StyledCard>
232-
<TopContent>
233+
<TopContent dir="auto">
233234
<IndexAndName>
234235
<Index>#{index}. </Index>
235236
<h3>{name}</h3>
236237
</IndexAndName>
237-
{name && description ? <StyledReactMarkdown>{description}</StyledReactMarkdown> : <p>{evidence}</p>}
238+
{name && description ? (
239+
<ReactMarkdownWrapper dir="auto">
240+
<StyledReactMarkdown>{description}</StyledReactMarkdown>
241+
</ReactMarkdownWrapper>
242+
) : (
243+
<p>{evidence}</p>
244+
)}
238245
</TopContent>
239246
<BottomShade>
240247
<BottomLeftContent>

web/src/components/Field.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from "react";
22
import styled, { css } from "styled-components";
3+
34
import { landscapeStyle } from "styles/landscapeStyle";
45

56
import { InternalLink } from "./InternalLink";
@@ -99,7 +100,7 @@ const Field: React.FC<IField> = ({
99100
className,
100101
}) => {
101102
return (
102-
<FieldContainer isList={displayAsList} {...{ isOverview, isJurorBalance, width, className }}>
103+
<FieldContainer dir="auto" isList={displayAsList} {...{ isOverview, isJurorBalance, width, className }}>
103104
<Icon />
104105
{(!displayAsList || isOverview || isJurorBalance) && <label>{name}:</label>}
105106
{link ? (

web/src/components/LabeledInput.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const LabeledInput: React.FC<ILabeledInput> = (props) => {
3030
return (
3131
<Container>
3232
{!isUndefined(props.label) ? <StyledLabel id={props.label}>{props.label}</StyledLabel> : null}
33-
<StyledField {...props} id={props?.label} />
33+
<StyledField dir="auto" {...props} id={props?.label} />
3434
</Container>
3535
);
3636
};

web/src/components/Verdict/Answer.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const AnswerDisplay: React.FC<IAnswer> = ({ answer, currentRuling }) => {
2222
return (
2323
<>
2424
{answer ? (
25-
<AnswerTitleAndDescription>
25+
<AnswerTitleAndDescription dir="auto">
2626
<AnswerTitle>{answer.title}</AnswerTitle>
2727
<AnswerDescription>{answer.description.trim() ? ` - ${answer.description}` : null}</AnswerDescription>
2828
</AnswerTitleAndDescription>

web/src/components/Verdict/FinalDecision.tsx

+9-5
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { useAccount } from "wagmi";
77

88
import ArrowIcon from "svgs/icons/arrow.svg";
99

10+
import { DEFAULT_CHAIN } from "consts/chains";
1011
import { REFETCH_INTERVAL } from "consts/index";
1112
import { Periods } from "consts/periods";
12-
import { DEFAULT_CHAIN } from "consts/chains";
1313
import { useReadKlerosCoreCurrentRuling } from "hooks/contracts/generated";
1414
import { usePopulatedDisputeData } from "hooks/queries/usePopulatedDisputeData";
1515
import { useVotingHistory } from "hooks/queries/useVotingHistory";
@@ -21,11 +21,12 @@ import { useDisputeDetailsQuery } from "queries/useDisputeDetailsQuery";
2121

2222
import { landscapeStyle } from "styles/landscapeStyle";
2323

24-
import RulingAndRewardsIndicators from "./RulingAndRewardsIndicators";
25-
import AnswerDisplay from "./Answer";
2624
import { Divider } from "../Divider";
2725
import { StyledArrowLink } from "../StyledArrowLink";
2826

27+
import AnswerDisplay from "./Answer";
28+
import RulingAndRewardsIndicators from "./RulingAndRewardsIndicators";
29+
2930
const Container = styled.div`
3031
width: 100%;
3132
`;
@@ -36,11 +37,14 @@ const JuryContainer = styled.div`
3637
flex-wrap: wrap;
3738
align-items: center;
3839
gap: 5px 7px;
39-
40+
flex: 1;
4041
h3 {
4142
line-height: 21px;
4243
margin-bottom: 0px;
4344
}
45+
> div {
46+
flex: 1;
47+
}
4448
`;
4549

4650
const VerdictContainer = styled.div`
@@ -104,7 +108,7 @@ const FinalDecision: React.FC<IFinalDecision> = ({ arbitrable }) => {
104108
if (isVotingPeriod && isHiddenVotes && commited && !hasVoted) return "Reveal your vote";
105109
if (isVotingPeriod && !isHiddenVotes && !hasVoted) return "Cast your vote";
106110
return "Check how the jury voted";
107-
}, [wasDrawn, hasVoted, isCommitPeriod, isVotingPeriod, commited, isHiddenVotes]);
111+
}, [wasDrawn, hasVoted, isCommitPeriod, isVotingPeriod, commited, isHiddenVotes, isDisconnected]);
108112

109113
return (
110114
<Container>

web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/FormContact.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { Dispatch, SetStateAction, useMemo, useEffect } from "react";
22
import styled from "styled-components";
33

44
import { Field } from "@kleros/ui-components-library";
5+
56
import { isEmpty } from "src/utils";
67

78
const StyledLabel = styled.label`
@@ -58,6 +59,7 @@ const FormContact: React.FC<IForm> = ({
5859
<>
5960
<StyledLabel>{contactLabel}</StyledLabel>
6061
<StyledField
62+
dir="auto"
6163
variant={fieldVariant}
6264
value={contactInput}
6365
onChange={handleInputChange}

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

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ const EvidenceSearch: React.FC<IEvidenceSearch> = ({ search, setSearch, evidence
4848

4949
<SearchContainer>
5050
<StyledSearchBar
51+
dir="auto"
5152
placeholder="Search evidence by number, word, or submitter"
5253
onChange={(e) => setSearch(e.target.value)}
5354
value={search}

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

+9-3
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@ import styled from "styled-components";
44
import Modal from "react-modal";
55
import { useWalletClient, usePublicClient, useConfig } from "wagmi";
66

7+
import { useAtlasProvider, Roles } from "@kleros/kleros-app";
78
import { Textarea, Button, FileUploader } from "@kleros/ui-components-library";
89

9-
import { useAtlasProvider, Roles } from "@kleros/kleros-app";
1010
import { simulateEvidenceModuleSubmitEvidence } from "hooks/contracts/generated";
1111
import { wrapWithToast, errorToast, infoToast, successToast } from "utils/wrapWithToast";
1212

13+
import { isEmpty } from "src/utils";
14+
1315
import EnsureAuth from "components/EnsureAuth";
1416
import { EnsureChain } from "components/EnsureChain";
15-
import { isEmpty } from "src/utils";
1617

1718
const StyledModal = styled(Modal)`
1819
position: absolute;
@@ -91,7 +92,12 @@ const SubmitEvidenceModal: React.FC<{
9192
return (
9293
<StyledModal {...{ isOpen }} shouldCloseOnEsc shouldCloseOnOverlayClick onRequestClose={close}>
9394
<h1>Submit New Evidence</h1>
94-
<StyledTextArea value={message} onChange={(e) => setMessage(e.target.value)} placeholder="Your Arguments" />
95+
<StyledTextArea
96+
dir="auto"
97+
value={message}
98+
onChange={(e) => setMessage(e.target.value)}
99+
placeholder="Your Arguments"
100+
/>
95101
<StyledFileUploader callback={(file: File) => setFile(file)} />
96102
<ButtonArea>
97103
<Button variant="secondary" disabled={isSending} text="Return" onClick={close} />

web/src/pages/Cases/CaseDetails/Voting/Classic/JustificationArea.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ interface IJustificationArea {
2323

2424
const JustificationArea: React.FC<IJustificationArea> = ({ justification, setJustification }) => (
2525
<StyledTextarea
26+
dir="auto"
2627
value={justification}
2728
onChange={(e) => setJustification(e.target.value)}
2829
placeholder="Justify your vote..."

web/src/pages/Cases/CaseDetails/Voting/Classic/OptionsContainer.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const Options: React.FC<IOptions> = ({ arbitrable, handleSelection, justificatio
6565

6666
return id ? (
6767
<>
68-
<MainContainer>
68+
<MainContainer dir="auto">
6969
<ReactMarkdown>{disputeDetails?.question}</ReactMarkdown>
7070
{!isUndefined(justification) && !isUndefined(setJustification) ? (
7171
<JustificationArea {...{ justification, setJustification }} />

web/src/pages/Cases/CaseDetails/Voting/Classic/Reveal.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const StyledButton = styled(Button)`
3434
margin: 16px auto;
3535
`;
3636

37+
const ReactMarkdownWrapper = styled.div``;
3738
interface IReveal {
3839
arbitrable: `0x${string}`;
3940
voteIDs: string[];
@@ -100,7 +101,9 @@ const Reveal: React.FC<IReveal> = ({ arbitrable, voteIDs, setIsOpen, commit, isR
100101
<StyledInfoCard msg="Failed to commit on time." />
101102
) : isRevealPeriod ? (
102103
<>
103-
<ReactMarkdown>{disputeDetails?.question}</ReactMarkdown>
104+
<ReactMarkdownWrapper dir="auto">
105+
<ReactMarkdown>{disputeDetails?.question}</ReactMarkdown>
106+
</ReactMarkdownWrapper>
104107
<JustificationArea {...{ justification, setJustification }} />
105108
<StyledButton
106109
variant="secondary"

web/src/pages/Cases/CaseDetails/Voting/VotesDetails/index.tsx

+15-9
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,16 @@ const AccordionContentContainer = styled.div`
7373
gap: 12px;
7474
`;
7575

76-
const JustificationText = styled.div`
76+
const LabelWrapper = styled.div`
77+
display: flex;
78+
gap: 4px;
79+
`;
80+
81+
const JustificationText = styled.label`
7782
color: ${({ theme }) => theme.secondaryText};
7883
font-size: 16px;
7984
line-height: 1.2;
80-
&:before {
81-
content: "Justification: ";
82-
color: ${({ theme }) => theme.primaryText};
83-
}
85+
flex: 1;
8486
`;
8587

8688
const StyledLabel = styled.label`
@@ -91,6 +93,7 @@ const StyledLabel = styled.label`
9193
const SecondaryTextLabel = styled.label`
9294
color: ${({ theme }) => theme.secondaryText};
9395
font-size: 16px;
96+
flex: 1;
9497
`;
9598

9699
const AccordionContent: React.FC<{
@@ -100,13 +103,16 @@ const AccordionContent: React.FC<{
100103
}> = ({ justification, choice, answers }) => (
101104
<AccordionContentContainer>
102105
{!isUndefined(choice) && (
103-
<div>
106+
<LabelWrapper>
104107
<StyledLabel>Voted:&nbsp;</StyledLabel>
105-
<SecondaryTextLabel>{getVoteChoice(parseInt(choice), answers)}</SecondaryTextLabel>
106-
</div>
108+
<SecondaryTextLabel dir="auto">{getVoteChoice(parseInt(choice), answers)}</SecondaryTextLabel>
109+
</LabelWrapper>
107110
)}
108111
{justification ? (
109-
<JustificationText>{justification}</JustificationText>
112+
<LabelWrapper>
113+
<StyledLabel>Justification:&nbsp;</StyledLabel>
114+
<JustificationText dir="auto">{justification}</JustificationText>
115+
</LabelWrapper>
110116
) : (
111117
<SecondaryTextLabel>No justification provided</SecondaryTextLabel>
112118
)}

web/src/pages/Cases/CaseDetails/Voting/VotingHistory.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const StyledTitle = styled.h1`
4747
margin-bottom: 0;
4848
font-size: ${responsiveSize(18, 24)};
4949
`;
50-
50+
const ReactMarkdownWrapper = styled.div``;
5151
const StyledReactMarkDown = styled(ReactMarkdown)`
5252
max-width: inherit;
5353
word-wrap: break-word;
@@ -95,7 +95,9 @@ const VotingHistory: React.FC<{ arbitrable?: `0x${string}`; isQuestion: boolean
9595
{isQuestion && (
9696
<>
9797
{disputeDetails.question ? (
98-
<StyledReactMarkDown>{disputeDetails.question}</StyledReactMarkDown>
98+
<ReactMarkdownWrapper dir="auto">
99+
<StyledReactMarkDown>{disputeDetails.question}</StyledReactMarkDown>
100+
</ReactMarkdownWrapper>
99101
) : (
100102
<StyledReactMarkDown>{isError ? RPC_ERROR : INVALID_DISPUTE_DATA_ERROR}</StyledReactMarkDown>
101103
)}

0 commit comments

Comments
 (0)