UNPKG

@ciri/ngx-countdown

Version:
324 lines 20 kB
/** * @fileoverview added by tsickle * Generated from: lib/countdown.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef } from '@angular/core'; import { interval } from 'rxjs'; import { animationFrame } from 'rxjs/internal/scheduler/animationFrame'; import { isSameSecond, parseFormat, parseTimeData } from './utils'; /** * @record */ function CountdownData() { } if (false) { /** @type {?} */ CountdownData.prototype.remain; /** @type {?} */ CountdownData.prototype.formattedTime; /** @type {?} */ CountdownData.prototype.fragments; } /** @enum {number} */ var CountdownState = { /** 暂停状态 */ paused: 0, /** 运行状态 */ playing: 1, /** 完成状态 */ finished: 2, }; export { CountdownState }; CountdownState[CountdownState.paused] = 'paused'; CountdownState[CountdownState.playing] = 'playing'; CountdownState[CountdownState.finished] = 'finished'; /** * 所有组件实例使用同一个 interval 流,以免实例多了后造成卡顿 * @type {?} */ var instances = []; /** @type {?} */ var counter$ = interval(0, animationFrame); /** @type {?} */ var counterSub; /** * @return {?} */ function setupCounter() { destroyCounter(); counterSub = counter$.subscribe((/** * @return {?} */ function () { for (var i = 0; i < instances.length; i++) { /** @type {?} */ var inst = instances[i]; if (inst.state !== CountdownState.playing) { continue; } if (inst.remain <= 0) { inst.state = CountdownState.finished; inst.cdr.detectChanges(); inst.finish.emit(); continue; } /** @type {?} */ var remain = Math.max(inst.endTime - Date.now(), 0); if (!inst.millisecond) { if (!isSameSecond(remain, inst.remain) || remain === 0) { inst.remain = remain; inst.tick.emit(inst.remain); } } else { inst.remain = remain; inst.tick.emit(inst.remain); } inst.cdr.detectChanges(); } })); } /** * @return {?} */ function destroyCounter() { counterSub && counterSub.unsubscribe(); } /** * 倒计时组件 */ var CountdownComponent = /** @class */ (function () { function CountdownComponent(cdr) { this.cdr = cdr; /** * 格式 */ this.format = 'HH:mm:ss'; /** * 是否自动开始 */ this.autoStart = true; /** * 是否开启毫秒级渲染 */ this.millisecond = false; /** * 倒计时完毕时触发 */ this.finish = new EventEmitter(); /** * 每倒计时一次都触发 */ this.tick = new EventEmitter(); this.state = CountdownState.paused; this._time = 60000; } Object.defineProperty(CountdownComponent.prototype, "time", { get: /** * @return {?} */ function () { return this._time; }, /** 总毫秒数 */ set: /** * 总毫秒数 * @param {?} value * @return {?} */ function (value) { this._time = Math.max(value, 0); this.reset(); }, enumerable: true, configurable: true }); Object.defineProperty(CountdownComponent.prototype, "data", { get: /** * @return {?} */ function () { /** @type {?} */ var noMillisecond = this.format.indexOf('S') === -1; /** @type {?} */ var isPlaying = this.state === CountdownState.playing // 即使 format 中没有设置毫秒,程序计算时候也会将毫秒计算进去,导致运行时秒数看上去总是小 1 // 此处在渲染时候手动 +1 秒,以追求视觉统一 ; // 即使 format 中没有设置毫秒,程序计算时候也会将毫秒计算进去,导致运行时秒数看上去总是小 1 // 此处在渲染时候手动 +1 秒,以追求视觉统一 /** @type {?} */ var timeData = parseTimeData(this.remain + (noMillisecond && isPlaying ? 1000 : 0)); /** @type {?} */ var formattedTime = parseFormat(this.format, timeData); return { formattedTime: formattedTime, remain: this.remain, fragments: formattedTime.split(':') }; }, enumerable: true, configurable: true }); /** * @return {?} */ CountdownComponent.prototype.ngOnInit = /** * @return {?} */ function () { instances.push(this); if (instances.length === 1) { setupCounter(); } }; /** * @return {?} */ CountdownComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.pause(); /** @type {?} */ var index = instances.indexOf(this); if (index !== -1) { instances.splice(index, 1); } if (instances.length === 0) { destroyCounter(); } }; /** * 继续倒计时 */ /** * 继续倒计时 * @return {?} */ CountdownComponent.prototype.start = /** * 继续倒计时 * @return {?} */ function () { if (this.state === CountdownState.playing) { return; } if (this.state === CountdownState.finished) { this.remain = this.time; } this.endTime = Date.now() + this.remain; this.state = CountdownState.playing; }; /** * 暂停倒计时 */ /** * 暂停倒计时 * @return {?} */ CountdownComponent.prototype.pause = /** * 暂停倒计时 * @return {?} */ function () { this.state = CountdownState.paused; }; /** * 重置倒计时 */ /** * 重置倒计时 * @return {?} */ CountdownComponent.prototype.reset = /** * 重置倒计时 * @return {?} */ function () { this.pause(); this.remain = this.time; this.cdr.detectChanges(); if (this.autoStart) { this.start(); } }; CountdownComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-countdown', template: "<ng-container *ngIf=\"!render\">{{ data.formattedTime }}</ng-container>\n<ng-container *ngTemplateOutlet=\"render; context: { $implicit: data }\"></ng-container>\n", changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ CountdownComponent.ctorParameters = function () { return [ { type: ChangeDetectorRef } ]; }; CountdownComponent.propDecorators = { format: [{ type: Input }], autoStart: [{ type: Input }], millisecond: [{ type: Input }], render: [{ type: Input }], time: [{ type: Input }], finish: [{ type: Output }], tick: [{ type: Output }] }; return CountdownComponent; }()); export { CountdownComponent }; if (false) { /** * 格式 * @type {?} */ CountdownComponent.prototype.format; /** * 是否自动开始 * @type {?} */ CountdownComponent.prototype.autoStart; /** * 是否开启毫秒级渲染 * @type {?} */ CountdownComponent.prototype.millisecond; /** * 自定义模版 * @type {?} */ CountdownComponent.prototype.render; /** * 倒计时完毕时触发 * @type {?} */ CountdownComponent.prototype.finish; /** * 每倒计时一次都触发 * @type {?} */ CountdownComponent.prototype.tick; /** @type {?} */ CountdownComponent.prototype.state; /** * @type {?} * @private */ CountdownComponent.prototype._time; /** * 剩余毫秒数 * @type {?} * @private */ CountdownComponent.prototype.remain; /** * @type {?} * @private */ CountdownComponent.prototype.endTime; /** * @type {?} * @private */ CountdownComponent.prototype.cdr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjaXJpL25neC1jb3VudGRvd24vIiwic291cmNlcyI6WyJsaWIvY291bnRkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixXQUFXLEVBQ1osTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxNQUFNLENBQUE7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQTs7OztBQUVsRSw0QkFJQzs7O0lBSEMsK0JBQWM7O0lBQ2Qsc0NBQXFCOztJQUNyQixrQ0FBZ0I7OztBQUVsQixJQUFZLGNBQWM7SUFDeEIsV0FBVztJQUNYLE1BQU0sR0FBQTtJQUNOLFdBQVc7SUFDWCxPQUFPLEdBQUE7SUFDUCxXQUFXO0lBQ1gsUUFBUSxHQUFBO0VBQ1Q7Ozs7Ozs7OztJQUtLLFNBQVMsR0FBRyxFQUFFOztJQUNkLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQzs7SUFDeEMsVUFBd0I7Ozs7QUFFNUIsU0FBUyxZQUFZO0lBQ25CLGNBQWMsRUFBRSxDQUFBO0lBQ2hCLFVBQVUsR0FBRyxRQUFRLENBQUMsU0FBUzs7O0lBQUM7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUNuQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUV6QixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLE9BQU8sRUFBRTtnQkFD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QyxJQUFJLENBQUE7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUV4QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1NBQ2I7SUFDSCxDQUFDOztnQkF4R0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QiwrS0FBeUM7b0JBQ3pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs7OztnQkE5RUMsaUJBQWlCOzs7eUJBaUZoQixLQUFLOzRCQUVMLEtBQUs7OEJBRUwsS0FBSzt5QkFFTCxLQUFLO3VCQUVMLEtBQUs7eUJBVUwsTUFBTTt1QkFFTixNQUFNOztJQThFVCx5QkFBQztDQUFBLEFBekdELElBeUdDO1NBcEdZLGtCQUFrQjs7Ozs7O0lBRTdCLG9DQUFvQzs7Ozs7SUFFcEMsdUNBQWtDOzs7OztJQUVsQyx5Q0FBcUM7Ozs7O0lBRXJDLG9DQUFpQzs7Ozs7SUFZakMsb0NBQTBDOzs7OztJQUUxQyxrQ0FBMkM7O0lBRTNDLG1DQUE2Qzs7Ozs7SUFnQjdDLG1DQUE2Qjs7Ozs7O0lBRTdCLG9DQUFzQjs7Ozs7SUFDdEIscUNBQXVCOzs7OztJQUVYLGlDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBhbmltYXRpb25GcmFtZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvc2NoZWR1bGVyL2FuaW1hdGlvbkZyYW1lJ1xuaW1wb3J0IHsgaXNTYW1lU2Vjb25kLCBwYXJzZUZvcm1hdCwgcGFyc2VUaW1lRGF0YSB9IGZyb20gJy4vdXRpbHMnXG5cbmludGVyZmFjZSBDb3VudGRvd25EYXRhIHtcbiAgcmVtYWluOiBudW1iZXJcbiAgZm9ybWF0dGVkVGltZTogc3RyaW5nXG4gIGZyYWdtZW50czogYW55W11cbn1cbmV4cG9ydCBlbnVtIENvdW50ZG93blN0YXRlIHtcbiAgLyoqIOaaguWBnOeKtuaAgSAqL1xuICBwYXVzZWQsXG4gIC8qKiDov5DooYznirbmgIEgKi9cbiAgcGxheWluZyxcbiAgLyoqIOWujOaIkOeKtuaAgSAqL1xuICBmaW5pc2hlZFxufVxuXG4vKipcbiAqIOaJgOaciee7hOS7tuWunuS+i+S9v+eUqOWQjOS4gOS4qiBpbnRlcnZhbCDmtYHvvIzku6XlhY3lrp7kvovlpJrkuoblkI7pgKDmiJDljaHpob9cbiAqL1xuY29uc3QgaW5zdGFuY2VzID0gW11cbmNvbnN0IGNvdW50ZXIkID0gaW50ZXJ2YWwoMCwgYW5pbWF0aW9uRnJhbWUpXG5sZXQgY291bnRlclN1YjogU3Vic2NyaXB0aW9uXG5cbmZ1bmN0aW9uIHNldHVwQ291bnRlcigpIHtcbiAgZGVzdHJveUNvdW50ZXIoKVxuICBjb3VudGVyU3ViID0gY291bnRlciQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5zdCA9IGluc3RhbmNlc1tpXVxuXG4gICAgICBpZiAoaW5zdC5zdGF0ZSAhPT0gQ291bnRkb3duU3RhdGUucGxheWluZykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdC5yZW1haW4gPD0gMCkge1xuICAgICAgICBpbnN0LnN0YXRlID0gQ291bnRkb3duU3RhdGUuZmluaXNoZWRcbiAgICAgICAgaW5zdC5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIGluc3QuZmluaXNoLmVtaXQoKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZW1haW4gPSBNYXRoLm1heChpbnN0LmVuZFRpbWUgLSBEYXRlLm5vdygpLCAwKVxuXG4gICAgICBpZiAoIWluc3QubWlsbGlzZWNvbmQpIHtcbiAgICAgICAgaWYgKCFpc1NhbWVTZWNvbmQocmVtYWluLCBpbnN0LnJlbWFpbikgfHwgcmVtYWluID09PSAwKSB7XG4gICAgICAgICAgaW5zdC5yZW1haW4gPSByZW1haW5cbiAgICAgICAgICBpbnN0LnRpY2suZW1pdChpbnN0LnJlbWFpbilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdC5yZW1haW4gPSByZW1haW5cbiAgICAgICAgaW5zdC50aWNrLmVtaXQoaW5zdC5yZW1haW4pXG4gICAgICB9XG5cbiAgICAgIGluc3QuY2RyLmRldGVjdENoYW5nZXMoKVxuICAgIH1cbiAgfSlcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lDb3VudGVyKCkge1xuICBjb3VudGVyU3ViICYmIGNvdW50ZXJTdWIudW5zdWJzY3JpYmUoKVxufVxuXG4vKipcbiAqIOWAkuiuoeaXtue7hOS7tlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtY291bnRkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvdW50ZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENvdW50ZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIOagvOW8jyAqL1xuICBASW5wdXQoKSBmb3JtYXQ6IHN0cmluZyA9ICdISDptbTpzcydcbiAgLyoqIOaYr+WQpuiHquWKqOW8gOWniyAqL1xuICBASW5wdXQoKSBhdXRvU3RhcnQ6IGJvb2xlYW4gPSB0cnVlXG4gIC8qKiDmmK/lkKblvIDlkK/mr6vnp5LnuqfmuLLmn5MgKi9cbiAgQElucHV0KCkgbWlsbGlzZWNvbmQ6IGJvb2xlYW4gPSBmYWxzZVxuICAvKiog6Ieq5a6a5LmJ5qih54mIICovXG4gIEBJbnB1dCgpIHJlbmRlcjogVGVtcGxhdGVSZWY8YW55PlxuICAvKiog5oC75q+r56eS5pWwICovXG4gIEBJbnB1dCgpXG4gIHNldCB0aW1lKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90aW1lID0gTWF0aC5tYXgodmFsdWUsIDApXG4gICAgdGhpcy5yZXNldCgpXG4gIH1cbiAgZ2V0IHRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVcbiAgfVxuXG4gIC8qKiDlgJLorqHml7blrozmr5Xml7bop6blj5EgKi9cbiAgQE91dHB1dCgpIGZpbmlzaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIC8qKiDmr4/lgJLorqHml7bkuIDmrKHpg73op6blj5EgKi9cbiAgQE91dHB1dCgpIHRpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuXG4gIHN0YXRlOiBDb3VudGRvd25TdGF0ZSA9IENvdW50ZG93blN0YXRlLnBhdXNlZFxuICBnZXQgZGF0YSgpOiBDb3VudGRvd25EYXRhIHtcbiAgICBjb25zdCBub01pbGxpc2Vjb25kID0gdGhpcy5mb3JtYXQuaW5kZXhPZignUycpID09PSAtMSxcbiAgICAgIGlzUGxheWluZyA9IHRoaXMuc3RhdGUgPT09IENvdW50ZG93blN0YXRlLnBsYXlpbmdcblxuICAgIC8vIOWNs+S9vyBmb3JtYXQg5Lit5rKh5pyJ6K6+572u5q+r56eS77yM56iL5bqP6K6h566X5pe25YCZ5Lmf5Lya5bCG5q+r56eS6K6h566X6L+b5Y6777yM5a+86Ie06L+Q6KGM5pe256eS5pWw55yL5LiK5Y675oC75piv5bCPIDFcbiAgICAvLyDmraTlpITlnKjmuLLmn5Pml7blgJnmiYvliqggKzEg56eS77yM5Lul6L+95rGC6KeG6KeJ57uf5LiAXG4gICAgY29uc3QgdGltZURhdGEgPSBwYXJzZVRpbWVEYXRhKHRoaXMucmVtYWluICsgKG5vTWlsbGlzZWNvbmQgJiYgaXNQbGF5aW5nID8gMTAwMCA6IDApKVxuICAgIGNvbnN0IGZvcm1hdHRlZFRpbWUgPSBwYXJzZUZvcm1hdCh0aGlzLmZvcm1hdCwgdGltZURhdGEpXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdHRlZFRpbWUsXG4gICAgICByZW1haW46IHRoaXMucmVtYWluLFxuICAgICAgZnJhZ21lbnRzOiBmb3JtYXR0ZWRUaW1lLnNwbGl0KCc6JylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90aW1lOiBudW1iZXIgPSA2MDAwMFxuICAvKiog5Ymp5L2Z5q+r56eS5pWwICovXG4gIHByaXZhdGUgcmVtYWluOiBudW1iZXJcbiAgcHJpdmF0ZSBlbmRUaW1lOiBudW1iZXJcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaW5zdGFuY2VzLnB1c2godGhpcylcbiAgICBpZiAoaW5zdGFuY2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc2V0dXBDb3VudGVyKClcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnBhdXNlKClcbiAgICBjb25zdCBpbmRleCA9IGluc3RhbmNlcy5pbmRleE9mKHRoaXMpXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgaW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlc3Ryb3lDb3VudGVyKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog57un57ut5YCS6K6h5pe2XG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ291bnRkb3duU3RhdGUucGxheWluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IENvdW50ZG93blN0YXRlLmZpbmlzaGVkKSB7XG4gICAgICB0aGlzLnJlbWFpbiA9IHRoaXMudGltZVxuICAgIH1cblxuICAgIHRoaXMuZW5kVGltZSA9IERhdGUubm93KCkgKyB0aGlzLnJlbWFpblxuICAgIHRoaXMuc3RhdGUgPSBDb3VudGRvd25TdGF0ZS5wbGF5aW5nXG4gIH1cblxuICAvKipcbiAgICog5pqC5YGc5YCS6K6h5pe2XG4gICAqL1xuICBwYXVzZSgpIHtcbiAgICB0aGlzLnN0YXRlID0gQ291bnRkb3duU3RhdGUucGF1c2VkXG4gIH1cblxuICAvKipcbiAgICog6YeN572u5YCS6K6h5pe2XG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLnBhdXNlKClcbiAgICB0aGlzLnJlbWFpbiA9IHRoaXMudGltZVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxuXG4gICAgaWYgKHRoaXMuYXV0b1N0YXJ0KSB7XG4gICAgICB0aGlzLnN0YXJ0KClcbiAgICB9XG4gIH1cbn1cbiJdfQ==