Refer to relay.tools for relay setup

This commit is contained in:
Jon Staab
2024-09-11 11:33:50 -07:00
parent 0ae02f2537
commit e9cbfec76d
6 changed files with 114 additions and 8 deletions
+44
View File
@@ -1,3 +1,5 @@
import {sleep} from '@welshman/lib'
export const copyToClipboard = (text: string) => {
const {activeElement} = document
const input = document.createElement("textarea")
@@ -13,3 +15,45 @@ export const copyToClipboard = (text: string) => {
return result
}
type ScrollerOpts = {
delay?: number
threshold?: number
reverse?: boolean
element?: Element
}
export const createScroller = (
loadMore: () => Promise<void>,
{delay = 1000, threshold = 2000, reverse = false}: ScrollerOpts = {},
) => {
let done = false
const check = async () => {
// While we have empty space, fill it
const {scrollY, innerHeight} = window
const {scrollHeight, scrollTop} = document.body
const offset = Math.abs(scrollTop || scrollY)
const shouldLoad = offset + innerHeight + threshold > scrollHeight
// Only trigger loading the first time we reach the threshold
if (shouldLoad) {
await loadMore()
}
// No need to check all that often
await sleep(delay)
if (!done) {
requestAnimationFrame(check)
}
}
requestAnimationFrame(check)
return {
check,
stop: () => {
done = true
},
}
}