Skip to content

Commit e7e0bd9

Browse files
committed
feat: handle value with undefined/null/``
1 parent 5f06c45 commit e7e0bd9

File tree

4 files changed

+68
-9
lines changed

4 files changed

+68
-9
lines changed

docs/examples/basic.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ export default function App() {
1111
onChange={(e) => console.log(e.target.value, typeof e.target.value)}
1212
/>
1313
</div>
14+
<div className="wrapper">
15+
<Segmented
16+
options={['iOS', 'Android', null, undefined, '', 'Web']}
17+
onChange={(e) => console.log(e.target.value, typeof e.target.value)}
18+
/>
19+
</div>
1420
<div className="wrapper">
1521
<Segmented
1622
options={[13333333333, 157110000, 12110086]}

src/index.tsx

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,13 @@ export interface SegmentedProps extends React.HTMLProps<HTMLDivElement> {
3535
motionName?: string;
3636
}
3737

38-
function isLabledOption(
39-
option: RawOption | LabeledOption,
40-
): option is LabeledOption {
41-
return option === Object(option);
42-
}
43-
4438
function normalizeOptions(options: Options): LabeledOption[] {
4539
return options.map((option) => {
46-
if (isLabledOption(option)) {
47-
return option;
40+
if (typeof option === 'object') {
41+
return option || {};
4842
}
4943
return {
50-
label: String(option),
44+
label: option?.toString(),
5145
value: option,
5246
};
5347
});

tests/__snapshots__/index.spec.tsx.snap

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,48 @@ exports[`rc-segmented render segmented with options 1`] = `
100100
</div>
101101
`;
102102

103+
exports[`rc-segmented render segmented with options null/undefined 1`] = `
104+
<div
105+
class="rc-segmented rc-segmented-disabled"
106+
>
107+
<label
108+
class="rc-segmented-item rc-segmented-item-selected"
109+
>
110+
<input
111+
checked=""
112+
class="rc-segmented-item-input"
113+
type="radio"
114+
/>
115+
<span
116+
class="rc-segmented-item-label"
117+
/>
118+
</label>
119+
<label
120+
class="rc-segmented-item rc-segmented-item-selected"
121+
>
122+
<input
123+
checked=""
124+
class="rc-segmented-item-input"
125+
type="radio"
126+
/>
127+
<span
128+
class="rc-segmented-item-label"
129+
/>
130+
</label>
131+
<label
132+
class="rc-segmented-item"
133+
>
134+
<input
135+
class="rc-segmented-item-input"
136+
type="radio"
137+
/>
138+
<span
139+
class="rc-segmented-item-label"
140+
/>
141+
</label>
142+
</div>
143+
`;
144+
103145
exports[`rc-segmented render segmented with options: 1 1`] = `
104146
<div
105147
class="rc-segmented"

tests/index.spec.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,23 @@ describe('rc-segmented', () => {
199199
).toEqual([true, false, false]);
200200
});
201201

202+
it('render segmented with options null/undefined', () => {
203+
const handleValueChange = jest.fn();
204+
const wrapper = mount(
205+
<Segmented
206+
options={[null, undefined, ''] as any}
207+
disabled
208+
onChange={(e) => handleValueChange(e.target.value)}
209+
/>,
210+
);
211+
expect(wrapper.render()).toMatchSnapshot();
212+
expect(
213+
wrapper
214+
.find('.rc-segmented-item-label')
215+
.map((n) => n.getDOMNode().textContent),
216+
).toEqual(['', '', '']);
217+
});
218+
202219
it('render segmented with className and other html attribues', () => {
203220
const wrapper = mount(
204221
<Segmented

0 commit comments

Comments
 (0)