From f1f74f06c7f35a70a67e1b41ac31d6eaa295bee4 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Fri, 25 Sep 2020 06:08:37 -0700 Subject: [PATCH] Refactored UnauthMenu into HeaderMenu Header also takes care of managing logged in state via cookies --- src/components/Header/Header.tsx | 26 +++++-- .../HeaderMenu.css} | 0 src/components/HeaderMenu/HeaderMenu.tsx | 67 +++++++++++++++++++ src/components/UnauthMenu/UnauthMenu.tsx | 53 --------------- 4 files changed, 88 insertions(+), 58 deletions(-) rename src/components/{UnauthMenu/UnauthMenu.css => HeaderMenu/HeaderMenu.css} (100%) create mode 100644 src/components/HeaderMenu/HeaderMenu.tsx delete mode 100644 src/components/UnauthMenu/UnauthMenu.tsx diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 65f18a9d..40ef3990 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,10 +1,9 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' import { RouteComponentProps, useLocation, withRouter } from 'react-router-dom' import { useCookies } from 'react-cookie' -import history from '~utils/history' import Button from '~components/Button/Button' -import UnauthMenu from '~components/UnauthMenu/UnauthMenu' +import HeaderMenu from '~components/HeaderMenu/HeaderMenu' import './Header.css' @@ -12,9 +11,16 @@ interface Props {} interface HeaderProps extends RouteComponentProps {} const Header: React.FC = (props: HeaderProps) => { - const [cookies, setCookie] = useCookies(['user']) + const [username, setUsername] = useState(undefined) + const [cookies, setCookie, removeCookie] = useCookies(['user']) let location = useLocation() + useEffect(() => { + if (cookies.user) { + setUsername(cookies.user.username) + } + }, []) + function copyToClipboard() { const el = document.createElement('input') el.value = window.location.href @@ -35,6 +41,16 @@ const Header: React.FC = (props: HeaderProps) => { } } + function route(pathname: string) { + props.history.push(pathname) + } + + function logout() { + removeCookie('user') + window.history.replaceState(null, `Grid Tool`, `/`) + props.history.go(0) + } + if (cookies.user != null) { console.log(`Logged in as user "${cookies.user.username}"`) } @@ -44,7 +60,7 @@ const Header: React.FC = (props: HeaderProps) => {
- +
diff --git a/src/components/UnauthMenu/UnauthMenu.css b/src/components/HeaderMenu/HeaderMenu.css similarity index 100% rename from src/components/UnauthMenu/UnauthMenu.css rename to src/components/HeaderMenu/HeaderMenu.css diff --git a/src/components/HeaderMenu/HeaderMenu.tsx b/src/components/HeaderMenu/HeaderMenu.tsx new file mode 100644 index 00000000..821c9d34 --- /dev/null +++ b/src/components/HeaderMenu/HeaderMenu.tsx @@ -0,0 +1,67 @@ +import React from 'react' +import './HeaderMenu.css' + +import LoginModal from '~components/LoginModal/LoginModal' +import SignupModal from '~components/SignupModal/SignupModal' + +import { useModal as useSignupModal } from '~utils/useModal' +import { useModal as useLoginModal } from '~utils/useModal' +import { Route } from 'react-router' + + +interface Props { + username?: string + navigate: (pathname: string) => void + logout: () => void +} + +const HeaderMenu = (props: Props) => { + const { open: signupOpen, openModal: openSignupModal, closeModal: closeSignupModal } = useSignupModal() + const { open: loginOpen, openModal: openLoginModal, closeModal: closeLoginModal } = useLoginModal() + + function authItems() { + return ( +
    +
    +
  • props.username ? props.navigate(props.username) : '' }>My Parties
  • +
    +
    +
  • props.navigate('about') }>About
  • +
  • props.navigate('guides') }>Guides
  • +
    +
    +
  • Logout
  • +
    +
+ ) + } + + function unauthItems() { + return ( +
    +
    +
  • props.navigate('about') }>About
  • +
  • props.navigate('guides') }>Guides
  • +
    +
    +
  • Log in
  • + {loginOpen ? ( + + ) : null} +
  • Sign up
  • + {signupOpen ? ( + + ) : null} +
    +
+ ) + } + + return (props.username !== undefined) ? authItems() : unauthItems() +} + +export default HeaderMenu \ No newline at end of file diff --git a/src/components/UnauthMenu/UnauthMenu.tsx b/src/components/UnauthMenu/UnauthMenu.tsx deleted file mode 100644 index bc1f9dec..00000000 --- a/src/components/UnauthMenu/UnauthMenu.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react' -import './UnauthMenu.css' - -import LoginModal from '~components/LoginModal/LoginModal' -import SignupModal from '~components/SignupModal/SignupModal' - -import { useModal as useSignupModal } from '~utils/useModal' -import { useModal as useLoginModal } from '~utils/useModal' - -function UnauthMenu() { - const { open: signupOpen, openModal: openSignupModal, closeModal: closeSignupModal } = useSignupModal() - const { open: loginOpen, openModal: openLoginModal, closeModal: closeLoginModal } = useLoginModal() - - return ( -
    -
    -
  • About
  • -
  • Guides
  • -
    -
    -
  • Log in
  • - {loginOpen ? ( - - ) : null} -
  • Sign up
  • - {signupOpen ? ( - - ) : null} -
    -
- ) -} - -export default UnauthMenu - -// if (this.state.loggedIn) { -// return ( -//
    -//
    -//
  • My Parties
  • -//
  • Guides
  • -//
  • About
  • -//
    -//
    -//
  • Log out
  • -//
    -//
-// ) -// } else { \ No newline at end of file