forked from coracle/caravel
42 lines
874 B
TypeScript
42 lines
874 B
TypeScript
import { createEffect, createSignal, onCleanup } from "solid-js"
|
|
|
|
export default function useMinLoading(loading: () => boolean, minDurationMs = 200) {
|
|
const [visible, setVisible] = createSignal(false)
|
|
let startTime = 0
|
|
let timeout: number | undefined
|
|
|
|
createEffect(() => {
|
|
if (timeout) {
|
|
window.clearTimeout(timeout)
|
|
timeout = undefined
|
|
}
|
|
|
|
if (loading()) {
|
|
startTime = Date.now()
|
|
setVisible(true)
|
|
return
|
|
}
|
|
|
|
if (!visible()) return
|
|
|
|
const elapsed = Date.now() - startTime
|
|
const remaining = Math.max(minDurationMs - elapsed, 0)
|
|
|
|
if (remaining === 0) {
|
|
setVisible(false)
|
|
return
|
|
}
|
|
|
|
timeout = window.setTimeout(() => {
|
|
setVisible(false)
|
|
timeout = undefined
|
|
}, remaining)
|
|
|
|
onCleanup(() => {
|
|
if (timeout) window.clearTimeout(timeout)
|
|
})
|
|
})
|
|
|
|
return visible
|
|
}
|