import React, { ComponentProps, DetailedHTMLProps, HTMLAttributes, ReactNode, } from "react"; import { twMerge } from "tailwind-merge"; import Link from "../layout/Link"; import { twuiAddActiveLinksFn } from "./HeaderNav"; import Row from "../layout/Row"; import Divider from "../layout/Divider"; import Button from "../layout/Button"; export type TWUI_LINK_LIST_LINK_OBJECT = { title?: string; url?: string; strict?: boolean; icon?: ReactNode; iconPosition?: "before" | "after"; linkProps?: ComponentProps; buttonProps?: Omit, "title">; linkType?: "button" | "link"; divider?: ReactNode; onClick?: React.MouseEventHandler; }; export type TWUI_LINK_LIST_PROPS = DetailedHTMLProps< HTMLAttributes, HTMLDivElement > & { links: ( | TWUI_LINK_LIST_LINK_OBJECT | TWUI_LINK_LIST_LINK_OBJECT[] | undefined )[]; linkProps?: ComponentProps; buttonProps?: Omit, "title">; divider?: boolean; dividerComponent?: ReactNode; linkType?: "button" | "link"; }; /** * # Link List Component * @description A component that renders a list of links. * @className_wrapper twui-link-list */ export default function LinkList({ links, linkProps, buttonProps, divider, dividerComponent, linkType, ...props }: TWUI_LINK_LIST_PROPS) { const listRef = React.useRef(null); React.useEffect(() => { twuiAddActiveLinksFn({ wrapperEl: listRef.current || undefined, selector: "a", }); }, []); return (
{links .flat() .filter((ln) => Boolean(ln)) .map((link, index) => { if (!link) return null; if (link.divider) return ( {link.divider} ); const finalDivider = index < links.length - 1 && (dividerComponent ? ( dividerComponent ) : divider ? ( ) : undefined); if (linkType == "button" || link.linkType == "button") { return ( {finalDivider} ); } return ( { link.onClick?.(e); link.linkProps?.onClick?.(e); }} > {!link.iconPosition || link.iconPosition == "before" ? link.icon : null} {link.title} {link.iconPosition == "after" ? link.icon : null} {finalDivider} ); })}
); }