Last active
May 30, 2017 22:05
-
-
Save jenikm/a20564948c48066eb0a21b1bb348e93f to your computer and use it in GitHub Desktop.
polymer-front-end-services
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- APP COMPONENT --> | |
<app> | |
<dashboard></dashboard> | |
</app> | |
<!-- DASHBAORD COMPONENT --> | |
<template> | |
<div>[[referral.balance]]</div> | |
<template is="dom-if" if="is-loading"> | |
Loading... | |
</template> | |
<div>[[error]]</div> | |
<button on-tap"_onRefresh">Refresh</button> | |
<referral-provider prefetch error="{{error}}" referral="{{referral}}"></referral-provider> | |
</template> | |
<script> | |
(function(){ | |
class ReferralDashboard extends Polymer.Element { | |
static properties(){ | |
return {referral: Object, error: Object} | |
} | |
_onRefresh(){ | |
this.$$("referral-provider").refresh() | |
} | |
}})() | |
</script> | |
<!-- PROVIDER --> | |
<script> | |
/* Purpose: Maps service data into reusable polymer component for native bindings. | |
Can be defined OUTSIDE of .html file | |
*/ | |
//@inject(ReferralService) | |
class ReferralProvider extends Subscriber(Polymer.Element) { | |
/* Many instance to ONE */ | |
static get properties(){ | |
return { | |
referral: { | |
type: Object, | |
notify: true | |
}, | |
error: Object, | |
prefetch: Boolean, | |
isLoading: Boolean | |
} | |
} | |
attached(){ | |
if(this.prefetch) | |
this.referralService.detailsMulticast$.subscribe(data => this.referral = data) | |
} | |
refresh(){ | |
this.subscribe(this.referralService.refreshDetails$()) | |
} | |
} | |
</script> | |
<!-- SERVICES --> | |
<script> | |
// @Injectable() | |
class ReferralService extends Fetchable(EventEmittable) { | |
// @Inject(PromoterService) | |
constructor() { | |
super({ }); | |
this.detailsMulticast$ = this._buildDDetailsMulticast() | |
} | |
_buildDDetailsMulticast(){ | |
return this.promoterService.authorized$ | |
.selectMany(() => this.subject('details')) | |
.shareReplay(1) | |
} | |
refreshDetails$(){ | |
this.fetch$('/referral/details').subscribe(this.subject('details')) | |
return this.subject('details') | |
} | |
} | |
</script> | |
<!-- Helpers (for provider) --> | |
<script> | |
Subscriber = Klass => class extends Klass{ | |
static properties(){ | |
return { | |
isLoading: Boolean | |
} | |
}, | |
subscribe(observable, onNext=()=>{}, onError=()=>{}, onCompleted=()=>{}){ | |
this.isLoading = true | |
this.error = undefined | |
observable | |
.doOnNext(d => this.isLoading = false) | |
.doOnError(e => { | |
this.isLoading = false | |
this.error = e | |
this.fire('load-error', e) | |
}) | |
.subscribe(onNext, onError, onCompleted) | |
} | |
} | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment