# domIsVisible.mjs

    import isfun from './isfun.mjs'
    import isEle from './isEle.mjs'
    import genPm from './genPm.mjs'

    function ckIOb() {
        try {
            return 'IntersectionObserver' in window
        }
        catch (err) {
            return false
        }
    }

    function ckIOE() {
        try {
            return 'IntersectionObserverEntry' in window
        }
        catch (err) {
            return false
        }
    }

    function ckIR() {

        function ckIRp() {
            try {
                return 'intersectionRatio' in window.IntersectionObserverEntry.prototype
            }
            catch (err) {
                return false
            }
        }

        function ckIRF() {
            //IE使用polyfill後IntersectionObserverEntry為函數, 檢核IntersectionObserverEntry.prototype會一樣過不了
            return isfun(window.IntersectionObserverEntry)
        }

        return ckIRp() || ckIRF()
    }

    function ckIO() {
        return !ckIOb() || !ckIOE() || !ckIR()
    }

    /**
     * 前端檢測DOM元素是否為顯示(使用者可見)狀態
     *
     * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/domIsVisible.test.mjs Github}
     * @memberOf wsemi
     * @param {Element} ele 輸入Element元素
     * @example
     * need test in browser
     *
     * let ele = document.querySelector('#id')
     * domIsVisible(ele)
     *     .then(function(visible){
     *         console.log(visible)
     *         // => true or false
     *     })
     *     .catch(function(err){
     *         console.log(err)
     *     })
     *
     */
    function domIsVisible(ele) {

        //check ele
        if (!isEle(ele)) {
            return Promise.reject('invalid element')
        }

        //check IntersectionObserver
        if (ckIO()) {
            return Promise.reject('invalid IntersectionObserver')
        }

        //pm
        let pm = genPm()

        try {

            //ob
            let ob = new IntersectionObserver((entries) => {

                //resolve
                pm.resolve(entries[0].isIntersecting)

                //disconnect
                ob.disconnect()

            })

            //observe
            ob.observe(ele)

        }
        catch (err) {
            pm.reject(err)
        }

        return pm
    }

    export default domIsVisible