diff --git a/components/Header.tsx b/components/Header.tsx index 3cd13aa41..d67666d57 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -1,10 +1,10 @@ import siteMetadata from '@/data/siteMetadata' -import headerNavLinks from '@/data/headerNavLinks' import Logo from '@/data/logo.svg' import Link from './Link' import MobileNav from './MobileNav' import ThemeSwitch from './ThemeSwitch' import SearchButton from './SearchButton' +import { NavOptions } from './NavOptions' const Header = () => { return ( @@ -26,18 +26,7 @@ const Header = () => {
- {headerNavLinks - .filter((link) => link.href !== '/') - .map((link) => ( - - {link.title} - - ))} + diff --git a/components/MobileNav.tsx b/components/MobileNav.tsx index 962eccc4c..73e122e01 100644 --- a/components/MobileNav.tsx +++ b/components/MobileNav.tsx @@ -4,6 +4,7 @@ import { Dialog, Transition } from '@headlessui/react' import { Fragment, useState } from 'react' import Link from './Link' import headerNavLinks from '@/data/headerNavLinks' +import { NavItem, NavItemChild } from '@/components/NavOptions' const MobileNav = () => { const [navShow, setNavShow] = useState(false) @@ -63,17 +64,15 @@ const MobileNav = () => { >
@@ -107,3 +106,46 @@ const MobileNav = () => { } export default MobileNav + +type RenderMobileNavLinkProps = { + clickFunc: () => void + navLink: NavItem +} + +const RenderMobileNavLink = ({ navLink, clickFunc }: RenderMobileNavLinkProps) => { + const children: NavItemChild[] = navLink?.children || [] + + if (children?.length > 0) { + return ( +
+

+ {navLink.title} +

+
+ {children.map((cLink: NavItemChild) => ( + + {cLink.title} + + ))} +
+
+ ) + } else { + return ( +
+ + {navLink.title} + +
+ ) + } +} diff --git a/components/NavOptions.tsx b/components/NavOptions.tsx new file mode 100644 index 000000000..ca6a6979e --- /dev/null +++ b/components/NavOptions.tsx @@ -0,0 +1,100 @@ +'use client' + +import { Fragment, useEffect, useState } from 'react' +import { useTheme } from 'next-themes' +import { Menu, RadioGroup, Transition } from '@headlessui/react' +import headerNavLinks from '@/data/headerNavLinks' +import Link from 'next/link' + +type NavItemBase = { + title: string +} + +type NavItemWithHref = NavItemBase & { + href: string + children?: never +} + +type NavItemWithChildren = NavItemBase & { + children: NavItemChild[] + href?: never +} + +export type NavItemChild = { + href: string + title: string +} + +export type NavItem = NavItemWithHref | NavItemWithChildren + +export const NavOptions = () => { + return ( + <> + {headerNavLinks + .filter((link) => link.href !== '/') + .map((link) => ( + + ))} + + ) +} + +const RenderNavLink = ({ navItem }: { navItem: NavItem }) => { + if (!navItem.children) { + return ( + + {navItem.title} + + ) + } + return ( +
+ +
+ {navItem.title && ( + + {navItem.title} + + )} +
+ + +
+ {navItem.children && + navItem.children.map((link: NavItemChild) => ( + + {({ active }) => ( + + {link.title} + + )} + + ))} +
+
+
+
+
+ ) +} diff --git a/data/headerNavLinks.ts b/data/headerNavLinks.ts index 8ca9493db..1641e1606 100644 --- a/data/headerNavLinks.ts +++ b/data/headerNavLinks.ts @@ -4,6 +4,13 @@ const headerNavLinks = [ { href: '/tags', title: 'Tags' }, { href: '/projects', title: 'Projects' }, { href: '/about', title: 'About' }, + { + title: 'Dropdown', + children: [ + { href: '/projects', title: 'Projects' }, + { href: '/about', title: 'About' }, + ], + }, ] export default headerNavLinks