From edcb9022d3512766cbb7026c1a94195071cccde4 Mon Sep 17 00:00:00 2001 From: kemuru <102478601+kemuru@users.noreply.github.com> Date: Thu, 7 Aug 2025 21:17:33 +0200 Subject: [PATCH 1/5] fix: shutter flash --- web/src/hooks/useVotingContext.tsx | 12 ++++++++++-- .../Cases/CaseDetails/Voting/Shutter/index.tsx | 17 ++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/web/src/hooks/useVotingContext.tsx b/web/src/hooks/useVotingContext.tsx index fa92bf09c..456520cd0 100644 --- a/web/src/hooks/useVotingContext.tsx +++ b/web/src/hooks/useVotingContext.tsx @@ -35,7 +35,7 @@ export const VotingContextProvider: React.FC<{ children: React.ReactNode }> = ({ const { data: drawData, isLoading } = useDrawQuery(address?.toLowerCase(), id, disputeData?.dispute?.currentRound.id); const roundId = disputeData?.dispute?.currentRoundIndex; const voteId = drawData?.draws?.[0]?.voteIDNum; - const { data: hasVoted } = useReadDisputeKitClassicIsVoteActive({ + const { data: hasVotedClassic } = useReadDisputeKitClassicIsVoteActive({ query: { enabled: !isUndefined(roundId) && !isUndefined(voteId), refetchInterval: REFETCH_INTERVAL, @@ -44,12 +44,20 @@ export const VotingContextProvider: React.FC<{ children: React.ReactNode }> = ({ }); const wasDrawn = useMemo(() => !isUndefined(drawData) && drawData.draws.length > 0, [drawData]); - const isHiddenVotes = useMemo(() => disputeData?.dispute?.court.hiddenVotes, [disputeData]); + const isHiddenVotes = useMemo(() => disputeData?.dispute?.court.hiddenVotes ?? false, [disputeData]); const isCommitPeriod = useMemo(() => disputeData?.dispute?.period === "commit", [disputeData]); const isVotingPeriod = useMemo(() => disputeData?.dispute?.period === "vote", [disputeData]); const commited = useMemo(() => !isUndefined(drawData) && drawData?.draws?.[0]?.vote?.commited, [drawData]); const commit = useMemo(() => drawData?.draws?.[0]?.vote?.commit, [drawData]); + + const hasVoted = useMemo(() => { + if (isHiddenVotes && isCommitPeriod) { + return commited; + } + return hasVotedClassic; + }, [isHiddenVotes, isCommitPeriod, commited, hasVotedClassic]); + return ( = ({ arbitrable, setIsOpen, dispute, currentPe const { isCommitPeriod, isVotingPeriod, commited } = useVotingContext(); const voteIDs = useMemo(() => drawData?.draws?.map((draw) => draw.voteIDNum) as string[], [drawData]); - return id && isCommitPeriod && !commited ? ( - - ) : id && isVotingPeriod ? ( - - ) : null; + const shouldShowCommit = id && isCommitPeriod && !commited; + const shouldShowReveal = id && isVotingPeriod; + + if (shouldShowCommit) { + return ; + } + + if (shouldShowReveal) { + return ; + } + + return null; }; export default Shutter; From 6f7862de1eaf9889577d97367f37cec82f3d6aa2 Mon Sep 17 00:00:00 2001 From: kemuru <102478601+kemuru@users.noreply.github.com> Date: Fri, 8 Aug 2025 01:22:33 +0200 Subject: [PATCH 2/5] chore: better return structure --- .../Cases/CaseDetails/Voting/Shutter/index.tsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx b/web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx index 7291efb3d..3000b2872 100644 --- a/web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx +++ b/web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx @@ -29,15 +29,14 @@ const Shutter: React.FC = ({ arbitrable, setIsOpen, dispute, currentPe const shouldShowCommit = id && isCommitPeriod && !commited; const shouldShowReveal = id && isVotingPeriod; - if (shouldShowCommit) { - return ; - } - - if (shouldShowReveal) { - return ; - } - - return null; + return ( + <> + {shouldShowCommit && ( + + )} + {shouldShowReveal && } + + ); }; export default Shutter; From 9807d8fd15dbce3dfc0c6f3a300c1f33df21e275 Mon Sep 17 00:00:00 2001 From: kemuru <102478601+kemuru@users.noreply.github.com> Date: Fri, 8 Aug 2025 02:05:12 +0200 Subject: [PATCH 3/5] fix: usevotingcontext dynamic disputekit hook calling --- web/src/hooks/useVotingContext.tsx | 77 +++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 13 deletions(-) diff --git a/web/src/hooks/useVotingContext.tsx b/web/src/hooks/useVotingContext.tsx index 456520cd0..4b216807a 100644 --- a/web/src/hooks/useVotingContext.tsx +++ b/web/src/hooks/useVotingContext.tsx @@ -3,10 +3,16 @@ import React, { useContext, createContext, useMemo } from "react"; import { useParams } from "react-router-dom"; import { useAccount } from "wagmi"; -import { REFETCH_INTERVAL } from "consts/index"; -import { useReadDisputeKitClassicIsVoteActive } from "hooks/contracts/generated"; +import { REFETCH_INTERVAL, DisputeKits } from "consts/index"; +import { + useReadDisputeKitClassicIsVoteActive, + useReadDisputeKitShutterIsVoteActive, + useReadDisputeKitGatedIsVoteActive, + useReadDisputeKitGatedShutterIsVoteActive, +} from "hooks/contracts/generated"; import { useDisputeDetailsQuery } from "hooks/queries/useDisputeDetailsQuery"; import { useDrawQuery } from "hooks/queries/useDrawQuery"; +import { useDisputeKitAddresses } from "hooks/useDisputeKitAddresses"; import { isUndefined } from "utils/index"; interface IVotingContext { @@ -35,14 +41,67 @@ export const VotingContextProvider: React.FC<{ children: React.ReactNode }> = ({ const { data: drawData, isLoading } = useDrawQuery(address?.toLowerCase(), id, disputeData?.dispute?.currentRound.id); const roundId = disputeData?.dispute?.currentRoundIndex; const voteId = drawData?.draws?.[0]?.voteIDNum; - const { data: hasVotedClassic } = useReadDisputeKitClassicIsVoteActive({ + + const disputeKitAddress = disputeData?.dispute?.currentRound?.disputeKit?.address; + const { disputeKitName } = useDisputeKitAddresses({ disputeKitAddress }); + + const hookArgs = [BigInt(id ?? 0), roundId, voteId] as const; + const isEnabled = !isUndefined(roundId) && !isUndefined(voteId); + + // Only call the hook for the specific dispute kit type + const classicVoteResult = useReadDisputeKitClassicIsVoteActive({ + query: { + enabled: isEnabled && disputeKitName === DisputeKits.Classic, + refetchInterval: REFETCH_INTERVAL, + }, + args: hookArgs, + }); + + const shutterVoteResult = useReadDisputeKitShutterIsVoteActive({ + query: { + enabled: isEnabled && disputeKitName === DisputeKits.Shutter, + refetchInterval: REFETCH_INTERVAL, + }, + args: hookArgs, + }); + + const gatedVoteResult = useReadDisputeKitGatedIsVoteActive({ query: { - enabled: !isUndefined(roundId) && !isUndefined(voteId), + enabled: isEnabled && disputeKitName === DisputeKits.Gated, refetchInterval: REFETCH_INTERVAL, }, - args: [BigInt(id ?? 0), roundId, voteId], + args: hookArgs, }); + const gatedShutterVoteResult = useReadDisputeKitGatedShutterIsVoteActive({ + query: { + enabled: isEnabled && disputeKitName === DisputeKits.GatedShutter, + refetchInterval: REFETCH_INTERVAL, + }, + args: hookArgs, + }); + + const hasVoted = useMemo(() => { + switch (disputeKitName) { + case DisputeKits.Classic: + return classicVoteResult.data; + case DisputeKits.Shutter: + return shutterVoteResult.data; + case DisputeKits.Gated: + return gatedVoteResult.data; + case DisputeKits.GatedShutter: + return gatedShutterVoteResult.data; + default: + return undefined; + } + }, [ + disputeKitName, + classicVoteResult.data, + shutterVoteResult.data, + gatedVoteResult.data, + gatedShutterVoteResult.data, + ]); + const wasDrawn = useMemo(() => !isUndefined(drawData) && drawData.draws.length > 0, [drawData]); const isHiddenVotes = useMemo(() => disputeData?.dispute?.court.hiddenVotes ?? false, [disputeData]); const isCommitPeriod = useMemo(() => disputeData?.dispute?.period === "commit", [disputeData]); @@ -50,14 +109,6 @@ export const VotingContextProvider: React.FC<{ children: React.ReactNode }> = ({ const commited = useMemo(() => !isUndefined(drawData) && drawData?.draws?.[0]?.vote?.commited, [drawData]); const commit = useMemo(() => drawData?.draws?.[0]?.vote?.commit, [drawData]); - - const hasVoted = useMemo(() => { - if (isHiddenVotes && isCommitPeriod) { - return commited; - } - return hasVotedClassic; - }, [isHiddenVotes, isCommitPeriod, commited, hasVotedClassic]); - return ( Date: Fri, 8 Aug 2025 02:09:36 +0200 Subject: [PATCH 4/5] chore: comment tweaking --- web/src/hooks/useVotingContext.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/src/hooks/useVotingContext.tsx b/web/src/hooks/useVotingContext.tsx index 4b216807a..59abeb2f7 100644 --- a/web/src/hooks/useVotingContext.tsx +++ b/web/src/hooks/useVotingContext.tsx @@ -48,7 +48,7 @@ export const VotingContextProvider: React.FC<{ children: React.ReactNode }> = ({ const hookArgs = [BigInt(id ?? 0), roundId, voteId] as const; const isEnabled = !isUndefined(roundId) && !isUndefined(voteId); - // Only call the hook for the specific dispute kit type + // Add a hook call for each DisputeKit const classicVoteResult = useReadDisputeKitClassicIsVoteActive({ query: { enabled: isEnabled && disputeKitName === DisputeKits.Classic, @@ -81,6 +81,7 @@ export const VotingContextProvider: React.FC<{ children: React.ReactNode }> = ({ args: hookArgs, }); + // Add a return for each DisputeKit const hasVoted = useMemo(() => { switch (disputeKitName) { case DisputeKits.Classic: From 97671a0e908fdb7688e9e6f70546656be069716b Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Tue, 2 Sep 2025 18:26:28 +0100 Subject: [PATCH 5/5] feat: maintenance mode with resolver, evidence, SIWE disabled --- web/src/components/EnsureAuth.tsx | 3 ++- web/src/consts/index.ts | 2 ++ web/src/layout/Header/index.tsx | 17 +++++++++++++++++ .../CaseDetails/Evidence/EvidenceSearch.tsx | 4 +++- web/src/pages/Home/CourtOverview/Header.tsx | 8 ++++++-- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/web/src/components/EnsureAuth.tsx b/web/src/components/EnsureAuth.tsx index e3f69264e..954a97120 100644 --- a/web/src/components/EnsureAuth.tsx +++ b/web/src/components/EnsureAuth.tsx @@ -6,6 +6,7 @@ import { useAccount } from "wagmi"; import { useAtlasProvider } from "@kleros/kleros-app"; import { Button } from "@kleros/ui-components-library"; +import { isMaintenanceMode } from "consts/index"; import { errorToast, infoToast, successToast } from "utils/wrapWithToast"; const Container = styled.div` @@ -50,7 +51,7 @@ const EnsureAuth: React.FC = ({ children, message, buttonText, clas