ngx-feature-toggle-demo
Version:
Your module to handle with feature toggles in Angular applications easier.
65 lines (55 loc) • 1.6 kB
text/typescript
import {
Directive,
Input,
OnInit,
TemplateRef,
ViewContainerRef,
DoCheck,
isDevMode,
} from '@angular/core';
import { isOn } from 'feature-toggle-service';
({
// tslint:disable-next-line: directive-selector
selector: '[featureToggle]',
})
export class FeatureToggleDirective implements OnInit, DoCheck {
() public featureToggle: string[] | string;
private isOn = false;
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) {}
ngOnInit() {
if (!this.featureToggle) {
throw new Error('Attribute `featureToggle` should not be null or empty');
}
this.shouldRender();
}
ngDoCheck() {
if (this.isOn !== this.isOnCheck(this.featureToggle)) {
this.shouldRender();
}
}
private shouldRender() {
this.isOn = this.isOnCheck(this.featureToggle);
if (this.isOn) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
isOnCheck(featureToggle: string[] | string) {
const DEV_MODE = isDevMode();
const isFeatureToggleOn = (toggle) =>
toggle[0] === '!' ? !isOn(toggle.replace('!', '')) : isOn(toggle);
if (typeof featureToggle === 'string') {
return isFeatureToggleOn(featureToggle as string);
} else if (Array.isArray(featureToggle)) {
return (featureToggle as string[]).every(isFeatureToggleOn);
} else if (DEV_MODE) {
console.error(
'`NgxFeatureToggle`: `featureToggle` should receive an array or an string as a value.'
);
}
}
}