export const dimensionMixin = {
  data() {
    return {
      dimensions: {
        targetElement: null,
        width: 1920,
        height: 1080,
      },
    }
  },
  mounted() {
    // Gives you time to set the targetElement in the mounted function of the component
    // using this mixin
    this.$nextTick(() => {
      this.dimensions.targetElement = this.dimensions.targetElement || this.$el
      this.resizeObserver = new ResizeObserver(this.updateElementSize)
      this.resizeObserver.observe(this.dimensions.targetElement)
    })
  },
  beforeDestroy() {
    if (this.resizeObserver) {
      this.resizeObserver.disconnect()
    }
  },
  methods: {
    updateElementSize(entries) {
      for (const entry of entries) {
        if (entry.target === this.dimensions.targetElement) {
          const { width, height } = entry.contentRect
          this.dimensions.width = width
          this.dimensions.height = height
        }
      }
    },
  },
}