UNPKG

@churchapps/apphelper

Version:

Library of helper functions for React and NextJS ChurchApps

155 lines 5.13 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"); } }; 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