From f9f3b307ce06a759b353c74c44d09a85431db201 Mon Sep 17 00:00:00 2001 From: Hazem Krimi Date: Sun, 10 Jan 2021 19:55:38 +0100 Subject: [PATCH] Change layout and add click outside close function for mobile nav --- components/MobileNav.tsx | 54 +++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/components/MobileNav.tsx b/components/MobileNav.tsx index 4199f9a..57e9202 100644 --- a/components/MobileNav.tsx +++ b/components/MobileNav.tsx @@ -1,4 +1,4 @@ -import { FC, useContext } from 'react'; +import { FC, useContext, useRef, useEffect } from 'react'; import { DarkModeContext } from './DarkMode'; import styled from 'styled-components'; import IconButton from './IconButton'; @@ -27,7 +27,7 @@ const Bar = styled.nav` transition: transform 250ms ease-in-out; display: grid; grid-template-rows: auto; - row-gap: 0.3rem; + row-gap: 10px; padding: 1rem 1rem 5rem 1rem; .close { @@ -36,27 +36,57 @@ const Bar = styled.nav` margin-top: 0.5rem; } - .mobile { - color: ${({ theme, dark }) => - dark ? theme.colors.light.text : theme.colors.dark.text} !important; + .mobile-button-wrapper { + display: flex; margin: 0rem 1rem; + + button { + color: ${({ theme, dark }) => + dark ? theme.colors.light.text : theme.colors.dark.text} !important; + } } `; const MobileNav: FC = ({ open, close }) => { const { dark, toggle } = useContext(DarkModeContext); + const ref = useRef(null); + + useEffect(() => { + document.addEventListener('mousedown', (event: MouseEvent) => { + if (ref.current && ref.current.contains(event.target as Node)) { + document.addEventListener('mouseup', event => { + if (ref.current && !ref.current.contains(event.target as Node)) return; + }); + } else { + document.addEventListener('mouseup', event => { + if (ref.current && !ref.current.contains(event.target as Node)) close(); + }); + } + }); + + return () => { + document.removeEventListener('mousedown', () => {}); + document.removeEventListener('mouseup', () => {}); + }; + }); return ( - +
- - - - +
+ +
+
+ +
+
+ +
+
+ +
); };