diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-11-14 19:07:14 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-11-14 19:07:14 +0100 |
| commit | be4d907efb4e2fa658baa7c9b276ed282eb920db (patch) | |
| tree | 0a7bd2d955ce9f9d5e252684ae6735bff7e9bd77 /src/components/organisms/widgets/toc-widget/toc-widget.tsx | |
| parent | a3a4c50f26b8750ae1c87f1f1103b84b7d2e6315 (diff) | |
refactor(components, hooks): rewrite ToC and useHeadingsTree
* replace TableOfContents component with TocWidget to keep the name of
widget components coherent
* replace `wrapper` prop with `tree` prop (the component no longer uses
the hook, it is up to the consumer to provide the headings tree)
* let consumer handle the widget title
* add options to useHeadingsTree hook to retrieve only the wanted
headings (and do not assume that h1 is unwanted)
* expect an ref object instead of an element in useHeadingsTree hook
* rename most of the types involved
Diffstat (limited to 'src/components/organisms/widgets/toc-widget/toc-widget.tsx')
| -rw-r--r-- | src/components/organisms/widgets/toc-widget/toc-widget.tsx | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/components/organisms/widgets/toc-widget/toc-widget.tsx b/src/components/organisms/widgets/toc-widget/toc-widget.tsx new file mode 100644 index 0000000..c2d015a --- /dev/null +++ b/src/components/organisms/widgets/toc-widget/toc-widget.tsx @@ -0,0 +1,44 @@ +import { type ForwardRefRenderFunction, forwardRef } from 'react'; +import type { HeadingsTreeNode } from '../../../../utils/hooks'; +import { + LinksWidget, + type LinksWidgetItemData, + type LinksWidgetProps, +} from '../links-widget'; +import styles from './toc-widget.module.scss'; + +const getLinksItemFrom = (tree: HeadingsTreeNode[]): LinksWidgetItemData[] => + tree.map((node) => { + return { + child: node.children.length ? getLinksItemFrom(node.children) : undefined, + id: node.id, + label: node.label, + url: `#${node.id}`, + }; + }); + +export type TocWidgetProps = Omit<LinksWidgetProps, 'isOrdered' | 'items'> & { + /** + * The headings tree. + */ + tree: HeadingsTreeNode[]; +}; + +const TocWidgetWithRef: ForwardRefRenderFunction< + HTMLDivElement, + TocWidgetProps +> = ({ className = '', tree, ...props }, ref) => { + const wrapperClass = `${styles.toc} ${className}`; + + return ( + <LinksWidget + {...props} + className={wrapperClass} + isOrdered + items={getLinksItemFrom(tree)} + ref={ref} + /> + ); +}; + +export const TocWidget = forwardRef(TocWidgetWithRef); |
