Skip to content

Commit edc29db

Browse files
add prop-types as a dependency and
validate props
1 parent 2db1273 commit edc29db

File tree

5 files changed

+67
-58
lines changed

5 files changed

+67
-58
lines changed

package-lock.json

Lines changed: 3 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,7 @@
101101
"jest-extended"
102102
]
103103
},
104-
"dependencies": {}
104+
"dependencies": {
105+
"prop-types": "^15.7.2"
106+
}
105107
}

src/panel/panel.js

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
import React, {memo} from 'react';
22
import {ApiContext, ForceUpdateContext} from '../utils/context.js';
33
import panelPropsManager from './panelPropsManager.js';
4-
const Panel = memo(
5-
function Panel(props) {
6-
React.useContext(ForceUpdateContext);
7-
const {id, selectedTabID} = props,
8-
api = React.useContext(ApiContext),
9-
isSelected = id === selectedTabID,
10-
panelProps = panelPropsManager({isSelected, api, id}),
11-
PanelComponent = api.getTab(id).panelComponent;
12-
return (
13-
<div {...panelProps}>
14-
<PanelComponent id={id} isSelected={isSelected} api={api.userProxy}></PanelComponent>
15-
</div>
16-
);
17-
},
18-
(oldProps, newProps) => {
19-
const {id, selectedTabID: oldActiveId} = oldProps,
20-
{selectedTabID: newActiveId} = newProps;
21-
return oldActiveId === newActiveId || (id !== oldActiveId && id !== newActiveId);
22-
},
23-
);
4+
import PropTypes from 'prop-types';
5+
const PanelComponent = function PanelComponent(props) {
6+
React.useContext(ForceUpdateContext);
7+
const {id, selectedTabID} = props,
8+
api = React.useContext(ApiContext),
9+
isSelected = id === selectedTabID,
10+
panelProps = panelPropsManager({isSelected, api, id}),
11+
PanelComponent = api.getTab(id).panelComponent;
12+
return (
13+
<div {...panelProps}>
14+
<PanelComponent id={id} isSelected={isSelected} api={api.userProxy}></PanelComponent>
15+
</div>
16+
);
17+
};
18+
PanelComponent.propTypes = {
19+
id: PropTypes.string,
20+
selectedTabID: PropTypes.string,
21+
};
22+
const Panel = memo(PanelComponent, (oldProps, newProps) => {
23+
const {id, selectedTabID: oldActiveId} = oldProps,
24+
{selectedTabID: newActiveId} = newProps;
25+
return oldActiveId === newActiveId || (id !== oldActiveId && id !== newActiveId);
26+
});
2427
export default Panel;

src/tab/defaulTabInner.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import React from 'react';
2-
const DefaulTabInner = function (props) {
2+
import PropTypes from 'prop-types';
3+
const DefaulTabInner = function DefaulTabInner(props) {
34
return (
45
<button {...props.tabProps}>
56
{props.children}
67
{Object.prototype.hasOwnProperty.call(props, 'iconProps') && <span {...props.iconProps}></span>}
78
</button>
89
);
910
};
11+
DefaulTabInner.propTypes = {
12+
tabProps: PropTypes.object,
13+
children: PropTypes.node,
14+
iconProps: PropTypes.object,
15+
};
1016
export default DefaulTabInner;

src/tab/tab.js

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,35 @@
11
import React, {memo} from 'react';
22
import {ApiContext, ForceUpdateContext} from '../utils/context.js';
33
import TabPropsManager from './tabPropsManager.js';
4-
const Tab = memo(
5-
function Tab(props) {
6-
React.useContext(ForceUpdateContext);
7-
const {id, selectedTabID} = props,
8-
api = React.useContext(ApiContext),
9-
TabInnerComponent = api.getOption('tabComponent'),
10-
tabObj = api.getTab(id),
11-
propsManager = new TabPropsManager({api, id, isSelected: selectedTabID === id}),
12-
clkHandler = function (e) {
13-
api.eventHandlerFactory({e, id});
14-
};
15-
return (
16-
<li
17-
{...propsManager.getTabProps()}
18-
onClick={(e) => {
19-
clkHandler(e);
20-
}}>
21-
<TabInnerComponent {...propsManager.getTabInnerProps()}>{tabObj.title}</TabInnerComponent>
22-
{tabObj.closable ? <span {...propsManager.getCloseIconProps()}>&times;</span> : null}
23-
</li>
24-
);
25-
},
26-
(oldProps, newProps) => {
27-
const {id, selectedTabID: oldActiveId} = oldProps,
28-
{selectedTabID: newActiveId} = newProps;
29-
return oldActiveId === newActiveId || (id !== oldActiveId && id !== newActiveId);
30-
},
31-
);
4+
import PropTypes from 'prop-types';
5+
const TabComponent = function TabComponent(props) {
6+
React.useContext(ForceUpdateContext);
7+
const {id, selectedTabID} = props,
8+
api = React.useContext(ApiContext),
9+
TabInnerComponent = api.getOption('tabComponent'),
10+
tabObj = api.getTab(id),
11+
propsManager = new TabPropsManager({api, id, isSelected: selectedTabID === id}),
12+
clkHandler = function (e) {
13+
api.eventHandlerFactory({e, id});
14+
};
15+
return (
16+
<li
17+
{...propsManager.getTabProps()}
18+
onClick={(e) => {
19+
clkHandler(e);
20+
}}>
21+
<TabInnerComponent {...propsManager.getTabInnerProps()}>{tabObj.title}</TabInnerComponent>
22+
{tabObj.closable ? <span {...propsManager.getCloseIconProps()}>&times;</span> : null}
23+
</li>
24+
);
25+
};
26+
TabComponent.propTypes = {
27+
id: PropTypes.string,
28+
selectedTabID: PropTypes.string,
29+
};
30+
const Tab = memo(TabComponent, (oldProps, newProps) => {
31+
const {id, selectedTabID: oldActiveId} = oldProps,
32+
{selectedTabID: newActiveId} = newProps;
33+
return oldActiveId === newActiveId || (id !== oldActiveId && id !== newActiveId);
34+
});
3235
export default Tab;

0 commit comments

Comments
 (0)