/* eslint-disable react-native/no-inline-styles */ import React, { useCallback, useEffect } from 'react'; import { Breadcrumbs } from '../Breadcrumbs'; import { Sidebar } from '../Sidebar'; import { Box, Text, Pressable, Divider } from '@gluestack-ui/themed'; import { LayoutContext } from './LayoutContext'; import { Icon } from '@gluestack-ui/themed'; export const SidebarRecursive = ({ sidebarItem, version, Link, router, leftIndent, }: any) => { if (sidebarItem?.type === 'heading') { return ( {sidebarItem.title} {sidebarItem?.pages?.map((sidebarPageItems: any) => { // const isActiveRoute = router?.route.includes(sidebarPageItems.id); // console.log('isActiveRoute', isActiveRoute, router?.route); return ( ); })} ); } return ( ); }; const SidebarNodeItem = ({ sidebarItem, Link, router }: any) => { const { setIsOpenSidebar } = React.useContext(LayoutContext); let sidebarItemTag = sidebarItem?.metaData?.tag; // let sidebarItemTagText; // if (sidebarItemTag) { // sidebarItemTagText = sidebarItemTag.toString(); // sidebarItemTagText = // sidebarItemTagText.charAt(0).toUpperCase() + sidebarItemTagText.slice(1); // } const isActiveRoute = router?.route === sidebarItem.id; return ( setIsOpenSidebar(false)} focusable={false} tabIndex={-1} > {sidebarItem.title} {sidebarItemTag && ( {sidebarItemTag} )} ); }; export const LayoutSidebar = ({ fluidLayout, ...props }: any) => { const { sidebarItems: sidebars, version, Link, router, } = React.useContext(LayoutContext); // const [sidebars, setSidebars] = React.useState(props.sidebarItems); // const sidebars = props.sidebarItems; const getHeaders = useCallback(() => { const headerItems = []; for (let i = 0; i < sidebars.length; i++) { if (sidebars[i].type === 'Dropdown') { headerItems.push(sidebars[i]); } } return headerItems; }, [sidebars]); const getSelectedHeader = React.useCallback(() => { const header = getHeaders(); for (let i = 0; i < header.length; i++) { if ( router?.route.includes( header[i]?.title?.toLocaleLowerCase().split(' ').join('-') ) ) { return header[i].title; } } }, [getHeaders, router?.route]); const [selectedHeading, setSelectedHeading] = React.useState( getSelectedHeader() ?? '' ); useEffect(() => { setSelectedHeading(getSelectedHeader()); }, [sidebars, getSelectedHeader]); const [hover, setHover] = React.useState(false); function getFirstPage(headerItem: any) { for (let i = 0; i < sidebars.length; i++) { if (sidebars[i].title === headerItem) { return getId(sidebars[i].pages[0]); } } return router?.route; } function getId(pages: any): string { if (pages?.pages.length > 0) { return getId(pages?.pages[0]); } return pages?.id; } let isActiveRoute: any = false; if (selectedHeading) { isActiveRoute = router?.route.includes( selectedHeading?.toLocaleLowerCase().split(' ').join('-') ) ? true : false; } function getSidebarItems() { for (let i = 0; i < sidebars.length; i++) { if (sidebars[i].title === selectedHeading) { return sidebars[i].pages; } } } const handleHeaderClick = (headerItem: any) => { setSelectedHeading(headerItem.title); }; // TODO: Remove this incase header items are required in case of gluestack-style // TODO: remove below hacky code later if ( // router.pathname.includes('nativewind/docs') || router.pathname.includes('style/docs') ) { return ( { if (!hover) { setHover(true); } }} onMouseLeave={() => { setHover(false); }} // onHoverIn={() => { // console.log('hello world'); // }} > {sidebars?.map((sidebarItems: any) => { return ( ); })} ); } return ( {getHeaders().map((headerItem: any) => { return ( <> handleHeaderClick(headerItem)} mr="$2.5" my={'$0.5'} borderRadius={'$md'} sx={{ bg: isActiveRoute && headerItem.title == selectedHeading ? '$primary100_alpha_50' : 'transparent', _light: { ':hover': { bg: '$primary100_alpha_30', }, }, _dark: { 'bg': isActiveRoute && headerItem.title == selectedHeading ? '$primary600_alpha_50' : undefined, ':hover': { bg: '$primary600_alpha_30', }, }, }} tabIndex={-1} > {headerItem.title} ); })} {getHeaders().length > 0 && } ); }; function RenderSideBarPages({ ...props }: any) { const { version, Link, router } = React.useContext(LayoutContext); const [hover, setHover] = React.useState(false); const sidebarRef: any = React.useRef(null); useEffect(() => { scrollToTop(); }, []); const scrollToTop = async () => { if (sidebarRef) { await sidebarRef?.current?.scrollIntoView({ behavior: 'smooth' }); } }; return ( <> { if (!hover) { setHover(true); } }} onMouseLeave={() => { setHover(false); }} > {/* @ts-ignore */} {props.sidebars?.map((sidebarPagesItems: any) => { return ( ); })} ); }