diff --git a/packages/editor/src/extensions/image/component.tsx b/packages/editor/src/extensions/image/component.tsx index 86d665e4f..def457cdc 100644 --- a/packages/editor/src/extensions/image/component.tsx +++ b/packages/editor/src/extensions/image/component.tsx @@ -57,7 +57,8 @@ export function ImageComponent( const isMobile = useIsMobile(); const { inView, ref: imageRef } = useObserver({ - threshold: 0.2 + threshold: 0.2, + once: true }); const float = isMobile ? false : node.attrs.float; diff --git a/packages/editor/src/hooks/use-observer.ts b/packages/editor/src/hooks/use-observer.ts index 7202d141f..cdef5a121 100644 --- a/packages/editor/src/hooks/use-observer.ts +++ b/packages/editor/src/hooks/use-observer.ts @@ -18,6 +18,7 @@ along with this program. If not, see . */ import { useState, useRef, useEffect, useCallback } from "react"; +import { debounce } from "../utils/debounce"; type ObserverType = { threshold: number; @@ -32,7 +33,7 @@ export function useObserver({ }: ObserverType) { const [inView, setInView] = useState(); const ref = useRef(null); - const iObserverRef = useRef(); + const observer = useRef(); const updateInView = useCallback( (val: boolean) => { @@ -51,22 +52,25 @@ export function useObserver({ threshold: threshold }; - iObserverRef.current = new IntersectionObserver((entries) => { - updateInView(entries[0].isIntersecting); - }, options); + observer.current = new IntersectionObserver( + debounce((entries) => { + updateInView(entries[0].isIntersecting); + }, 500) as IntersectionObserverCallback, + options + ); }); useEffect(() => { if (ref.current) { - iObserverRef?.current?.observe(ref.current); + observer?.current?.observe(ref.current); } const reference = ref.current; return () => { if (reference) { - iObserverRef.current?.unobserve(reference); - iObserverRef.current?.disconnect(); + observer.current?.unobserve(reference); + observer.current?.disconnect(); } }; });