Skip to content

Commit f360770

Browse files
authored
feat(rate): Allow disabling keyboard control (#190)
* ♻️ clean Code * feat(rate): Allow disabling keyboard control * chore: rename * chore: update * typo
1 parent a1ff97a commit f360770

2 files changed

Lines changed: 37 additions & 32 deletions

File tree

src/Rate.tsx

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ export interface RateProps
2727
id?: string;
2828
autoFocus?: boolean;
2929
direction?: string;
30+
/**
31+
* Is keyboard control enabled.
32+
* @default true
33+
*/
34+
keyboard?: boolean;
3035
}
3136

3237
export interface RateRef {
@@ -46,6 +51,7 @@ function Rate(props: RateProps, ref: React.Ref<RateRef>) {
4651
count = 5,
4752
allowHalf = false,
4853
allowClear = true,
54+
keyboard = true,
4955

5056
// Display
5157
character = '★',
@@ -166,39 +172,22 @@ function Rate(props: RateProps, ref: React.Ref<RateRef>) {
166172
const onInternalKeyDown: React.KeyboardEventHandler<HTMLUListElement> = (event) => {
167173
const { keyCode } = event;
168174
const reverse = direction === 'rtl';
169-
let nextValue = value;
170-
if (keyCode === KeyCode.RIGHT && nextValue < count && !reverse) {
171-
if (allowHalf) {
172-
nextValue += 0.5;
173-
} else {
174-
nextValue += 1;
175+
const step = allowHalf ? 0.5 : 1;
176+
177+
if (keyboard) {
178+
if (keyCode === KeyCode.RIGHT && value < count && !reverse) {
179+
changeValue(value + step);
180+
event.preventDefault();
181+
} else if (keyCode === KeyCode.LEFT && value > 0 && !reverse) {
182+
changeValue(value - step);
183+
event.preventDefault();
184+
} else if (keyCode === KeyCode.RIGHT && value > 0 && reverse) {
185+
changeValue(value - step);
186+
event.preventDefault();
187+
} else if (keyCode === KeyCode.LEFT && value < count && reverse) {
188+
changeValue(value + step);
189+
event.preventDefault();
175190
}
176-
changeValue(nextValue);
177-
event.preventDefault();
178-
} else if (keyCode === KeyCode.LEFT && nextValue > 0 && !reverse) {
179-
if (allowHalf) {
180-
nextValue -= 0.5;
181-
} else {
182-
nextValue -= 1;
183-
}
184-
changeValue(nextValue);
185-
event.preventDefault();
186-
} else if (keyCode === KeyCode.RIGHT && nextValue > 0 && reverse) {
187-
if (allowHalf) {
188-
nextValue -= 0.5;
189-
} else {
190-
nextValue -= 1;
191-
}
192-
changeValue(nextValue);
193-
event.preventDefault();
194-
} else if (keyCode === KeyCode.LEFT && nextValue < count && reverse) {
195-
if (allowHalf) {
196-
nextValue += 0.5;
197-
} else {
198-
nextValue += 1;
199-
}
200-
changeValue(nextValue);
201-
event.preventDefault();
202191
}
203192

204193
onKeyDown?.(event);

tests/simple.spec.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,22 @@ describe('rate', () => {
314314
wrapper.simulate('mouseleave');
315315
expect(handleMouseLeave).toHaveBeenCalled();
316316
});
317+
318+
it('should ignore key presses when keyboard is false', () => {
319+
const mockChange = jest.fn();
320+
const mockKeyDown = jest.fn();
321+
const wrapper = mount(
322+
<Rate
323+
defaultValue={3}
324+
onChange={mockChange}
325+
onKeyDown={mockKeyDown}
326+
keyboard={false}
327+
/>
328+
);
329+
wrapper.simulate('keyDown', { keyCode: KeyCode.LEFT });
330+
expect(mockChange).not.toHaveBeenCalled();
331+
expect(mockKeyDown).toHaveBeenCalled();
332+
});
317333
});
318334

319335
describe('html attributes', () => {

0 commit comments

Comments
 (0)