Skip to content

Commit 5c968f5

Browse files
fix: 🐛 onMenuToggle skip callback on initial render (#326)
1 parent 0d735ae commit 5c968f5

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

src/hooks/use-did-update-effect.tsx

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { useEffect, useRef } from "react";
2+
3+
/**
4+
* similar to `useEffect` but gets triggered only when value changes
5+
* @param fn executable function on dependency updates
6+
* @param inputs dependency array
7+
*/
8+
export function useDidUpdateEffect(fn, inputs) {
9+
const didMountRef = useRef(false);
10+
11+
useEffect(() => {
12+
if (didMountRef.current) fn();
13+
else didMountRef.current = true;
14+
}, inputs);
15+
}

src/multi-select/dropdown.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import { css } from "goober";
77
import React, { useEffect, useRef, useState } from "react";
88

9+
import { useDidUpdateEffect } from "../hooks/use-did-update-effect";
910
import { useMultiSelect } from "../hooks/use-multi-select";
1011
import { cn } from "../lib/classnames";
1112
import SelectPanel from "../select-panel";
@@ -89,8 +90,7 @@ const Dropdown = () => {
8990

9091
const wrapper: any = useRef();
9192

92-
/* eslint-disable react-hooks/exhaustive-deps */
93-
useEffect(() => {
93+
useDidUpdateEffect(() => {
9494
onMenuToggle && onMenuToggle(expanded);
9595
}, [expanded]);
9696

stories/custom-arrow.stories.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export const ExampleCustomArrow = () => {
2323
onChange={setSelected}
2424
labelledBy={text("labelledBy", "Select Fruits")}
2525
ArrowRenderer={ArrowRenderer}
26+
onMenuToggle={(isOpen) => console.log("onMenuToggle", isOpen)}
2627
/>
2728
</div>
2829
);

0 commit comments

Comments
 (0)