-
Notifications
You must be signed in to change notification settings - Fork 57
Expand file tree
/
Copy pathfiletree.jsx
More file actions
62 lines (56 loc) · 1.86 KB
/
filetree.jsx
File metadata and controls
62 lines (56 loc) · 1.86 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
59
60
61
62
/**
* @typedef {(
* {name: string, note?: string}
* )} FileTreeItemCommon
*
* @typedef {(
* | '...'
* | '…'
* | string
* | FileTreeItemCommon & {kind: 'file'}
* | FileTreeItemCommon & {kind: 'folder', open?: boolean, items?: FileTreeItem[] }
* )} FileTreeItem
*
* @param {{ items: FileTreeItem[], defaultOpen?: boolean }} props
*/
export const FileTree = ({ items = [], defaultOpen = true }) => {
/**
* @param {FileTreeItem} item
* @param {import("react").Key | null | undefined} index
*/
const renderItem = (item, index) => {
// Handle ellipsis items
if (item === "..." || item === "…") {
// @ts-ignore
return <Tree.File key={index} name="…" />;
}
// Handle file items (both string and file objects)
if (typeof item === "string" || item.kind === "file") {
const fileName = typeof item === "string" ? item : item.name;
const note = typeof item === "string" ? null : item.note;
const displayName = note ? `${fileName} — ${note}` : fileName;
// @ts-ignore
return <Tree.File key={index} name={displayName} />;
}
// Handle folder objects
if (item.kind === "folder") {
const isOpen = item.open ?? defaultOpen;
const displayName = item.note ? `${item.name} — ${item.note}` : item.name;
return (
// @ts-ignore
<Tree.Folder key={index} name={displayName} defaultOpen={isOpen}>
{item?.items?.map((nestedItem, nestedIndex) => renderItem(nestedItem, nestedIndex))}
{/* @ts-ignore */}
</Tree.Folder>
);
}
throw new Error(
[
`In the FileTree component, found: ${item}.`,
`Expected either of: ..., …, string, { kind: "file", ... }, or { kind: "folder", ... }`,
].join(' '),
);
};
// @ts-ignore
return <Tree>{items.map((item, index) => renderItem(item, index))}</Tree>;
};