import { h } from 'vue';
import { inBrowser } from './util';

export default (lazy) => {
  return {
    props: {
      tag: {
        type: String,
        default: 'div',
      },
    },

    emits: ['show'],

    render() {
      return h(
        this.tag,
        this.show && this.$slots.default ? this.$slots.default() : null
      );
    },

    data() {
      return {
        el: null,
        state: {
          loaded: false,
        },
        rect: {},
        show: false,
      };
    },

    mounted() {
      this.el = this.$el;
      lazy.addLazyBox(this);
      lazy.lazyLoadHandler();
    },

    beforeUnmount() {
      lazy.removeComponent(this);
    },

    methods: {
      getRect() {
        this.rect = this.$el.getBoundingClientRect();
      },

      checkInView() {
        this.getRect();
        return (
          inBrowser &&
          this.rect.top < window.innerHeight * lazy.options.preLoad &&
          this.rect.bottom > 0 &&
          this.rect.left < window.innerWidth * lazy.options.preLoad &&
          this.rect.right > 0
        );
      },

      load() {
        this.show = true;
        this.state.loaded = true;
        this.$emit('show', this);
      },

      destroy() {
        return this.$destroy;
      },
    },
  };
};
