'use client'; import { VscListSelection } from '@react-icons/all-files/vsc/VscListSelection'; import { VscSymbolMethod } from '@react-icons/all-files/vsc/VscSymbolMethod'; import { VscSymbolProperty } from '@react-icons/all-files/vsc/VscSymbolProperty'; import { useMemo } from 'react'; export interface TableOfContentsSerializedMethod { kind: 'Method' | 'MethodSignature'; name: string; overloadIndex?: number; } export interface TableOfContentsSerializedProperty { kind: 'Property' | 'PropertySignature'; name: string; } export type TableOfContentsSerialized = TableOfContentsSerializedMethod | TableOfContentsSerializedProperty; export interface TableOfContentsItemProps { serializedMembers: TableOfContentsSerialized[]; } export function TableOfContentsPropertyItem({ property }: { property: TableOfContentsSerializedProperty }) { return ( {property.name} ); } export function TableOfContentsMethodItem({ method }: { method: TableOfContentsSerializedMethod }) { if (method.overloadIndex && method.overloadIndex > 1) { return null; } const key = `${method.name}${method.overloadIndex && method.overloadIndex > 1 ? `:${method.overloadIndex}` : ''}`; return ( {method.name} {method.overloadIndex && method.overloadIndex > 1 ? ( {method.overloadIndex} ) : null} ); } export function TableOfContentItems({ serializedMembers }: TableOfContentsItemProps) { const propertyItems = useMemo( () => serializedMembers .filter( (member): member is TableOfContentsSerializedProperty => member.kind === 'Property' || member.kind === 'PropertySignature', ) .map((prop, idx) => ), [serializedMembers], ); const methodItems = useMemo( () => serializedMembers .filter( (member): member is TableOfContentsSerializedMethod => member.kind === 'Method' || member.kind === 'MethodSignature', ) .map((member, idx) => ( )), [serializedMembers], ); return (
Contents
{propertyItems.length ? (
Properties
{propertyItems}
) : null} {methodItems.length ? (
Methods
{methodItems}
) : null}
); }