From ea57ea7815a148b42cc4342f61ec90a6219efb52 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Sirois Date: Fri, 17 Jan 2020 23:17:05 -0500 Subject: [PATCH] refact(sidebar): move mobile state to context provider --- src/SidebarProvider.tsx | 7 +++- src/layouts/ColumnLayout/index.tsx | 65 ++++++++++++++++++------------ 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/SidebarProvider.tsx b/src/SidebarProvider.tsx index 02bb1e4..917a635 100644 --- a/src/SidebarProvider.tsx +++ b/src/SidebarProvider.tsx @@ -3,6 +3,8 @@ import React, { FC, useMemo, useState } from "react" export interface ISidebarContextInterface { current: number setCurrent: (index: number) => void + openOnMobile: boolean + setOpenOnMobile: (active: boolean) => void } export const SidebarContext = React.createContext( @@ -11,13 +13,16 @@ export const SidebarContext = React.createContext { const [current, setCurrent] = useState(0) + const [openOnMobile, setOpenOnMobile] = useState(false) const memoizedContextValue = useMemo( () => ({ current, setCurrent, + openOnMobile, + setOpenOnMobile, }), - [current, setCurrent] + [current, setCurrent, openOnMobile, setOpenOnMobile] ) return ( diff --git a/src/layouts/ColumnLayout/index.tsx b/src/layouts/ColumnLayout/index.tsx index 36ca046..3b4c00f 100644 --- a/src/layouts/ColumnLayout/index.tsx +++ b/src/layouts/ColumnLayout/index.tsx @@ -1,8 +1,9 @@ -import React, { FC, useState } from "react" +import React, { FC, Fragment } from "react" import { MobileHeader } from "../../components/MobileHeader" import { GlobalStyles } from "../../globalStyles" import { useLockBodyScroll } from "../../hooks/useLockBodyScroll" +import useSidebar from "../../hooks/useSidebar" import { SidebarProvider } from "../../SidebarProvider" import { ThemeProvider } from "../../ThemeProvider" import * as SC from "./styles" @@ -13,39 +14,51 @@ interface IColumnLayoutProps { content: React.ReactNode } +const InnerColumnLayout: FC = ({ + title, + sidebar, + content, +}) => { + const { openOnMobile, setOpenOnMobile } = useSidebar() + const { lock, unlock } = useLockBodyScroll() + + function openMenu() { + setOpenOnMobile(true) + lock() + } + + function closeMenu() { + setOpenOnMobile(false) + unlock() + } + + return ( + + + + {title} + {sidebar({ className: openOnMobile ? "is-open" : "" })} + + {content} + + + + + ) +} + export const ColumnLayout: FC = ({ title, sidebar, content, }) => { - const [activeMobileMenu, setActiveMobileMenu] = useState(false) - const { lock, unlock } = useLockBodyScroll() - - function openMenu() { - setActiveMobileMenu(true) - lock() - } - - function closeMenu() { - setActiveMobileMenu(false) - unlock() - } - return ( - - - {title} - {sidebar({ className: activeMobileMenu ? "is-open" : "" })} - - {content} - - - + )