diff --git a/src/components/base/Header.tsx b/src/components/base/Header.tsx index 24f64a59..9a7c76f0 100644 --- a/src/components/base/Header.tsx +++ b/src/components/base/Header.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { useRef, useCallback } from 'react'; import styled, { css } from 'styled-components'; import RoundButton from '../common/RoundButton'; import { CurrentUser } from '../../lib/graphql/user'; @@ -95,8 +95,6 @@ interface HeaderProps { isSearch: boolean; } -const { useCallback } = React; - const Header: React.FC = ({ floating, floatingMargin, @@ -108,6 +106,7 @@ const Header: React.FC = ({ isSearch, }) => { const [userMenu, toggleUserMenu] = useToggle(false); + const ref = useRef(null); const onLogout = useCallback(async () => { try { @@ -116,6 +115,16 @@ const Header: React.FC = ({ storage.removeItem('CURRENT_USER'); window.location.href = '/'; }, []); + + const onOutsideClick = useCallback( + (e: React.MouseEvent) => { + if (!ref.current) return; + if (ref.current.contains(e.target as any)) return; + toggleUserMenu(); + }, + [toggleUserMenu], + ); + return ( <> = ({ > 새 글 작성 - +
+ +
void; + onClick: (e: React.MouseEvent) => void; } // TODO: show user thumbnail diff --git a/src/components/base/HeaderUserMenu.tsx b/src/components/base/HeaderUserMenu.tsx index ec8dc6fd..1ef27db1 100644 --- a/src/components/base/HeaderUserMenu.tsx +++ b/src/components/base/HeaderUserMenu.tsx @@ -26,7 +26,7 @@ const HeaderUserMenuBlock = styled.div` `; interface HeaderUserMenuProps { - onClose: () => void; + onClose: (e: React.MouseEvent) => void; onLogout: () => void; username: string; visible: boolean; diff --git a/src/components/main/MainHeader.tsx b/src/components/main/MainHeader.tsx index 4e1369ee..5fe2f635 100644 --- a/src/components/main/MainHeader.tsx +++ b/src/components/main/MainHeader.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useRef, useCallback } from 'react'; import styled from 'styled-components'; import { Logo, SearchIcon2 } from '../../static/svg'; import RoundButton from '../common/RoundButton'; @@ -15,6 +15,16 @@ export type MainHeaderProps = {}; function MainHeader(props: MainHeaderProps) { const { user, onLoginClick, onLogout } = useHeader(); const [userMenu, toggleUserMenu] = useToggle(false); + const ref = useRef(null); + + const onOutsideClick = useCallback( + (e: React.MouseEvent) => { + if (!ref.current) return; + if (ref.current.contains(e.target as any)) return; + toggleUserMenu(); + }, + [toggleUserMenu], + ); return ( @@ -37,9 +47,11 @@ function MainHeader(props: MainHeaderProps) { 새 글 작성 - +
+ +