@churchapps/apphelper
Version:
Library of helper functions for React and NextJS ChurchApps
155 lines • 5.13 kB
JavaScript
var _a;
import { ApiHelper, ArrayHelper, CommonEnvironmentHelper } from "@churchapps/helpers";
export class SocketHelper {
}
_a = SocketHelper;
SocketHelper.actionHandlers = [];
SocketHelper.personIdChurchId = { personId: "", churchId: "" };
SocketHelper.isCleanedUp = false;
SocketHelper.setPersonChurch = (pc) => {
if (pc?.personId && pc.personId && pc.churchId !== _a.personIdChurchId.churchId && pc.personId !== _a.personIdChurchId.personId) {
_a.personIdChurchId = pc;
_a.createAlertConnection();
}
};
SocketHelper.createAlertConnection = () => {
if (_a.personIdChurchId.personId && _a.socketId) {
const connection = {
conversationId: "alerts",
churchId: _a.personIdChurchId.churchId,
displayName: "Test",
socketId: _a.socketId,
personId: _a.personIdChurchId.personId
};
ApiHelper.postAnonymous("/connections", [connection], "MessagingApi");
}
};
SocketHelper.init = async () => {
_a.cleanup();
_a.isCleanedUp = false;
if (_a.socket && _a.socket.readyState !== _a.socket.CLOSED) {
try {
_a.socket.close();
}
catch { /* ignore */ }
}
await new Promise((resolve, reject) => {
try {
_a.socket = new WebSocket(CommonEnvironmentHelper.MessagingApiSocket);
_a.socket.onmessage = (event) => {
if (_a.isCleanedUp)
return;
try {
const payload = JSON.parse(event.data);
_a.handleMessage(payload);
}
catch { /* ignore parse errors */ }
};
_a.socket.onopen = async () => {
_a.socket.send("getId");
setTimeout(() => {
resolve(null);
}, 3000);
};
_a.socket.onclose = async () => { };
_a.socket.onerror = (error) => {
reject(error);
};
}
catch (error) {
reject(error);
}
});
};
SocketHelper.addHandler = (action, id, handleMessage) => {
const existing = ArrayHelper.getOne(_a.actionHandlers, "id", id);
if (existing !== null) {
existing.handleMessage = handleMessage;
}
else {
_a.actionHandlers.push({ action, id, handleMessage });
}
};
SocketHelper.removeHandler = (id) => {
_a.actionHandlers = _a.actionHandlers.filter(handler => handler.id !== id);
};
SocketHelper.removeHandlersByAction = (action) => {
_a.actionHandlers = _a.actionHandlers.filter(handler => handler.action !== action);
};
SocketHelper.clearAllHandlers = () => {
_a.actionHandlers = [];
};
SocketHelper.handleMessage = (payload) => {
if (_a.isCleanedUp)
return;
try {
if (payload.action === "socketId") {
_a.socketId = payload.data;
_a.createAlertConnection();
}
else {
const matchingHandlers = ArrayHelper.getAll(_a.actionHandlers, "action", payload.action);
matchingHandlers.forEach((handler) => {
try {
handler.handleMessage(payload.data);
}
catch (error) {
console.error(`Error in handler ${handler.id}:`, error);
}
});
}
}
catch (error) {
console.error("Error handling socket message:", error);
}
};
SocketHelper.cleanup = () => {
_a.isCleanedUp = true;
// Close socket connection
if (_a.socket && _a.socket.readyState !== _a.socket.CLOSED) {
try {
_a.socket.close();
}
catch { /* ignore */ }
}
// Clear references but preserve handlers - they should persist across reconnects
_a.socket = null;
_a.socketId = null;
_a.personIdChurchId = { personId: "", churchId: "" };
};
SocketHelper.disconnect = () => {
_a.cleanup();
};
SocketHelper.isConnected = () => {
return _a.socket && _a.socket.readyState === _a.socket.OPEN;
};
SocketHelper.getConnectionState = () => {
if (!_a.socket)
return "UNINITIALIZED";
switch (_a.socket.readyState) {
case _a.socket.CONNECTING: return "CONNECTING";
case _a.socket.OPEN: return "OPEN";
case _a.socket.CLOSING: return "CLOSING";
case _a.socket.CLOSED: return "CLOSED";
default: return "UNKNOWN";
}
};
// Global cleanup on window unload
SocketHelper.setupGlobalCleanup = () => {
if (typeof window !== "undefined") {
const cleanup = () => {
_a.cleanup();
};
window.addEventListener("beforeunload", cleanup);
window.addEventListener("unload", cleanup);
// Also cleanup on page visibility change (when tab is closed)
document.addEventListener("visibilitychange", () => {
if (document.visibilityState === "hidden") {
// Optional: cleanup when tab becomes hidden
// SocketHelper.cleanup();
}
});
return cleanup;
}
};
//# sourceMappingURL=SocketHelper.js.map