Skip to content

Commit 9d0cf72

Browse files
committed
feat: hash path to navigate directly to specific mini-guides
1 parent db762de commit 9d0cf72

File tree

2 files changed

+60
-13
lines changed

2 files changed

+60
-13
lines changed

web/src/components/Popup/MiniGuides/MainStructureTemplate.tsx

+18-5
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import styled, { css } from "styled-components";
33

44
import { useLocation, useNavigate } from "react-router-dom";
55
import { useClickAway } from "react-use";
6-
import BookOpenIcon from "svgs/icons/book-open.svg";
76

87
import { CompactPagination } from "@kleros/ui-components-library";
98

9+
import BookOpenIcon from "svgs/icons/book-open.svg";
10+
1011
import { landscapeStyle } from "styles/landscapeStyle";
1112
import { responsiveSize } from "styles/responsiveSize";
1213

@@ -129,6 +130,16 @@ interface ITemplate {
129130
isVisible: boolean;
130131
}
131132

133+
export const miniGuideHashes = [
134+
"#appeal-miniguide",
135+
"#binaryvoting-miniguide",
136+
"#disputeresolver-miniguide",
137+
"#rankedvoting-miniguide",
138+
"#staking-miniguide",
139+
"#onboarding-miniguide",
140+
] as const;
141+
export type MiniguideHashesType = (typeof miniGuideHashes)[number];
142+
132143
const Template: React.FC<ITemplate> = ({
133144
onClose,
134145
LeftContent,
@@ -143,13 +154,15 @@ const Template: React.FC<ITemplate> = ({
143154
const containerRef = useRef(null);
144155
const location = useLocation();
145156
const navigate = useNavigate();
146-
const removeOnboardingHashPath = useCallback(() => {
147-
if (isOnboarding && location.hash.includes("#onboarding")) navigate("#", { replace: true });
148-
}, [location.hash, navigate, isOnboarding]);
157+
const removeMiniGuideHashPath = useCallback(() => {
158+
if (miniGuideHashes.some((hash) => location.hash.includes(hash))) {
159+
navigate("#", { replace: true });
160+
}
161+
}, [location.hash, navigate]);
149162

150163
const onCloseAndRemoveOnboardingHashPath = () => {
151164
onClose();
152-
removeOnboardingHashPath();
165+
removeMiniGuideHashPath();
153166
};
154167

155168
useClickAway(containerRef, () => {

web/src/layout/Header/DesktopHeader.tsx

+42-8
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@ import { useAccount } from "wagmi";
77

88
import KlerosSolutionsIcon from "svgs/menu-icons/kleros-solutions.svg";
99

10-
import { useLockOverlayScroll } from "hooks/useLockOverlayScroll";
11-
1210
import { DEFAULT_CHAIN } from "consts/chains";
11+
import { useLockOverlayScroll } from "hooks/useLockOverlayScroll";
1312

1413
import { landscapeStyle } from "styles/landscapeStyle";
1514
import { responsiveSize } from "styles/responsiveSize";
1615

1716
import ConnectWallet from "components/ConnectWallet";
1817
import LightButton from "components/LightButton";
18+
import Appeal from "components/Popup/MiniGuides/Appeal";
19+
import BinaryVoting from "components/Popup/MiniGuides/BinaryVoting";
20+
import DisputeResolver from "components/Popup/MiniGuides/DisputeResolver";
21+
import { MiniguideHashesType } from "components/Popup/MiniGuides/MainStructureTemplate";
1922
import Onboarding from "components/Popup/MiniGuides/Onboarding";
23+
import RankedVoting from "components/Popup/MiniGuides/RankedVoting";
24+
import Staking from "components/Popup/MiniGuides/Staking";
2025

2126
import Logo from "./Logo";
2227
import DappList from "./navbar/DappList";
@@ -105,20 +110,44 @@ const DesktopHeader: React.FC = () => {
105110
const [isDappListOpen, toggleIsDappListOpen] = useToggle(false);
106111
const [isHelpOpen, toggleIsHelpOpen] = useToggle(false);
107112
const [isSettingsOpen, toggleIsSettingsOpen] = useToggle(false);
113+
const [isAppealMiniGuideOpen, toggleIsAppealMiniGuideOpen] = useToggle(false);
114+
const [isBinaryVotingMiniGuideOpen, toggleIsBinaryVotingMiniGuideOpen] = useToggle(false);
115+
const [isDisputeResolverMiniGuideOpen, toggleIsDisputeResolverMiniGuideOpen] = useToggle(false);
116+
const [isRankedVotingMiniGuideOpen, toggleIsRankedVotingMiniGuideOpen] = useToggle(false);
117+
const [isStakingMiniGuideOpen, toggleIsStakingMiniGuideOpen] = useToggle(false);
108118
const [isOnboardingMiniGuidesOpen, toggleIsOnboardingMiniGuidesOpen] = useToggle(false);
109119
const [initialTab, setInitialTab] = useState<number>(0);
110120
const location = useLocation();
111121
const { isConnected, chainId } = useAccount();
112122
const isDefaultChain = chainId === DEFAULT_CHAIN;
113-
114123
const initializeFragmentURL = useCallback(() => {
115-
const hash = location.hash;
116-
const hasOnboardingPath = hash.includes("#onboarding");
117-
const hasNotificationsPath = hash.includes("#notifications");
118-
toggleIsOnboardingMiniGuidesOpen(hasOnboardingPath);
124+
const hashIncludes = (hash: MiniguideHashesType | "#notifications") => location.hash.includes(hash);
125+
const hasAppealMiniGuidePath = hashIncludes("#appeal-miniguide");
126+
const hasBinaryVotingMiniGuidePath = hashIncludes("#binaryvoting-miniguide");
127+
const hasDisputeResolverMiniGuidePath = hashIncludes("#disputeresolver-miniguide");
128+
const hasRankedVotingMiniGuidePath = hashIncludes("#rankedvoting-miniguide");
129+
const hasStakingMiniGuidePath = hashIncludes("#staking-miniguide");
130+
const hasOnboardingMiniGuidePath = hashIncludes("#onboarding-miniguide");
131+
const hasNotificationsPath = hashIncludes("#notifications");
132+
toggleIsAppealMiniGuideOpen(hasAppealMiniGuidePath);
133+
toggleIsBinaryVotingMiniGuideOpen(hasBinaryVotingMiniGuidePath);
134+
toggleIsDisputeResolverMiniGuideOpen(hasDisputeResolverMiniGuidePath);
135+
toggleIsRankedVotingMiniGuideOpen(hasRankedVotingMiniGuidePath);
136+
toggleIsStakingMiniGuideOpen(hasStakingMiniGuidePath);
137+
toggleIsOnboardingMiniGuidesOpen(hasOnboardingMiniGuidePath);
138+
toggleIsAppealMiniGuideOpen(hasAppealMiniGuidePath);
119139
toggleIsSettingsOpen(hasNotificationsPath);
120140
setInitialTab(hasNotificationsPath ? 1 : 0);
121-
}, [location.hash, toggleIsSettingsOpen, toggleIsOnboardingMiniGuidesOpen]);
141+
}, [
142+
toggleIsAppealMiniGuideOpen,
143+
toggleIsBinaryVotingMiniGuideOpen,
144+
toggleIsDisputeResolverMiniGuideOpen,
145+
toggleIsRankedVotingMiniGuideOpen,
146+
toggleIsStakingMiniGuideOpen,
147+
toggleIsOnboardingMiniGuidesOpen,
148+
toggleIsSettingsOpen,
149+
location.hash,
150+
]);
122151

123152
useEffect(initializeFragmentURL, [initializeFragmentURL]);
124153

@@ -161,6 +190,11 @@ const DesktopHeader: React.FC = () => {
161190
{isSettingsOpen && <Settings {...{ toggleIsSettingsOpen, isSettingsOpen, initialTab }} />}
162191
</PopupContainer>
163192
)}
193+
{isAppealMiniGuideOpen && <Appeal toggleMiniGuide={toggleIsAppealMiniGuideOpen} />}
194+
{isBinaryVotingMiniGuideOpen && <BinaryVoting toggleMiniGuide={toggleIsBinaryVotingMiniGuideOpen} />}
195+
{isDisputeResolverMiniGuideOpen && <DisputeResolver toggleMiniGuide={toggleIsDisputeResolverMiniGuideOpen} />}
196+
{isRankedVotingMiniGuideOpen && <RankedVoting toggleMiniGuide={toggleIsRankedVotingMiniGuideOpen} />}
197+
{isStakingMiniGuideOpen && <Staking toggleMiniGuide={toggleIsStakingMiniGuideOpen} />}
164198
{isOnboardingMiniGuidesOpen && <Onboarding toggleMiniGuide={toggleIsOnboardingMiniGuidesOpen} />}
165199
</>
166200
);

0 commit comments

Comments
 (0)