Skip to content

Commit

Permalink
refactor: onChange API changed (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
vagusX committed Apr 23, 2022
1 parent 5aa4844 commit 0d072c7
Show file tree
Hide file tree
Showing 10 changed files with 47 additions and 47 deletions.
13 changes: 8 additions & 5 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CI

on:
push:
branches: [ master ]
branches: [master]
pull_request:
branches: [ master ]
branches: [master]

jobs:
setup:
Expand Down Expand Up @@ -43,7 +43,7 @@ jobs:
- name: install
if: steps.node_modules_cache_id.outputs.cache-hit != 'true'
run: npm ci

lint:
runs-on: ubuntu-latest
steps:
Expand All @@ -65,8 +65,11 @@ jobs:
- name: lint
run: npm run lint

- name: type:check
run: npm run type:check

needs: setup

compile:
runs-on: ubuntu-latest
steps:
Expand All @@ -89,7 +92,7 @@ jobs:
run: npm run compile

needs: setup

coverage:
runs-on: ubuntu-latest
steps:
Expand Down
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,17 @@ import { render } from 'react-dom';
render(
<Segmented
options={['Antd', 'Antv', 'Egg.js']}
onChange={(e) => handleValueChange(e.target.value)}
onChange={(value) => handleValueChange(value)}
/>,
mountNode,
);
```

## API

Please note that **onChange** API
changed on v2.0.0+

| Property | Type | Default | Description |
| --------- | --------- | --------- | --------- |
| prefixCls | string | rc-segmented | prefixCls of this component |
Expand All @@ -52,7 +55,7 @@ render(
| value | string \| number | | value of segmented |
| defaultValue | string \| number | | defaultValue of segmented |
| value | string \| number | | currently selected value of segmented |
| onChange | (e: any) => void | | defaultValue of segmented |
| onChange | (value: string \| number) => void | | defaultValue of segmented |
| disabled | boolean | false | disabled status of segmented |

### SegmentedOption
Expand Down
4 changes: 2 additions & 2 deletions docs/examples/basic.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ export default function App() {
<div className="wrapper">
<Segmented
options={['iOS', 'Android', 'Web']}
onChange={(e) => console.log(e.target.value, typeof e.target.value)}
onChange={(value) => console.log(value, typeof value)}
/>
</div>
<div className="wrapper">
<Segmented
options={[13333333333, 157110000, 12110086]}
onChange={(e) => console.log(e.target.value, typeof e.target.value)}
onChange={(value) => console.log(value, typeof value)}
/>
</div>
<div className="wrapper">
Expand Down
8 changes: 4 additions & 4 deletions docs/examples/controlled.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,19 @@ export default class Demo extends React.Component<
<Segmented
options={['iOS', 'Android', 'Web3']}
value={this.state.value}
onChange={(e) =>
onChange={(value) =>
this.setState({
value: e.target.value,
value,
})
}
/>
&nbsp;&nbsp;
<Segmented
options={['iOS', 'Android', 'Web3']}
value={this.state.value}
onChange={(e) =>
onChange={(value) =>
this.setState({
value: e.target.value,
value,
})
}
/>
Expand Down
11 changes: 8 additions & 3 deletions docs/examples/refs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ class ClassComponentWithStringRef extends React.Component {
}

render() {
return <Segmented options={['iOS', 'Android', 'Web']} ref="segmentedRef" />;
return (
<Segmented
options={['iOS', 'Android', 'Web']}
ref={'segmentedRef' as any}
/>
);
}
}

Expand All @@ -34,7 +39,7 @@ class ClassComponentWithCreateRef extends React.Component<
Record<string, never>,
Record<string, never>
> {
segmentedRef = React.createRef();
segmentedRef = React.createRef<HTMLDivElement>();

componentDidMount() {
console.log(this.segmentedRef.current, 'ref');
Expand All @@ -48,7 +53,7 @@ class ClassComponentWithCreateRef extends React.Component<
}

function FunctionalComponent() {
const segmentedRef = React.useRef();
const segmentedRef = React.useRef<HTMLDivElement>(null);
React.useEffect(() => {
console.log(segmentedRef.current, 'ref');
}, []);
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"license": "MIT",
"scripts": {
"start": "dumi dev",
"type:check": "tsc --noEmit",
"docs:build": "dumi build",
"docs:deploy": "gh-pages -d .doc",
"compile": "father build && lessc assets/index.less assets/index.css",
Expand Down
23 changes: 4 additions & 19 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,12 @@ export interface SegmentedLabeledOption {

type SegmentedOptions = (SegmentedRawOption | SegmentedLabeledOption)[];

type ExtendedHTMLInputElement = Omit<HTMLInputElement, 'value'> & {
value: SegmentedValue;
};

export interface SegmentedProps extends React.HTMLProps<HTMLDivElement> {
export interface SegmentedProps
extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {
options: SegmentedOptions;
defaultValue?: SegmentedValue;
value?: SegmentedValue;
onChange?: (e: React.ChangeEvent<ExtendedHTMLInputElement>) => void;
onChange?: (value: SegmentedValue) => void;
disabled?: boolean;
prefixCls?: string;
direction?: 'ltr' | 'rtl';
Expand Down Expand Up @@ -230,19 +227,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(

setSelected(val);

if (onChange) {
const mutatedTarget = Object.create(event.target, {
value: {
value: val,
},
});
const mutatedEvent = Object.create(event, {
target: {
value: mutatedTarget,
},
});
onChange(mutatedEvent);
}
onChange?.(val);
};

// --- motion event handlers for thumb move
Expand Down
21 changes: 11 additions & 10 deletions tests/index.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ describe('rc-segmented', () => {
const wrapper = mount(
<Segmented
options={['iOS', 'Android', 'Web']}
onChange={(e) => handleValueChange(e.target.value)}
onChange={(value) => handleValueChange(value)}
/>,
);
expect(wrapper.render()).toMatchSnapshot();
Expand Down Expand Up @@ -108,7 +108,7 @@ describe('rc-segmented', () => {
const wrapper = mount(
<Segmented
options={[1, 2, 3, 4, 5]}
onChange={(e) => handleValueChange(e.target.value)}
onChange={(value) => handleValueChange(value)}
/>,
);
expect(wrapper.render()).toMatchSnapshot();
Expand All @@ -133,7 +133,7 @@ describe('rc-segmented', () => {
const wrapper = mount(
<Segmented
options={['iOS', { label: 'Android', value: 'Android' }, 'Web']}
onChange={(e) => handleValueChange(e.target.value)}
onChange={(value) => handleValueChange(value)}
/>,
);
expect(wrapper.render()).toMatchSnapshot();
Expand All @@ -157,7 +157,7 @@ describe('rc-segmented', () => {
{ label: 'Android', value: 'Android', disabled: true },
'Web',
]}
onChange={(e) => handleValueChange(e.target.value)}
onChange={(value) => handleValueChange(value)}
/>,
);
expect(wrapper.render()).toMatchSnapshot();
Expand Down Expand Up @@ -197,7 +197,7 @@ describe('rc-segmented', () => {
<Segmented
options={['iOS', 'Android', 'Web']}
disabled
onChange={(e) => handleValueChange(e.target.value)}
onChange={(value) => handleValueChange(value)}
/>,
);
expect(wrapper.render()).toMatchSnapshot();
Expand Down Expand Up @@ -248,7 +248,8 @@ describe('rc-segmented', () => {
/>,
);

expect(wrapper.find(Segmented).getElement().ref).toBe(ref);
const segmentedEl = wrapper.find(Segmented).getElement();
expect((segmentedEl as any).ref).toBe(ref);
});

it('render segmented with controlled mode', () => {
Expand All @@ -262,9 +263,9 @@ describe('rc-segmented', () => {
<Segmented
options={['iOS', 'Android', 'Web3']}
value={this.state.value}
onChange={(e) =>
onChange={(value) =>
this.setState({
value: e.target.value,
value,
})
}
/>
Expand Down Expand Up @@ -320,7 +321,7 @@ describe('rc-segmented', () => {
const wrapper = mount(
<Segmented
options={['iOS', 'Android', 'Web3']}
onChange={(e) => handleValueChange(e.target.value)}
onChange={(value) => handleValueChange(value)}
/>,
);
expect(wrapper.render()).toMatchSnapshot();
Expand Down Expand Up @@ -404,7 +405,7 @@ describe('rc-segmented', () => {
<Segmented
options={[null, undefined, ''] as any}
disabled
onChange={(e) => handleValueChange(e.target.value)}
onChange={(value) => handleValueChange(value)}
/>,
);
expect(wrapper.render()).toMatchSnapshot();
Expand Down
2 changes: 1 addition & 1 deletion tests/wrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ export function mount<
P = C['props'],
S = C['state'],
>(...args: MountParam) {
return enzymeMount(...args) as WrapperType<P, S, C>;
return enzymeMount(...args) as unknown as WrapperType<P, S, C>;
}
4 changes: 3 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,7 @@
"@@/*": ["src/.umi/*"],
"rc-segmented": ["src/index.tsx"]
}
}
},
"include": ["src", "tests", "docs/examples"],
"exclude": [".umi*"]
}

0 comments on commit 0d072c7

Please sign in to comment.