{"version":3,"file":"ngx-countdown.mjs","sources":["../../lib/src/interfaces.ts","../../lib/src/timer.ts","../../lib/src/provide.ts","../../lib/src/countdown.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 { Injectable } from '@angular/core';\n\n@Injectable()\nexport class CountdownTimer {\n  private fns: (((count: number) => number | void) | number)[] = [];\n  private commands: (() => 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.process();\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  OnDestroy,\n  ChangeDetectionStrategy,\n  ViewEncapsulation,\n  LOCALE_ID,\n  TemplateRef,\n  inject,\n  output,\n  input,\n  effect,\n  afterNextRender,\n  signal,\n} from '@angular/core';\n\nimport { CountdownConfig, CountdownStatus, CountdownEvent, CountdownEventAction, CountdownItem } from './interfaces';\nimport { CountdownTimer } from './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' },\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 OnDestroy {\n  private readonly locale = inject(LOCALE_ID);\n  private readonly timer = inject(CountdownTimer);\n  private readonly defCog = inject(COUNTDOWN_CONFIG, { optional: true });\n\n  private frequency = 1000;\n  private readonly _notify: Record<number, boolean> = {};\n  private status: CountdownStatus = CountdownStatus.ing;\n  private isDestroy = false;\n  private _config?: CountdownConfig;\n  private left = 0;\n  readonly i = signal<CountdownItem>({});\n\n  readonly config = input.required({\n    transform: (i: CountdownConfig) => {\n      if (i.notify != null && !Array.isArray(i.notify) && i.notify > 0) {\n        i.notify = [i.notify];\n      }\n      return i;\n    }\n  });\n  readonly render = input<TemplateRef<{ $implicit: CountdownItem }>>();\n  readonly event = output<CountdownEvent>();\n\n  constructor() {\n    afterNextRender(() => {\n      this.init();\n      if (!this._config?.demand) {\n        this.begin();\n      }\n    });\n\n    let cfgFirst = true;\n    effect(() => {\n      this.config();\n\n      if (cfgFirst) {\n        cfgFirst = false;\n        return;\n      }\n\n      this.restart();\n    })\n  }\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: CountdownConfig = {\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    this._config = config;\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 = 0, force = 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 = 0, force = false): void {\n    if (this.isDestroy || this._config == null) {\n      return;\n    }\n\n    const { status, _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    const { formatDate, format, timezone, prettyText, notify } = this._config;\n    const item: CountdownItem = {\n      value,\n      text: formatDate!({ date: value, formatStr: format!, timezone: timezone }),\n    };\n    if (typeof prettyText === 'function') {\n      item.text = prettyText(item.text!);\n    }\n    this.i.set(item);\n\n    if (notify === 0 || _notify[value]) {\n      this.callEvent('notify');\n    }\n\n    if (value === 0) {\n      this.status = CountdownStatus.done;\n      this.destroy();\n      this.callEvent('done');\n    }\n  }\n\n  /**\n   * 获取倒计时剩余帧数\n   */\n  private getLeft(): void {\n    const { frequency } = this;\n    const { leftTime, stopTime } = this._config!;\n    let left = leftTime! * 1000;\n    const end = stopTime;\n\n    if (!left && end) {\n      left = end - new Date().getTime();\n    }\n\n    this.left = left - (left % frequency);\n  }\n\n  ngOnDestroy(): void {\n    this.isDestroy = true;\n    this.destroy();\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}