mirror of
https://github.com/docusealco/docuseal
synced 2026-11-04 14:42:32 -05:00
53 lines
1.1 KiB
JavaScript
53 lines
1.1 KiB
JavaScript
import { renderStreamMessage, session } from '@hotwired/turbo'
|
|
|
|
export default class extends HTMLElement {
|
|
connectedCallback () {
|
|
if (this.dataset.limit) this.replaceLimitParam()
|
|
|
|
if (!this.dataset.src) {
|
|
this.remove()
|
|
|
|
return
|
|
}
|
|
|
|
this.observer = new IntersectionObserver((entries) => {
|
|
if (entries.some((entry) => entry.isIntersecting)) {
|
|
this.load()
|
|
}
|
|
}, { rootMargin: '400px' })
|
|
|
|
this.observer.observe(this)
|
|
}
|
|
|
|
disconnectedCallback () {
|
|
this.observer?.disconnect()
|
|
}
|
|
|
|
replaceLimitParam () {
|
|
const url = new URL(window.location.href)
|
|
|
|
url.searchParams.set('limit', this.dataset.limit)
|
|
|
|
session.history.replace(url, session.history.restorationIdentifier)
|
|
session.view.lastRenderedLocation = url
|
|
}
|
|
|
|
load () {
|
|
if (this.loading || !this.dataset.src) return
|
|
|
|
this.loading = true
|
|
|
|
fetch(this.dataset.src, {
|
|
headers: { 'X-Turbo-Infinite-Scroll': 'true' }
|
|
}).then(async (response) => {
|
|
if (!response.ok) return
|
|
|
|
delete this.dataset.src
|
|
|
|
renderStreamMessage(await response.text())
|
|
}).finally(() => {
|
|
this.loading = false
|
|
})
|
|
}
|
|
}
|