diff options
| author | taehoon <th.dev91@gmail.com> | 2019-02-13 21:07:28 -0500 |
|---|---|---|
| committer | taehoon <th.dev91@gmail.com> | 2019-02-20 13:30:30 -0500 |
| commit | 159e84532ebdae038e1263efe8832015597a5e20 (patch) | |
| tree | e393c419325c17f9ad2fd7aee552f8c3076e9603 /src | |
| parent | 82702748653c7630e4f337433d47863f52c57ee4 (diff) | |
Add withSubscription hoc
Diffstat (limited to 'src')
| -rw-r--r-- | src/hocs/with_subscription/with_subscription.js | 65 | ||||
| -rw-r--r-- | src/hocs/with_subscription/with_subscription.scss | 10 |
2 files changed, 75 insertions, 0 deletions
diff --git a/src/hocs/with_subscription/with_subscription.js b/src/hocs/with_subscription/with_subscription.js new file mode 100644 index 00000000..31fc106f --- /dev/null +++ b/src/hocs/with_subscription/with_subscription.js @@ -0,0 +1,65 @@ +import Vue from 'vue' +import filter from 'lodash/filter' +import isEmpty from 'lodash/isEmpty' +import './with_subscription.scss' + +const withSubscription = (Component, fetch, select, contentPropName = 'content') => { + const originalProps = Component.props || [] + const props = filter(originalProps, v => v !== 'content') + + return Vue.component('withSubscription', { + render (createElement) { + const props = { + props: { + ...this.$props, + [contentPropName]: this.fetchedData + }, + on: this.$listeners + } + return ( + <div class="with-subscription"> + <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, + data () { + return { + loading: false, + error: false + } + }, + computed: { + fetchedData () { + return select(this.$props, this.$store) + } + }, + created () { + if (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 diff --git a/src/hocs/with_subscription/with_subscription.scss b/src/hocs/with_subscription/with_subscription.scss new file mode 100644 index 00000000..5114029d --- /dev/null +++ b/src/hocs/with_subscription/with_subscription.scss @@ -0,0 +1,10 @@ +.with-subscription { + &-footer { + padding: 10px; + text-align: center; + } + + .error { + font-size: 14px; + } +}
\ No newline at end of file |
