{"version":3,"sources":["../src/helpers/getTimeParts.ts","../src/hook/useTimeModel.ts","../src/helpers/now.ts","../src/models/TimeModelState.ts","../src/models/TimeModel.ts","../src/instances/timeModel.ts"],"sourcesContent":["import { Unit, TimeParts } from \"../types\";\n\nexport function getTimeParts(\n  time: number,\n  lastUnit: Unit,\n  roundUnit: Unit = \"ms\"\n): TimeParts {\n  const units: Unit[] = [\"ms\", \"s\", \"m\", \"h\", \"d\"];\n  const lastUnitIndex = units.findIndex((unit) => unit === lastUnit);\n  const roundUnitIndex = units.findIndex((unit) => unit === roundUnit);\n\n  if (roundUnitIndex > lastUnitIndex) {\n    throw new Error(\"roundUnitIndex must be less or equal than lastUnitIndex\");\n  }\n\n  const dividers = [1000, 60, 60, 24, 1];\n  const dividersAcc = [1, 1000, 60000, 3600000, 86400000];\n\n  const startValue = {\n    ms: 0,\n    s: 0,\n    m: 0,\n    h: 0,\n    d: 0,\n  };\n\n  const output = units.reduce((obj, unit, index) => {\n    if (index > lastUnitIndex) {\n      obj[unit] = 0;\n    } else if (index === lastUnitIndex) {\n      obj[unit] = Math.floor(time / dividersAcc[index]);\n    } else {\n      obj[unit] = Math.floor(time / dividersAcc[index]) % dividers[index];\n    }\n\n    return obj;\n  }, startValue);\n\n  if (roundUnitIndex > 0) {\n    const unitToDecideOnRoundIndex = roundUnitIndex - 1;\n    const unitToDecideOnRound = units[unitToDecideOnRoundIndex];\n    const isRoundNeeded = output[unitToDecideOnRound] >= dividers[unitToDecideOnRoundIndex] / 2;\n\n    if (isRoundNeeded) {\n      output[roundUnit] = output[roundUnit] + 1;\n    }\n\n    for (let i = 0; i < roundUnitIndex; i++) {\n      output[units[i]] = 0;\n    }\n  }\n\n  return output;\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { TimeModel } from \"../models/TimeModel\";\nimport { TimerValue } from \"../types\";\n\nexport const useTimeModel = (timer: TimeModel) => {\n  const [timerValue, setTimerValue] = useState(timer.value);\n\n  useEffect(() => {\n    setTimerValue(timer.value);\n\n    const onChange = (timerValue: TimerValue) => {\n      setTimerValue(timerValue);\n    };\n\n    timer.events = {\n      ...timer.events,\n      onChange,\n    };\n\n    return () => {\n      timer.events = {\n        ...timer.events,\n        onChange: undefined,\n      };\n    };\n  }, [timer]);\n\n  const value = useMemo(\n    () => ({\n      value: timerValue,\n      changeTime: timer.changeTime,\n      changeLastUnit: timer.changeLastUnit,\n      changeTimeToUpdate: timer.changeTimeToUpdate,\n      changeDirection: timer.changeDirection,\n      changeCheckpoints: timer.changeCheckpoints,\n      start: timer.start,\n      pause: timer.pause,\n      resume: timer.resume,\n      stop: timer.stop,\n      reset: timer.reset,\n    }),\n    [timer, timerValue]\n  );\n\n  return value;\n};\n","export function now(): number {\n  // if (typeof window === 'undefined' || !('performance' in window)) {\n  //   return Date.now();\n  // }\n  // return performance.now();\n\n  // we do not use performance.now() anymore, read links below for more info\n  // https://medium.com/@mihai/performance-now-sleep-16a5b774560c\n  // https://persistent.info/web-experiments/performance-now-sleep/\n  return Date.now();\n}\n","import { TimeModelStateValues } from \"../types\";\n\nexport const INITED = \"INITED\";\nexport const PLAYING = \"PLAYING\";\nexport const PAUSED = \"PAUSED\";\nexport const STOPPED = \"STOPPED\";\n\nexport class TimeModelState {\n  private onStateChange: (obj: { state: TimeModelStateValues }) => void;\n  private state: TimeModelStateValues = INITED;\n\n  constructor(\n    initialStatus: TimeModelStateValues = INITED,\n    onStateChange: (obj: { state: TimeModelStateValues }) => void = () => {}\n  ) {\n    this.state = initialStatus;\n    this.onStateChange = onStateChange;\n  }\n\n  public setOnStateChange(\n    onStateChange: (obj: { state: TimeModelStateValues }) => void\n  ) {\n    this.onStateChange = onStateChange;\n  }\n\n  public getState() {\n    return this.state;\n  }\n\n  public setInited() {\n    if (this.state === INITED) {\n      return false;\n    }\n\n    this.state = INITED;\n\n    this.onChange();\n\n    return true;\n  }\n\n  public isInited() {\n    return this.state === INITED;\n  }\n\n  public setPlaying() {\n    if (this.state === PLAYING) {\n      return false;\n    }\n\n    this.state = PLAYING;\n\n    this.onChange();\n\n    return true;\n  }\n\n  public isPlaying() {\n    return this.state === PLAYING;\n  }\n\n  public setPaused() {\n    if (this.state !== PLAYING) {\n      return false;\n    }\n\n    this.state = PAUSED;\n\n    this.onChange();\n\n    return true;\n  }\n\n  public isPaused() {\n    return this.state === PAUSED;\n  }\n\n  public setStopped() {\n    if (this.state === INITED) {\n      return false;\n    }\n\n    this.state = STOPPED;\n\n    this.onChange();\n\n    return true;\n  }\n\n  public isStopped() {\n    return this.state === STOPPED;\n  }\n\n  private onChange() {\n    this.onStateChange({ state: this.state });\n  }\n}\n","import { getTimeParts } from \"../helpers/getTimeParts\";\nimport { now } from \"../helpers/now\";\n\nimport { TimeModelState } from \"./TimeModelState\";\nimport { TimerValue, Unit, Checkpoints, Direction } from \"../types\";\n\nexport interface TimeModelOptions {\n  initialTime: number;\n  startImmediately: boolean;\n  direction: \"forward\" | \"backward\";\n  timeToUpdate: number;\n  lastUnit: Unit;\n  roundUnit: Unit;\n  checkpoints: Checkpoints;\n}\n\nexport interface TimeModelEvents {\n  onChange?: (timerValue: TimerValue) => void;\n  onStart?: () => void;\n  onResume?: () => void;\n  onPause?: () => void;\n  onStop?: () => void;\n  onReset?: () => void;\n}\n\nexport class TimeModel {\n  private options: TimeModelOptions;\n  public events: TimeModelEvents;\n\n  private internalTime: number;\n  private time: number;\n  private innerState: TimeModelState;\n  private timerId: number | null;\n\n  constructor(options: TimeModelOptions, events: TimeModelEvents = {}) {\n    this.internalTime = now();\n    this.options = options;\n    this.events = events;\n    this.time = options.initialTime;\n    this.innerState = new TimeModelState(\"INITED\", () => {\n      if (this.events.onChange) {\n        this.events.onChange(this.value);\n      }\n    });\n\n    this.timerId = null;\n\n    if (this.options.startImmediately) {\n      this.start();\n    }\n  }\n\n  get value() {\n    return this.getTimerValue(this.computeTime());\n  }\n\n  get currentOptions(): TimeModelOptions {\n    return JSON.parse(JSON.stringify(this.options));\n  }\n\n  /**\n   * Change options methods\n   **/\n\n  public changeTime = (time: number) => {\n    this.internalTime = now();\n    this.options.initialTime = time;\n    this.time = this.options.initialTime;\n\n    if (this.events.onChange) {\n      this.events.onChange(this.getTimerValue(this.time));\n    }\n  };\n\n  public changeLastUnit = (lastUnit: Unit) => {\n    if (this.innerState.isPlaying()) {\n      this.pause();\n      this.options.lastUnit = lastUnit;\n      this.resume(true);\n    } else {\n      this.options.lastUnit = lastUnit;\n    }\n  };\n\n  public changeRoundUnit = (roundUnit: Unit) => {\n    if (this.innerState.isPlaying()) {\n      this.pause();\n      this.options.roundUnit = roundUnit;\n      this.resume(true);\n    } else {\n      this.options.roundUnit = roundUnit;\n    }\n  };\n\n  public changeTimeToUpdate = (interval: number) => {\n    if (this.innerState.isPlaying()) {\n      this.pause();\n      this.options.timeToUpdate = interval;\n      this.resume();\n    } else {\n      this.options.timeToUpdate = interval;\n    }\n  };\n\n  public changeDirection = (direction: Direction) => {\n    this.options.direction = direction;\n  };\n\n  public changeCheckpoints = (checkpoints: Checkpoints) => {\n    this.options.checkpoints = checkpoints;\n  };\n\n  /**\n   * Timer controls methods\n   **/\n\n  public start = () => {\n    if (this.innerState.setPlaying()) {\n      this.setTimerInterval(true);\n\n      if (this.events.onStart) {\n        this.events.onStart();\n      }\n    }\n  };\n\n  public resume = (callImmediately = false) => {\n    if (this.innerState.isPaused() && this.innerState.setPlaying()) {\n      this.setTimerInterval(callImmediately);\n\n      if (this.events.onResume) {\n        this.events.onResume();\n      }\n    }\n  };\n\n  public pause = () => {\n    if (this.innerState.setPaused()) {\n      if (this.timerId) {\n        clearInterval(this.timerId);\n      }\n\n      if (this.events.onPause) {\n        this.events.onPause();\n      }\n    }\n  };\n\n  public stop = () => {\n    if (this.innerState.setStopped()) {\n      if (this.timerId) {\n        clearInterval(this.timerId);\n      }\n\n      if (this.events.onStop) {\n        this.events.onStop();\n      }\n    }\n  };\n\n  public reset = () => {\n    this.time = this.options.initialTime;\n\n    if (this.events.onChange) {\n      this.events.onChange(this.getTimerValue(this.time));\n    }\n\n    if (this.events.onReset) {\n      this.events.onReset();\n    }\n  };\n\n  /**\n   * Private methods\n   **/\n\n  private setTimerInterval = (callImmediately = false) => {\n    if (this.timerId) {\n      clearInterval(this.timerId);\n    }\n\n    this.internalTime = now();\n\n    const repeatedFunc = () => {\n      const oldTime = this.time;\n      const updatedTime = this.computeTime();\n\n      if (this.events.onChange) {\n        this.events.onChange(this.getTimerValue(updatedTime));\n      }\n\n      this.options.checkpoints.map(({ time, callback }) => {\n        const checkForForward = time > oldTime && time <= updatedTime;\n        const checkForBackward = time < oldTime && time >= updatedTime;\n        const checkIntersection =\n          this.options.direction === \"backward\"\n            ? checkForBackward\n            : checkForForward;\n\n        if (checkIntersection) {\n          callback();\n        }\n      });\n    };\n\n    if (callImmediately && this.events.onChange) {\n      this.events.onChange(this.getTimerValue(this.time));\n    }\n\n    this.timerId = window.setInterval(repeatedFunc, this.options.timeToUpdate);\n  };\n\n  private getTimerValue = (time: number): TimerValue => {\n    return {\n      ...getTimeParts(time, this.options.lastUnit, this.options.roundUnit),\n      state: this.innerState.getState(),\n    };\n  };\n\n  private computeTime = () => {\n    if (this.innerState.isPlaying()) {\n      const currentInternalTime = now();\n      const delta = Math.abs(currentInternalTime - this.internalTime);\n\n      switch (this.options.direction) {\n        case \"forward\":\n          this.time = this.time + delta;\n          this.internalTime = currentInternalTime;\n\n          return this.time;\n\n        case \"backward\": {\n          this.time = this.time - delta;\n          this.internalTime = currentInternalTime;\n\n          if (this.time < 0) {\n            this.stop();\n\n            return 0;\n          }\n\n          return this.time;\n        }\n\n        default:\n          return this.time;\n      }\n    }\n\n    return this.time < 0 ? 0 : this.time;\n  };\n}\n","import {\n  TimeModel,\n  TimeModelEvents,\n  TimeModelOptions,\n} from \"../models/TimeModel\";\n\nconst defaultOptions: TimeModelOptions = {\n  initialTime: 0,\n  direction: \"forward\",\n  timeToUpdate: 250,\n  startImmediately: true,\n  lastUnit: \"d\",\n  roundUnit: \"ms\",\n  checkpoints: [],\n};\n\nexport const createTimeModel = (\n  options: Partial<TimeModelOptions> = {},\n  events: TimeModelEvents = {}\n) => {\n  const resultOptions = {\n    ...defaultOptions,\n    ...options,\n  };\n\n  return new TimeModel(resultOptions, events);\n};\n"],"mappings":"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","names":["getTimeParts","time","lastUnit","roundUnit","units","lastUnitIndex","unit","roundUnitIndex","dividers","dividersAcc","startValue","output","obj","index","unitToDecideOnRoundIndex","unitToDecideOnRound","i","useEffect","useMemo","useState","useTimeModel","timer","timerValue","setTimerValue","useState","useEffect","onChange","__spreadProps","__spreadValues","useMemo","now","INITED","PLAYING","PAUSED","STOPPED","TimeModelState","initialStatus","onStateChange","TimeModel","options","events","time","now","lastUnit","roundUnit","interval","direction","checkpoints","callImmediately","repeatedFunc","oldTime","updatedTime","callback","checkForForward","checkForBackward","__spreadProps","__spreadValues","getTimeParts","currentInternalTime","delta","TimeModelState","defaultOptions","createTimeModel","options","events","resultOptions","__spreadValues","TimeModel"]}