You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

36 lines
826 B
TypeScript

import { createSignal, onCleanup } from 'solid-js'
export function useTimer(durationMs: number) {
const [remainingMs, setRemainingMs] = createSignal(durationMs)
const [isExpired, setIsExpired] = createSignal(false)
let t: number | undefined
let startedAt: number | undefined
const tick = () => {
if (startedAt == null) return
const elapsed = Date.now() - startedAt
const remain = Math.max(0, durationMs - elapsed)
setRemainingMs(remain)
if (remain === 0) setIsExpired(true)
}
const start = () => {
if (t != null) return
startedAt = Date.now()
tick()
t = window.setInterval(tick, 250)
}
const stop = () => {
if (t != null) {
window.clearInterval(t)
t = undefined
}
}
onCleanup(() => stop())
return { remainingMs, isExpired, start, stop }
}