Skip to content

Commit 4f2e88f

Browse files
authored
Merge pull request #1723 from kleros/chore/handle-stake-maintenance-buttons-in-university
chore(web): abstract-sortition-module-hooks-and-hide-in-university
2 parents fd8766e + 6ee1d71 commit 4f2e88f

File tree

9 files changed

+116
-33
lines changed

9 files changed

+116
-33
lines changed

web/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ dist
2222
.env.development.local
2323
.env.test.local
2424
.env.production.local
25+
.env.devnet-university
2526

2627
# generated code
2728
src/hooks/contracts/generated.ts

web/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"build-local": "scripts/runEnv.sh local 'yarn generate && vite build'",
3636
"build-devnet": "scripts/runEnv.sh devnet 'yarn generate && vite build'",
3737
"build-devnet-neo": "scripts/runEnv.sh devnet-neo 'yarn generate && vite build'",
38+
"build-devnet-university": "scripts/runEnv.sh devnet-university 'yarn generate && vite build'",
3839
"build-testnet": "scripts/runEnv.sh testnet 'yarn generate && vite build'",
3940
"build-mainnet-neo": "scripts/runEnv.sh mainnet-neo 'yarn generate && vite build'",
4041
"build-netlify": "scripts/generateBuildInfo.sh && yarn generate && vite build",

web/src/components/Phase.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react";
22
import styled from "styled-components";
33

4-
import { useSortitionModulePhase } from "hooks/useSortitionModulePhase";
4+
import { useSortitionModulePhase } from "hooks/useSortitionModule";
55

66
import { isUndefined } from "src/utils";
77

web/src/hooks/useSortitionModule.ts

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { REFETCH_INTERVAL } from "consts/index";
2+
3+
import { useReadSortitionModule } from "hooks/contracts/generated";
4+
5+
export const useSortitionModulePhase = () => {
6+
// eslint-disable-next-line
7+
// @ts-ignore
8+
return useReadSortitionModule({ functionName: "phase", query: { refetchInterval: REFETCH_INTERVAL } });
9+
};
10+
11+
export const useReadSortitionModuleDelayedStakeReadIndex = () => {
12+
return useReadSortitionModule({
13+
// eslint-disable-next-line
14+
// @ts-ignore
15+
functionName: "delayedStakeReadIndex",
16+
query: { refetchInterval: REFETCH_INTERVAL },
17+
});
18+
};
19+
20+
export const useReadSortitionModuleDelayedStakeWriteIndex = () => {
21+
return useReadSortitionModule({
22+
// eslint-disable-next-line
23+
// @ts-ignore
24+
functionName: "delayedStakeWriteIndex",
25+
query: { refetchInterval: REFETCH_INTERVAL },
26+
});
27+
};
28+
29+
export const useReadSortitionModuleLastPhaseChange = () => {
30+
return useReadSortitionModule({
31+
// eslint-disable-next-line
32+
// @ts-ignore
33+
functionName: "lastPhaseChange",
34+
query: { refetchInterval: REFETCH_INTERVAL },
35+
});
36+
};
37+
38+
export const useReadSortitionModuleMaxDrawingTime = () => {
39+
return useReadSortitionModule({
40+
// eslint-disable-next-line
41+
// @ts-ignore
42+
functionName: "maxDrawingTime",
43+
query: { refetchInterval: REFETCH_INTERVAL },
44+
});
45+
};
46+
47+
export const useReadSortitionModuleMinStakingTime = () => {
48+
return useReadSortitionModule({
49+
// eslint-disable-next-line
50+
// @ts-ignore
51+
functionName: "minStakingTime",
52+
query: { refetchInterval: REFETCH_INTERVAL },
53+
});
54+
};

web/src/hooks/useSortitionModulePhase.ts

-9
This file was deleted.

web/src/pages/Cases/CaseDetails/MaintenanceButtons/DrawButton.tsx

+35-10
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import styled from "styled-components";
33

44
import { usePublicClient } from "wagmi";
55

6-
import { Button } from "@kleros/ui-components-library";
6+
import { Button, Field } from "@kleros/ui-components-library";
77

88
import { useSimulateKlerosCoreDraw, useWriteKlerosCoreDraw } from "hooks/contracts/generated";
9-
import { useSortitionModulePhase } from "hooks/useSortitionModulePhase";
9+
import { useSortitionModulePhase } from "hooks/useSortitionModule";
1010
import { wrapWithToast } from "utils/wrapWithToast";
1111

1212
import useDisputeMaintenanceQuery from "queries/useDisputeMaintenanceQuery";
@@ -18,6 +18,8 @@ import { Phases } from "components/Phase";
1818

1919
import { IBaseMaintenanceButton } from ".";
2020
import { Link } from "react-router-dom";
21+
import { isKlerosUniversity } from "src/consts";
22+
import { isAddress } from "viem";
2123

2224
const StyledButton = styled(Button)`
2325
width: 100%;
@@ -29,17 +31,24 @@ interface IDrawButton extends IBaseMaintenanceButton {
2931
period?: string;
3032
}
3133

34+
const isUniversity = isKlerosUniversity();
35+
3236
const DrawButton: React.FC<IDrawButton> = ({ id, numberOfVotes, setIsOpen, period }) => {
33-
const [isSending, setIsSending] = useState(false);
3437
const publicClient = usePublicClient();
3538
const { data: maintenanceData } = useDisputeMaintenanceQuery(id);
3639
const { data: phase } = useSortitionModulePhase();
40+
const [isSending, setIsSending] = useState(false);
41+
const [drawJuror, setDrawJuror] = useState("");
3742

3843
const isDrawn = useMemo(() => maintenanceData?.dispute?.currentRound.jurorsDrawn, [maintenanceData]);
3944

4045
const canDraw = useMemo(
41-
() => !isUndefined(maintenanceData) && !isDrawn && period === Period.Evidence && phase === Phases.drawing,
42-
[maintenanceData, isDrawn, phase, period]
46+
() =>
47+
!isUndefined(maintenanceData) &&
48+
!isDrawn &&
49+
period === Period.Evidence &&
50+
(isUniversity ? true : phase === Phases.drawing),
51+
[maintenanceData, isDrawn, phase, period, isUniversity]
4352
);
4453

4554
const needToPassPhase = useMemo(
@@ -53,17 +62,30 @@ const DrawButton: React.FC<IDrawButton> = ({ id, numberOfVotes, setIsOpen, perio
5362
isError,
5463
} = useSimulateKlerosCoreDraw({
5564
query: {
56-
enabled: !isUndefined(id) && !isUndefined(numberOfVotes) && !isUndefined(period) && canDraw,
65+
enabled:
66+
!isUndefined(id) &&
67+
!isUndefined(numberOfVotes) &&
68+
!isUndefined(period) &&
69+
canDraw &&
70+
(isUniversity ? isAddress(drawJuror) : true),
5771
},
58-
args: [BigInt(id ?? 0), BigInt(numberOfVotes ?? 0)],
72+
// eslint-disable-next-line
73+
// @ts-ignore
74+
args: [BigInt(id ?? 0), isUniversity ? drawJuror : BigInt(numberOfVotes ?? 0)],
5975
});
6076

6177
const { writeContractAsync: draw } = useWriteKlerosCoreDraw();
6278

6379
const isLoading = useMemo(() => isLoadingConfig || isSending, [isLoadingConfig, isSending]);
6480
const isDisabled = useMemo(
65-
() => isUndefined(id) || isUndefined(numberOfVotes) || isError || isLoading || !canDraw,
66-
[id, numberOfVotes, isError, isLoading, canDraw]
81+
() =>
82+
isUndefined(id) ||
83+
isUndefined(numberOfVotes) ||
84+
isError ||
85+
isLoading ||
86+
!canDraw ||
87+
(isUniversity && !isAddress(drawJuror)),
88+
[id, numberOfVotes, isError, isLoading, canDraw, isUniversity, drawJuror]
6789
);
6890
const handleClick = () => {
6991
if (!drawConfig || !publicClient) return;
@@ -77,12 +99,15 @@ const DrawButton: React.FC<IDrawButton> = ({ id, numberOfVotes, setIsOpen, perio
7799
};
78100
return (
79101
<>
80-
{needToPassPhase ? (
102+
{needToPassPhase && !isUniversity ? (
81103
<StyledLabel>
82104
Jurors can be drawn in <small>drawing</small> phase.
83105
<br /> Pass phase <Link to="/courts/1/purpose/#maintenance">here</Link>.
84106
</StyledLabel>
85107
) : null}
108+
{isUniversity && canDraw ? (
109+
<Field placeholder="Juror Address" onChange={(e) => setDrawJuror(e.target.value)} value={drawJuror} />
110+
) : null}
86111
<StyledButton text="Draw" small isLoading={isLoading} disabled={isDisabled} onClick={handleClick} />
87112
</>
88113
);

web/src/pages/Courts/StakeMaintenanceButton/ExecuteDelayedStakeButton.tsx

+10-6
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ import { usePublicClient } from "wagmi";
55

66
import { Button } from "@kleros/ui-components-library";
77

8+
import { useSimulateSortitionModule, useWriteSortitionModule } from "hooks/contracts/generated";
89
import {
910
useReadSortitionModuleDelayedStakeReadIndex,
1011
useReadSortitionModuleDelayedStakeWriteIndex,
11-
useSimulateSortitionModuleExecuteDelayedStakes,
12-
useWriteSortitionModuleExecuteDelayedStakes,
13-
} from "hooks/contracts/generated";
14-
import { useSortitionModulePhase } from "hooks/useSortitionModulePhase";
12+
useSortitionModulePhase,
13+
} from "hooks/useSortitionModule";
1514
import { wrapWithToast } from "utils/wrapWithToast";
1615

1716
import { isUndefined } from "src/utils";
@@ -42,14 +41,19 @@ const ExecuteDelayedStakeButton: React.FC<IExecuteStakeDelayedButton> = ({ setIs
4241
data: executeDelayedStakeConfig,
4342
isLoading: isLoadingConfig,
4443
isError,
45-
} = useSimulateSortitionModuleExecuteDelayedStakes({
44+
} = useSimulateSortitionModule({
4645
query: {
4746
enabled: canExecute,
4847
},
48+
// eslint-disable-next-line
49+
// @ts-ignore
50+
functionName: "executeDelayedStakes",
51+
// eslint-disable-next-line
52+
// @ts-ignore
4953
args: [1n + (delayedStakeWriteIndex ?? 0n) - (delayedStakeReadIndex ?? 0n)],
5054
});
5155

52-
const { writeContractAsync: executeDelayedStake } = useWriteSortitionModuleExecuteDelayedStakes();
56+
const { writeContractAsync: executeDelayedStake } = useWriteSortitionModule();
5357

5458
const isLoading = useMemo(() => isLoadingConfig || isSending, [isLoadingConfig, isSending]);
5559
const isDisabled = useMemo(() => isError || isLoading || !canExecute, [isError, isLoading, canExecute]);

web/src/pages/Courts/StakeMaintenanceButton/PassPhaseButton.tsx

+11-6
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import { Button } from "@kleros/ui-components-library";
77

88
import {
99
useReadSortitionModuleDisputesWithoutJurors,
10+
useSimulateSortitionModule,
11+
useWriteSortitionModule,
12+
} from "hooks/contracts/generated";
13+
import {
1014
useReadSortitionModuleLastPhaseChange,
1115
useReadSortitionModuleMaxDrawingTime,
1216
useReadSortitionModuleMinStakingTime,
13-
useSimulateSortitionModulePassPhase,
14-
useWriteSortitionModulePassPhase,
15-
} from "hooks/contracts/generated";
16-
import { useSortitionModulePhase } from "hooks/useSortitionModulePhase";
17+
useSortitionModulePhase,
18+
} from "hooks/useSortitionModule";
1719
import { wrapWithToast } from "utils/wrapWithToast";
1820

1921
import { isUndefined } from "src/utils";
@@ -62,13 +64,16 @@ const PassPhaseButton: React.FC<IPassPhaseButton> = ({ setIsOpen }) => {
6264
data: passPhaseConfig,
6365
isLoading: isLoadingConfig,
6466
isError,
65-
} = useSimulateSortitionModulePassPhase({
67+
} = useSimulateSortitionModule({
6668
query: {
6769
enabled: canChangePhase,
6870
},
71+
// eslint-disable-next-line
72+
// @ts-ignore
73+
functionName: "passPhase",
6974
});
7075

71-
const { writeContractAsync: passPhase } = useWriteSortitionModulePassPhase();
76+
const { writeContractAsync: passPhase } = useWriteSortitionModule();
7277

7378
const isLoading = useMemo(() => isLoadingConfig || isSending, [isLoadingConfig, isSending]);
7479
const isDisabled = useMemo(() => isError || isLoading || !canChangePhase, [isError, isLoading, canChangePhase]);

web/src/pages/Courts/TopSearch.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { responsiveSize } from "styles/responsiveSize";
1414
import { StyledSkeleton } from "components/StyledSkeleton";
1515

1616
import StakeMaintenanceButtons from "./StakeMaintenanceButton";
17+
import { isKlerosUniversity } from "src/consts";
1718

1819
const Container = styled.div`
1920
width: 100%;
@@ -33,6 +34,7 @@ const TopSearch: React.FC = () => {
3334
const { data } = useCourtTree();
3435
const navigate = useNavigate();
3536
const items = useMemo(() => !isUndefined(data) && [rootCourtToItems(data.court)], [data]);
37+
const isUniversity = isKlerosUniversity();
3638
return (
3739
<Container>
3840
{items ? (
@@ -44,7 +46,7 @@ const TopSearch: React.FC = () => {
4446
) : (
4547
<StyledSkeleton width={240} height={42} />
4648
)}
47-
<StakeMaintenanceButtons />
49+
{isUniversity ? null : <StakeMaintenanceButtons />}
4850
</Container>
4951
);
5052
};

0 commit comments

Comments
 (0)