@churchapps/apphelper
Version:
Library of helper functions for React and NextJS ChurchApps
166 lines • 5.67 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").catch((error) => {
console.error("❌ Failed to create alert connection:", error);
});
}
};
SocketHelper.init = async () => {
_a.cleanup();
_a.isCleanedUp = false;
if (_a.socket && _a.socket.readyState !== _a.socket.CLOSED) {
try {
_a.socket.close();
}
catch (e) {
console.error("❌ Error closing existing socket:", e);
}
}
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 (error) {
console.error("❌ Error parsing socket message:", error);
}
};
_a.socket.onopen = async (e) => {
_a.socket.send("getId"); // Request socket ID
setTimeout(() => { resolve(null); }, 500);
};
_a.socket.onclose = async (e) => {
console.log("🔌 WebSocket connection closed");
// No retry logic - just log the closure
};
_a.socket.onerror = (error) => {
console.error("❌ WebSocket connection error:", error);
reject(error);
};
}
catch (error) {
console.error("❌ Error initializing socket:", 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 (error) {
console.error("Error closing socket:", error);
}
}
// Clear references
_a.socket = null;
_a.socketId = null;
_a.actionHandlers = [];
_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