react-compound-timer
Version:
React hooks for timers, countdowns, and stopwatches.
1 lines • 18.3 kB
Source Map (JSON)
{"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":";;;;;;;;;;;;;;;;;;;;;AAEO,SAAS,aACd,MACA,UACA,YAAkB,MACP;AACX,QAAM,QAAgB,CAAC,MAAM,KAAK,KAAK,KAAK,GAAG;AAC/C,QAAM,gBAAgB,MAAM,UAAU,CAAC,SAAS,SAAS,QAAQ;AACjE,QAAM,iBAAiB,MAAM,UAAU,CAAC,SAAS,SAAS,SAAS;AAEnE,MAAI,iBAAiB,eAAe;AAClC,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,QAAM,WAAW,CAAC,KAAM,IAAI,IAAI,IAAI,CAAC;AACrC,QAAM,cAAc,CAAC,GAAG,KAAM,KAAO,MAAS,KAAQ;AAEtD,QAAM,aAAa;AAAA,IACjB,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,QAAM,SAAS,MAAM,OAAO,CAAC,KAAK,MAAM,UAAU;AAChD,QAAI,QAAQ,eAAe;AACzB,UAAI,IAAI,IAAI;AAAA,IACd,WAAW,UAAU,eAAe;AAClC,UAAI,IAAI,IAAI,KAAK,MAAM,OAAO,YAAY,KAAK,CAAC;AAAA,IAClD,OAAO;AACL,UAAI,IAAI,IAAI,KAAK,MAAM,OAAO,YAAY,KAAK,CAAC,IAAI,SAAS,KAAK;AAAA,IACpE;AAEA,WAAO;AAAA,EACT,GAAG,UAAU;AAEb,MAAI,iBAAiB,GAAG;AACtB,UAAM,2BAA2B,iBAAiB;AAClD,UAAM,sBAAsB,MAAM,wBAAwB;AAC1D,UAAM,gBAAgB,OAAO,mBAAmB,KAAK,SAAS,wBAAwB,IAAI;AAE1F,QAAI,eAAe;AACjB,aAAO,SAAS,IAAI,OAAO,SAAS,IAAI;AAAA,IAC1C;AAEA,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,aAAO,MAAM,CAAC,CAAC,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;ACrDA,SAAS,WAAW,SAAS,gBAAgB;AAItC,IAAM,eAAe,CAAC,UAAqB;AAChD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,MAAM,KAAK;AAExD,YAAU,MAAM;AACd,kBAAc,MAAM,KAAK;AAEzB,UAAM,WAAW,CAACA,gBAA2B;AAC3C,oBAAcA,WAAU;AAAA,IAC1B;AAEA,UAAM,SAAS,iCACV,MAAM,SADI;AAAA,MAEb;AAAA,IACF;AAEA,WAAO,MAAM;AACX,YAAM,SAAS,iCACV,MAAM,SADI;AAAA,QAEb,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY,MAAM;AAAA,MAClB,gBAAgB,MAAM;AAAA,MACtB,oBAAoB,MAAM;AAAA,MAC1B,iBAAiB,MAAM;AAAA,MACvB,mBAAmB,MAAM;AAAA,MACzB,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,IACf;AAAA,IACA,CAAC,OAAO,UAAU;AAAA,EACpB;AAEA,SAAO;AACT;;;AC7CO,SAAS,MAAc;AAS5B,SAAO,KAAK,IAAI;AAClB;;;ACRO,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,UAAU;AAEhB,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YACE,gBAAsC,QACtC,gBAAgE,MAAM;AAAA,EAAC,GACvE;AALF,SAAQ,QAA8B;AAMpC,SAAK,QAAQ;AACb,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEO,iBACL,eACA;AACA,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEO,WAAW;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,YAAY;AACjB,QAAI,KAAK,UAAU,QAAQ;AACzB,aAAO;AAAA,IACT;AAEA,SAAK,QAAQ;AAEb,SAAK,SAAS;AAEd,WAAO;AAAA,EACT;AAAA,EAEO,WAAW;AAChB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEO,aAAa;AAClB,QAAI,KAAK,UAAU,SAAS;AAC1B,aAAO;AAAA,IACT;AAEA,SAAK,QAAQ;AAEb,SAAK,SAAS;AAEd,WAAO;AAAA,EACT;AAAA,EAEO,YAAY;AACjB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEO,YAAY;AACjB,QAAI,KAAK,UAAU,SAAS;AAC1B,aAAO;AAAA,IACT;AAEA,SAAK,QAAQ;AAEb,SAAK,SAAS;AAEd,WAAO;AAAA,EACT;AAAA,EAEO,WAAW;AAChB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEO,aAAa;AAClB,QAAI,KAAK,UAAU,QAAQ;AACzB,aAAO;AAAA,IACT;AAEA,SAAK,QAAQ;AAEb,SAAK,SAAS;AAEd,WAAO;AAAA,EACT;AAAA,EAEO,YAAY;AACjB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEQ,WAAW;AACjB,SAAK,cAAc,EAAE,OAAO,KAAK,MAAM,CAAC;AAAA,EAC1C;AACF;;;ACvEO,IAAM,YAAN,MAAgB;AAAA,EASrB,YAAY,SAA2B,SAA0B,CAAC,GAAG;AA8BrE;AAAA;AAAA;AAAA,SAAO,aAAa,CAAC,SAAiB;AACpC,WAAK,eAAe,IAAI;AACxB,WAAK,QAAQ,cAAc;AAC3B,WAAK,OAAO,KAAK,QAAQ;AAEzB,UAAI,KAAK,OAAO,UAAU;AACxB,aAAK,OAAO,SAAS,KAAK,cAAc,KAAK,IAAI,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,SAAO,iBAAiB,CAAC,aAAmB;AAC1C,UAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,aAAK,MAAM;AACX,aAAK,QAAQ,WAAW;AACxB,aAAK,OAAO,IAAI;AAAA,MAClB,OAAO;AACL,aAAK,QAAQ,WAAW;AAAA,MAC1B;AAAA,IACF;AAEA,SAAO,kBAAkB,CAAC,cAAoB;AAC5C,UAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,aAAK,MAAM;AACX,aAAK,QAAQ,YAAY;AACzB,aAAK,OAAO,IAAI;AAAA,MAClB,OAAO;AACL,aAAK,QAAQ,YAAY;AAAA,MAC3B;AAAA,IACF;AAEA,SAAO,qBAAqB,CAAC,aAAqB;AAChD,UAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,aAAK,MAAM;AACX,aAAK,QAAQ,eAAe;AAC5B,aAAK,OAAO;AAAA,MACd,OAAO;AACL,aAAK,QAAQ,eAAe;AAAA,MAC9B;AAAA,IACF;AAEA,SAAO,kBAAkB,CAAC,cAAyB;AACjD,WAAK,QAAQ,YAAY;AAAA,IAC3B;AAEA,SAAO,oBAAoB,CAAC,gBAA6B;AACvD,WAAK,QAAQ,cAAc;AAAA,IAC7B;AAMA;AAAA;AAAA;AAAA,SAAO,QAAQ,MAAM;AACnB,UAAI,KAAK,WAAW,WAAW,GAAG;AAChC,aAAK,iBAAiB,IAAI;AAE1B,YAAI,KAAK,OAAO,SAAS;AACvB,eAAK,OAAO,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,SAAO,SAAS,CAAC,kBAAkB,UAAU;AAC3C,UAAI,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,WAAW,GAAG;AAC9D,aAAK,iBAAiB,eAAe;AAErC,YAAI,KAAK,OAAO,UAAU;AACxB,eAAK,OAAO,SAAS;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,SAAO,QAAQ,MAAM;AACnB,UAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,YAAI,KAAK,SAAS;AAChB,wBAAc,KAAK,OAAO;AAAA,QAC5B;AAEA,YAAI,KAAK,OAAO,SAAS;AACvB,eAAK,OAAO,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,SAAO,OAAO,MAAM;AAClB,UAAI,KAAK,WAAW,WAAW,GAAG;AAChC,YAAI,KAAK,SAAS;AAChB,wBAAc,KAAK,OAAO;AAAA,QAC5B;AAEA,YAAI,KAAK,OAAO,QAAQ;AACtB,eAAK,OAAO,OAAO;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,SAAO,QAAQ,MAAM;AACnB,WAAK,OAAO,KAAK,QAAQ;AAEzB,UAAI,KAAK,OAAO,UAAU;AACxB,aAAK,OAAO,SAAS,KAAK,cAAc,KAAK,IAAI,CAAC;AAAA,MACpD;AAEA,UAAI,KAAK,OAAO,SAAS;AACvB,aAAK,OAAO,QAAQ;AAAA,MACtB;AAAA,IACF;AAMA;AAAA;AAAA;AAAA,SAAQ,mBAAmB,CAAC,kBAAkB,UAAU;AACtD,UAAI,KAAK,SAAS;AAChB,sBAAc,KAAK,OAAO;AAAA,MAC5B;AAEA,WAAK,eAAe,IAAI;AAExB,YAAM,eAAe,MAAM;AACzB,cAAM,UAAU,KAAK;AACrB,cAAM,cAAc,KAAK,YAAY;AAErC,YAAI,KAAK,OAAO,UAAU;AACxB,eAAK,OAAO,SAAS,KAAK,cAAc,WAAW,CAAC;AAAA,QACtD;AAEA,aAAK,QAAQ,YAAY,IAAI,CAAC,EAAE,MAAM,SAAS,MAAM;AACnD,gBAAM,kBAAkB,OAAO,WAAW,QAAQ;AAClD,gBAAM,mBAAmB,OAAO,WAAW,QAAQ;AACnD,gBAAM,oBACJ,KAAK,QAAQ,cAAc,aACvB,mBACA;AAEN,cAAI,mBAAmB;AACrB,qBAAS;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,mBAAmB,KAAK,OAAO,UAAU;AAC3C,aAAK,OAAO,SAAS,KAAK,cAAc,KAAK,IAAI,CAAC;AAAA,MACpD;AAEA,WAAK,UAAU,OAAO,YAAY,cAAc,KAAK,QAAQ,YAAY;AAAA,IAC3E;AAEA,SAAQ,gBAAgB,CAAC,SAA6B;AACpD,aAAO,iCACF,aAAa,MAAM,KAAK,QAAQ,UAAU,KAAK,QAAQ,SAAS,IAD9D;AAAA,QAEL,OAAO,KAAK,WAAW,SAAS;AAAA,MAClC;AAAA,IACF;AAEA,SAAQ,cAAc,MAAM;AAC1B,UAAI,KAAK,WAAW,UAAU,GAAG;AAC/B,cAAM,sBAAsB,IAAI;AAChC,cAAM,QAAQ,KAAK,IAAI,sBAAsB,KAAK,YAAY;AAE9D,gBAAQ,KAAK,QAAQ,WAAW;AAAA,UAC9B,KAAK;AACH,iBAAK,OAAO,KAAK,OAAO;AACxB,iBAAK,eAAe;AAEpB,mBAAO,KAAK;AAAA,UAEd,KAAK,YAAY;AACf,iBAAK,OAAO,KAAK,OAAO;AACxB,iBAAK,eAAe;AAEpB,gBAAI,KAAK,OAAO,GAAG;AACjB,mBAAK,KAAK;AAEV,qBAAO;AAAA,YACT;AAEA,mBAAO,KAAK;AAAA,UACd;AAAA,UAEA;AACE,mBAAO,KAAK;AAAA,QAChB;AAAA,MACF;AAEA,aAAO,KAAK,OAAO,IAAI,IAAI,KAAK;AAAA,IAClC;AAvNE,SAAK,eAAe,IAAI;AACxB,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,OAAO,QAAQ;AACpB,SAAK,aAAa,IAAI,eAAe,UAAU,MAAM;AACnD,UAAI,KAAK,OAAO,UAAU;AACxB,aAAK,OAAO,SAAS,KAAK,KAAK;AAAA,MACjC;AAAA,IACF,CAAC;AAED,SAAK,UAAU;AAEf,QAAI,KAAK,QAAQ,kBAAkB;AACjC,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,cAAc,KAAK,YAAY,CAAC;AAAA,EAC9C;AAAA,EAEA,IAAI,iBAAmC;AACrC,WAAO,KAAK,MAAM,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,EAChD;AAiMF;;;ACrPA,IAAM,iBAAmC;AAAA,EACvC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa,CAAC;AAChB;AAEO,IAAM,kBAAkB,CAC7B,UAAqC,CAAC,GACtC,SAA0B,CAAC,MACxB;AACH,QAAM,gBAAgB,kCACjB,iBACA;AAGL,SAAO,IAAI,UAAU,eAAe,MAAM;AAC5C;","names":["timerValue"]}