htmgo/framework/assets/js/htmxextensions/ws-event-handler.ts

74 lines
2 KiB
TypeScript
Raw Normal View History

2024-10-08 17:48:28 +00:00
import {ws} from "./ws";
window.onload = addWsEventHandlers;
2024-10-09 14:57:51 +00:00
function sendWs(message: Record<string, any>) {
if(ws != null && ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(message));
}
}
function walk(node: Node, cb: (node: Node) => void) {
cb(node);
for (let child of Array.from(node.childNodes)) {
walk(child, cb);
}
}
2024-10-08 17:48:28 +00:00
export function addWsEventHandlers() {
console.log('add ws event handlers')
const observer = new MutationObserver(register)
observer.observe(document.body, {childList: true, subtree: true})
let added = new Set<string>();
2024-10-09 14:57:51 +00:00
function register(mutations: MutationRecord[]) {
console.log(mutations)
for (let mutation of mutations) {
for (let removedNode of Array.from(mutation.removedNodes)) {
walk(removedNode, (node) => {
if (node instanceof HTMLElement) {
console.log('removing', node.innerHTML)
const handlerId = node.getAttribute("data-handler-id")
if(handlerId) {
added.delete(handlerId)
sendWs({id: handlerId, event: 'dom-element-removed'})
}
}
})
}
}
2024-10-08 17:48:28 +00:00
let ids = new Set<string>();
document.querySelectorAll("[data-handler-id]").forEach(element => {
const id = element.getAttribute("data-handler-id");
const event = element.getAttribute("data-handler-event");
if(id == null || event == null) {
return;
}
ids.add(id);
if (added.has(id)) {
return;
}
added.add(id);
element.addEventListener(event, (e) => {
2024-10-09 14:57:51 +00:00
sendWs({id, event})
2024-10-08 17:48:28 +00:00
});
})
for (let id of added) {
if (!ids.has(id)) {
added.delete(id);
}
}
console.log('size', added.size)
}
2024-10-09 14:57:51 +00:00
register([])
2024-10-08 17:48:28 +00:00
}