Layout.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { Flex, useDisclosure, Spinner, Breadcrumb, BreadcrumbItem, useColorModeValue, Box } from '@chakra-ui/react';
  2. import Head from 'next/head';
  3. import Link from 'next/link';
  4. import React from 'react';
  5. import { FiChevronRight } from 'react-icons/fi';
  6. import Header from './Header';
  7. import Menu from './Menu';
  8. import MenuDrawer from './MenuDrawer';
  9. interface IProps {
  10. loading?: boolean;
  11. breadcrumbs?: { name: string; href: string; current?: boolean }[];
  12. }
  13. const Layout: React.FC<IProps> = ({ children, loading, breadcrumbs }) => {
  14. const { isOpen, onClose, onOpen } = useDisclosure();
  15. const menubg = useColorModeValue('#F1F3F4', '#202736');
  16. const bg = useColorModeValue('white', '#1a202c');
  17. const renderContent = () => {
  18. if (loading) {
  19. return (
  20. <Flex className="justify-center flex-1">
  21. <Spinner />
  22. </Flex>
  23. );
  24. }
  25. return children;
  26. };
  27. const renderBreadcrumbs = () => {
  28. return (
  29. <Breadcrumb spacing="8px" separator={<FiChevronRight color="gray.500" />}>
  30. {breadcrumbs?.map((breadcrumb, index) => {
  31. return (
  32. <BreadcrumbItem className="hover:underline" isCurrentPage={breadcrumb.current} key={index}>
  33. <Link href={breadcrumb.href}>{breadcrumb.name}</Link>
  34. </BreadcrumbItem>
  35. );
  36. })}
  37. </Breadcrumb>
  38. );
  39. };
  40. return (
  41. <>
  42. <Head>
  43. <title>Tipi</title>
  44. </Head>
  45. <Flex height="100vh" direction="column">
  46. <MenuDrawer isOpen={isOpen} onClose={onClose}>
  47. <Menu />
  48. </MenuDrawer>
  49. <Header onClickMenu={onOpen} />
  50. <Flex flex={1}>
  51. <Flex height="100vh" bg={menubg} className="sticky top-0 invisible md:visible w-0 md:w-64">
  52. <Menu />
  53. </Flex>
  54. <Box bg={bg} className="flex-1 px-4 py-4 md:px-10 md:py-8">
  55. {renderBreadcrumbs()}
  56. {renderContent()}
  57. </Box>
  58. </Flex>
  59. </Flex>
  60. </>
  61. );
  62. };
  63. export default Layout;