/* eslint-disable react-hooks/exhaustive-deps */
import { Box, Flex, Heading, Link, useDisclosure } from "@chakra-ui/react";
import React, { memo, useCallback, VFC } from "react";
import { MenuIconButton } from "../../atoms/button/MenuIconButton";
import { MenuDrawer } from "../../molecules/MenuDrawer";
import { useHistory } from "react-router-dom";
export const Header: VFC = memo(() => {
const { isOpen, onOpen, onClose } = useDisclosure();
const history = useHistory();
const onClickHome = useCallback(() => history.push("/home"), []);
const onClickUserManagement = useCallback(
() => history.push("/home/user_management"),
[]
);
const onClickSetting = useCallback(() => history.push("/home/setting"), []);
return (
<>
<Flex
as="nav"
bg="teal.500"
color="gray.50"
align="center"
justify="space-between"
padding=
>
<Flex
align="center"
as="a"
mr={8}
_hover=
onClick={onClickHome}
>
<Heading as="h1" fontSize=>
ユーザ管理アプリ
</Heading>
</Flex>
<Flex
align="center"
fontSize="sm"
flexGrow={2}
display=
>
<Box pr={4}>
<Link onClick={onClickUserManagement}>ユーザ一覧</Link>
</Box>
<Link onClick={onClickSetting}>設定</Link>
</Flex>
<MenuIconButton onOpen={onOpen} />
</Flex>
<MenuDrawer
onClose={onClose}
isOpen={isOpen}
onClickHome={onClickHome}
onClickSetting={onClickSetting}
onClickUserManagement={onClickUserManagement}
/>
</>
);
});
import React, { memo, VFC } from "react";
import { HamburgerIcon } from "@chakra-ui/icons";
import { IconButton } from "@chakra-ui/react";
type Props = {
onOpen: () => void;
};
export const MenuIconButton: VFC<Props> = memo((props) => {
const { onOpen } = props;
return (
<IconButton
aria-label="メニューボタン"
icon={<HamburgerIcon />}
size="sm"
variant="unstyled"
display=
onClick={onOpen}
/>
);
});
import {
Button,
Drawer,
DrawerBody,
DrawerContent,
DrawerOverlay,
} from "@chakra-ui/react";
import React, { memo, VFC } from "react";
type Props = {
onClose: () => void;
isOpen: boolean;
onClickHome: () => void;
onClickUserManagement: () => void;
onClickSetting: () => void;
};
export const MenuDrawer: VFC<Props> = memo((props) => {
const {
onClose,
isOpen,
onClickHome,
onClickUserManagement,
onClickSetting,
} = props;
return (
<Drawer placement="left" size="xs" onClose={onClose} isOpen={isOpen}>
<DrawerOverlay>
<DrawerContent>
<DrawerBody p={0} bg="gray.100">
<Button w="100%" onClick={onClickHome}>
TOP
</Button>
<Button w="100%" onClick={onClickUserManagement}>
ユーザ一覧
</Button>
<Button w="100%" onClick={onClickSetting}>
設定
</Button>
</DrawerBody>
</DrawerContent>
</DrawerOverlay>
</Drawer>
);
});
import React, { memo, ReactNode, VFC } from "react";
import { Header } from "../organisms/layout/Header";
type Props = {
children: ReactNode;
};
export const HeaderLayout: VFC<Props> = memo((props) => {
const { children } = props;
return (
<>
<Header />
{children}
</>
);
});