Skip to content

Commit a316486

Browse files
committed
feat(m3-react): M3Popper closer element effect
1 parent 7c18fe4 commit a316486

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import type { CloserTarget } from '@modulify/m3-foundation/types/components/popper'
2+
import type { ElementEffect } from '@/hooks/useElementEffect'
3+
4+
import {
5+
addCloserListeners,
6+
removeCloserListeners,
7+
} from '@modulify/m3-foundation/lib/popper/closer'
8+
9+
import { useCallback } from 'react'
10+
11+
export type CloserOptions = {
12+
active?: boolean;
13+
all?: boolean;
14+
}
15+
16+
export const createM3PopperCloserEffect = <T extends Element>({
17+
active = true,
18+
all = false,
19+
}: CloserOptions = {}): ElementEffect<T> => {
20+
return useCallback((el: T) => {
21+
const _el = el as CloserTarget<T>
22+
_el.m3PopperCloseAll = all
23+
if (active) {
24+
addCloserListeners(_el)
25+
} else {
26+
removeCloserListeners(_el)
27+
}
28+
29+
return () => removeCloserListeners(_el)
30+
}, [active, all])
31+
}

m3-react/src/components/popper/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ export type {
33
M3PopperProps,
44
} from './types'
55

6+
export { createM3PopperCloserEffect } from './closer'
7+
68
export { default as M3Popper } from './M3Popper'

m3-react/src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ export {
7878
useM3NavigationAppearance,
7979
} from '@/components/navigation'
8080

81+
export {
82+
M3Popper,
83+
createM3PopperCloserEffect,
84+
} from '@/components/popper'
85+
8186
export {
8287
M3RichTooltip,
8388
} from '@/components/rich-tooltip'

m3-react/storybook/examples/rich-tooltip/DeleteTooltip.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
useState,
88
} from 'react'
99

10+
import { createM3PopperCloserEffect } from '@/components/popper/closer'
11+
1012
const DeleteTooltip: FC = () => {
1113
const [target, setTarget] = useState<HTMLElement | null>(null)
1214

@@ -24,11 +26,17 @@ const DeleteTooltip: FC = () => {
2426
This action can not be undone
2527

2628
<M3RichTooltip.Footer>
27-
<M3Button appearance="text">
29+
<M3Button
30+
appearance="text"
31+
effects={[createM3PopperCloserEffect()]}
32+
>
2833
Proceed
2934
</M3Button>
3035

31-
<M3Button appearance="text">
36+
<M3Button
37+
appearance="text"
38+
effects={[createM3PopperCloserEffect()]}
39+
>
3240
Cancel
3341
</M3Button>
3442
</M3RichTooltip.Footer>

0 commit comments

Comments
 (0)