|
1 | | -import { forwardRef, useLayoutEffect, useRef } from 'react'; |
| 1 | +import { forwardRef, useEffect, useLayoutEffect, useRef } from 'react'; |
2 | 2 | import { useControlledState } from '@react-stately/utils'; |
3 | 3 | import { useTextField } from 'react-aria'; |
4 | 4 |
|
@@ -100,23 +100,26 @@ function TextArea(props: WithNullableValue<CubeTextAreaProps>, ref) { |
100 | 100 | textarea.style.height = `${totalHeight}px`; |
101 | 101 | }); |
102 | 102 |
|
| 103 | + const useEnvironmentalEffect = |
| 104 | + typeof window !== 'undefined' ? useLayoutEffect : useEffect; |
| 105 | + |
103 | 106 | // Call adjustHeight on content change |
104 | | - useLayoutEffect(() => { |
| 107 | + useEnvironmentalEffect(() => { |
105 | 108 | adjustHeight(); |
106 | 109 | }, [inputValue]); |
107 | 110 |
|
108 | 111 | // Also call it on window resize as that can affect wrapping |
109 | | - useLayoutEffect(() => { |
110 | | - if (!autoSize) return; |
| 112 | + useEnvironmentalEffect(() => { |
| 113 | + if (!autoSize || !inputRef.current) return; |
| 114 | + |
| 115 | + adjustHeight(); |
111 | 116 |
|
112 | | - const handleResize = () => { |
113 | | - adjustHeight(); |
114 | | - }; |
| 117 | + const resizeObserver = new ResizeObserver(adjustHeight); |
115 | 118 |
|
116 | | - window.addEventListener('resize', handleResize); |
| 119 | + resizeObserver.observe(inputRef?.current); |
117 | 120 |
|
118 | | - return () => window.removeEventListener('resize', handleResize); |
119 | | - }, [adjustHeight, autoSize]); |
| 121 | + return () => resizeObserver.disconnect(); |
| 122 | + }, [autoSize, inputRef?.current]); |
120 | 123 |
|
121 | 124 | return ( |
122 | 125 | <TextInputBase |
|
0 commit comments