Skip to content

Commit 56fbe69

Browse files
authored
Merge pull request #1647 from kleros/refactor/dispute-resolver
Refactor/dispute resolver
2 parents 42e9b77 + ca6a9f7 commit 56fbe69

File tree

6 files changed

+42
-47
lines changed

6 files changed

+42
-47
lines changed

web/src/context/NewDisputeContext.tsx

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
import React, { createContext, useState, useContext, useMemo } from "react";
1+
import React, { createContext, useState, useContext, useMemo, useCallback } from "react";
22

33
import { Address } from "viem";
44

5+
import { DEFAULT_CHAIN } from "consts/chains";
6+
import { klerosCoreAddress } from "hooks/contracts/generated";
57
import { useLocalStorage } from "hooks/useLocalStorage";
68
import { isUndefined } from "utils/index";
79

810
export type Answer = {
9-
id?: string;
11+
id: string;
1012
title: string;
11-
description?: string;
13+
description: string;
1214
reserved?: boolean;
1315
};
1416

@@ -35,6 +37,7 @@ export interface IDisputeTemplate {
3537
specification?: string;
3638
title: string;
3739
aliases?: Alias;
40+
version: string;
3841
// attachment: Attachment;
3942
// type: string;
4043
}
@@ -62,29 +65,24 @@ const initialDisputeData: IDisputeData = {
6265
title: "",
6366
description: "",
6467
question: "",
68+
category: "",
6569
answers: [
66-
{ title: "", id: "1" },
67-
{ title: "", id: "2" },
68-
],
69-
aliasesArray: [
70-
{ name: "", address: "", id: "1" },
71-
{ name: "", address: "", id: "2" },
70+
{ title: "", id: "1", description: "" },
71+
{ title: "", id: "2", description: "" },
7272
],
73+
aliasesArray: [{ name: "", address: "", id: "1" }],
74+
version: "1.0",
7375
};
74-
const initialDisputeTemplate = initialDisputeData as IDisputeTemplate;
7576

76-
const NewDisputeContext = createContext<INewDisputeContext>({
77-
disputeData: initialDisputeData,
78-
setDisputeData: () => {},
79-
disputeTemplate: initialDisputeTemplate,
80-
resetDisputeData: () => {},
81-
isSubmittingCase: false,
82-
setIsSubmittingCase: () => {},
83-
isPolicyUploading: false,
84-
setIsPolicyUploading: () => {},
85-
});
77+
const NewDisputeContext = createContext<INewDisputeContext | undefined>(undefined);
8678

87-
export const useNewDisputeContext = () => useContext(NewDisputeContext);
79+
export const useNewDisputeContext = () => {
80+
const context = useContext(NewDisputeContext);
81+
if (!context) {
82+
throw new Error("Context Provider not found.");
83+
}
84+
return context;
85+
};
8886

8987
export const NewDisputeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
9088
const [disputeData, setDisputeData] = useLocalStorage<IDisputeData>("disputeData", initialDisputeData);
@@ -93,9 +91,9 @@ export const NewDisputeProvider: React.FC<{ children: React.ReactNode }> = ({ ch
9391

9492
const disputeTemplate = useMemo(() => constructDisputeTemplate(disputeData), [disputeData]);
9593

96-
const resetDisputeData = () => {
94+
const resetDisputeData = useCallback(() => {
9795
setDisputeData(initialDisputeData);
98-
};
96+
}, [setDisputeData]);
9997

10098
const contextValues = useMemo(
10199
() => ({
@@ -108,14 +106,15 @@ export const NewDisputeProvider: React.FC<{ children: React.ReactNode }> = ({ ch
108106
isPolicyUploading,
109107
setIsPolicyUploading,
110108
}),
111-
[disputeData, disputeTemplate, resetDisputeData, isSubmittingCase, isPolicyUploading]
109+
[disputeData, disputeTemplate, resetDisputeData, isSubmittingCase, isPolicyUploading, setDisputeData]
112110
);
113111

114112
return <NewDisputeContext.Provider value={contextValues}>{children}</NewDisputeContext.Provider>;
115113
};
116114

117115
const constructDisputeTemplate = (disputeData: IDisputeData) => {
118-
const baseTemplate = { ...disputeData };
116+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
117+
const { courtId, numberOfJurors, arbitrationCost, ...baseTemplate } = disputeData;
119118

120119
if (!isUndefined(baseTemplate.aliasesArray)) {
121120
baseTemplate.aliasesArray = baseTemplate.aliasesArray.filter((item) => item.address !== "" && item.isValid);
@@ -130,7 +129,14 @@ const constructDisputeTemplate = (disputeData: IDisputeData) => {
130129
baseTemplate.aliases = aliases;
131130
}
132131
}
132+
133+
for (const answer of baseTemplate.answers) {
134+
answer.id = "0x" + BigInt(answer.id).toString(16);
135+
}
133136
if (!isUndefined(baseTemplate.policyURI) && baseTemplate.policyURI === "") delete baseTemplate.policyURI;
134137

138+
baseTemplate.arbitratorAddress = klerosCoreAddress[DEFAULT_CHAIN];
139+
baseTemplate.arbitratorChainID = DEFAULT_CHAIN.toString();
140+
135141
return baseTemplate as IDisputeTemplate;
136142
};

web/src/pages/Resolver/NavigationButtons/NextButton.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ const NextButton: React.FC<INextButton> = ({ nextRoute }) => {
1717

1818
//checks if each answer is filled in
1919
const areVotingOptionsFilled =
20-
disputeData.question !== "" && disputeData.answers.every((answer) => answer.title !== "");
20+
disputeData.question !== "" &&
21+
disputeData.answers.every((answer) => answer.title !== "" && answer.description !== "");
2122

2223
//check if any filled address or ens is invalid
23-
const areFilledAddressesValid = disputeData?.aliasesArray?.every(
24-
(alias) => alias.address !== "" && alias.isValid && alias.name !== ""
24+
const areFilledAddressesValid = disputeData?.aliasesArray?.every((alias) =>
25+
alias.address === "" && alias.name === "" ? true : alias.isValid
2526
);
2627

2728
const isButtonDisabled =

web/src/pages/Resolver/NavigationButtons/SubmitDisputeButton.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ const SubmitDisputeButton: React.FC = () => {
9696

9797
const isTemplateValid = (disputeTemplate: IDisputeTemplate) => {
9898
const areVotingOptionsFilled =
99-
disputeTemplate.question !== "" && disputeTemplate.answers.every((answer) => answer.title !== "");
99+
disputeTemplate.question !== "" &&
100+
disputeTemplate.answers.every((answer) => answer.title !== "" && answer.description !== "");
100101

101102
return (disputeTemplate.title &&
102103
disputeTemplate.description &&

web/src/pages/Resolver/Parameters/NotablePersons/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const NotablePersons: React.FC = () => {
4343
<StyledPlusMinusField
4444
currentValue={disputeData.aliasesArray?.length ?? 2}
4545
updateValue={updateNumberOfAliases}
46-
minValue={2}
46+
minValue={1}
4747
/>
4848
<NavigationButtons prevRoute="/resolver/voting-options" nextRoute="/resolver/policy" />
4949
</Container>

web/src/pages/Resolver/Parameters/VotingOptions/OptionsFields.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ const OptionsFields: React.FC = () => {
4343
const { disputeData, setDisputeData } = useNewDisputeContext();
4444

4545
const updateOptions = (value: number) => {
46-
let defaultAnswer: Answer = { title: "", id: value.toString() };
47-
let answers = disputeData.answers;
46+
const defaultAnswer: Answer = { title: "", id: value.toString(), description: "" };
47+
const answers = disputeData.answers;
4848

4949
if (value < answers?.length) return setDisputeData({ ...disputeData, answers: answers.splice(0, value) });
5050
if (value > answers?.length) return setDisputeData({ ...disputeData, answers: [...answers, defaultAnswer] });
5151
};
5252

5353
const handleOptionWrite = (event: React.ChangeEvent<HTMLInputElement>, key: number) => {
54-
let answers = disputeData.answers;
54+
const answers = disputeData.answers;
5555
answers[key] = { ...answers[key], [event.target.name]: event.target.value };
5656
setDisputeData({ ...disputeData, answers });
5757
};
@@ -69,7 +69,7 @@ const OptionsFields: React.FC = () => {
6969
/>
7070
<LabeledInput
7171
name="description"
72-
label="Option Description (Optional)"
72+
label="Option Description"
7373
placeholder={`Description for Option ${index + 1}`}
7474
value={answer.description ?? ""}
7575
onChange={(event) => handleOptionWrite(event, index)}

web/src/pages/Resolver/index.tsx

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,6 @@ const MiddleContentContainer = styled.div`
7373
position: relative;
7474
`;
7575

76-
const StyledLabel = styled.label`
77-
display: none;
78-
79-
${landscapeStyle(
80-
() => css`
81-
display: flex;
82-
color: ${({ theme }) => theme.secondaryPurple};
83-
margin-bottom: 20px;
84-
padding-left: ${responsiveSize(25, 65)};
85-
`
86-
)}
87-
`;
88-
8976
const DisputeResolver: React.FC = () => {
9077
const location = useLocation();
9178
const [isDisputeResolverMiniGuideOpen, toggleDisputeResolverMiniGuide] = useToggle(false);

0 commit comments

Comments
 (0)