70 lines
2.2 KiB
TypeScript
70 lines
2.2 KiB
TypeScript
///
|
|
/// Copyright © 2016-2020 The Thingsboard Authors
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
///
|
|
|
|
import { Inject, Injectable, NgZone } from '@angular/core';
|
|
import { HttpClient } from '@angular/common/http';
|
|
import { WINDOW } from '@core/services/window.service';
|
|
|
|
export type CancelAnimationFrame = () => void;
|
|
|
|
// @dynamic
|
|
@Injectable({
|
|
providedIn: 'root'
|
|
})
|
|
export class RafService {
|
|
|
|
private readonly rafFunction: (frameCallback: () => void) => CancelAnimationFrame;
|
|
private readonly rafSupported: boolean;
|
|
|
|
constructor(
|
|
@Inject(WINDOW) private window: Window,
|
|
private ngZone: NgZone
|
|
) {
|
|
const requestAnimationFrame: (frameCallback: () => void) => number = window.requestAnimationFrame ||
|
|
window.webkitRequestAnimationFrame;
|
|
const cancelAnimationFrame = window.cancelAnimationFrame ||
|
|
window.webkitCancelAnimationFrame ||
|
|
// @ts-ignore
|
|
window.webkitCancelRequestAnimationFrame;
|
|
|
|
this.rafSupported = !!requestAnimationFrame;
|
|
|
|
if (this.rafSupported) {
|
|
this.rafFunction = (frameCallback: () => void) => {
|
|
const id = requestAnimationFrame(frameCallback);
|
|
return () => {
|
|
cancelAnimationFrame(id);
|
|
};
|
|
};
|
|
} else {
|
|
this.rafFunction = (frameCallback: () => void) => {
|
|
const timeoutId = setTimeout(frameCallback, 16.66);
|
|
return () => {
|
|
clearTimeout(timeoutId);
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
public raf(frameCallback: () => void, runInZone = false): CancelAnimationFrame {
|
|
if (runInZone) {
|
|
return this.rafFunction(frameCallback);
|
|
} else {
|
|
return this.ngZone.runOutsideAngular(() => this.rafFunction(frameCallback));
|
|
}
|
|
}
|
|
}
|