react-artasys-ui 0.1.19 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,8 +8,9 @@ export interface IDropdown extends AllHTMLAttributes<HTMLDivElement> {
8
8
  hover?: boolean;
9
9
  items?: FunctionComponentElement<IItem> | FunctionComponentElement<IItem>[];
10
10
  disabled?: boolean;
11
+ enableRerenderItems?: boolean;
11
12
  onShow?: () => void;
12
13
  onHide?: () => void;
13
14
  }
14
- declare const Dropdown: ({ children, className, items, direction, position, split, disabled, hover, onShow, onHide, ...props }: IDropdown) => JSX.Element;
15
+ declare const Dropdown: ({ children, className, items, direction, position, split, disabled, hover, enableRerenderItems, onShow, onHide, ...props }: IDropdown) => JSX.Element;
15
16
  export default Dropdown;
@@ -1,6 +1,6 @@
1
1
  import type { IDropdown } from "./Dropdown";
2
- interface IItems extends Pick<IDropdown, 'items' | 'disabled'> {
2
+ interface IItems extends Pick<IDropdown, 'items' | 'disabled' | 'enableRerenderItems'> {
3
3
  isOpen: boolean;
4
4
  }
5
- declare const Items: ({ items, isOpen, disabled }: IItems) => JSX.Element | null;
5
+ declare const Items: ({ items, isOpen, enableRerenderItems, disabled }: IItems) => JSX.Element | null;
6
6
  export default Items;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-artasys-ui",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -27,11 +27,12 @@ export interface IDropdown extends AllHTMLAttributes<HTMLDivElement> {
27
27
  hover?: boolean;
28
28
  items?: FunctionComponentElement<IItem> | FunctionComponentElement<IItem>[];
29
29
  disabled?: boolean;
30
+ enableRerenderItems?: boolean;
30
31
  onShow?: () => void;
31
32
  onHide?: () => void;
32
33
  };
33
34
 
34
- const Dropdown = ({children, className, items, direction = 'down', position = 'right', split = false, disabled, hover = false, onShow, onHide, ...props}: IDropdown) => {
35
+ const Dropdown = ({children, className, items, direction = 'down', position = 'right', split = false, disabled, hover = false, enableRerenderItems = true, onShow, onHide, ...props}: IDropdown) => {
35
36
  const containerRef = useRef<HTMLDivElement>(null);
36
37
  const hoverTimeout = useRef<ReturnType<typeof setTimeout>>();
37
38
  const [isOpen, setOpen] = useState(false);
@@ -104,7 +105,7 @@ const Dropdown = ({children, className, items, direction = 'down', position = 'r
104
105
  {children}
105
106
  </div>
106
107
  {(position === 'right' && !disabled) && <Arrow className={styles['arrow']} onClick={handleClickArrow}/>}
107
- <Items isOpen={isOpen} disabled={disabled} items={items}/>
108
+ <Items isOpen={isOpen} disabled={disabled} enableRerenderItems={enableRerenderItems} items={items}/>
108
109
  </div>
109
110
  </Context.Provider>);
110
111
  };
@@ -1,27 +1,27 @@
1
1
  import styles from "./style.module.css";
2
2
  import type { IDropdown } from "./Dropdown";
3
- import { useEffect, useRef, useState } from "react";
3
+ import { useEffect, useMemo, useRef, useState } from "react";
4
4
 
5
- interface IItems extends Pick<IDropdown, 'items' | 'disabled'> {
5
+ interface IItems extends Pick<IDropdown, 'items' | 'disabled' | 'enableRerenderItems'> {
6
6
  isOpen: boolean;
7
7
  };
8
8
 
9
- const Items = ({items, isOpen, disabled}: IItems) => {
9
+ const Items = ({items, isOpen, enableRerenderItems, disabled}: IItems) => {
10
10
  const listRef = useRef<HTMLUListElement>(null);
11
- const [hide, setHide] = useState(false);
11
+
12
+ const renderItems = useMemo(() => {
13
+ if (enableRerenderItems) {
14
+ return isOpen ? items : null;
15
+ }
16
+ return items;
17
+ }, [enableRerenderItems, items, isOpen]);
12
18
 
13
19
  useEffect(() => {
20
+
14
21
  if (!listRef.current) return;
15
22
  const screenWidth = window.innerWidth;
16
23
  const element = listRef.current.getBoundingClientRect();
17
- if (!isOpen) {
18
- listRef.current.ontransitionend = () => {
19
- setHide(true);
20
- };
21
- }else{
22
- listRef.current.ontransitionend = null;
23
- setHide(false);
24
- }
24
+
25
25
 
26
26
  // console.log(element.left)
27
27
  if (element.left <= 0) {
@@ -30,9 +30,9 @@ const Items = ({items, isOpen, disabled}: IItems) => {
30
30
  }
31
31
  },[isOpen]);
32
32
 
33
- if (disabled || hide) return null;
33
+ if (disabled) return null;
34
34
 
35
- return(<ul className={styles['dropdown-list']} children={items} ref={listRef}/>);
35
+ return(<ul className={styles['dropdown-list']} children={renderItems} ref={listRef}/>);
36
36
  };
37
37
 
38
38
  export default Items;