openpetswithchatandmcp/apps/desktop/pet-preload.cjs
2026-05-10 13:30:48 +02:00

88 lines
2.6 KiB
JavaScript

const { ipcRenderer } = require("electron");
const allowedMotionStates = new Set(["idle", "run-left", "run-right"]);
const allowedReactionStates = new Set(["idle", "running-right", "running-left", "waving", "jumping", "failed", "waiting", "running", "review"]);
let lastInteractiveHit = null;
let dragging = false;
ipcRenderer.on("openpets:pet-motion", (_event, state) => {
if (!allowedMotionStates.has(state)) {
return;
}
const apply = () => {
document.documentElement.dataset.motionState = state;
};
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", apply, { once: true });
} else {
apply();
}
});
ipcRenderer.on("openpets:pet-reaction-state", (_event, state) => {
if (!allowedReactionStates.has(state)) {
return;
}
const apply = () => {
document.documentElement.dataset.reactionState = state;
};
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", apply, { once: true });
} else {
apply();
}
});
const getInteractiveTarget = (event) => {
const target = document.elementFromPoint(event.clientX, event.clientY);
return target && target.closest(".pet-shell, .bubble");
};
const setInteractiveHit = (interactive) => {
if (lastInteractiveHit === interactive) return;
lastInteractiveHit = interactive;
ipcRenderer.send("openpets:pet-hit-test", interactive);
};
const updateInteractiveHit = (event) => {
setInteractiveHit(Boolean(getInteractiveTarget(event)) || dragging);
};
const installMouseInterop = () => {
document.addEventListener("mousemove", (event) => {
updateInteractiveHit(event);
if (dragging) ipcRenderer.send("openpets:pet-drag-move", { screenX: event.screenX, screenY: event.screenY });
}, { passive: true });
document.addEventListener("mousedown", (event) => {
const target = getInteractiveTarget(event);
setInteractiveHit(Boolean(target));
if (event.button !== 0 || !target?.closest(".pet-shell")) return;
event.preventDefault();
dragging = true;
setInteractiveHit(true);
ipcRenderer.send("openpets:pet-drag-start", { screenX: event.screenX, screenY: event.screenY });
});
document.addEventListener("mouseup", () => {
if (!dragging) return;
dragging = false;
ipcRenderer.send("openpets:pet-drag-end");
});
document.addEventListener("mouseleave", () => {
if (!dragging) setInteractiveHit(false);
}, { passive: true });
setInteractiveHit(false);
};
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", installMouseInterop, { once: true });
} else {
installMouseInterop();
}