import { type ForwardRefRenderFunction, forwardRef, useCallback } from 'react';
import { Link, List, ListItem } from '../../../atoms';
import { Collapsible, type CollapsibleProps } from '../../../molecules';
import styles from './links-widget.module.scss';
export type LinksWidgetItemData = {
/**
* An array of name/url couple child of this list item.
*/
child?: LinksWidgetItemData[];
/**
* The item id.
*/
id: string;
/**
* The item name.
*/
label: string;
/**
* The item url.
*/
url: string;
};
export type LinksWidgetProps = Omit<
CollapsibleProps,
'children' | 'disablePadding' | 'hasBorders'
> & {
/**
* Should the links be ordered?
*
* @default false
*/
isOrdered?: boolean;
/**
* The links.
*/
items: LinksWidgetItemData[];
};
const LinksWidgetWithRef: ForwardRefRenderFunction<
HTMLDivElement,
LinksWidgetProps
> = ({ isOrdered = false, items, ...props }, ref) => {
const listClass = [
styles.list,
styles[isOrdered ? 'list--ordered' : 'list--unordered'],
].join(' ');
const getLinksList = useCallback(
(data: LinksWidgetItemData[]) => (
{data.map((item) => (
{item.label}
{item.child?.length ? getLinksList(item.child) : null}
))}
),
[isOrdered, listClass]
);
return (
{getLinksList(items)}
);
};
/**
* LinksWidget component
*
* Render a list of links inside a widget.
*/
export const LinksWidget = forwardRef(LinksWidgetWithRef);