-
Notifications
You must be signed in to change notification settings - Fork 6.5k
Expand file tree
/
Copy pathindex.tsx
More file actions
58 lines (47 loc) · 1.39 KB
/
index.tsx
File metadata and controls
58 lines (47 loc) · 1.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import Signature from '#ui/Common/Signature';
import type { ComponentProps, FC } from 'react';
type SignatureDefinition = Omit<
ComponentProps<typeof Signature>,
'children'
> & {
children?: Array<SignatureDefinition>;
};
type FunctionSignatureProps = {
title?: string;
items: Array<SignatureDefinition>;
};
const renderSignature = (param: SignatureDefinition, index: number) => (
<Signature
key={`${param.name}-${index}`}
name={param.name}
type={param.type}
optional={param.optional}
description={param.description}
kind={param.kind}
>
{param.children?.map((child, i) => renderSignature(child, i))}
</Signature>
);
const FunctionSignature: FC<FunctionSignatureProps> = ({ title, items }) => {
if (title) {
const attributes: Array<SignatureDefinition> = [];
const returnTypes: Array<SignatureDefinition> = [];
for (const item of items) {
const target = item.kind === 'return' ? returnTypes : attributes;
target.push(item);
}
return (
<>
<Signature title={title}>
{attributes.map((param, i) => renderSignature(param, i))}
</Signature>
{returnTypes.length > 0 &&
returnTypes.map((param, i) =>
renderSignature(param, attributes.length + i)
)}
</>
);
}
return items.map((param, i) => renderSignature(param, i));
};
export default FunctionSignature;