UNPKG

@churchapps/apphelper

Version:

Library of helper functions for React and NextJS ChurchApps

166 lines 5.67 kB
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