1import { CodeBlock } from '~/components/base/code';
2import { TypeDefinitionData } from '~/components/plugins/api/APIDataTypes';
3import { resolveTypeName } from '~/components/plugins/api/APISectionUtils';
4import { CODE } from '~/ui/components/Text';
5
6const typeDefinitionContainsObject = (typDef: TypeDefinitionData) =>
7  typDef.type === 'reflection' && typDef.declaration?.children;
8
9type APIDataTypeProps = { typeDefinition: TypeDefinitionData; inline?: boolean };
10
11export const APIDataType = ({ typeDefinition, inline = true }: APIDataTypeProps) => {
12  const { type, declaration, types, elementType, typeArguments } = typeDefinition;
13
14  const isObjectDefinition = type === 'reflection' && declaration?.children?.length;
15  const isIntersectionWithObject =
16    type === 'intersection' && types?.filter(typeDefinitionContainsObject).length;
17  const isUnionWithObject =
18    (type === 'union' || (elementType && elementType.type === 'union')) &&
19    types?.filter(typeDefinitionContainsObject).length;
20  const isObjectWrapped =
21    type === 'reference' &&
22    typeArguments &&
23    typeArguments?.filter(typeDefinitionContainsObject).length;
24
25  return isObjectDefinition || isIntersectionWithObject || isUnionWithObject || isObjectWrapped ? (
26    <CodeBlock inline={inline} key={typeDefinition.name}>
27      {resolveTypeName(typeDefinition)}
28    </CodeBlock>
29  ) : (
30    <CODE key={typeDefinition.name}>{resolveTypeName(typeDefinition)}</CODE>
31  );
32};
33