File size: 1,318 Bytes
0dbc9de | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import { createEffect, createSignal, on, onCleanup, type Accessor } from "solid-js"
export function createDebouncedSignal<T>(value: T, ms: number): [Accessor<T>, (value: T) => void] {
const [get, set] = createSignal(value)
let timer: ReturnType<typeof setTimeout> | undefined
const debounced = (next: T) => {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
timer = undefined
set(() => next)
}, ms)
}
onCleanup(() => {
if (timer) clearTimeout(timer)
})
return [get, debounced]
}
export function createFadeIn(show: Accessor<boolean>, enabled: Accessor<boolean>) {
const [alpha, setAlpha] = createSignal(show() ? 1 : 0)
let revealed = show()
createEffect(
on([show, enabled], ([visible, animate]) => {
if (!visible) {
setAlpha(0)
return
}
if (!animate || revealed) {
revealed = true
setAlpha(1)
return
}
const start = performance.now()
revealed = true
setAlpha(0)
const timer = setInterval(() => {
const progress = Math.min((performance.now() - start) / 160, 1)
setAlpha(progress * progress * (3 - 2 * progress))
if (progress >= 1) clearInterval(timer)
}, 16)
onCleanup(() => clearInterval(timer))
}),
)
return alpha
}
|