import React, { useState, useRef, useEffect } from 'react' import { Image, Repeater, types, Link, useAdminContext, } from 'react-bricks/frontend' import { useReactBricksContext } from 'react-bricks/frontend' import { FiMenu, FiX } from 'react-icons/fi' import { BsMoonFill, BsSunFill } from 'react-icons/bs' import blockNames from '../blockNames' import { bgColors, buttonColors } from '../colors' import { backgroundColorsEditProps, borderBottomEditProp, LayoutProps, sectionDefaults, } from '../LayoutSideProps' import Section from '../shared/components/Section' import useOnClickOutside from './useClickOutside' interface HeaderProps extends LayoutProps { menuItems: types.RepeaterItems logo: types.IImageSource buttons: types.RepeaterItems } const Header: types.Brick = ({ backgroundColor, borderBottom, logo, menuItems, buttons, }) => { const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const { isDarkColorMode, toggleColorMode } = useReactBricksContext() const [mounted, setMounted] = useState(false) const { isAdmin } = useAdminContext() // - in Admin get the current theme from `isDarkColorMode` // - in the frontend page get the current theme from localStorage const currentTheme = isAdmin ? isDarkColorMode ? 'dark' : 'light' : typeof window === 'undefined' ? '' : localStorage.getItem('color-mode') useEffect(() => { setMounted(true) }, []) const ref = useRef(null) useOnClickOutside(ref, () => setMobileMenuOpen(false)) return (
) } Header.schema = { name: blockNames.Header, label: 'Header', category: 'layout', tags: ['header', 'menu'], previewImageUrl: `/bricks-preview-images/${blockNames.Header}.png`, playgroundLinkLabel: 'View source code on Github', playgroundLinkUrl: 'https://github.com/ReactBricks/reactbricks-starters/blob/main/packages/reactbricks-ui/nextjs-pages/src/layout/Header.tsx', repeaterItems: [ { name: 'menuItems', itemType: blockNames.HeaderMenuItem, itemLabel: 'Item', min: 0, max: 6, }, { name: 'buttons', itemType: blockNames.Button, itemLabel: 'Button', min: 0, max: 2, }, ], sideEditProps: [ { groupName: 'Layout', defaultOpen: true, props: [backgroundColorsEditProps, borderBottomEditProp], }, ], getDefaultProps: () => ({ backgroundColor: bgColors.WHITE.value, borderBottom: 'none', menuItems: [ { linkPath: '/', linkText: 'Home', }, { linkPath: '/about-us', linkText: 'About us', }, { linkPath: '', linkText: 'Features', submenuItems: [ { linkText: 'Visual editing', linkDescription: 'The best visual experience for your content editors', linkPath: '/', }, ], }, ], logo: { src: 'https://images.reactbricks.com/original/a63a73db-8df4-4a01-9084-44b8217332cf.svg', placeholderSrc: 'https://images.reactbricks.com/original/a63a73db-8df4-4a01-9084-44b8217332cf.svg', srcSet: '', width: 450, height: 100, alt: 'React Bricks', seoName: 'react-bricks', }, buttons: [ { type: 'link', text: 'Edit content', href: '/admin', isTargetBlank: true, buttonType: 'submit', buttonColor: buttonColors.SKY.value, variant: 'solid', padding: 'small', simpleAnchorLink: true, }, ], }), stories: [ { id: 'header-dark', name: 'Header dark', previewImageUrl: `/bricks-preview-images/header-dark.png`, showAsBrick: true, props: { ...sectionDefaults, borderBottom: 'none', backgroundColor: bgColors.DARK_GRAY.value, menuItems: [ { linkPath: '/', linkText: 'Home', }, { linkPath: '/about-us', linkText: 'About us', }, ], logo: { src: 'https://images.reactbricks.com/original/881feb54-54af-46d5-8825-31e22ccbac25.webp', placeholderSrc: 'https://images.reactbricks.com/placeholder/881feb54-54af-46d5-8825-31e22ccbac25.jpg', srcSet: 'https://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-600.webp 600w,\nhttps://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-450.webp 450w,\nhttps://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-300.webp 300w,\nhttps://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-150.webp 150w,\nhttps://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-75.webp 75w', width: 5314, height: 1181, alt: 'React Bricks', seoName: 'react-bricks', fallbackSrc: 'https://images.reactbricks.com/original/881feb54-54af-46d5-8825-31e22ccbac25.png', fallbackSrcSet: 'https://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-600.png 600w,\nhttps://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-450.png 450w,\nhttps://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-300.png 300w,\nhttps://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-150.png 150w,\nhttps://images.reactbricks.com/src_set/881feb54-54af-46d5-8825-31e22ccbac25-75.png 75w', fallbackType: 'image/png', }, buttons: [ { type: 'link', text: 'Edit content', href: '/admin', isTargetBlank: true, buttonType: 'submit', buttonColor: buttonColors.SKY.value, variant: 'outline', padding: 'small', simpleAnchorLink: true, }, ], }, }, ], } export default Header