Skip to content

Commit bf0ddfe

Browse files
committed
chore: post info
1 parent f9dc1fa commit bf0ddfe

5 files changed

Lines changed: 112 additions & 78 deletions

File tree

docs/examples/two-buttons.tsx

Lines changed: 43 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import Trigger from '@rc-component/trigger';
1+
import Trigger, { UniqueProvider } from '@rc-component/trigger';
22
import React from 'react';
33
import '../../assets/index.less';
44

@@ -27,47 +27,49 @@ function getPopupContainer(trigger) {
2727

2828
const MovingPopupDemo = () => {
2929
return (
30-
<div style={{ margin: 100 }}>
31-
<div style={{ display: 'flex', gap: 20 }}>
32-
<Trigger
33-
action={['hover']}
34-
popupPlacement="top"
35-
builtinPlacements={builtinPlacements}
36-
getPopupContainer={getPopupContainer}
37-
popupMotion={{
38-
motionName: 'rc-trigger-popup-zoom',
39-
}}
40-
popup={<div>这是左侧按钮的提示信息</div>}
41-
popupStyle={{
42-
border: '1px solid #ccc',
43-
padding: 10,
44-
background: 'white',
45-
boxSizing: 'border-box',
46-
}}
47-
>
48-
<button type="button">左侧按钮</button>
49-
</Trigger>
50-
51-
<Trigger
52-
action={['hover']}
53-
popupPlacement="top"
54-
builtinPlacements={builtinPlacements}
55-
getPopupContainer={getPopupContainer}
56-
popupMotion={{
57-
motionName: 'rc-trigger-popup-zoom',
58-
}}
59-
popup={<div>This is the tooltip for the right button</div>}
60-
popupStyle={{
61-
border: '1px solid #ccc',
62-
padding: 10,
63-
background: 'white',
64-
boxSizing: 'border-box',
65-
}}
66-
>
67-
<button type="button">Right Button</button>
68-
</Trigger>
30+
<UniqueProvider>
31+
<div style={{ margin: 100 }}>
32+
<div style={{ display: 'flex', gap: 20 }}>
33+
<Trigger
34+
action={['hover']}
35+
popupPlacement="top"
36+
builtinPlacements={builtinPlacements}
37+
getPopupContainer={getPopupContainer}
38+
popupMotion={{
39+
motionName: 'rc-trigger-popup-zoom',
40+
}}
41+
popup={<div>这是左侧按钮的提示信息</div>}
42+
popupStyle={{
43+
border: '1px solid #ccc',
44+
padding: 10,
45+
background: 'white',
46+
boxSizing: 'border-box',
47+
}}
48+
>
49+
<button type="button">左侧按钮</button>
50+
</Trigger>
51+
52+
<Trigger
53+
action={['hover']}
54+
popupPlacement="top"
55+
builtinPlacements={builtinPlacements}
56+
getPopupContainer={getPopupContainer}
57+
popupMotion={{
58+
motionName: 'rc-trigger-popup-zoom',
59+
}}
60+
popup={<div>This is the tooltip for the right button</div>}
61+
popupStyle={{
62+
border: '1px solid #ccc',
63+
padding: 10,
64+
background: 'white',
65+
boxSizing: 'border-box',
66+
}}
67+
>
68+
<button type="button">Right Button</button>
69+
</Trigger>
70+
</div>
6971
</div>
70-
</div>
72+
</UniqueProvider>
7173
);
7274
};
7375

src/UniqueProvider.tsx

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/UniqueProvider/index.tsx

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import * as React from 'react';
2+
import { UniqueContext, type UniqueContextProps } from '../context';
3+
4+
export interface UniqueProviderProps {
5+
children: React.ReactNode;
6+
}
7+
8+
const UniqueProvider = ({ children }: UniqueProviderProps) => {
9+
const [target, setTarget] = React.useState<HTMLElement | null>(null);
10+
const delayRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);
11+
12+
const clearDelay = () => {
13+
if (delayRef.current) {
14+
clearTimeout(delayRef.current);
15+
delayRef.current = null;
16+
}
17+
};
18+
19+
const show = (targetElement: HTMLElement, delay: number) => {
20+
clearDelay();
21+
22+
if (delay === 0) {
23+
setTarget(targetElement);
24+
} else {
25+
delayRef.current = setTimeout(() => {
26+
setTarget(targetElement);
27+
}, delay * 1000);
28+
}
29+
};
30+
31+
const hide = (targetElement: HTMLElement, delay: number) => {
32+
clearDelay();
33+
34+
if (delay === 0) {
35+
setTarget(null);
36+
} else {
37+
delayRef.current = setTimeout(() => {
38+
setTarget(null);
39+
}, delay * 1000);
40+
}
41+
};
42+
43+
const contextValue = React.useMemo<UniqueContextProps>(() => ({
44+
show,
45+
hide,
46+
}), []);
47+
48+
return (
49+
<UniqueContext.Provider value={contextValue}>
50+
{children}
51+
</UniqueContext.Provider>
52+
);
53+
};
54+
55+
export default UniqueProvider;

src/context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ export default TriggerContext;
1111

1212
// ==================== Unique ====================
1313
export interface UniqueContextProps {
14-
show: (target: HTMLElement) => void;
15-
hide: (target: HTMLElement) => void;
14+
show: (target: HTMLElement, delay: number) => void;
15+
hide: (target: HTMLElement, delay: number) => void;
1616
}
1717

1818
export const UniqueContext = React.createContext<UniqueContextProps | null>(

src/index.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import useId from '@rc-component/util/lib/hooks/useId';
99
import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect';
1010
import * as React from 'react';
1111
import Popup, { type MobileConfig } from './Popup';
12-
import type { TriggerContextProps, UniqueContextProps } from './context';
12+
import type { TriggerContextProps } from './context';
1313
import TriggerContext, { UniqueContext } from './context';
1414
import useAction from './hooks/useAction';
1515
import useAlign from './hooks/useAlign';
@@ -31,6 +31,8 @@ export type {
3131
BuildInPlacements,
3232
};
3333

34+
export { default as UniqueProvider } from './UniqueProvider';
35+
3436
export interface TriggerRef {
3537
nativeElement: HTMLElement;
3638
popupElement: HTMLDivElement;
@@ -301,13 +303,13 @@ export function generateTrigger(
301303
const lastTriggerRef = React.useRef<boolean[]>([]);
302304
lastTriggerRef.current = [];
303305

304-
const internalTriggerOpen = useEvent((nextOpen: boolean) => {
306+
const internalTriggerOpen = useEvent((nextOpen: boolean, delay: number = 0) => {
305307
// If UniqueContext exists, delegate show/hide to Provider
306308
if (uniqueContext) {
307309
if (nextOpen && targetEle) {
308-
uniqueContext.show(targetEle);
310+
uniqueContext.show(targetEle, delay);
309311
} else {
310-
uniqueContext.hide(targetEle);
312+
uniqueContext.hide(targetEle, delay);
311313
}
312314
return;
313315
}
@@ -335,6 +337,12 @@ export function generateTrigger(
335337
};
336338

337339
const triggerOpen = (nextOpen: boolean, delay = 0) => {
340+
// If UniqueContext exists, pass delay to Provider instead of handling it internally
341+
if (uniqueContext) {
342+
internalTriggerOpen(nextOpen, delay);
343+
return;
344+
}
345+
338346
clearDelay();
339347

340348
if (delay === 0) {

0 commit comments

Comments
 (0)