aboutsummaryrefslogtreecommitdiff
path: root/src/hocs/with_subscription/with_subscription.jsx
diff options
context:
space:
mode:
authorHJ <30-hj@users.noreply.git.pleroma.social>2022-12-23 13:31:18 +0000
committerHJ <30-hj@users.noreply.git.pleroma.social>2022-12-23 13:31:18 +0000
commit3a507ba9b2fde594950a09c9d7934d54561a187c (patch)
tree450f241149cae93c602819db824cef0d39842979 /src/hocs/with_subscription/with_subscription.jsx
parentb13d8f7e6339e877a38a28008630dc8ec64abcdf (diff)
parent25e628efe265db583797fe1c10fdcab2f0d9cc9d (diff)
Merge branch 'develop' into 'master'
Update stable - 2.5.0 release See merge request pleroma/pleroma-fe!1711
Diffstat (limited to 'src/hocs/with_subscription/with_subscription.jsx')
-rw-r--r--src/hocs/with_subscription/with_subscription.jsx91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/hocs/with_subscription/with_subscription.jsx b/src/hocs/with_subscription/with_subscription.jsx
new file mode 100644
index 00000000..d3f5506a
--- /dev/null
+++ b/src/hocs/with_subscription/with_subscription.jsx
@@ -0,0 +1,91 @@
+// eslint-disable-next-line no-unused
+import { h } from 'vue'
+import isEmpty from 'lodash/isEmpty'
+import { getComponentProps } from '../../services/component_utils/component_utils'
+import './with_subscription.scss'
+
+import { FontAwesomeIcon as FAIcon } from '@fortawesome/vue-fontawesome'
+import { library } from '@fortawesome/fontawesome-svg-core'
+import {
+ faCircleNotch
+} from '@fortawesome/free-solid-svg-icons'
+
+library.add(
+ faCircleNotch
+)
+
+const withSubscription = ({
+ fetch, // function to fetch entries and return a promise
+ select, // function to select data from store
+ childPropName = 'content', // name of the prop to be passed into the wrapped component
+ additionalPropNames = [] // additional prop name list of the wrapper component
+}) => (WrappedComponent) => {
+ const originalProps = Object.keys(getComponentProps(WrappedComponent))
+ const props = originalProps.filter(v => v !== childPropName).concat(additionalPropNames)
+
+ return {
+ props: [
+ ...props,
+ 'refresh' // boolean saying to force-fetch data whenever created
+ ],
+ 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
+ })
+ }
+ }
+ },
+ render () {
+ if (!this.error && !this.loading) {
+ const props = {
+ ...this.$props,
+ [childPropName]: this.fetchedData
+ }
+ const children = this.$slots
+ return (
+ <div class="with-subscription">
+ <WrappedComponent {...props}>
+ {children}
+ </WrappedComponent>
+ </div>
+ )
+ } else {
+ return (
+ <div class="with-subscription-loading">
+ {this.error
+ ? <a onClick={this.fetchData} class="alert error">{this.$t('general.generic_error')}</a>
+ : <FAIcon spin icon="circle-notch"/>
+ }
+ </div>
+ )
+ }
+ }
+ }
+}
+
+export default withSubscription