aboutsummaryrefslogtreecommitdiff
path: root/src/hocs
diff options
context:
space:
mode:
authortaehoon <th.dev91@gmail.com>2019-02-13 21:07:28 -0500
committertaehoon <th.dev91@gmail.com>2019-02-20 13:30:30 -0500
commit159e84532ebdae038e1263efe8832015597a5e20 (patch)
treee393c419325c17f9ad2fd7aee552f8c3076e9603 /src/hocs
parent82702748653c7630e4f337433d47863f52c57ee4 (diff)
Add withSubscription hoc
Diffstat (limited to 'src/hocs')
-rw-r--r--src/hocs/with_subscription/with_subscription.js65
-rw-r--r--src/hocs/with_subscription/with_subscription.scss10
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