Skip to content

Commit bf10971

Browse files
authored
Fix: respect defaultValue in Select and MultiSelect (#522)
* feat: add useUpdateEffect hook * fix(SingleSelect): respect defaultValue * test(SingleSelect): respect defaultValue * fix(MultiSelect): respect defaultValue * test(MultiSelect): respect defaultValue
1 parent b38422c commit bf10971

File tree

7 files changed

+46
-4
lines changed

7 files changed

+46
-4
lines changed

.eslintrc.cjs

+3
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,8 @@ module.exports = {
2929
singleReturnOnly: false,
3030
},
3131
],
32+
"react-hooks/exhaustive-deps": ["warn", {
33+
"additionalHooks": "(useUpdateEffect)"
34+
}]
3235
},
3336
};

src/components/Select/MultiSelect.test.tsx

+10
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,16 @@ describe("MultiSelect", () => {
8383
expect(queryByTestingText(selectTrigger, "Content3")).toBeNull();
8484
});
8585

86+
it("should respect given defaultValue in select", () => {
87+
const { getByTestId } = renderSelect({
88+
defaultValue: ["content0", "content2"],
89+
});
90+
const selectTrigger = getByTestId("select-trigger");
91+
expect(selectTrigger).not.toBeNull();
92+
expect(queryByTestingText(selectTrigger, "Content0")).not.toBeNull();
93+
expect(queryByTestingText(selectTrigger, "Content2")).not.toBeNull();
94+
});
95+
8696
it("should show error", () => {
8797
const { queryByText } = renderSelect({
8898
error: "Select Error",

src/components/Select/MultiSelect.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import { useCallback, useEffect, useState } from "react";
1+
import { useCallback, useState } from "react";
2+
3+
import {useUpdateEffect} from "@/hooks";
24

35
import { SelectContainerProps, SelectOptionProp, SelectionType } from "./common/types";
46
import {
@@ -43,7 +45,7 @@ export const MultiSelect = ({
4345
[onOpenChangeProp]
4446
);
4547

46-
useEffect(() => {
48+
useUpdateEffect(() => {
4749
setSelectedValues(valueProp ?? []);
4850
}, [valueProp]);
4951

src/components/Select/SingleSelect.test.tsx

+8
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ describe("Select", () => {
115115
expect(queryByTestingText(selectTrigger, "Content0")).not.toBeNull();
116116
});
117117

118+
it("should respect given defaultValue in select", () => {
119+
const { getByTestId } = renderSelect({
120+
defaultValue: "content0",
121+
});
122+
const selectedValue = getByTestId("select-trigger");
123+
expect(selectedValue.textContent).toBe("Content0");
124+
});
125+
118126
it("should render options", () => {
119127
const { queryByText, getByTestId } = renderSelect({
120128
options: selectOptions,

src/components/Select/SingleSelect.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { useCallback, useEffect, useState } from "react";
1+
import { useCallback, useState } from "react";
2+
3+
import { useUpdateEffect } from "@/hooks";
4+
25
import { SelectContainerProps, SelectOptionProp, SelectionType } from "./common/types";
36
import { InternalSelect, SelectGroup, SelectItem } from "./common/InternalSelect";
47

@@ -65,7 +68,7 @@ export const Select = ({
6568
[selectedValues, onSelect]
6669
);
6770

68-
useEffect(() => {
71+
useUpdateEffect(() => {
6972
setSelectedValues(valueProp ? [valueProp] : []);
7073
}, [valueProp]);
7174

src/hooks/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./useUpdateEffect";

src/hooks/useUpdateEffect.ts

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { useEffect, useRef } from "react";
2+
3+
export const useUpdateEffect: typeof useEffect = (effect, deps) => {
4+
const isFirstMount = useRef(true);
5+
6+
useEffect(() => {
7+
if (isFirstMount) {
8+
isFirstMount.current = false;
9+
return;
10+
}
11+
12+
return effect();
13+
// eslint-disable-next-line react-hooks/exhaustive-deps
14+
}, deps);
15+
};

0 commit comments

Comments
 (0)