PageSourceSearch

https://internationaldayofzerowaste.org/assets/admin_controllers/editing_presence_controller-f831a8c1.js

js internationaldayofzerowaste.org collected 2026-09-29 11:08:27 UTC 2,032 bytes, 64 lines download raw bytes

1import { Controller } from "@hotwired/stimulus"
2
3export default class extends Controller {
4  static values = {
5    heartbeatUrl: String,
6    releaseUrl: String,
7    locked: { type: Boolean, default: false }
8  }
9
10  connect() {
11    if (this.lockedValue) return
12
13    // Start heartbeat every 30 seconds
14    this._heartbeatInterval = setInterval(() => this.#heartbeat(), 30000)
15
16    // Release on page leave
17    this._beforeUnload = () => this.#release()
18    window.addEventListener("beforeunload", this._beforeUnload)
19
20    // Also release on turbo navigation away
21    this._turboBeforeVisit = () => this.#release()
22    document.addEventListener("turbo:before-visit", this._turboBeforeVisit)
23  }
24
25  disconnect() {
26    if (this._heartbeatInterval) clearInterval(this._heartbeatInterval)
27    if (this._beforeUnload) window.removeEventListener("beforeunload", this._beforeUnload)
28    if (this._turboBeforeVisit) document.removeEventListener("turbo:before-visit", this._turboBeforeVisit)
29    this.#release()
30  }
31
32  forceEdit() {
33    // Allow taking over the lock
34    const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content
35    fetch(this.heartbeatUrlValue, {
36      method: "POST",
37      headers: { "X-CSRF-Token": csrfToken, "Accept": "application/json" }
38    }).then(() => {
39      window.location.reload()
40    })
41  }
42
43  // Private
44
45  #heartbeat() {
46    if (!this.heartbeatUrlValue) return
47    const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content
48
49    fetch(this.heartbeatUrlValue, {
50      method: "POST",
51      headers: { "X-CSRF-Token": csrfToken, "Accept": "application/json" }
52    }).catch(err => console.error("Heartbeat failed:", err))
53  }
54
55  #release() {
56    if (!this.releaseUrlValue || this.lockedValue) return
57
58    // Use sendBeacon for reliability on page unload
59    const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content
60    const data = new FormData()
61    data.append("authenticity_token", csrfToken)
62    navigator.sendBeacon(this.releaseUrlValue, data)
63  }
64}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.