Skip to content
This repository was archived by the owner on Jan 14, 2025. It is now read-only.

Commit e5b953f

Browse files
Ben McKernanMatt Goo
Ben McKernan
authored and
Matt Goo
committed
fix(icon-button): upgrade to mdc-web v1.1 (#792)
1 parent 9c7bfa7 commit e5b953f

File tree

5 files changed

+68
-29
lines changed

5 files changed

+68
-29
lines changed

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"@material/drawer": "^1.0.1",
7272
"@material/fab": "^1.1.0",
7373
"@material/floating-label": "^1.0.0",
74-
"@material/icon-button": "^0.41.0",
74+
"@material/icon-button": "^1.1.0",
7575
"@material/layout-grid": "^0.41.0",
7676
"@material/line-ripple": "^1.0.0",
7777
"@material/linear-progress": "^1.1.0",

packages/icon-button/index.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323
import * as React from 'react';
2424
import classnames from 'classnames';
2525
import * as Ripple from '@material/react-ripple';
26-
// @ts-ignore no mdc .d.ts file
27-
import {MDCIconButtonToggleFoundation} from '@material/icon-button/dist/mdc.iconButton';
26+
import {MDCIconButtonToggleAdapter} from '@material/icon-button/adapter';
27+
import {MDCIconButtonToggleFoundation} from '@material/icon-button/foundation';
28+
import {MDCIconButtonToggleEventDetail} from '@material/icon-button/types';
2829
import IconToggle from './IconToggle';
2930
const ARIA_PRESSED = 'aria-pressed';
3031

@@ -35,6 +36,7 @@ interface ElementAttributes {
3536

3637
type IconButtonTypes = HTMLButtonElement | HTMLAnchorElement;
3738
export interface IconButtonBaseProps extends ElementAttributes {
39+
handleChange?: (evt: MDCIconButtonToggleEventDetail) => void;
3840
isLink?: boolean;
3941
};
4042

@@ -49,7 +51,7 @@ class IconButtonBase<T extends IconButtonTypes> extends React.Component<
4951
IconButtonProps<T>,
5052
IconButtonBaseState
5153
> {
52-
foundation = MDCIconButtonToggleFoundation;
54+
foundation!: MDCIconButtonToggleFoundation;
5355

5456
constructor(props: IconButtonProps<T>) {
5557
super(props);
@@ -61,6 +63,7 @@ class IconButtonBase<T extends IconButtonTypes> extends React.Component<
6163

6264
static defaultProps = {
6365
className: '',
66+
handleChange: () => {},
6467
initRipple: () => {},
6568
isLink: false,
6669
onClick: () => {},
@@ -78,17 +81,18 @@ class IconButtonBase<T extends IconButtonTypes> extends React.Component<
7881
return classnames('mdc-icon-button', Array.from(classList), className);
7982
}
8083

81-
get adapter() {
84+
get adapter(): MDCIconButtonToggleAdapter {
8285
return {
8386
addClass: (className: string) =>
8487
this.setState({classList: this.state.classList.add(className)}),
8588
removeClass: (className: string) => {
86-
const classList = new Set(this.state.classList);
89+
const {classList} = this.state;
8790
classList.delete(className);
8891
this.setState({classList});
8992
},
9093
hasClass: (className: string) => this.classes.split(' ').includes(className),
9194
setAttr: this.updateState,
95+
notifyChange: this.props.handleChange!,
9296
};
9397
}
9498

@@ -111,6 +115,7 @@ class IconButtonBase<T extends IconButtonTypes> extends React.Component<
111115
isLink,
112116
/* eslint-disable no-unused-vars */
113117
className,
118+
handleChange,
114119
onClick,
115120
unbounded,
116121
[ARIA_PRESSED]: ariaPressed,

packages/icon-button/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"url": "https://github.com/material-components/material-components-web-react.git"
1818
},
1919
"dependencies": {
20-
"@material/icon-button": "^0.41.0",
20+
"@material/icon-button": "^1.1.0",
2121
"@material/react-ripple": "^0.11.0",
2222
"classnames": "^2.2.6",
2323
"react": "^16.3.2"

test/unit/icon-button/index.test.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as td from 'testdouble';
44
import {shallow} from 'enzyme';
55
import {IconButtonBase as IconButton} from '../../../packages/icon-button/index';
66
import {coerceForTesting} from '../helpers/types';
7+
import {MDCIconButtonToggleEventDetail} from '@material/icon-button/types';
78

89
suite('IconButton');
910

@@ -34,7 +35,7 @@ test('renders anchor tag when isLink is true', () => {
3435

3536
test('#foundation.handleClick gets called onClick', () => {
3637
const wrapper = shallow<IconButton<HTMLButtonElement>>(<IconButton />);
37-
wrapper.instance().foundation.handleClick = td.func();
38+
wrapper.instance().foundation.handleClick = td.func<() => void>();
3839
wrapper.simulate('click');
3940
td.verify(wrapper.instance().foundation.handleClick(), {times: 1});
4041
});
@@ -62,13 +63,13 @@ test('aria-pressed is set false if passed as prop but on className is not passed
6263
test('#get.classes has a class added to state.classList', () => {
6364
const wrapper = shallow(<IconButton />);
6465
wrapper.setState({classList: new Set(['test-class'])});
65-
wrapper.hasClass('test-class');
66+
assert.isTrue(wrapper.hasClass('test-class'));
6667
});
6768

6869
test('#adapter.addClass adds a class to state.classList', () => {
6970
const wrapper = shallow<IconButton<HTMLButtonElement>>(<IconButton />);
7071
wrapper.instance().adapter.addClass('test-class');
71-
wrapper.state().classList.has('test-class');
72+
assert.isTrue(wrapper.state().classList.has('test-class'));
7273
});
7374

7475
test('#adapter.removeClass removes a class to state.classList', () => {
@@ -91,7 +92,14 @@ test('#adapter.hasClass returns false if element does not contains class', () =>
9192

9293
test('#adapter.setAttr sets aria-pressed', () => {
9394
const wrapper = shallow<IconButton<HTMLButtonElement>>(<IconButton />);
94-
wrapper.instance().adapter.setAttr('aria-pressed', true);
95-
assert.isTrue(wrapper.state()['aria-pressed']);
95+
wrapper.instance().adapter.setAttr('aria-pressed', 'true');
96+
assert.equal(wrapper.state('aria-pressed'), 'true');
9697
});
9798

99+
test('#adapter.notifyChange calls props.handleChange', () => {
100+
const handleChange = td.func<(event: MDCIconButtonToggleEventDetail) => void>();
101+
const wrapper = shallow<IconButton<HTMLButtonElement>>(<IconButton handleChange={handleChange} />);
102+
const event = {isOn: false};
103+
wrapper.instance().adapter.notifyChange(event);
104+
td.verify(handleChange(event), {times: 1});
105+
});

0 commit comments

Comments
 (0)