Skip to content

Commit 1149b6f

Browse files
committed
refactor(web): update-draw-jurors-call-condition
1 parent 3d268a7 commit 1149b6f

File tree

3 files changed

+80
-8
lines changed

3 files changed

+80
-8
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { useQuery } from "@tanstack/react-query";
2+
3+
import { useGraphqlBatcher } from "context/GraphqlBatcher";
4+
5+
import { graphql } from "src/graphql";
6+
import { DisputeMaintenanceQuery } from "src/graphql/graphql";
7+
import { isUndefined } from "src/utils";
8+
9+
const disputeMaintenance = graphql(`
10+
query DisputeMaintenance($disputeId: ID!, $disputeIdAsString: String!) {
11+
dispute(id: $disputeId) {
12+
currentRound {
13+
jurorsDrawn
14+
}
15+
rounds {
16+
jurorRewardsDispersed
17+
nbVotes
18+
}
19+
}
20+
contributions(where: { coreDispute: $disputeIdAsString }) {
21+
contributor {
22+
id
23+
}
24+
... on ClassicContribution {
25+
choice
26+
rewardWithdrawn
27+
}
28+
coreDispute {
29+
currentRoundIndex
30+
}
31+
}
32+
}
33+
`);
34+
35+
const useDisputeMaintenanceQuery = (id?: string) => {
36+
const isEnabled = !isUndefined(id);
37+
38+
const { graphqlBatcher } = useGraphqlBatcher();
39+
return useQuery<DisputeMaintenanceQuery>({
40+
queryKey: [`disputeMaintenanceQuery-${id}`],
41+
enabled: isEnabled,
42+
queryFn: async () =>
43+
await graphqlBatcher.fetch({
44+
id: crypto.randomUUID(),
45+
document: disputeMaintenance,
46+
variables: { disputeId: id?.toString(), disputeIdAsString: id?.toString() },
47+
}),
48+
});
49+
};
50+
51+
export default useDisputeMaintenanceQuery;

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { Button } from "@kleros/ui-components-library";
88
import { useSimulateKlerosCoreDraw, useWriteKlerosCoreDraw } from "hooks/contracts/generated";
99
import { wrapWithToast } from "utils/wrapWithToast";
1010

11+
import useDisputeMaintenanceQuery from "queries/useDisputeMaintenanceQuery";
12+
1113
import { Period } from "src/graphql/graphql";
1214
import { isUndefined } from "src/utils";
1315

@@ -25,14 +27,22 @@ interface IDrawButton extends IBaseMaintenanceButton {
2527
const DrawButton: React.FC<IDrawButton> = ({ id, numberOfVotes, setIsOpen, period }) => {
2628
const [isSending, setIsSending] = useState(false);
2729
const publicClient = usePublicClient();
30+
const { data: maintenanceData } = useDisputeMaintenanceQuery(id);
31+
32+
const isDrawn = useMemo(() => maintenanceData?.dispute?.currentRound.jurorsDrawn, [maintenanceData]);
2833

2934
const {
3035
data: drawConfig,
3136
isLoading: isLoadingConfig,
3237
isError,
3338
} = useSimulateKlerosCoreDraw({
3439
query: {
35-
enabled: !isUndefined(id) && !isUndefined(numberOfVotes) && !isUndefined(period) && period === Period.Evidence,
40+
enabled:
41+
!isUndefined(id) &&
42+
!isUndefined(numberOfVotes) &&
43+
!isUndefined(period) &&
44+
period === Period.Evidence &&
45+
!isDrawn,
3646
},
3747
args: [BigInt(id ?? 0), BigInt(numberOfVotes ?? 0)],
3848
});
@@ -41,11 +51,12 @@ const DrawButton: React.FC<IDrawButton> = ({ id, numberOfVotes, setIsOpen, perio
4151

4252
const isLoading = useMemo(() => isLoadingConfig || isSending, [isLoadingConfig, isSending]);
4353
const isDisabled = useMemo(
44-
() => isUndefined(id) || isUndefined(numberOfVotes) || isError || isLoading || period !== Period.Evidence,
45-
[id, numberOfVotes, isError, isLoading, period]
54+
() =>
55+
isUndefined(id) || isUndefined(numberOfVotes) || isError || isLoading || period !== Period.Evidence || isDrawn,
56+
[id, numberOfVotes, isError, isLoading, period, isDrawn]
4657
);
4758
const handleClick = () => {
48-
if (!drawConfig) return;
59+
if (!drawConfig || !publicClient) return;
4960

5061
setIsSending(true);
5162

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { Button } from "@kleros/ui-components-library";
88
import { useSimulateKlerosCorePassPeriod, useWriteKlerosCorePassPeriod } from "hooks/contracts/generated";
99
import { wrapWithToast } from "utils/wrapWithToast";
1010

11+
import useDisputeMaintenanceQuery from "queries/useDisputeMaintenanceQuery";
12+
1113
import { Period } from "src/graphql/graphql";
1214
import { isUndefined } from "src/utils";
1315

@@ -24,14 +26,21 @@ interface IPassPeriodButton extends IBaseMaintenanceButton {
2426
const PassPeriodButton: React.FC<IPassPeriodButton> = ({ id, setIsOpen, period }) => {
2527
const [isSending, setIsSending] = useState(false);
2628
const publicClient = usePublicClient();
29+
const { data: maintenanceData } = useDisputeMaintenanceQuery(id);
30+
31+
const isDrawn = useMemo(() => maintenanceData?.dispute?.currentRound.jurorsDrawn, [maintenanceData]);
2732

2833
const {
2934
data: passPeriodConfig,
3035
isLoading: isLoadingConfig,
3136
isError,
3237
} = useSimulateKlerosCorePassPeriod({
3338
query: {
34-
enabled: !isUndefined(id) && !isUndefined(period) && period !== Period.Execution,
39+
enabled:
40+
!isUndefined(id) &&
41+
!isUndefined(period) &&
42+
period !== Period.Execution &&
43+
!(period === Period.Evidence && !isDrawn),
3544
},
3645
args: [BigInt(id ?? 0)],
3746
});
@@ -40,11 +49,12 @@ const PassPeriodButton: React.FC<IPassPeriodButton> = ({ id, setIsOpen, period }
4049

4150
const isLoading = useMemo(() => isLoadingConfig || isSending, [isLoadingConfig, isSending]);
4251
const isDisabled = useMemo(
43-
() => isUndefined(id) || isError || isLoading || period === Period.Execution,
44-
[id, isError, isLoading, period]
52+
() =>
53+
isUndefined(id) || isError || isLoading || period === Period.Execution || (period === Period.Evidence && isDrawn),
54+
[id, isError, isLoading, period, isDrawn]
4555
);
4656
const handleClick = () => {
47-
if (!passPeriodConfig) return;
57+
if (!passPeriodConfig || !publicClient) return;
4858

4959
setIsSending(true);
5060

0 commit comments

Comments
 (0)