import * as Tabs from '@radix-ui/react-tabs'; import classNames from 'classnames'; import { useRouter } from 'next/router'; import { chdir } from 'process'; import { Children, isValidElement, ReactNode, useCallback, useEffect, useState, } from 'react'; interface GridTabsProps { children: ReactNode; group: string; } export const GridTabs = ({ children, group }: GridTabsProps) => { const { query, asPath, replace } = useRouter(); const [activeTab, setActiveTab] = useState(() => { if (query[group]) { return query[group]; } // Default to first tab return children[0].props.name; }); // Using replace inside an effect causes a render loop. Seems like its not using useCallback // eslint-disable-next-line const safeReplace = useCallback((path: string) => replace(path), []); // Update the query string in the url when the active tab changes // uses group property as the query stirng key useEffect(() => { const [url, queryString] = asPath.split('?'); const searchParams = new URLSearchParams(queryString); searchParams.set(group, activeTab as string); safeReplace(`${url}?${searchParams.toString()}`); }, [activeTab, group, asPath, safeReplace]); return ( setActiveTab(value)} > {/* the tabs */} {Children.map(children, (child) => { if (!isValidElement(child)) return null; const isActive = child.props.name === activeTab; const triggerClass = classNames( 'py-4', 'px-12', 'border-t border-neutral-200', 'capitalize', { 'text-vega-pink': isActive, 'bg-white': isActive, } ); return ( {child.props.name} ); })} {/* the content */}
{Children.map(children, (child) => { if (!isValidElement(child)) return null; return ( {child.props.children} ); })}
); }; interface GridTabProps { children: ReactNode; name: string; } export const GridTab = ({ children }: GridTabProps) => { return
{children}
; };