Skip to content

Commit 2b6735b

Browse files
committed
refactor: extracted some props to a context
1 parent 967e78f commit 2b6735b

File tree

11 files changed

+94
-58
lines changed

11 files changed

+94
-58
lines changed

web/src/app.tsx

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,28 @@ import Cases from "./pages/Cases";
1414
import Dashboard from "./pages/Dashboard";
1515
import Courts from "./pages/Courts";
1616
import DisputeTemplateView from "./pages/DisputeTemplateView";
17+
import MenuProvider from "./context/MenuProvider";
1718

1819
const App: React.FC = () => {
1920
return (
2021
<StyledComponentsProvider>
2122
<QueryClientProvider>
2223
<RefetchOnBlock />
2324
<Web3Provider>
24-
<IsListProvider>
25-
<SentryRoutes>
26-
<Route path="/" element={<Layout />}>
27-
<Route index element={<Home />} />
28-
<Route path="cases/*" element={<Cases />} />
29-
<Route path="courts/*" element={<Courts />} />
30-
<Route path="dashboard/:page/:order/:filter" element={<Dashboard />} />
31-
<Route path="disputeTemplate" element={<DisputeTemplateView />} />
32-
<Route path="*" element={<h1>Justice not found here ¯\_( ͡° ͜ʖ ͡°)_/¯</h1>} />
33-
</Route>
34-
</SentryRoutes>
35-
</IsListProvider>
25+
<MenuProvider>
26+
<IsListProvider>
27+
<SentryRoutes>
28+
<Route path="/" element={<Layout />}>
29+
<Route index element={<Home />} />
30+
<Route path="cases/*" element={<Cases />} />
31+
<Route path="courts/*" element={<Courts />} />
32+
<Route path="dashboard/:page/:order/:filter" element={<Dashboard />} />
33+
<Route path="disputeTemplate" element={<DisputeTemplateView />} />
34+
<Route path="*" element={<h1>Justice not found here ¯\_( ͡° ͜ʖ ͡°)_/¯</h1>} />
35+
</Route>
36+
</SentryRoutes>
37+
</IsListProvider>
38+
</MenuProvider>
3639
</Web3Provider>
3740
</QueryClientProvider>
3841
</StyledComponentsProvider>

web/src/context/IsListProvider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ interface IIsListProvider {
99
const Context = createContext<IIsListProvider>({
1010
isList: false,
1111
setIsList: () => {
12-
//
12+
// nop
1313
},
1414
});
1515

web/src/context/MenuProvider.tsx

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import React, { createContext, useContext } from "react";
2+
import { useToggle } from "react-use";
3+
4+
interface IMenuProvider {
5+
isDappListOpen: boolean;
6+
toggleIsDappListOpen: (nextValue?: any) => void;
7+
8+
isHelpOpen: boolean;
9+
toggleIsHelpOpen: (nextValue?: any) => void;
10+
11+
isSettingsOpen: boolean;
12+
toggleIsSettingsOpen: (nextValue?: any) => void;
13+
}
14+
15+
const nop = () => {
16+
// nop
17+
};
18+
19+
const Context = createContext<IMenuProvider>({
20+
isDappListOpen: false,
21+
toggleIsDappListOpen: nop,
22+
isHelpOpen: false,
23+
toggleIsHelpOpen: nop,
24+
isSettingsOpen: false,
25+
toggleIsSettingsOpen: nop,
26+
});
27+
28+
const MenuProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
29+
const [isDappListOpen, toggleIsDappListOpen] = useToggle(false);
30+
const [isHelpOpen, toggleIsHelpOpen] = useToggle(false);
31+
const [isSettingsOpen, toggleIsSettingsOpen] = useToggle(false);
32+
33+
const value = {
34+
isDappListOpen,
35+
toggleIsDappListOpen,
36+
isHelpOpen,
37+
toggleIsHelpOpen,
38+
isSettingsOpen,
39+
toggleIsSettingsOpen,
40+
};
41+
42+
return <Context.Provider value={value}>{children}</Context.Provider>;
43+
};
44+
45+
export const useMenu = () => useContext(Context);
46+
47+
export default MenuProvider;

web/src/layout/Header/DesktopHeader.tsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react";
22
import styled, { css } from "styled-components";
3+
import { useMenu } from "../../context/MenuProvider";
34
import { landscapeStyle } from "styles/landscapeStyle";
4-
import { useToggle } from "react-use";
55
import { Link } from "react-router-dom";
66
import { useLockOverlayScroll } from "hooks/useLockOverlayScroll";
77
import KlerosSolutionsIcon from "svgs/menu-icons/kleros-solutions.svg";
@@ -76,9 +76,7 @@ const ConnectWalletContainer = styled.div`
7676
`;
7777

7878
const DesktopHeader = () => {
79-
const [isDappListOpen, toggleIsDappListOpen] = useToggle(false);
80-
const [isHelpOpen, toggleIsHelpOpen] = useToggle(false);
81-
const [isSettingsOpen, toggleIsSettingsOpen] = useToggle(false);
79+
const { isDappListOpen, toggleIsDappListOpen, isSettingsOpen, isHelpOpen } = useMenu();
8280
useLockOverlayScroll(isDappListOpen || isHelpOpen || isSettingsOpen);
8381

8482
return (
@@ -107,15 +105,15 @@ const DesktopHeader = () => {
107105
<ConnectWalletContainer>
108106
<ConnectWallet />
109107
</ConnectWalletContainer>
110-
<Menu {...{ toggleIsHelpOpen, toggleIsSettingsOpen }} />
108+
<Menu />
111109
</RightSide>
112110
</Container>
113111
{(isDappListOpen || isHelpOpen || isSettingsOpen) && (
114112
<PopupContainer>
115113
<Overlay />
116-
{isDappListOpen && <DappList {...{ toggleIsDappListOpen, isDappListOpen }} />}
117-
{isHelpOpen && <Help {...{ toggleIsHelpOpen, isHelpOpen }} />}
118-
{isSettingsOpen && <Settings {...{ toggleIsSettingsOpen, isSettingsOpen }} />}
114+
{isDappListOpen && <DappList />}
115+
{isHelpOpen && <Help />}
116+
{isSettingsOpen && <Settings />}
119117
</PopupContainer>
120118
)}
121119
</>

web/src/layout/Header/navbar/DappList.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import POH from "svgs/icons/poh-image.png";
1212
import Vea from "svgs/icons/vea.svg";
1313
import Tokens from "svgs/icons/tokens.svg";
1414
import Product from "./Product";
15+
import { useMenu } from "../../../context/MenuProvider";
1516

1617
const Header = styled.h1`
1718
display: flex;
@@ -117,12 +118,9 @@ const ITEMS = [
117118
},
118119
];
119120

120-
interface IDappList {
121-
toggleIsDappListOpen: () => void;
122-
}
123-
124-
const DappList: React.FC<IDappList> = ({ toggleIsDappListOpen }) => {
121+
const DappList: React.FC = () => {
125122
const containerRef = useRef(null);
123+
const { toggleIsDappListOpen } = useMenu();
126124
useFocusOutside(containerRef, () => {
127125
toggleIsDappListOpen();
128126
});

web/src/layout/Header/navbar/Menu/Help.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Bug from "svgs/icons/bug.svg";
88
import ETH from "svgs/icons/eth.svg";
99
import Faq from "svgs/menu-icons/help.svg";
1010
import Telegram from "svgs/socialmedia/telegram.svg";
11-
import { IHelp } from "..";
11+
import { useMenu } from "../../../../context/MenuProvider";
1212

1313
const Container = styled.div`
1414
display: flex;
@@ -97,8 +97,9 @@ const ITEMS = [
9797
},
9898
];
9999

100-
const Help: React.FC<IHelp> = ({ toggleIsHelpOpen }) => {
100+
const Help: React.FC = () => {
101101
const containerRef = useRef(null);
102+
const { toggleIsHelpOpen } = useMenu();
102103
useFocusOutside(containerRef, () => {
103104
toggleIsHelpOpen();
104105
});

web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { uploadSettingsToSupabase } from "utils/uploadSettingsToSupabase";
66
import FormContact from "./FormContact";
77
import messages from "../../../../../../../consts/eip712-messages";
88
import { EMAIL_REGEX, TELEGRAM_REGEX } from "../../../../../../../consts/index";
9-
import { ISettings } from "../../../index";
9+
import { useMenu } from "../../../../../../../context/MenuProvider";
1010

1111
const FormContainer = styled.form`
1212
position: relative;
@@ -27,13 +27,14 @@ const FormContactContainer = styled.div`
2727
margin-bottom: 24px;
2828
`;
2929

30-
const FormContactDetails: React.FC<ISettings> = ({ toggleIsSettingsOpen }) => {
30+
const FormContactDetails: React.FC = () => {
3131
const [telegramInput, setTelegramInput] = useState<string>("");
3232
const [emailInput, setEmailInput] = useState<string>("");
3333
const [telegramIsValid, setTelegramIsValid] = useState<boolean>(false);
3434
const [emailIsValid, setEmailIsValid] = useState<boolean>(false);
3535
const { data: walletClient } = useWalletClient();
3636
const { address } = useAccount();
37+
const { toggleIsSettingsOpen } = useMenu();
3738

3839
// TODO: after the user is authenticated, retrieve the current email/telegram from the database and populate the form
3940

web/src/layout/Header/navbar/Menu/Settings/Notifications/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import React from "react";
22
import styled from "styled-components";
3-
import { ISettings } from "../../../index";
43

54
import FormContactDetails from "./FormContactDetails";
65
import { EnsureChain } from "components/EnsureChain";
6+
import { useMenu } from "../../../../../../context/MenuProvider";
77

88
const Container = styled.div`
99
display: flex;
@@ -33,13 +33,13 @@ const EnsureChainContainer = styled.div`
3333
padding-bottom: 16px;
3434
`;
3535

36-
const NotificationSettings: React.FC<ISettings> = ({ toggleIsSettingsOpen }) => {
36+
const NotificationSettings: React.FC = () => {
3737
return (
3838
<EnsureChainContainer>
3939
<EnsureChain>
4040
<Container>
4141
<HeaderNotifs />
42-
<FormContactDetails toggleIsSettingsOpen={toggleIsSettingsOpen} />
42+
<FormContactDetails />
4343
</Container>
4444
</EnsureChain>
4545
</EnsureChainContainer>

web/src/layout/Header/navbar/Menu/Settings/index.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import General from "./General";
66
import NotificationSettings from "./Notifications";
77
import { useFocusOutside } from "hooks/useFocusOutside";
88
import { Overlay } from "components/Overlay";
9-
import { ISettings } from "../../index";
9+
import { useMenu } from "../../../../../context/MenuProvider";
1010

1111
const Container = styled.div`
1212
display: flex;
@@ -60,9 +60,10 @@ const TABS = [
6060
},
6161
];
6262

63-
const Settings: React.FC<ISettings> = ({ toggleIsSettingsOpen }) => {
63+
const Settings: React.FC = () => {
6464
const [currentTab, setCurrentTab] = useState<number>(0);
6565
const containerRef = useRef(null);
66+
const { toggleIsSettingsOpen } = useMenu();
6667
useFocusOutside(containerRef, () => toggleIsSettingsOpen());
6768

6869
return (
@@ -77,7 +78,7 @@ const Settings: React.FC<ISettings> = ({ toggleIsSettingsOpen }) => {
7778
setCurrentTab(n);
7879
}}
7980
/>
80-
{currentTab === 0 ? <General /> : <NotificationSettings toggleIsSettingsOpen={toggleIsSettingsOpen} />}
81+
{currentTab === 0 ? <General /> : <NotificationSettings />}
8182
</Container>
8283
</>
8384
);

web/src/layout/Header/navbar/Menu/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import LightModeIcon from "svgs/menu-icons/light-mode.svg";
88
import NotificationsIcon from "svgs/menu-icons/notifications.svg";
99
import SettingsIcon from "svgs/menu-icons/settings.svg";
1010
import { useToggleTheme } from "hooks/useToggleThemeContext";
11-
import { IHelp, ISettings } from "..";
11+
import { useMenu } from "../../../../context/MenuProvider";
1212

1313
const Container = styled.div`
1414
display: flex;
@@ -53,8 +53,9 @@ const ButtonContainer = styled.div`
5353
)}
5454
`;
5555

56-
const Menu: React.FC<ISettings & IHelp> = ({ toggleIsHelpOpen, toggleIsSettingsOpen }) => {
56+
const Menu: React.FC = () => {
5757
const [theme, toggleTheme] = useToggleTheme();
58+
const { toggleIsSettingsOpen, toggleIsHelpOpen } = useMenu();
5859
const isLightTheme = theme === "light";
5960

6061
const buttons = [

web/src/layout/Header/navbar/index.tsx

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from "react";
22
import styled from "styled-components";
3-
import { useToggle } from "react-use";
3+
import { useMenu } from "../../../context/MenuProvider";
44
import { useAccount } from "wagmi";
55
import { useLockOverlayScroll } from "hooks/useLockOverlayScroll";
66
import { useOpenContext } from "../MobileHeader";
@@ -53,23 +53,9 @@ const DisconnectWalletButtonContainer = styled.div`
5353
align-items: center;
5454
`;
5555

56-
export interface ISettings {
57-
toggleIsSettingsOpen: () => void;
58-
}
59-
60-
export interface IHelp {
61-
toggleIsHelpOpen: () => void;
62-
}
63-
64-
export interface IDappList {
65-
toggleIsDappListOpen: () => void;
66-
}
67-
6856
const NavBar: React.FC = () => {
6957
const { isConnected } = useAccount();
70-
const [isDappListOpen, toggleIsDappListOpen] = useToggle(false);
71-
const [isHelpOpen, toggleIsHelpOpen] = useToggle(false);
72-
const [isSettingsOpen, toggleIsSettingsOpen] = useToggle(false);
58+
const { isDappListOpen, toggleIsDappListOpen, isSettingsOpen, isHelpOpen } = useMenu();
7359
const { isOpen } = useOpenContext();
7460
useLockOverlayScroll(isOpen);
7561

@@ -95,16 +81,16 @@ const NavBar: React.FC = () => {
9581
)}
9682
</WalletContainer>
9783
<hr />
98-
<Menu {...{ toggleIsHelpOpen, toggleIsSettingsOpen }} />
84+
<Menu />
9985
<br />
10086
<Debug />
10187
</Container>
10288
{(isDappListOpen || isHelpOpen || isSettingsOpen) && (
10389
<PopupContainer>
10490
<Overlay />
105-
{isDappListOpen && <DappList {...{ toggleIsDappListOpen }} />}
106-
{isHelpOpen && <Help {...{ toggleIsHelpOpen }} />}
107-
{isSettingsOpen && <Settings {...{ toggleIsSettingsOpen }} />}
91+
{isDappListOpen && <DappList />}
92+
{isHelpOpen && <Help />}
93+
{isSettingsOpen && <Settings />}
10894
</PopupContainer>
10995
)}
11096
</>

0 commit comments

Comments
 (0)