/*
This file is part of the Notesnook project (https://notesnook.com/)

Copyright (C) 2023 Streetwriters (Private) Limited

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
import { useState, useRef, useEffect, useCallback } from "react";
import { debounce } from "../utils/debounce";
export function useObserver({ threshold, rootMargin = "0px", once = false }) {
    const [inView, setInView] = useState();
    const ref = useRef(null);
    const observer = useRef();
    const updateInView = useCallback((val) => {
        if (inView && once) {
            return;
        }
        setInView(val);
    }, [inView, once]);
    useEffect(() => {
        const options = {
            root: null,
            rootMargin: rootMargin,
            threshold: threshold
        };
        observer.current = new IntersectionObserver(debounce((entries) => {
            updateInView(entries[0].isIntersecting);
        }, 500), options);
    });
    useEffect(() => {
        var _a;
        if (ref.current) {
            (_a = observer === null || observer === void 0 ? void 0 : observer.current) === null || _a === void 0 ? void 0 : _a.observe(ref.current);
        }
        const reference = ref.current;
        return () => {
            var _a, _b;
            if (reference) {
                (_a = observer.current) === null || _a === void 0 ? void 0 : _a.unobserve(reference);
                (_b = observer.current) === null || _b === void 0 ? void 0 : _b.disconnect();
            }
        };
    });
    return { inView, ref };
}
