Created
August 18, 2022 09:51
-
-
Save sag1v/6817184cba3a4a6cf4298bd9d7b045ab to your computer and use it in GitHub Desktop.
React hook for checking if text is overflowing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { useState, useEffect, useCallback, useRef } from 'react'; | |
function useIsTextOverflow(value) { | |
const [isOverflow, setIsOverflow] = useState(false); | |
const [elementRef, setElementRef] = useState(null); | |
const [elementSize, setElementSize] = useState(0); | |
const observerRef = useRef(null); | |
const refCallback = useCallback(node => { | |
if (node) { | |
if (observerRef.current) { | |
observerRef.current.disconnect(); // in case react triggers the ref callback again or for a different node | |
} | |
// we want to keep track on size change so we can re calculate the overflow | |
observerRef.current = new ResizeObserver((entries) => { | |
const [element] = entries | |
setElementSize(element.contentRect.width); | |
}); | |
setElementRef(node); | |
observerRef.current.observe(node); | |
} | |
}, []); | |
useEffect(() => { | |
if (elementRef) { | |
const { scrollWidth, clientWidth } = elementRef; | |
const isOverflowing = scrollWidth > clientWidth; | |
setIsOverflow(isOverflowing); | |
} | |
}, [value, elementRef, elementSize]); | |
useEffect(() => { | |
return () => { | |
if (observerRef.current) { | |
observerRef.current.disconnect(); | |
} | |
}; | |
}, []); | |
return [isOverflow, refCallback]; | |
} | |
export default useIsTextOverflow; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment