aboutsummaryrefslogtreecommitdiff
path: root/src/hocs/with_subscription/with_subscription.js
blob: 633517e308e0b8acc9f024a943897e464d4dce64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import Vue from 'vue'
import reject from 'lodash/reject'
import isEmpty from 'lodash/isEmpty'
import omit from 'lodash/omit'
import './with_subscription.scss'

const withSubscription = (Component, fetch, select, contentPropName = 'content') => {
  const originalProps = Component.props || []
  const props = reject(originalProps, v => v === 'content')

  return Vue.component('withSubscription', {
    render (createElement) {
      const props = {
        props: {
          ...omit(this.$props, 'refresh'),
          [contentPropName]: this.fetchedData
        },
        on: this.$listeners
      }
      return (
        <div class="with-subscription">
          {!this.error && !this.loading && <Component {...props} />}
          <div class="with-subscription-footer">
            {this.error && <a onClick={this.fetchData} class="alert error">{this.$t('general.generic_error')}</a>}
            {!this.error && this.loading && <i class="icon-spin3 animate-spin"/>}
          </div>
        </div>
      )
    },
    props: [...props, 'refresh'],
    data () {
      return {
        loading: false,
        error: false
      }
    },
    computed: {
      fetchedData () {
        return select(this.$props, this.$store)
      }
    },
    created () {
      if (this.refresh || isEmpty(this.fetchedData)) {
        this.fetchData()
      }
    },
    methods: {
      fetchData () {
        if (!this.loading) {
          this.loading = true
          this.error = false
          fetch(this.$props, this.$store)
            .then(() => {
              this.loading = false
            })
            .catch(() => {
              this.error = true
              this.loading = false
            })
        }
      }
    }
  })
}

export default withSubscription