UNPKG

ngx-countdown

Version:

Simple, easy and performance countdown for angular

1 lines 20.7 kB
{"version":3,"file":"ngx-countdown.mjs","sources":["../../lib/src/interfaces.ts","../../lib/src/countdown.timer.ts","../../lib/src/provide.ts","../../lib/src/countdown.component.ts","../../lib/src/countdown.module.ts","../../lib/src/ngx-countdown.ts"],"sourcesContent":["export type CountdownFormatFn = (opt: CountdownFormatFnOption) => string;\n\nexport interface CountdownFormatFnOption {\n date: number;\n formatStr: string;\n timezone?: string;\n}\n\nexport enum CountdownStatus {\n ing,\n pause,\n stop,\n done,\n}\n\nexport interface CountdownConfig {\n /**\n * Start the counter on demand, must call `begin()` to starting, Default: `false`\n */\n demand?: boolean;\n\n /**\n * Calculate the remaining time based on the server, e.g: `10`,`5.5`, (Unit: seconds)\n */\n leftTime?: number;\n\n /**\n * Refers to counting down from local time to end time (Unit: Milliseconds second UNIX timestamp)\n */\n stopTime?: number;\n\n /**\n * Formats a date value, pls refer to [Accepted patterns](https://angular.io/api/common/DatePipe#usage-notes), Default: `HH:mm:ss`\n */\n format?: string;\n\n /**\n * Beautify text, generally used to convert formatted time text into HTML\n */\n prettyText?: (text: string) => string;\n\n /**\n * Should be trigger type `notify` event on the x second. When values is `0` will be trigger every time.\n */\n notify?: number[] | number;\n\n /**\n * Default based on the implementation of `formatDate` in `@angular/common`\n *\n * You can changed to other libs, e.g: [date-fns](https://date-fns.org/v2.0.1/docs/format)\n */\n formatDate?: CountdownFormatFn;\n\n /**\n * A timezone offset (such as '+0430'), or a standard UTC/GMT.\n * When not supplied, uses the end-user's local system timezone, Default: `+0000`\n */\n timezone?: string;\n}\n\nexport type CountdownEventAction = 'start' | 'stop' | 'restart' | 'pause' | 'resume' | 'notify' | 'done';\n\nexport interface CountdownEvent {\n action: CountdownEventAction;\n status: CountdownStatus;\n left: number;\n text: string;\n}\n\nexport interface CountdownItem {\n text?: string;\n value?: number;\n}\n","import { inject, Injectable, NgZone } from '@angular/core';\n\n@Injectable()\nexport class CountdownTimer {\n private ngZone = inject(NgZone);\n private fns: Array<((count: number) => number | void) | number> = [];\n private commands: Array<() => void> = [];\n private nextTime = 0;\n private ing = false;\n\n start(): void {\n if (this.ing === true) {\n return;\n }\n\n this.ing = true;\n this.nextTime = +new Date();\n this.ngZone.runOutsideAngular(() => {\n this.process();\n });\n }\n\n private process(): void {\n while (this.commands.length) {\n this.commands.shift()!();\n }\n let diff = +new Date() - this.nextTime;\n const count = 1 + Math.floor(diff / 100);\n\n diff = 100 - (diff % 100);\n this.nextTime += 100 * count;\n\n for (let i = 0, len = this.fns.length; i < len; i += 2) {\n let frequency = this.fns[i + 1] as number;\n\n // 100/s\n if (0 === frequency) {\n (this.fns[i] as (count: number) => void)(count);\n // 1000/s\n } else {\n // 先把末位至0,再每次加2\n frequency += 2 * count - 1;\n\n const step = Math.floor(frequency / 20);\n if (step > 0) {\n (this.fns[i] as (count: number) => void)(step);\n }\n\n // 把末位还原成1\n this.fns[i + 1] = (frequency % 20) + 1;\n }\n }\n\n if (!this.ing) {\n return;\n }\n\n setTimeout(() => this.process(), diff);\n }\n\n add(fn: () => void, frequency: number): this {\n this.commands.push(() => {\n this.fns.push(fn);\n this.fns.push(frequency === 1000 ? 1 : 0);\n this.ing = true;\n });\n return this;\n }\n\n remove(fn: () => void): this {\n this.commands.push(() => {\n const i = this.fns.indexOf(fn);\n if (i !== -1) {\n this.fns.splice(i, 2);\n }\n this.ing = this.fns.length > 0;\n });\n return this;\n }\n}\n","import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport type { CountdownConfig } from './interfaces';\n\nexport const COUNTDOWN_CONFIG = new InjectionToken<CountdownConfig>('COUNTDOWN_CONFIG');\n\nexport function provideCountdown(config?: CountdownConfig): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: COUNTDOWN_CONFIG, useValue: config }]);\n}\n","import {\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n Output,\n EventEmitter,\n OnInit,\n SimpleChange,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n LOCALE_ID,\n ChangeDetectorRef,\n TemplateRef,\n NgZone,\n inject,\n} from '@angular/core';\n\nimport { CountdownConfig, CountdownStatus, CountdownEvent, CountdownEventAction, CountdownItem } from './interfaces';\nimport { CountdownTimer } from './countdown.timer';\nimport { NgTemplateOutlet, formatDate } from '@angular/common';\nimport { COUNTDOWN_CONFIG } from './provide';\n\n@Component({\n selector: 'countdown',\n template: `\n @if (render) {\n <ng-container *ngTemplateOutlet=\"render; context: { $implicit: i }\" />\n } @else {\n <span [innerHTML]=\"i.text\"></span>\n }\n `,\n host: { '[class.count-down]': 'true' },\n styles: [\n `\n .count-down {\n font-variant-numeric: tabular-nums;\n }\n `,\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n providers: [CountdownTimer],\n})\nexport class CountdownComponent implements OnInit, OnChanges, OnDestroy {\n private locale = inject(LOCALE_ID);\n private timer = inject(CountdownTimer);\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private defCog = inject(COUNTDOWN_CONFIG, { optional: true });\n\n private frequency = 1000;\n private _notify: { [key: number]: boolean } = {};\n private status: CountdownStatus = CountdownStatus.ing;\n private isDestroy = false;\n private _config!: CountdownConfig;\n i: CountdownItem = {};\n left = 0;\n\n @Input({ required: true })\n set config(i: CountdownConfig) {\n if (i.notify != null && !Array.isArray(i.notify) && i.notify > 0) {\n i.notify = [i.notify];\n }\n this._config = i;\n }\n get config(): CountdownConfig {\n return this._config;\n }\n @Input() render?: TemplateRef<{ $implicit: CountdownItem }>;\n @Output() readonly event = new EventEmitter<CountdownEvent>();\n\n /**\n * Start countdown, you must manually call when `demand: false`\n */\n begin(): void {\n this.status = CountdownStatus.ing;\n this.callEvent('start');\n }\n\n /**\n * Restart countdown\n */\n restart(): void {\n if (this.status !== CountdownStatus.stop) {\n this.destroy();\n }\n this.init();\n this.callEvent('restart');\n }\n\n /**\n * Stop countdown, must call `restart` when stopped, it's different from pause, unable to recover\n */\n stop(): void {\n if (this.status === CountdownStatus.stop) {\n return;\n }\n this.status = CountdownStatus.stop;\n this.destroy();\n this.callEvent('stop');\n }\n\n /**\n * Pause countdown, you can use `resume` to recover again\n */\n pause(): void {\n if (this.status === CountdownStatus.stop || this.status === CountdownStatus.pause) {\n return;\n }\n this.status = CountdownStatus.pause;\n this.callEvent('pause');\n }\n\n /**\n * Resume countdown\n */\n resume(): void {\n if (this.status === CountdownStatus.stop || this.status !== CountdownStatus.pause) {\n return;\n }\n this.status = CountdownStatus.ing;\n this.callEvent('resume');\n }\n\n private callEvent(action: CountdownEventAction): void {\n this.event.emit({ action, left: this.left, status: this.status, text: this.i.text! });\n }\n\n private init(): void {\n const config = (this.config = {\n demand: false,\n leftTime: 0,\n format: 'HH:mm:ss',\n timezone: '+0000',\n formatDate: ({ date, formatStr, timezone }) => {\n return formatDate(new Date(date), formatStr, this.locale, timezone || '+0000');\n },\n ...this.defCog,\n ...this.config,\n });\n const frq = (this.frequency = ~config.format!.indexOf('S') ? 100 : 1000);\n this.status = config.demand ? CountdownStatus.pause : CountdownStatus.ing;\n\n this.getLeft();\n\n // bind reflow to me\n const _reflow = this.reflow;\n this.reflow = (count: number = 0, force: boolean = false) => _reflow.apply(this, [count, force]);\n\n if (Array.isArray(config.notify)) {\n config.notify.forEach((time: number) => {\n if (time < 1) {\n throw new Error(`The notify config must be a positive integer.`);\n }\n\n time = time * 1000;\n time = time - (time % frq);\n this._notify[time] = true;\n });\n }\n\n this.timer.add(this.reflow, frq).start();\n\n this.reflow(0, true);\n }\n\n private destroy(): this {\n this.timer.remove(this.reflow);\n return this;\n }\n\n /**\n * 更新时钟\n */\n private reflow(count: number = 0, force: boolean = false): void {\n if (this.isDestroy) {\n return;\n }\n\n const { status, config, _notify } = this;\n if (!force && status !== CountdownStatus.ing) {\n return;\n }\n\n let value = (this.left = this.left - this.frequency * count);\n if (value < 1) {\n value = 0;\n }\n this.i = {\n value,\n text: config.formatDate!({ date: value, formatStr: config.format!, timezone: config.timezone }),\n };\n if (typeof config.prettyText === 'function') {\n this.i.text = config.prettyText(this.i.text!);\n }\n this.cdr.detectChanges();\n\n if (config.notify === 0 || _notify[value]) {\n this.ngZone.run(() => {\n this.callEvent('notify');\n });\n }\n\n if (value === 0) {\n this.ngZone.run(() => {\n this.status = CountdownStatus.done;\n this.destroy();\n this.callEvent('done');\n });\n }\n }\n\n /**\n * 获取倒计时剩余帧数\n */\n private getLeft(): void {\n const { config, frequency } = this;\n let left = config.leftTime! * 1000;\n const end = config.stopTime;\n\n if (!left && end) {\n left = end - new Date().getTime();\n }\n\n this.left = left - (left % frequency);\n }\n\n ngOnInit(): void {\n this.init();\n if (!this.config.demand) {\n this.begin();\n }\n }\n\n ngOnDestroy(): void {\n this.isDestroy = true;\n this.destroy();\n }\n\n ngOnChanges(changes: { [P in keyof this]?: SimpleChange } & SimpleChanges): void {\n if (!changes.config!.firstChange) {\n this.restart();\n }\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { CountdownComponent } from './countdown.component';\n\n@NgModule({\n imports: [CountdownComponent],\n exports: [CountdownComponent],\n})\nexport class CountdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}