Skip to content

Commit 6c7e005

Browse files
committed
refactor: global update & refactoring + allow opening and closing nodes programmatically
1 parent 0da4fa8 commit 6c7e005

19 files changed

+12290
-12392
lines changed

.babelrc.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ const {BUILD_TYPE} = process.env;
22
const isCjs = BUILD_TYPE === 'cjs';
33
const isLib = BUILD_TYPE === 'lib';
44

5-
module.exports = api => ({
5+
module.exports = (api) => ({
66
plugins: [
77
[require('@babel/plugin-proposal-class-properties'), {loose: true}],
88
[require('@babel/plugin-proposal-optional-chaining'), {loose: true}],
9+
[
10+
require('@babel/plugin-proposal-nullish-coalescing-operator'),
11+
{loose: true},
12+
],
913
...(isLib
1014
? []
1115
: [

.eslintignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
**/node_modules/**/*
22
**/dist/**/*
33
docs
4-
*.ts
5-
*.tsx

.eslintrc

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
{
2-
"extends": ["eslint-config-poetez", "plugin:prettier/recommended"],
2+
"extends": [
3+
"eslint-config-poetez/typescript-react",
4+
"eslint-config-prettier/@typescript-eslint",
5+
"prettier/react",
6+
"plugin:prettier/recommended"
7+
],
38
"env": {
4-
"node": true
9+
"browser": true,
10+
"node": true,
11+
"es6": true,
12+
"jest": true
513
},
614
"rules": {
7-
"global-require": "off"
15+
"guard-for-in": "off",
16+
"react/sort-comp": "off"
817
}
918
}

.storybook/webpack.config.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/* eslint-disable sort-keys */
2-
31
module.exports = ({config}) => {
42
config.devtool = 'eval';
53

__stories__/FixedSizeTree.story.tsx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import {number, withKnobs} from '@storybook/addon-knobs';
22
import {storiesOf} from '@storybook/react';
33
import * as React from 'react';
44
import AutoSizer from 'react-virtualized-auto-sizer';
5-
import Tree, {
5+
import {
66
FixedSizeNodeComponentProps,
77
FixedSizeNodeData,
8-
} from '../src/FixedSizeTree';
8+
FixedSizeTree,
9+
} from '../src';
910

1011
document.body.style.margin = '0';
1112
document.body.style.display = 'flex';
@@ -15,22 +16,23 @@ const root = document.getElementById('root')!;
1516
root.style.margin = '10px 0 0 10px';
1617
root.style.flex = '1';
1718

18-
type DataNode = {
19+
type DataNode = Readonly<{
1920
children: DataNode[];
2021
id: number;
2122
name: string;
22-
};
23+
}>;
2324

24-
type StackElement = {
25+
type StackElement = Readonly<{
2526
nestingLevel: number;
2627
node: DataNode;
27-
};
28+
}>;
2829

29-
type ExtendedData = {
30-
readonly isLeaf: boolean;
31-
readonly name: string;
32-
readonly nestingLevel: number;
33-
};
30+
type ExtendedData = FixedSizeNodeData &
31+
Readonly<{
32+
isLeaf: boolean;
33+
name: string;
34+
nestingLevel: number;
35+
}>;
3436

3537
let nodeId = 0;
3638

@@ -47,7 +49,6 @@ const createNode = (depth: number = 0) => {
4749
return node;
4850
}
4951

50-
// tslint:disable-next-line:increment-decrement
5152
for (let i = 0; i < 5; i++) {
5253
node.children.push(createNode(depth + 1));
5354
}
@@ -61,7 +62,7 @@ const defaultButtonStyle = {fontFamily: 'Courier New'};
6162

6263
function* treeWalker(
6364
refresh: boolean,
64-
): Generator<FixedSizeNodeData<ExtendedData> | string | symbol, void, boolean> {
65+
): Generator<ExtendedData | string | symbol, void, boolean> {
6566
const stack: StackElement[] = [];
6667

6768
stack.push({
@@ -84,7 +85,6 @@ function* treeWalker(
8485
: id;
8586

8687
if (node.children.length !== 0 && isOpened) {
87-
// tslint:disable-next-line:increment-decrement
8888
for (let i = node.children.length - 1; i >= 0; i--) {
8989
stack.push({
9090
nestingLevel: nestingLevel + 1,
@@ -117,23 +117,23 @@ const Node: React.FunctionComponent<FixedSizeNodeComponentProps<
117117
</div>
118118
);
119119

120-
interface TreePresenterProps {
120+
type TreePresenterProps = {
121121
readonly itemSize: number;
122-
}
122+
};
123123

124124
const TreePresenter: React.FunctionComponent<TreePresenterProps> = ({
125125
itemSize,
126126
}) => (
127127
<AutoSizer disableWidth>
128128
{({height}) => (
129-
<Tree<ExtendedData>
129+
<FixedSizeTree
130130
treeWalker={treeWalker}
131131
itemSize={itemSize}
132132
height={height}
133133
width="100%"
134134
>
135135
{Node}
136-
</Tree>
136+
</FixedSizeTree>
137137
)}
138138
</AutoSizer>
139139
);

__stories__/VariableSizeTree.story.tsx

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import {number, withKnobs} from '@storybook/addon-knobs';
22
import {storiesOf} from '@storybook/react';
3-
import * as React from 'react';
3+
import React, {FC} from 'react';
44
import AutoSizer from 'react-virtualized-auto-sizer';
5-
import Tree, {
5+
import {
66
VariableSizeNodeComponentProps,
77
VariableSizeNodeData,
8-
} from '../src/VariableSizeTree';
8+
VariableSizeTree,
9+
} from '../src';
910

1011
document.body.style.margin = '0';
1112
document.body.style.display = 'flex';
@@ -15,22 +16,23 @@ const root = document.getElementById('root')!;
1516
root.style.margin = '10px 0 0 10px';
1617
root.style.flex = '1';
1718

18-
type DataNode = {
19+
type DataNode = Readonly<{
1920
children: DataNode[];
2021
id: number;
2122
name: string;
22-
};
23+
}>;
2324

24-
type StackElement = {
25+
type StackElement = Readonly<{
2526
nestingLevel: number;
2627
node: DataNode;
27-
};
28+
}>;
2829

29-
type ExtendedData = {
30-
readonly isLeaf: boolean;
31-
readonly name: string;
32-
readonly nestingLevel: number;
33-
};
30+
type ExtendedData = VariableSizeNodeData &
31+
Readonly<{
32+
isLeaf: boolean;
33+
name: string;
34+
nestingLevel: number;
35+
}>;
3436

3537
let nodeId = 0;
3638

@@ -47,7 +49,6 @@ const createNode = (depth: number = 0) => {
4749
return node;
4850
}
4951

50-
// tslint:disable-next-line:increment-decrement
5152
for (let i = 0; i < 5; i++) {
5253
node.children.push(createNode(depth + 1));
5354
}
@@ -59,9 +60,7 @@ const rootNode = createNode();
5960
const defaultGapStyle = {marginLeft: 10};
6061
const defaultButtonStyle = {fontFamily: 'Courier New'};
6162

62-
const Node: React.FunctionComponent<VariableSizeNodeComponentProps<
63-
ExtendedData
64-
>> = ({
63+
const Node: FC<VariableSizeNodeComponentProps<ExtendedData>> = ({
6564
height,
6665
data: {isLeaf, name, nestingLevel},
6766
isOpen,
@@ -105,23 +104,19 @@ const Node: React.FunctionComponent<VariableSizeNodeComponentProps<
105104
);
106105
};
107106

108-
interface TreePresenterProps {
107+
type TreePresenterProps = Readonly<{
109108
itemSize: number;
110-
}
109+
}>;
111110

112111
const TreePresenter: React.FunctionComponent<TreePresenterProps> = ({
113112
itemSize,
114113
}) => {
115-
const tree = React.useRef<Tree<ExtendedData>>(null);
114+
const tree = React.useRef<VariableSizeTree<ExtendedData>>(null);
116115

117116
const treeWalker = React.useCallback(
118-
function*(
117+
function* treeWalker(
119118
refresh: boolean,
120-
): Generator<
121-
VariableSizeNodeData<ExtendedData> | string | symbol,
122-
void,
123-
boolean
124-
> {
119+
): Generator<ExtendedData | string | symbol, void, boolean> {
125120
const stack: StackElement[] = [];
126121

127122
stack.push({
@@ -145,7 +140,6 @@ const TreePresenter: React.FunctionComponent<TreePresenterProps> = ({
145140
: id;
146141

147142
if (node.children.length !== 0 && isOpened) {
148-
// tslint:disable-next-line:increment-decrement
149143
for (let i = node.children.length - 1; i >= 0; i--) {
150144
stack.push({
151145
nestingLevel: nestingLevel + 1,
@@ -159,21 +153,25 @@ const TreePresenter: React.FunctionComponent<TreePresenterProps> = ({
159153
);
160154

161155
React.useEffect(() => {
162-
tree.current?.recomputeTree({refreshNodes: true, useDefaultHeight: true});
156+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
157+
tree.current?.recomputeTree({
158+
refreshNodes: true,
159+
useDefaultHeight: true,
160+
});
163161
}, [itemSize]);
164162

165163
return (
166164
<AutoSizer disableWidth>
167165
{({height}) => (
168-
<Tree<ExtendedData>
166+
<VariableSizeTree
169167
ref={tree}
170168
itemData={itemSize}
171169
treeWalker={treeWalker}
172170
height={height}
173171
width="100%"
174172
>
175173
{Node}
176-
</Tree>
174+
</VariableSizeTree>
177175
)}
178176
</AutoSizer>
179177
);

0 commit comments

Comments
 (0)