Skip to content

Instantly share code, notes, and snippets.

@wgrafael
Last active November 17, 2016 01:18
Show Gist options
  • Select an option

  • Save wgrafael/0f41ac6d11a5df1a4196845ac63fed63 to your computer and use it in GitHub Desktop.

Select an option

Save wgrafael/0f41ac6d11a5df1a4196845ac63fed63 to your computer and use it in GitHub Desktop.
Loading State Service with dispenser in Angular2
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
interface State {
isLoading: boolean;
blockerLoading: boolean;
}
/**
* Responsible by loadingState
*/
@Injectable()
export class LoadingStateService {
public state: State = {
isLoading: true,
blockerLoading: true
};
public stateChange: Subject<State> = new Subject<State>();
private dispensers: Array<Number> = [];
private setState(isLoading: boolean, blockerLoading: boolean) {
this.state = {
isLoading,
blockerLoading
}
this.stateChange.next(this.state);
}
validateDispensers(dispenseUid: Number): Boolean {
this.cleanDispenser(dispenseUid);
return this.dispensers.length > 0;
}
stopLoading(dispenseUid: Number = null) {
if(this.validateDispensers(dispenseUid)) return;
this.setState(false, false);
}
startLoading(blocker = false, dispenseUid: Number = null) {
if(this.validateDispensers(dispenseUid)) return;
this.setState(false, blocker);
}
startBlockLoading(dispenseUid: Number = null) {
if(this.validateDispensers(dispenseUid)) return;
this.startLoading(true);
}
registerDispenser(blocker = false) {
var dispenserUid = Date.now();
this.dispensers.push(dispenserUid);
var Dispenser = {
dispenserUid,
dispense: function() {
this.stopLoading(Dispenser.dispenserUid);
}
};
// bind context in Dispenser!
Dispenser.dispense = Dispenser.dispense.bind(this);
this.startLoading(blocker);
return Dispenser;
}
cleanDispenser(dispenseUid: Number) {
this.dispensers = this.dispensers.filter((dispenser) => {
return dispenser !== dispenseUid
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment