diff --git a/src/MarkdownTextInput.web.tsx b/src/MarkdownTextInput.web.tsx index f3f80823..3eedb4bf 100644 --- a/src/MarkdownTextInput.web.tsx +++ b/src/MarkdownTextInput.web.tsx @@ -9,7 +9,7 @@ import type { TextInputKeyPressEventData, TextInputFocusEventData, } from 'react-native'; -import React, {useEffect, useRef, useCallback, useMemo} from 'react'; +import React, {useEffect, useRef, useCallback, useMemo, useLayoutEffect} from 'react'; import type {CSSProperties, MutableRefObject, ReactEventHandler, FocusEventHandler, MouseEvent, KeyboardEvent, SyntheticEvent} from 'react'; import {StyleSheet} from 'react-native'; import * as ParseUtils from './web/parserUtils'; @@ -21,6 +21,8 @@ import InputHistory from './web/InputHistory'; require('../parser/react-native-live-markdown-parser.js'); +const useClientEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect; + let createReactDOMStyle: (style: any) => any; try { createReactDOMStyle = @@ -449,29 +451,35 @@ const MarkdownTextInput = React.forwardRef( divRef.current = r; }; - useEffect(() => { - if (!divRef.current || processedValue === divRef.current.innerText) { - return; - } + useClientEffect( + function parseAndStyleValue() { + if (!divRef.current || processedValue === divRef.current.innerText) { + return; + } - if (value === undefined) { - parseText(divRef.current, divRef.current.innerText, processedMarkdownStyle); - return; - } + if (value === undefined) { + parseText(divRef.current, divRef.current.innerText, processedMarkdownStyle); + return; + } - const text = processedValue !== undefined ? processedValue : ''; - parseText(divRef.current, text, processedMarkdownStyle, text.length); - updateTextColor(divRef.current, value); - }, [multiline, processedMarkdownStyle, processedValue]); + const text = processedValue !== undefined ? processedValue : ''; + parseText(divRef.current, text, processedMarkdownStyle, text.length); + updateTextColor(divRef.current, value); + }, + [multiline, processedMarkdownStyle, processedValue], + ); - useEffect(() => { - if (!divRef.current || !multiline) { - return; - } - const elementHeight = getElementHeight(divRef.current, inputStyles, numberOfLines); - divRef.current.style.height = elementHeight; - divRef.current.style.maxHeight = elementHeight; - }, [numberOfLines]); + useClientEffect( + function adjustHeight() { + if (!divRef.current || !multiline) { + return; + } + const elementHeight = getElementHeight(divRef.current, inputStyles, numberOfLines); + divRef.current.style.height = elementHeight; + divRef.current.style.maxHeight = elementHeight; + }, + [numberOfLines], + ); return ( // eslint-disable-next-line jsx-a11y/no-static-element-interactions