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
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 }
|
|
}
|