import React from 'react';
import { Navigate, useParams } from 'react-router';
import BetaNotice from '../components/BetaNotice.js';
import EventCard from '../components/cards/EventCard.js';
import MethodCard from '../components/cards/MethodCard.js';
import PropertyCard from '../components/cards/PropertyCard.js';
import DeprecationNotice from '../components/DeprecationNotice.js';
import OverviewTable from '../components/overviewTable/OverviewTable.js';
import SymbolHeader from '../components/SymbolHeader.js';
import PageContent from '../containers/PageContent.js';
import type { PackageContainerRouteParams } from '../containers/ReferencePackageContainer.js';
import type {
AccessorReferenceNode,
CallSignatureReferenceNode,
ClassReferenceNode,
ConstructorReferenceNode,
MethodReferenceNode,
PropertyReferenceNode
} from '../reference/index.js';
import { partition } from '../tools/ArrayTools.js';
import { getPageType, getTag, hasTag } from '../tools/CodeTools.js';
import MarkdownParser from '../tools/markdown/MarkdownParser.js';
import { checkVisibility, defaultNodeSort } from '../tools/NodeTools.js';
import { filterChildrenByMember, findSymbolByMember } from '../tools/ReferenceTools.js';
import { getPackagePath } from '../tools/StringTools.js';
interface ClassPageRouteParams extends PackageContainerRouteParams {
name: string;
}
const ClassPage: React.FC = () => {
const { name, packageName } = useParams() as unknown as ClassPageRouteParams;
const symbolDef = findSymbolByMember('name', name, packageName);
if (!symbolDef) {
// TODO
return null;
}
const symbol = symbolDef.symbol as ClassReferenceNode;
const correctPageType = getPageType(symbol);
if (correctPageType !== 'classes') {
return ;
}
const constructor: ConstructorReferenceNode | undefined =
symbol.ctor && checkVisibility(symbol.ctor, symbol) ? symbol.ctor : undefined;
const constructorSigs: CallSignatureReferenceNode[] = constructor?.signatures ?? [];
const methods: MethodReferenceNode[] = filterChildrenByMember(symbol, 'kind', 'method');
methods.sort(defaultNodeSort);
const properties: PropertyReferenceNode[] = filterChildrenByMember(symbol, 'kind', 'property');
const [propertiesWithoutEvents, events] = partition(properties, prop => hasTag(prop, 'eventListener'));
events.sort(defaultNodeSort);
const accessors: AccessorReferenceNode[] = filterChildrenByMember(symbol, 'kind', 'accessor');
const allGetProps = [...propertiesWithoutEvents, ...accessors]
.filter(prop => prop.kind === 'property' || !!prop.getSignature)
.sort(defaultNodeSort);
return (
<>
{hasTag(symbol, 'deprecated') && (
)}
{hasTag(symbol, 'beta') && }
{properties.length || methods.length || accessors.length ? (
<>
Overview
>
) : null}
{symbol.comment?.text && }
{constructorSigs.length ? (
<>
{constructorSigs.length === 1 ? 'Constructor' : 'Constructors'}
{constructorSigs.map(sig => (
))}
>
) : null}
{events.length ? (
<>
Events
{events.map(prop => (
))}
>
) : null}
{propertiesWithoutEvents.length || accessors.length ? (
<>
Properties
{allGetProps.map(prop => {
if (prop.kind === 'property') {
return ;
}
if (!prop.getSignature) {
return null;
}
return ;
})}
>
) : null}
{methods.length ? (
<>
Methods
{methods.map(method =>
method.signatures?.map(sig => (
))
)}
>
) : null}
>
);
};
export default ClassPage;