Skip to content

Commit 8549583

Browse files
authored
Merge pull request #1 from react-component/master
merge
2 parents c0259da + c0963ac commit 8549583

File tree

3 files changed

+28
-15
lines changed

3 files changed

+28
-15
lines changed

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rc-picker",
3-
"version": "2.5.2",
3+
"version": "2.5.5",
44
"description": "React date & time picker",
55
"keywords": [
66
"react",
@@ -41,7 +41,6 @@
4141
"@babel/runtime": "^7.10.1",
4242
"classnames": "^2.2.1",
4343
"date-fns": "^2.15.0",
44-
"dayjs": "^1.8.30",
4544
"moment": "^2.24.0",
4645
"rc-trigger": "^5.0.4",
4746
"rc-util": "^5.4.0",
@@ -60,6 +59,7 @@
6059
"@umijs/fabric": "^2.0.8",
6160
"coveralls": "^3.0.6",
6261
"cross-env": "^7.0.2",
62+
"dayjs": "^1.8.30",
6363
"enzyme": "^3.0.0",
6464
"enzyme-adapter-react-16": "^1.0.1",
6565
"enzyme-to-json": "^3.4.0",
@@ -85,6 +85,7 @@
8585
"mode": "npm"
8686
},
8787
"peerDependencies": {
88+
"dayjs": "^1.8.30",
8889
"react": ">=16.9.0",
8990
"react-dom": ">=16.9.0"
9091
}

src/hooks/usePickerInput.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type * as React from 'react';
22
import { useState, useEffect, useRef } from 'react';
33
import KeyCode from 'rc-util/lib/KeyCode';
4-
import { addGlobalMouseDownEvent } from '../utils/uiUtil';
4+
import { addGlobalMouseDownEvent, getTargetFromEvent } from '../utils/uiUtil';
55

66
export default function usePickerInput({
77
open,
@@ -21,10 +21,7 @@ export default function usePickerInput({
2121
isClickOutside: (clickElement: EventTarget | null) => boolean;
2222
triggerOpen: (open: boolean) => void;
2323
forwardKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;
24-
onKeyDown: (
25-
e: React.KeyboardEvent<HTMLInputElement>,
26-
preventDefault: () => void,
27-
) => void;
24+
onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>, preventDefault: () => void) => void;
2825
blurToCancel?: boolean;
2926
onSubmit: () => void | boolean;
3027
onCancel: () => void;
@@ -49,7 +46,7 @@ export default function usePickerInput({
4946
setTyping(true);
5047
triggerOpen(true);
5148
},
52-
onKeyDown: e => {
49+
onKeyDown: (e) => {
5350
const preventDefault = (): void => {
5451
preventDefaultRef.current = true;
5552
};
@@ -98,7 +95,7 @@ export default function usePickerInput({
9895
}
9996
},
10097

101-
onFocus: e => {
98+
onFocus: (e) => {
10299
setTyping(true);
103100
setFocused(true);
104101

@@ -107,7 +104,7 @@ export default function usePickerInput({
107104
}
108105
},
109106

110-
onBlur: e => {
107+
onBlur: (e) => {
111108
if (preventBlurRef.current || !isClickOutside(document.activeElement)) {
112109
preventBlurRef.current = false;
113110
return;
@@ -145,16 +142,20 @@ export default function usePickerInput({
145142

146143
// Global click handler
147144
useEffect(() =>
148-
addGlobalMouseDownEvent(({ target }: MouseEvent) => {
145+
addGlobalMouseDownEvent((e: MouseEvent) => {
146+
const target = getTargetFromEvent(e);
147+
149148
if (open) {
150-
if (!isClickOutside(target)) {
149+
const clickedOutside = isClickOutside(target);
150+
151+
if (!clickedOutside) {
151152
preventBlurRef.current = true;
152153

153154
// Always set back in case `onBlur` prevented by user
154155
requestAnimationFrame(() => {
155156
preventBlurRef.current = false;
156157
});
157-
} else if (!focused) {
158+
} else if (!focused || clickedOutside) {
158159
triggerOpen(false);
159160
}
160161
}

src/utils/uiUtil.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ export function addGlobalMouseDownEvent(callback: ClickEventHandler) {
201201
if (!globalClickFunc && typeof window !== 'undefined' && window.addEventListener) {
202202
globalClickFunc = (e: MouseEvent) => {
203203
// Clone a new list to avoid repeat trigger events
204-
[...clickCallbacks].forEach(queueFunc => {
204+
[...clickCallbacks].forEach((queueFunc) => {
205205
queueFunc(e);
206206
});
207207
};
@@ -219,6 +219,17 @@ export function addGlobalMouseDownEvent(callback: ClickEventHandler) {
219219
};
220220
}
221221

222+
export function getTargetFromEvent(e: Event) {
223+
const target = e.target as HTMLElement;
224+
225+
// get target if in shadow dom
226+
if (e.composed && target.shadowRoot) {
227+
return (e.composedPath?.()[0] || target) as HTMLElement;
228+
}
229+
230+
return target;
231+
}
232+
222233
// ====================== Mode ======================
223234
const getYearNextMode = (next: PanelMode): PanelMode => {
224235
if (next === 'month' || next === 'date') {
@@ -261,5 +272,5 @@ export function elementsContains(
261272
elements: (HTMLElement | undefined | null)[],
262273
target: HTMLElement,
263274
) {
264-
return elements.some(ele => ele && ele.contains(target));
275+
return elements.some((ele) => ele && ele.contains(target));
265276
}

0 commit comments

Comments
 (0)