@microsoft/mgt
Version:
The Microsoft Graph Toolkit
113 lines (101 loc) • 3.08 kB
text/typescript
/**
* -------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License.
* See License in the project root for license information.
* -------------------------------------------------------------------------------------------
*/
import { property } from 'lit-element';
import { IProvider } from '../../providers/IProvider';
import { MgtBaseComponent } from '../baseComponent';
/**
* Abstract implementation for provider component
*
* @export
* @abstract
* @class MgtBaseProvider
* @extends {MgtBaseComponent}
*/
export abstract class MgtBaseProvider extends MgtBaseComponent {
/**
* The IProvider created by this component
*
* @memberof MgtBaseProvider
*/
public get provider(): IProvider {
return this._provider;
}
public set provider(value: IProvider) {
if (this._provider) {
this.provider.removeStateChangedHandler(() => this.stateChangedHandler);
}
this._provider = value;
if (this._provider) {
this.provider.onStateChanged(() => this.stateChangedHandler);
}
}
/**
* Gets weather this provider can be used in this environment
*
* @readonly
* @type {boolean}
* @memberof MgtBaseProvider
*/
public get isAvailable(): boolean {
return true;
}
/**
* Higher priority provider that should be initialized before attempting
* to initialize this provider. This provider will only be initialized
* if all higher priority providers are not available.
*
* @type {MgtBaseProvider}
* @memberof MgtBaseProvider
*/
public dependsOn: MgtBaseProvider;
private _provider: IProvider;
/**
* Invoked when the element is first updated. Implement to perform one time
* work on the element after update.
*
* Setting properties inside this method will trigger the element to update
* again after this update cycle completes.
*
* * @param _changedProperties Map of changed properties with old values
*/
protected firstUpdated(changedProperties) {
super.firstUpdated(changedProperties);
let higherPriority = false;
if (this.dependsOn) {
let higherPriorityProvider = this.dependsOn;
while (higherPriorityProvider) {
if (higherPriorityProvider.isAvailable) {
higherPriority = true;
break;
}
higherPriorityProvider = higherPriorityProvider.dependsOn;
}
}
if (!higherPriority && this.isAvailable) {
this.initializeProvider();
}
}
/**
* method called to initialize the provider. Each derived class should provide
* their own implementation
*
* @protected
* @memberof MgtBaseProvider
*/
// tslint:disable-next-line: no-empty
protected initializeProvider() {}
private stateChangedHandler() {
this.fireCustomEvent('onStateChanged', this.provider.state);
}
}