Skip to content

Commit acf3642

Browse files
authoredJun 25, 2024··
feat: Dropdown 及び FilterDropdown に onOpen/onClose オプションを追加する (#4722)
* feat: Dropdown 及び FilterDropdown に onOpen オプションを追加 * fix: onOpen でなく onToggle にする * fix: 不要なコードを削除 * fix: useEffect を分離する * fix: 不要な差分を戻す * fix: マウント時に発火しないようにする * fix: active の変更でのみ発火させる * fix: eslint 違反を無視する * fix: onToggle を onOpen / onClose に分割
1 parent 01f25ff commit acf3642

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed
 

‎packages/smarthr-ui/src/components/Dropdown/Dropdown.tsx

+15-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ import { usePortal } from '../../hooks/usePortal'
1616

1717
import { Rect, getFirstTabbable, isEventFromChild } from './dropdownHelper'
1818

19+
type Props = {
20+
onOpen?: () => void
21+
onClose?: () => void
22+
}
23+
1924
type DropdownContextType = {
2025
active: boolean
2126
triggerRect: Rect
@@ -44,7 +49,7 @@ export const DropdownContext = createContext<DropdownContextType>({
4449
contentId: '',
4550
})
4651

47-
export const Dropdown: FC<PropsWithChildren> = ({ children }) => {
52+
export const Dropdown: FC<PropsWithChildren<Props>> = ({ onOpen, onClose, children }) => {
4853
const [active, setActive] = useState(false)
4954
const [triggerRect, setTriggerRect] = useState<Rect>(initialRect)
5055

@@ -82,6 +87,15 @@ export const Dropdown: FC<PropsWithChildren> = ({ children }) => {
8287
},
8388
[active, createPortal, isPortalRootMounted],
8489
)
90+
91+
useEffect(() => {
92+
if (isPortalRootMounted()) {
93+
if (active) onOpen?.()
94+
else onClose?.()
95+
}
96+
// eslint-disable-next-line react-hooks/exhaustive-deps
97+
}, [active])
98+
8599
// set the displayName explicit for DevTools
86100
DropdownContentRoot.displayName = 'DropdownContentRoot'
87101

‎packages/smarthr-ui/src/components/Dropdown/FilterDropdown/FilterDropdown.stories.tsx

+14
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ export const Render: React.FC = () => {
4949
setValue('hoge')
5050
setText('')
5151
}}
52+
onOpen={action('onOpen')}
53+
onClose={action('onClose')}
5254
isFiltered={isFiltered}
5355
>
5456
<Fieldset
@@ -96,6 +98,8 @@ export const Render: React.FC = () => {
9698
isFiltered={isFiltered2}
9799
onApply={() => setIsFiltered2(true)}
98100
onReset={() => setIsFiltered2(false)}
101+
onOpen={action('onOpen')}
102+
onClose={action('onClose')}
99103
>
100104
<p>You can change border color of the trigger button by setting `isFiltered`.</p>
101105
</FilterDropdown>
@@ -106,6 +110,8 @@ export const Render: React.FC = () => {
106110
isFiltered={isFiltered3}
107111
onApply={() => setIsFiltered3(true)}
108112
onReset={() => setIsFiltered3(false)}
113+
onOpen={action('onOpen')}
114+
onClose={action('onClose')}
109115
hasStatusText
110116
>
111117
<p>
@@ -122,6 +128,8 @@ export const Render: React.FC = () => {
122128
setValue('hoge')
123129
setText('')
124130
}}
131+
onOpen={action('onOpen')}
132+
onClose={action('onClose')}
125133
isFiltered={isFiltered}
126134
disabled
127135
>
@@ -134,6 +142,8 @@ export const Render: React.FC = () => {
134142
isFiltered={isFiltered4}
135143
onApply={() => setIsFiltered4(true)}
136144
onReset={() => setIsFiltered4(false)}
145+
onOpen={action('onOpen')}
146+
onClose={action('onClose')}
137147
hasStatusText
138148
decorators={{
139149
status: (txt) => <span data-wovn-enable="true">{`filtered.(${txt})`}</span>,
@@ -154,6 +164,8 @@ export const Render: React.FC = () => {
154164
isFiltered={isFiltered4}
155165
onApply={() => setIsFiltered4(true)}
156166
onReset={() => setIsFiltered4(false)}
167+
onOpen={action('onOpen')}
168+
onClose={action('onClose')}
157169
responseMessage={responseMessage}
158170
>
159171
<Stack gap={1}>
@@ -193,6 +205,8 @@ export const Render: React.FC = () => {
193205
isFiltered={isFiltered2}
194206
onApply={() => setIsFiltered2(true)}
195207
onReset={() => setIsFiltered2(false)}
208+
onOpen={action('onOpen')}
209+
onClose={action('onClose')}
196210
triggerSize="s"
197211
>
198212
<p>You can change border color of the trigger button by setting `isFiltered`.</p>

‎packages/smarthr-ui/src/components/Dropdown/FilterDropdown/FilterDropdown.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ type Props = {
1919
onApply: React.MouseEventHandler<HTMLButtonElement>
2020
onCancel?: React.MouseEventHandler<HTMLButtonElement>
2121
onReset?: React.MouseEventHandler<HTMLButtonElement>
22+
onOpen?: () => void
23+
onClose?: () => void
2224
children: ReactNode
2325
hasStatusText?: boolean
2426
decorators?: DecoratorsType<
@@ -73,6 +75,8 @@ export const FilterDropdown: FC<Props & ElementProps> = ({
7375
onApply,
7476
onCancel,
7577
onReset,
78+
onOpen,
79+
onClose,
7680
children,
7781
hasStatusText,
7882
decorators,
@@ -140,7 +144,7 @@ export const FilterDropdown: FC<Props & ElementProps> = ({
140144
}, [isFiltered, triggerSize])
141145

142146
return (
143-
<Dropdown>
147+
<Dropdown onOpen={onOpen} onClose={onClose}>
144148
<DropdownTrigger>
145149
<Button
146150
{...props}

0 commit comments

Comments
 (0)
Please sign in to comment.