mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-04-10 06:57:49 +09:00
Hello world
First open source release of Campfire 🎉
This commit is contained in:
32
app/javascript/controllers/maintain_scroll_controller.js
Normal file
32
app/javascript/controllers/maintain_scroll_controller.js
Normal file
@@ -0,0 +1,32 @@
|
||||
import { Controller } from "@hotwired/stimulus"
|
||||
import ScrollManager from "models/scroll_manager"
|
||||
|
||||
export default class extends Controller {
|
||||
#scrollManager
|
||||
|
||||
connect() {
|
||||
this.#scrollManager = new ScrollManager(this.element)
|
||||
}
|
||||
|
||||
// Actions
|
||||
|
||||
beforeStreamRender(event) {
|
||||
const shouldKeepScroll = event.detail.newStream.hasAttribute("maintain_scroll")
|
||||
const render = event.detail.render
|
||||
const target = event.detail.newStream.getAttribute("target")
|
||||
const targetElement = document.getElementById(target)
|
||||
|
||||
if (this.element.contains(targetElement) && shouldKeepScroll) {
|
||||
const top = this.#isAboveFold(targetElement)
|
||||
event.detail.render = async (streamElement) => {
|
||||
this.#scrollManager.keepScroll(top, () => render(streamElement))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Internal
|
||||
|
||||
#isAboveFold(element) {
|
||||
return element.getBoundingClientRect().top < this.element.clientHeight
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user